diff --git a/modules/io/src/mol/mmcif_info.cc b/modules/io/src/mol/mmcif_info.cc index 709cb8686401bbd779c2b8f8cfa5be646bf9bf00..f2c0bf7545634744acde58f727d06b350e885335 100644 --- a/modules/io/src/mol/mmcif_info.cc +++ b/modules/io/src/mol/mmcif_info.cc @@ -23,14 +23,22 @@ namespace ost { namespace io { -void MMCifInfo::AddMMCifPDBChainTr(String cif, String pdb) +void MMCifInfo::AddMMCifPDBChainTr(String cif, String pdb, bool fault_tolerant) { std::map<String, String>::iterator tr_it = cif_2_pdb_chain_id_.find(cif); if (tr_it != cif_2_pdb_chain_id_.end()) { - throw IOException("mmCIF chain id '"+ cif +"' is already mapped to '"+ - tr_it->second+"'."); + std::stringstream msg; + msg << "mmCIF chain id '" << cif << "' is already mapped to '" << + tr_it->second << "'. Cannot map it to '" << pdb << "'." ; + if(fault_tolerant) { + LOG_WARNING(msg.str()); + return; + } else { + throw IOException(msg.str()); + } + } else { + cif_2_pdb_chain_id_.insert(std::pair<String, String>(cif, pdb)); } - cif_2_pdb_chain_id_.insert(std::pair<String, String>(cif, pdb)); } String MMCifInfo::GetMMCifPDBChainTr(String cif) const @@ -41,14 +49,22 @@ String MMCifInfo::GetMMCifPDBChainTr(String cif) const return tr_it->second; } -void MMCifInfo::AddPDBMMCifChainTr(String pdb, String cif) +void MMCifInfo::AddPDBMMCifChainTr(String pdb, String cif, bool fault_tolerant) { std::map<String, String>::iterator tr_it = pdb_2_cif_chain_id_.find(pdb); if (tr_it != pdb_2_cif_chain_id_.end()) { - throw IOException("PDB chain id '"+ pdb +"' is already mapped to '"+ - tr_it->second+"'."); + std::stringstream msg; + msg << "PDB chain id '" << pdb << "' is already mapped to '" << + tr_it->second << "'. Cannot map it to '" << cif << "'." ; + if(fault_tolerant) { + LOG_WARNING(msg.str()); + return; + } else { + throw IOException(msg.str()); + } + } else { + pdb_2_cif_chain_id_.insert(std::pair<String, String>(pdb, cif)); } - pdb_2_cif_chain_id_.insert(std::pair<String, String>(pdb, cif)); } String MMCifInfo::GetPDBMMCifChainTr(String pdb) const @@ -59,14 +75,23 @@ String MMCifInfo::GetPDBMMCifChainTr(String pdb) const return tr_it->second; } -void MMCifInfo::AddMMCifEntityIdTr(String cif, String ent_id) +void MMCifInfo::AddMMCifEntityIdTr(String cif, String ent_id, bool fault_tolerant) { std::map<String, String>::iterator tr_it = cif_2_entity_id_.find(cif); if (tr_it != cif_2_entity_id_.end()) { - throw IOException("mmCIF chain id '" + cif + "' is already mapped to " - "entity id '" + tr_it->second + "'."); + std::stringstream msg; + msg << "mmCIF chain id '" << cif << "' is already mapped to " << + "entity id '" << tr_it->second << "'. Cannot map it to '" << + ent_id << "'." ; + if(fault_tolerant) { + LOG_WARNING(msg.str()); + return; + } else { + throw IOException(msg.str()); + } + } else { + cif_2_entity_id_.insert(std::pair<String, String>(cif, ent_id)); } - cif_2_entity_id_.insert(std::pair<String, String>(cif, ent_id)); } String MMCifInfo::GetMMCifEntityIdTr(String cif) const diff --git a/modules/io/src/mol/mmcif_info.hh b/modules/io/src/mol/mmcif_info.hh index 2892ae7c6ca18db874275884bf0f26b1fa22dd12..8cfb031cb9a7d3466cfd176ec66f576ad8c91b3f 100644 --- a/modules/io/src/mol/mmcif_info.hh +++ b/modules/io/src/mol/mmcif_info.hh @@ -1065,7 +1065,8 @@ public: /// /// \param cif chain name as used by the mmCIF file (label_asym_id) /// \param pdb chain name as used in the PDB file (auth_asym_id) - void AddMMCifPDBChainTr(String cif, String pdb); + void AddMMCifPDBChainTr(String cif, String pdb, + bool fault_tolerant=false); /// \brief Get a PDB chain name for a CIF chain name /// @@ -1077,7 +1078,8 @@ public: /// /// \param pdb chain name as used by the PDB file (auth_asym_id) /// \param cif chain name as used in the mmCIF file (label_asym_id) - void AddPDBMMCifChainTr(String pdb, String cif); + void AddPDBMMCifChainTr(String pdb, String cif, + bool fault_tolerant=false); /// \brief Get a CIF chain name for a PDB chain name /// @@ -1089,7 +1091,8 @@ public: /// /// \param cif chain name as used by the mmCIF file (label_asym_id) /// \param ent_id entity ID as used by the mmCIF file (label_entity_id) - void AddMMCifEntityIdTr(String cif, String ent_id); + void AddMMCifEntityIdTr(String cif, String ent_id, + bool fault_tolerant=false); /// \brief Get the entity ID for a CIF chain name /// diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index 2a3fed856f2fb29609c01a9ea329a4e31adcfb21..e95263b57e3f4bbb376bc5c61e46b5c135be49b7 100644 --- a/modules/io/src/mol/mmcif_reader.cc +++ b/modules/io/src/mol/mmcif_reader.cc @@ -608,7 +608,7 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) curr_chain_.SetStringProp("entity_id", ent_id); chain_id_pairs_.push_back(std::pair<mol::ChainHandle,String>(curr_chain_, ent_id)); - info_.AddMMCifEntityIdTr(cif_chain_name, ent_id); + info_.AddMMCifEntityIdTr(cif_chain_name, ent_id, profile_.fault_tolerant); } assert(curr_chain_.IsValid()); } else if (chain_id_pairs_.back().second != // unit test @@ -1865,12 +1865,14 @@ void MMCifReader::OnEndData() editor.SetChainDescription(css->first, edm_it->second.details); // Add chain mapping for all chains pdb_auth_chain_name = css->first.GetStringProp("pdb_auth_chain_name"); - info_.AddMMCifPDBChainTr(css->first.GetName(), pdb_auth_chain_name); + info_.AddMMCifPDBChainTr(css->first.GetName(), pdb_auth_chain_name, + profile_.fault_tolerant); if (edm_it->second.entity_type=="polymer") { // PDB -> mmCIF chain mapping only for polymers // This is not a 1:1 mapping because of ligands - info_.AddPDBMMCifChainTr(pdb_auth_chain_name, css->first.GetName()); + info_.AddPDBMMCifChainTr(pdb_auth_chain_name, css->first.GetName(), + profile_.fault_tolerant); } else if (edm_it->second.entity_type=="non-polymer") { mol::ChainHandle chain=css->first; mol::ResidueHandleList residues=chain.GetResidueList();