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