source: src/molecule.hpp@ 88c8ec

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 88c8ec was 88c8ec, checked in by Frederik Heber <heber@…>, 13 years ago

REFACTOR: Replaced all "bond *" appearances by bond::ptr.

  • this is preparatory for making bond::ptr a boost::shared_ptr of bond.
  • NOTE: We had to remove a const prefix at four or five places and forward declarations had to be replaced by the true inclusion of bond.hpp at tne or so files. Apart from that, the replacement has been very smooth.
  • Property mode set to 100755
File size: 9.1 KB
Line 
1/** \file molecule.hpp
2 *
3 * Class definitions of atom and molecule, element and periodentafel
4 */
5
6#ifndef MOLECULES_HPP_
7#define MOLECULES_HPP_
8
9/*********************************************** includes ***********************************/
10
11#ifdef HAVE_CONFIG_H
12#include <config.h>
13#endif
14
15//// STL headers
16#include <map>
17#include <set>
18#include <stack>
19#include <deque>
20#include <list>
21#include <vector>
22
23#include <string>
24
25#include "AtomIdSet.hpp"
26#include "Atom/AtomSet.hpp"
27#include "CodePatterns/Cacheable.hpp"
28#include "CodePatterns/Observer/Observable.hpp"
29#include "Descriptors/AtomIdDescriptor.hpp"
30#include "Fragmentation/HydrogenSaturation_enum.hpp"
31#include "Formula.hpp"
32#include "Helpers/defs.hpp"
33#include "IdPool_policy.hpp"
34#include "IdPool.hpp"
35#include "Shapes/Shape.hpp"
36#include "types.hpp"
37
38/****************************************** forward declarations *****************************/
39
40class atom;
41class bond;
42class BondedParticle;
43class BondGraph;
44class DepthFirstSearchAnalysis;
45class element;
46class ForceMatrix;
47class Graph;
48class LinkedCell_deprecated;
49class ListOfLocalAtoms_t;
50class molecule;
51class MoleculeLeafClass;
52class MoleculeListClass;
53class MoleculeUnittest;
54class RealSpaceMatrix;
55class Vector;
56
57/************************************* Class definitions ****************************************/
58
59/** The complete molecule.
60 * Class incorporates number of types
61 */
62class molecule : public Observable
63{
64 //!> grant unit test access
65 friend class MoleculeUnittest;
66 //!> function may access cstor
67 friend molecule *NewMolecule();
68 //!> function may access dstor
69 friend void DeleteMolecule(molecule *);
70
71public:
72 typedef AtomIdSet::atomIdSet atomIdSet;
73 typedef AtomIdSet::iterator iterator;
74 typedef AtomIdSet::const_iterator const_iterator;
75
76 int MDSteps; //!< The number of MD steps in Trajectories
77 mutable int NoNonBonds; //!< number of non-hydrogen bonds in molecule
78 mutable int NoCyclicBonds; //!< number of cyclic bonds in molecule, by DepthFirstSearchAnalysis()
79 bool ActiveFlag; //!< in a MoleculeListClass used to discern active from inactive molecules
80 int IndexNr; //!< index of molecule in a MoleculeListClass
81 char name[MAXSTRINGSIZE]; //!< arbitrary name
82
83private:
84 Formula formula;
85 Cacheable<size_t> NoNonHydrogen; //!< number of non-hydrogen atoms in molecule
86 Cacheable<int> BondCount; //!< number of atoms, brought up-to-date by doCountBonds()
87 moleculeId_t id;
88 AtomIdSet atomIds; //<!set of atomic ids to check uniqueness of atoms
89 IdPool<atomId_t, uniqueId> atomIdPool; //!< pool of internal ids such that way may guarantee uniqueness
90
91protected:
92
93 molecule();
94 virtual ~molecule();
95
96public:
97
98 /******* Notifications *******/
99
100 //!> enumeration of present notification types: only insertion/removal of atoms or molecules
101 enum NotificationType {
102 AtomInserted,
103 AtomRemoved,
104 AtomNrChanged,
105 MoleculeNameChanged,
106 NotificationType_MAX
107 };
108
109public:
110 //getter and setter
111 const std::string getName() const;
112 int getAtomCount() const;
113 size_t doCountNoNonHydrogen() const;
114 size_t getNoNonHydrogen() const;
115 int getBondCount() const;
116 int doCountBonds() const;
117 moleculeId_t getId() const;
118 void setId(moleculeId_t);
119 void setName(const std::string);
120 const Formula &getFormula() const;
121 unsigned int getElementCount() const;
122 bool hasElement(const element*) const;
123 bool hasElement(atomicNumber_t) const;
124 bool hasElement(const std::string&) const;
125
126 virtual bool changeId(atomId_t newId);
127
128 World::AtomComposite getAtomSet() const;
129
130 // simply pass on all functions to AtomIdSet
131 iterator begin() {
132 return atomIds.begin();
133 }
134 const_iterator begin() const
135 {
136 return atomIds.begin();
137 }
138 iterator end()
139 {
140 return atomIds.end();
141 }
142 const_iterator end() const
143 {
144 return atomIds.end();
145 }
146 bool empty() const
147 {
148 return atomIds.empty();
149 }
150 size_t size() const
151 {
152 return atomIds.size();
153 }
154 const_iterator find(atom * key) const
155 {
156 return atomIds.find(key);
157 }
158
159 /** Returns the set of atomic ids contained in this molecule.
160 *
161 * @return set of atomic ids
162 */
163 const atomIdSet & getAtomIds() const {
164 return atomIds.getAtomIds();
165 }
166
167 std::pair<iterator, bool> insert(atom * const key);
168
169 /** Predicate whether given \a key is contained in this molecule.
170 *
171 * @param key atom to check
172 * @return true - is contained, false - else
173 */
174 bool containsAtom(const atom* key) const
175 {
176 return atomIds.contains(key);
177 }
178
179 /** Predicate whether given \a id is contained in this molecule.
180 *
181 * @param id atomic id to check
182 * @return true - is contained, false - else
183 */
184 bool containsAtom(const atomId_t id) const
185 {
186 return atomIds.contains(id);
187 }
188
189private:
190 friend void atom::removeFromMolecule();
191 /** Erase an atom from the list.
192 * \note This should only be called by atom::removeFromMolecule(),
193 * otherwise it is not assured that the atom knows about it.
194 *
195 * @param loc locator to atom in list
196 * @return iterator to just after removed item (compliant with standard)
197 */
198 const_iterator erase(const_iterator loc);
199
200 /** Erase an atom from the list.
201 * \note This should only be called by atom::removeFromMolecule(),
202 * otherwise it is not assured that the atom knows about it.
203 *
204 * @param *key key to atom in list
205 * @return iterator to just after removed item (compliant with standard)
206 */
207 const_iterator erase(atom * key);
208
209private:
210 friend bool atom::changeNr(int newId);
211 /**
212 * used when changing an ParticleInfo::Nr.
213 * Note that this number is local with this molecule.
214 * Unless you are calling this method from inside an atom don't fiddle with the third parameter.
215 *
216 * @param oldNr old Nr
217 * @param newNr new Nr to set
218 * @param *target ref to atom
219 * @return indicates wether the change could be done or not.
220 */
221 bool changeAtomNr(int oldNr, int newNr, atom* target=0);
222
223 /** Sets the name of the atom.
224 *
225 * The name is set via its element symbol and its internal ParticleInfo::Nr.
226 *
227 * @param _atom atom whose name to set
228 */
229 void setAtomName(atom *_atom) const;
230
231public:
232
233 /** Function to create a bounding spherical shape for the currently associated atoms.
234 *
235 * \param boundary extra boundary of shape around (i.e. distance between outermost atom
236 * and the shape's surface)
237 */
238 Shape getBoundingShape(const double boundary = 0.) const;
239
240 /// remove atoms from molecule.
241 bool AddAtom(atom *pointer);
242 bool RemoveAtom(atom *pointer);
243 bool UnlinkAtom(atom *pointer);
244 bool CleanupMolecule();
245 void removeAtomsinMolecule();
246
247 /// Add/remove atoms to/from molecule.
248 atom * AddCopyAtom(atom *pointer);
249 bool AddHydrogenReplacementAtom(bond::ptr Bond, atom *BottomOrigin, atom *TopOrigin, atom *TopReplacement, bool IsAngstroem);
250 bond::ptr AddBond(atom *first, atom *second, int degree = 1);
251 bool RemoveBond(bond::ptr pointer);
252 bool RemoveBonds(atom *BondPartner);
253 bool hasBondStructure() const;
254
255 /// Find atoms.
256 atom * FindAtom(int Nr) const;
257 atom * AskAtom(std::string text);
258 bool isInMolecule(const atom * const _atom);
259
260 /// Count and change present atoms' coordination.
261 bool CenterInBox();
262 bool BoundInBox();
263 void CenterEdge(Vector *max);
264 void CenterOrigin();
265 void CenterPeriodic();
266 void CenterAtVector(Vector *newcenter);
267 void Translate(const Vector *x);
268 void TranslatePeriodically(const Vector *trans);
269 void Mirror(const Vector *x);
270 void Align(Vector *n);
271 void Scale(const double ** const factor);
272 void DeterminePeriodicCenter(Vector &center, const enum HydrogenSaturation _saturation = DoSaturate);
273 Vector * DetermineCenterOfGravity() const;
274 Vector * DetermineCenterOfAll() const;
275 Vector * DetermineCenterOfBox() const;
276 void SetNameFromFilename(const char *filename);
277 void SetBoxDimension(Vector *dim);
278 bool ScanForPeriodicCorrection();
279 double VolumeOfConvexEnvelope(bool IsAngstroem);
280 RealSpaceMatrix getInertiaTensor() const;
281 void RotateToPrincipalAxisSystem(const Vector &Axis);
282
283 bool CheckBounds(const Vector *x) const;
284 void GetAlignvector(struct lsq_params * par) const;
285
286 /// Initialising routines in fragmentation
287 void OutputBondsList() const;
288
289 bond::ptr CopyBond(atom *left, atom *right, bond::ptr CopyBond);
290
291 molecule *CopyMolecule(const Vector &offset = zeroVec) const;
292 molecule* CopyMoleculeFromSubRegion(const Shape&) const;
293
294 /// Fragment molecule by two different approaches:
295 bool StoreBondsToFile(std::string filename, std::string path = "");
296 bool CreateFatherLookupTable(ListOfLocalAtoms_t &LookupTable, int count = 0);
297
298 // Recognize doubly appearing molecules in a list of them
299 int * GetFatherSonAtomicMap(molecule *OtherMolecule);
300 bool FillBondStructureFromReference(const molecule * const reference, ListOfLocalAtoms_t &ListOfLocalAtoms, bool FreeList = false);
301 bool FillListOfLocalAtoms(ListOfLocalAtoms_t &ListOfLocalAtoms, const int GlobalAtomCount);
302
303 // Output routines.
304 bool Output(std::ostream * const output) const;
305 void OutputListOfBonds() const;
306
307 // Manipulation routines
308 void flipActiveFlag();
309
310private:
311 int last_atom; //!< number given to last atom
312};
313
314molecule *NewMolecule();
315void DeleteMolecule(molecule* mol);
316
317
318
319#endif /*MOLECULES_HPP_*/
320
Note: See TracBrowser for help on using the repository browser.