source: src/Atom/CopyAtoms/CopyAtoms_withBonds.cpp@ b3d687

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since b3d687 was b3d687, checked in by Frederik Heber <heber@…>, 13 years ago

FIX: Filler::operator() did not create a molecule for each cloned cluster.

  • so far we assume (in AtomicInfo) that each atoms always belongs to a molecule. However, the CopyAtomsInterface copies without creating new molecules or associating copied ones with the old molecules.
  • AtomicInfo asserts that atom is associated to a molecule.
  • CopyAtoms_withBonds now associates cloned atoms with molecule of original atom.
  • Filler::operator() creates a molecule for each cloned cluster and associates all atoms in the cluster with it.
  • This [closes #180].
  • Property mode set to 100644
File size: 3.7 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2012 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * CopyAtoms_withBonds.cpp
10 *
11 * Created on: Mar 17, 2012
12 * Author: heber
13 */
14
15
16// include config.h
17#ifdef HAVE_CONFIG_H
18#include <config.h>
19#endif
20
21#include "CodePatterns/MemDebug.hpp"
22
23#include "CopyAtoms_withBonds.hpp"
24
25#include "Bond/bond.hpp"
26#include "CodePatterns/Assert.hpp"
27#include "CodePatterns/Log.hpp"
28#include "molecule.hpp"
29#include "WorldTime.hpp"
30
31void CopyAtoms_withBonds::operator()(const AtomVector &_atoms)
32{
33 CopyAtoms_Simple::operator()(_atoms);
34
35 // create LookupMap
36 LookupMap_t LookupMap = createLookup(_atoms);
37 ASSERT( LookupMap.size() == _atoms.size(),
38 "CopyAtoms_withBonds::operator() - Lookupmap and original AtomVectors differ in size: "
39 +toString(LookupMap.size())+" != "+toString(_atoms.size())+".");
40 ASSERT( LookupMap.size() == CopiedAtoms.size(),
41 "CopyAtoms_withBonds::operator() - Lookupmap and copied AtomVectors differ in size.: "
42 +toString(LookupMap.size())+" != "+toString(CopiedAtoms.size())+".");
43
44 // then go through the bonds of each original atom
45 for (AtomVector::const_iterator original_iter = _atoms.begin();
46 original_iter != _atoms.end(); ++original_iter) {
47 const BondList ListOfBonds = (*original_iter)->getListOfBonds();
48 for(BondList::const_iterator iter = ListOfBonds.begin(); iter != ListOfBonds.end(); ++iter) {
49 // check both bond partners have been copied
50 const bond * const Binder = *iter;
51 if (*original_iter == Binder->leftatom) {
52 LookupMap_t::const_iterator leftiter = LookupMap.find(Binder->leftatom);
53 LookupMap_t::const_iterator rightiter = LookupMap.find(Binder->rightatom);
54 if ((leftiter != LookupMap.end()) && (rightiter != LookupMap.end())) {
55 // create new bond, copy its properties, and register with both copies
56 atom * const LeftAtom = leftiter->second;
57 atom * const RightAtom = rightiter->second;
58 bond * const NewBond = LeftAtom->addBond(WorldTime::getTime(), RightAtom);
59 LOG(3, "DEBUG: Creating copy bond between original " << Binder->leftatom->getId()
60 << " and " << Binder->rightatom->getId() << ": " << *NewBond << ".");
61 NewBond->BondDegree = Binder->BondDegree;
62 NewBond->Cyclic = Binder->Cyclic;
63 NewBond->Type = Binder->Type;
64 } else {
65 LOG(4, "DEBUG: Skipping bond between original atoms " << Binder->leftatom->getId()
66 << " and " << Binder->rightatom->getId() << " as one of them is not present in copied atoms.");
67 }
68 } else {
69 LOG(4, "DEBUG: Skipping bond between original atoms " << Binder->leftatom->getId()
70 << " and " << Binder->rightatom->getId() << " due to wrong order.");
71 }
72 }
73 }
74
75 // associate cloned atoms with molecule from original atom
76 for (AtomVector::const_iterator original_iter = _atoms.begin();
77 original_iter != _atoms.end(); ++original_iter) {
78 const atom * const _atom = *original_iter;
79 molecule * const mol = _atom->getMolecule();
80 if (mol != NULL) {
81 ASSERT( LookupMap.count(_atom),
82 "CopyAtoms_withBonds::operator() - atom "+toString(_atom)+" not found in LookupMap.");
83 mol->AddAtom(LookupMap[_atom]);
84 }
85 }
86
87 // print copied atoms
88 if (DoLog(3))
89 for (AtomVector::const_iterator copy_iter = CopiedAtoms.begin();
90 copy_iter != CopiedAtoms.end(); ++copy_iter) {
91 const BondList ListOfBonds = (*copy_iter)->getListOfBonds();
92 LOG(3, "DEBUG: List of bonds for " << **copy_iter << ": " << ListOfBonds << ".");
93 }
94}
Note: See TracBrowser for help on using the repository browser.