diff --git a/modules/mol/mm/src/topology_creator.cc b/modules/mol/mm/src/topology_creator.cc index 71401b50b14f3873690f2227214fd32b51ad68d0..d21526c2428ae47b01c28e658d1d32bd7a85462a 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