diff --git a/modules/conop/src/heuristic.cc b/modules/conop/src/heuristic.cc index cecf6dcb2df8996a41b7685877e5c40518bac4b5..8c5277206ce487c7b9496b876f7422651db5c28c 100644 --- a/modules/conop/src/heuristic.cc +++ b/modules/conop/src/heuristic.cc @@ -32,14 +32,16 @@ namespace ost { namespace conop { void HeuristicProcessor::ProcessUnkResidue(DiagnosticsPtr diags, mol::ResidueHandle res) const { - res.SetChemClass(GuessChemClass(res)); mol::AtomHandleList atoms = res.GetAtomList(); for (mol::AtomHandleList::iterator i = atoms.begin(), e = atoms.end(); i != e; ++i) { mol::AtomHandle a = *i; if (!Conopology::Instance().IsValidElement(a.GetElement())) - a.SetElement(GuessAtomElement(a.GetName(), a.IsHetAtom())); + a.SetElement(GuessAtomElement(a.GetName(), atoms.size())); } + + res.SetChemClass(GuessChemClass(res)); + if (!this->GetConnect()) { return; } for (mol::AtomHandleList::iterator i = atoms.begin(), e = atoms.end(); i != e; ++i) { @@ -64,6 +66,9 @@ void HeuristicProcessor::DoProcess(DiagnosticsPtr diags, if (!compound) { // process unknown residue... this->ProcessUnkResidue(diags, residue); + if (this->GetConnectAminoAcids()) + this->ConnectResidues(prev, residue); + prev = residue; continue; } this->ReorderAtoms(residue, compound, true); diff --git a/modules/conop/src/processor.cc b/modules/conop/src/processor.cc index d8f5c269837dd4f38a892b5fc8996ee4e9986656..4ce93eba6d6fcc2f1df40dc64d1ab92fc8f950df 100644 --- a/modules/conop/src/processor.cc +++ b/modules/conop/src/processor.cc @@ -115,6 +115,7 @@ void AssignBackboneTorsions(mol::ResidueHandle prev, } } } + mol::ChemClass GuessChemClass(mol::ResidueHandle res) { mol::AtomHandle ca=res.FindAtom("CA"); @@ -131,7 +132,8 @@ mol::ChemClass GuessChemClass(mol::ResidueHandle res) } return mol::ChemClass(); } -String GuessAtomElement(const String& aname, bool hetatm) + +String GuessAtomElement(const String& aname, int atom_count) { static String l1[] = { "H","C","N","O","P","S","K" @@ -156,7 +158,7 @@ String GuessAtomElement(const String& aname, bool hetatm) if(ele[0]=='H') { return "H"; } - if (hetatm==false) { + if (atom_count > 1) { if (ele=="CA" || ele=="CB") { return "C"; } diff --git a/modules/conop/src/processor.hh b/modules/conop/src/processor.hh index 6001b5cbfa32b8610ef73753256515276f583f43..d66f6ccbc65459e16933bea7cc7053d5770d3b73 100644 --- a/modules/conop/src/processor.hh +++ b/modules/conop/src/processor.hh @@ -126,7 +126,7 @@ String DLLEXPORT_OST_CONOP StringFromConopAction(ConopAction action); /// \brief guess element of atom based on name and hetatm flag -String DLLEXPORT_OST_CONOP GuessAtomElement(const String& atom_name, bool hetatm); +String DLLEXPORT_OST_CONOP GuessAtomElement(const String& atom_name, int atom_count); /// \brief guess chemclass based on atoms of residue mol::ChemClass DLLEXPORT_OST_CONOP GuessChemClass(mol::ResidueHandle res); diff --git a/modules/conop/src/rule_based.cc b/modules/conop/src/rule_based.cc index 2a18ddb20360158baf6d1ac950568dfa05058ff5..c4c870005e5c3d33332c921a5c371b89cfdbe834 100644 --- a/modules/conop/src/rule_based.cc +++ b/modules/conop/src/rule_based.cc @@ -63,7 +63,7 @@ void RuleBasedProcessor::DoProcess(DiagnosticsPtr diags, mol::AtomHandleList unk_atoms; unk_atoms = GetUnknownAtomsOfResidue(residue, compound, this->GetStrictHydrogens()); - this->ProcessUnkAtoms(diags, unk_atoms, atoms_to_connect); + this->ProcessUnkAtoms(diags, residue, unk_atoms, atoms_to_connect); residue.SetChemClass(mol::ChemClass(mol::ChemClass::UNKNOWN)); residue.SetChemType(mol::ChemType(mol::ChemType::UNKNOWN)); residue.SetOneLetterCode('?'); @@ -102,7 +102,7 @@ void RuleBasedProcessor::ProcessUnkResidue(DiagnosticsPtr diags, e = atoms.end(); i !=e; ++i) { remaining_atoms.push_back(*i); if (!Conopology::Instance().IsValidElement(i->GetElement())) - i->SetElement(GuessAtomElement(i->GetName(), i->IsHetAtom())); + i->SetElement(GuessAtomElement(i->GetName(), atoms.size())); } } // Don't do anything if treatment is set to SILENT @@ -129,6 +129,7 @@ void RuleBasedProcessor::ProcessUnkResidue(DiagnosticsPtr diags, } void RuleBasedProcessor::ProcessUnkAtoms(DiagnosticsPtr diags, + mol::ResidueHandle res, mol::AtomHandleList unks, mol::AtomHandleList& remaining_atoms) const { @@ -138,7 +139,7 @@ void RuleBasedProcessor::ProcessUnkAtoms(DiagnosticsPtr diags, e = unks.end(); i !=e; ++i) { remaining_atoms.push_back(*i); if (!Conopology::Instance().IsValidElement(i->GetElement())) - i->SetElement(GuessAtomElement(i->GetName(), i->IsHetAtom())); + i->SetElement(GuessAtomElement(i->GetName(), res.GetAtomCount())); } } diff --git a/modules/conop/src/rule_based.hh b/modules/conop/src/rule_based.hh index 4275d7e40e15dfdd7b088fe5ceae437a32095aaa..3b91771a29c027f9cbd503c3927f3a13b58add34 100644 --- a/modules/conop/src/rule_based.hh +++ b/modules/conop/src/rule_based.hh @@ -85,6 +85,7 @@ protected: mol::ResidueHandle res, mol::AtomHandleList& remaining) const; void ProcessUnkAtoms(DiagnosticsPtr diags, + mol::ResidueHandle res, mol::AtomHandleList unks, mol::AtomHandleList& remaining) const; virtual void DoProcess(DiagnosticsPtr diags, diff --git a/modules/conop/tests/test_heuristic_conop.cc b/modules/conop/tests/test_heuristic_conop.cc index 4943393161d1e3f8911073d67a6f261ccc091f2f..61155c644b20c11220218355153a8b334e4817bf 100644 --- a/modules/conop/tests/test_heuristic_conop.cc +++ b/modules/conop/tests/test_heuristic_conop.cc @@ -19,6 +19,7 @@ #include <ost/log.hh> #include <ost/mol/mol.hh> +#include <ost/mol/builder.hh> #include <ost/conop/heuristic.hh> #define BOOST_TEST_DYN_LINK @@ -140,5 +141,44 @@ BOOST_AUTO_TEST_CASE(does_assign_torsions) { BOOST_CHECK(a2.GetPsiTorsion().IsValid()); } + +BOOST_AUTO_TEST_CASE(quack_types_unknown_residues) { + + mol::EntityHandle e = Builder() + .Chain("A") + .Residue("GLY") + .Atom("N", geom::Vec3(-8.22, 35.20, 22.39)) + .Atom("CA", geom::Vec3(-8.28, 36.36, 21.49)) + .Atom("C", geom::Vec3(-8.59, 35.93, 20.06)) + .Atom("O", geom::Vec3(-7.88, 36.30, 19.12)) + .Atom("CB", geom::Vec3(-6.96, 37.11, 21.53)) + .Residue("SEP") + .Atom("N", geom::Vec3(-9.66, 35.16, 19.91)) + .Atom("CA", geom::Vec3(-10.08, 34.66, 18.61)) + .Atom("CB", geom::Vec3(-10.90, 33.38, 18.79)) + .Atom("OG", geom::Vec3(-12.22, 33.66, 19.22)) + .Atom("C", geom::Vec3(-10.84, 35.69, 17.77)) + .Atom("O", geom::Vec3(-10.99, 35.54, 16.56)) + .Atom("P", geom::Vec3(-12.43, 33.20, 20.70)) + .Atom("O1P", geom::Vec3(-11.55, 34.04, 21.65)) + .Atom("O2P", geom::Vec3(-12.05, 31.71, 20.86)) + .Atom("O3P", geom::Vec3(-13.92, 33.41, 21.07)) + .Residue("GLY") + .Atom("N", geom::Vec3(-11.31, 36.75, 18.43)) + .Atom("CA", geom::Vec3(-12.04, 37.81, 17.75)) + .Atom("C", geom::Vec3(-12.34, 38.94, 18.73)) + .Atom("O", geom::Vec3(-13.45, 39.03, 19.26)) + ; + HeuristicProcessor proc; + proc.Process(e); + BOOST_CHECK(e.FindResidue("A", 1).IsPeptideLinking()); + BOOST_CHECK(e.FindResidue("A", 2).IsPeptideLinking()); + BOOST_CHECK(e.FindResidue("A", 3).IsPeptideLinking()); + + BOOST_CHECK(mol::BondExists(e.FindAtom("A", 1, "C"), e.FindAtom("A", 2, "N"))); + BOOST_CHECK(mol::BondExists(e.FindAtom("A", 2, "C"), e.FindAtom("A", 3, "N"))); + +} + BOOST_AUTO_TEST_SUITE_END();