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