source: src/molecule_graph.cpp@ 9b410d

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 9b410d was 13a953, checked in by Frederik Heber <heber@…>, 14 years ago

Moved molecule::CheckAdjacencyAgainstFile() into functor in Graph/.

  • Note that this is currently not working because there is no correct mapping from indices in the adjacency file to the indices of the atoms (and without some fixed mean of aligning atoms, this will never be possible).
  • Property mode set to 100644
File size: 7.7 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * molecule_graph.cpp
10 *
11 * Created on: Oct 5, 2009
12 * Author: heber
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include "CodePatterns/MemDebug.hpp"
21
22#include <stack>
23
24#include "atom.hpp"
25#include "Bond/bond.hpp"
26#include "Box.hpp"
27#include "CodePatterns/Assert.hpp"
28#include "CodePatterns/Info.hpp"
29#include "CodePatterns/Log.hpp"
30#include "CodePatterns/Verbose.hpp"
31#include "config.hpp"
32#include "Graph/DepthFirstSearchAnalysis.hpp"
33#include "element.hpp"
34#include "Graph/BondGraph.hpp"
35#include "Helpers/defs.hpp"
36#include "Helpers/fast_functions.hpp"
37#include "Helpers/helpers.hpp"
38#include "LinearAlgebra/RealSpaceMatrix.hpp"
39#include "linkedcell.hpp"
40#include "molecule.hpp"
41#include "PointCloudAdaptor.hpp"
42#include "World.hpp"
43#include "WorldTime.hpp"
44
45
46/** Fills the bond structure of this chain list subgraphs that are derived from a complete \a *reference molecule.
47 * Calls this routine in each MoleculeLeafClass::next subgraph if it's not NULL.
48 * \param *reference reference molecule with the bond structure to be copied
49 * \param **&ListOfLocalAtoms Lookup table for this subgraph and index of each atom in \a *reference, may be NULL on start, then it is filled
50 * \param FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not
51 * \return true - success, false - failure
52 */
53bool molecule::FillBondStructureFromReference(const molecule * const reference, atom **&ListOfLocalAtoms, bool FreeList)
54{
55 atom *OtherWalker = NULL;
56 atom *Father = NULL;
57 bool status = true;
58 int AtomNo;
59
60 DoLog(1) && (Log() << Verbose(1) << "Begin of FillBondStructureFromReference." << endl);
61 // fill ListOfLocalAtoms if NULL was given
62 if (!FillListOfLocalAtoms(ListOfLocalAtoms, reference->getAtomCount())) {
63 DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
64 return false;
65 }
66
67 if (status) {
68 DoLog(1) && (Log() << Verbose(1) << "Creating adjacency list for molecule " << getName() << "." << endl);
69 // remove every bond from the list
70 for_each(begin(), end(),
71 boost::bind(&BondedParticle::ClearBondsAtStep,_1,WorldTime::getTime()));
72
73
74 for(molecule::const_iterator iter = begin(); iter != end(); ++iter) {
75 Father = (*iter)->GetTrueFather();
76 AtomNo = Father->getNr(); // global id of the current walker
77 const BondList& ListOfBonds = Father->getListOfBonds();
78 for (BondList::const_iterator Runner = ListOfBonds.begin();
79 Runner != ListOfBonds.end();
80 ++Runner) {
81 OtherWalker = ListOfLocalAtoms[(*Runner)->GetOtherAtom((*iter)->GetTrueFather())->getNr()]; // local copy of current bond partner of walker
82 if (OtherWalker != NULL) {
83 if (OtherWalker->getNr() > (*iter)->getNr())
84 AddBond((*iter), OtherWalker, (*Runner)->BondDegree);
85 } else {
86 DoLog(1) && (Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << (*Runner)->GetOtherAtom((*iter)->GetTrueFather())->getNr() << "] is NULL!" << endl);
87 status = false;
88 }
89 }
90 }
91 }
92
93 if ((FreeList) && (ListOfLocalAtoms != NULL)) {
94 // free the index lookup list
95 delete[](ListOfLocalAtoms);
96 }
97 DoLog(1) && (Log() << Verbose(1) << "End of FillBondStructureFromReference." << endl);
98 return status;
99};
100
101/** Checks for presence of bonds within atom list.
102 * TODO: more sophisticated check for bond structure (e.g. connected subgraph, ...)
103 * \return true - bonds present, false - no bonds
104 */
105bool molecule::hasBondStructure() const
106{
107 for(molecule::const_iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner) {
108 const BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
109 if (!ListOfBonds.empty())
110 return true;
111 }
112 return false;
113}
114
115/** Prints a list of all bonds to \a *out.
116 */
117void molecule::OutputBondsList() const
118{
119 DoLog(1) && (Log() << Verbose(1) << endl << "From contents of bond chain list:");
120 for(molecule::const_iterator AtomRunner = molecule::begin(); AtomRunner != molecule::end(); ++AtomRunner) {
121 const BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
122 for(BondList::const_iterator BondRunner = ListOfBonds.begin();
123 BondRunner != ListOfBonds.end();
124 ++BondRunner)
125 if ((*BondRunner)->leftatom == *AtomRunner) {
126 DoLog(0) && (Log() << Verbose(0) << *(*BondRunner) << "\t" << endl);
127 }
128 }
129 DoLog(0) && (Log() << Verbose(0) << endl);
130}
131;
132
133
134/** Storing the bond structure of a molecule to file.
135 * Simply stores Atom::Nr and then the Atom::Nr of all bond partners per line.
136 * \param &filename name of file
137 * \param path path to file, defaults to empty
138 * \return true - file written successfully, false - writing failed
139 */
140bool molecule::StoreAdjacencyToFile(std::string filename, std::string path)
141{
142 ofstream AdjacencyFile;
143 string line;
144 bool status = true;
145
146 if (path != "")
147 line = path + "/" + filename;
148 else
149 line = filename;
150 AdjacencyFile.open(line.c_str(), ios::out);
151 DoLog(1) && (Log() << Verbose(1) << "Saving adjacency list ... " << endl);
152 if (AdjacencyFile.good()) {
153 AdjacencyFile << "m\tn" << endl;
154 for_each(atoms.begin(),atoms.end(),bind2nd(mem_fun(&atom::OutputAdjacency),&AdjacencyFile));
155 AdjacencyFile.close();
156 DoLog(1) && (Log() << Verbose(1) << "\t... done." << endl);
157 } else {
158 DoLog(1) && (Log() << Verbose(1) << "\t... failed to open file " << line << "." << endl);
159 status = false;
160 }
161
162 return status;
163}
164;
165
166/** Storing the bond structure of a molecule to file.
167 * Simply stores Atom::Nr and then the Atom::Nr of all bond partners, one per line.
168 * \param &filename name of file
169 * \param path path to file, defaults to empty
170 * \return true - file written successfully, false - writing failed
171 */
172bool molecule::StoreBondsToFile(std::string filename, std::string path)
173{
174 ofstream BondFile;
175 string line;
176 bool status = true;
177
178 if (path != "")
179 line = path + "/" + filename;
180 else
181 line = filename;
182 BondFile.open(line.c_str(), ios::out);
183 DoLog(1) && (Log() << Verbose(1) << "Saving adjacency list ... " << endl);
184 if (BondFile.good()) {
185 BondFile << "m\tn" << endl;
186 for_each(atoms.begin(),atoms.end(),bind2nd(mem_fun(&atom::OutputBonds),&BondFile));
187 BondFile.close();
188 DoLog(1) && (Log() << Verbose(1) << "\t... done." << endl);
189 } else {
190 DoLog(1) && (Log() << Verbose(1) << "\t... failed to open file " << line << "." << endl);
191 status = false;
192 }
193
194 return status;
195}
196;
197
198/** Adds a bond as a copy to a given one
199 * \param *left leftatom of new bond
200 * \param *right rightatom of new bond
201 * \param *CopyBond rest of fields in bond are copied from this
202 * \return pointer to new bond
203 */
204bond * molecule::CopyBond(atom *left, atom *right, bond *CopyBond)
205{
206 bond *Binder = AddBond(left, right, CopyBond->BondDegree);
207 Binder->Cyclic = CopyBond->Cyclic;
208 Binder->Type = CopyBond->Type;
209 return Binder;
210}
211;
212
213/** Fills a lookup list of father's Atom::nr -> atom for each subgraph.
214 * \param **&ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled
215 * \param GlobalAtomCount number of atoms in the complete molecule
216 * \return true - success, false - failure (ListOfLocalAtoms != NULL)
217 */
218bool molecule::FillListOfLocalAtoms(atom **&ListOfLocalAtoms, const int GlobalAtomCount)
219{
220 bool status = true;
221
222 if (ListOfLocalAtoms == NULL) { // allocate and fill list of this fragment/subgraph
223 status = status && CreateFatherLookupTable(ListOfLocalAtoms, GlobalAtomCount);
224 } else
225 return false;
226
227 return status;
228}
229
Note: See TracBrowser for help on using the repository browser.