From 675d0d812a822b476282bc969e1f16adf45d5e3d Mon Sep 17 00:00:00 2001 From: Gabriel Studer <gabriel.studer@unibas.ch> Date: Wed, 20 May 2015 21:03:43 +0200 Subject: [PATCH] properly remove torsion handles from residues When an atom gets deleted, all related torsions get deleted from the entities TorsionImplMap. The ResidueHandles keep their own vector of the same TorsionHandles. If an atom gets deleted, only the internal torsion list of the corresponding residue got updated. This had to be extended to all residues containing torsions related to the deleted atom. --- modules/mol/base/src/impl/atom_impl.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/mol/base/src/impl/atom_impl.cc b/modules/mol/base/src/impl/atom_impl.cc index 3a2b4d013..7bc585b14 100644 --- a/modules/mol/base/src/impl/atom_impl.cc +++ b/modules/mol/base/src/impl/atom_impl.cc @@ -355,20 +355,29 @@ void AtomImpl::DeleteAllTorsions() { EntityImplPtr e=this->GetEntity(); TorsionImplMap::iterator i; std::vector<TorsionImplMap::iterator> t_rm_vec; + std::set<ResidueImpl*> involved_residues; for (i=e->GetTorsionMap().begin(); i!=e->GetTorsionMap().end(); ++i) { if (i->second->IsAtomInvolved(shared_from_this())) { t_rm_vec.push_back(i); + involved_residues.insert(i->second->GetFirst()->GetResidue().get()); + involved_residues.insert(i->second->GetSecond()->GetResidue().get()); + involved_residues.insert(i->second->GetThird()->GetResidue().get()); + involved_residues.insert(i->second->GetFourth()->GetResidue().get()); } } std::vector<TorsionImplMap::iterator>::iterator it_rm; for (it_rm=t_rm_vec.begin(); it_rm!=t_rm_vec.end(); ++it_rm) { e->GetTorsionMap().erase(*it_rm); } - TorsionImplList& l=this->GetResidue()->GetTorsionList(); - TorsionImplList::iterator j; - j=std::remove_if(l.begin(), l.end(), - bind(&TorsionImpl::IsAtomInvolved, _1, shared_from_this())); - l.erase(j, l.end()); + + for(std::set<ResidueImpl*>::iterator i = involved_residues.begin(); + i != involved_residues.end(); ++i){ + TorsionImplList& l = (*i)->GetTorsionList(); + TorsionImplList::iterator j; + j=std::remove_if(l.begin(), l.end(), + bind(&TorsionImpl::IsAtomInvolved, _1, shared_from_this())); + l.erase(j, l.end()); + } } }}} // ns -- GitLab