From 103e7472c3efc837d22fe6696add3c4c5d31dff7 Mon Sep 17 00:00:00 2001
From: Niklaus Johner <niklaus.johner@unibas.ch>
Date: Fri, 21 Nov 2014 14:11:48 +0100
Subject: [PATCH] Fixed bug in TopologyCreator

Multiple periodic dihedrals and impropers for a single set of atoms
were not terated properly when read from a BuildingBlock.
---
 modules/mol/mm/src/topology_creator.cc | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/modules/mol/mm/src/topology_creator.cc b/modules/mol/mm/src/topology_creator.cc
index 71401b50b..d21526c24 100644
--- a/modules/mol/mm/src/topology_creator.cc
+++ b/modules/mol/mm/src/topology_creator.cc
@@ -652,6 +652,7 @@ TopologyPtr TopologyCreator::Create(const ost::mol::EntityHandle& handle,
 
   if(settings->add_dihedrals){
     //handle dihedrals
+    std::set<Index<4> > dihedrals_to_delete;
     for(uint i = 0; i < top->GetNumResidues(); ++i){
       interaction_list = building_blocks[i]->GetDihedrals();
       for(std::vector<MMInteractionPtr>::iterator j = interaction_list.begin();
@@ -681,7 +682,8 @@ TopologyPtr TopologyCreator::Create(const ost::mol::EntityHandle& handle,
             ss << "defines dihedral, that doesn't exist!";
             throw ost::Error(ss.str());
           }
-          dihedrals.erase(dihedral_index);
+          
+          dihedrals_to_delete.insert(dihedral_index);
           //only periodic dihedrals are supported... 
           parameters = (*j)->GetParam();
           top->AddPeriodicDihedral(one,two,three,four,
@@ -689,6 +691,11 @@ TopologyPtr TopologyCreator::Create(const ost::mol::EntityHandle& handle,
         }
       }
     }
+    
+    for(std::set<Index<4> >::iterator i = dihedrals_to_delete.begin();
+        i != dihedrals_to_delete.end(); ++i){
+      dihedrals.erase(*i);
+    }
 
     //add pointers of dihedrals definitions, that are not already parametrized
     //in the building blocks
@@ -726,6 +733,7 @@ TopologyPtr TopologyCreator::Create(const ost::mol::EntityHandle& handle,
 
   if(settings->add_impropers){
     //handle impropers
+    std::set<Index<4> > impropers_to_delete;
     for(uint i = 0; i < building_blocks.size(); ++i){
       interaction_list = building_blocks[i]->GetImpropers();
       for(std::vector<MMInteractionPtr>::iterator j = interaction_list.begin();
@@ -740,7 +748,7 @@ TopologyPtr TopologyCreator::Create(const ost::mol::EntityHandle& handle,
           uint three = top->GetAtomIndex(i, interaction_atom_names[2]);
           uint four = top->GetAtomIndex(i, interaction_atom_names[3]);
           Index<4> improper_index(one,two,three,four);
-          impropers.erase(improper_index);
+          impropers_to_delete.insert(improper_index);
           parameters = (*j)->GetParam();
           switch((*j)->GetFuncType()){
             case PeriodicImproper:{
@@ -760,6 +768,12 @@ TopologyPtr TopologyCreator::Create(const ost::mol::EntityHandle& handle,
         }
       }
     }
+    
+    for(std::set<Index<4> >::iterator i = impropers_to_delete.begin();
+        i != impropers_to_delete.end(); ++i){
+      impropers.erase(*i);
+    }
+    
     //add pointers of improper definitions, that are not already parametrized
     //in the building blocks
 
-- 
GitLab