Chemical Data Processing Library C++ API - Version 1.4.0
ResonanceStructureGenerator.hpp
Go to the documentation of this file.
1 /*
2  * ResonanceStructureGenerator.hpp
3  *
4  * This file is part of the Chemical Data Processing Toolkit
5  *
6  * Copyright (C) 2003 Thomas Seidel <thomas.seidel@univie.ac.at>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; see the file COPYING. If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 
29 #ifndef CDPL_CHEM_RESONANCESTRUCTUREGENERATOR_HPP
30 #define CDPL_CHEM_RESONANCESTRUCTUREGENERATOR_HPP
31 
32 #include <vector>
33 #include <cstddef>
34 #include <unordered_set>
35 #include <memory>
36 
37 #include <boost/iterator/indirect_iterator.hpp>
38 
39 #include "CDPL/Chem/APIPrefix.hpp"
40 #include "CDPL/Util/Array.hpp"
41 #include "CDPL/Util/BitSet.hpp"
42 #include "CDPL/Util/ObjectPool.hpp"
43 
44 
45 namespace CDPL
46 {
47 
48  namespace Chem
49  {
50 
51  class MolecularGraph;
52  class Atom;
53 
63  {
64 
65  public:
66  class StructureData;
67 
68  private:
70  typedef StructureDataCache::SharedObjectPointer StructureDataPtr;
71  typedef std::vector<StructureDataPtr> StructureDataList;
72 
73  public:
77  typedef std::shared_ptr<ResonanceStructureGenerator> SharedPointer;
78 
82  typedef boost::indirect_iterator<StructureDataList::const_iterator, const StructureData> ConstStructureDataIterator;
83 
88  {
89 
91 
92  public:
97  const Util::LArray& getAtomCharges() const;
98 
103  const Util::STArray& getBondOrders() const;
104 
105  private:
106  Util::LArray atomCharges;
107  Util::STArray bondOrders;
108  std::size_t numCharges;
109  };
110 
115 
121 
126 
133 
139 
145 
150  void minimizeOctetRuleViolations(bool minimize);
151 
157 
162  void minimizeSP1GeometryViolations(bool minimize);
163 
169 
174  void minimizeCarbonBond12Charges(bool minimize);
175 
181 
186  void setChargeCountWindow(std::size_t win_size);
187 
192  std::size_t getChargeCountWindow() const;
193 
198  void setMaxNumGeneratedStructures(std::size_t max_num);
199 
204  std::size_t getMaxNumGeneratedStructures() const;
205 
210  void generate(const MolecularGraph& molgraph);
211 
216  std::size_t getNumStructures() const;
217 
224  const StructureData& getStructureData(std::size_t idx) const;
225 
231 
237 
243 
249 
250  private:
251  struct BondData
252  {
253 
254  std::size_t atom1Index;
255  std::size_t atom2Index;
256  std::size_t bondIndex;
257  };
258 
259  class AtomData
260  {
261 
262  public:
263  long init(const Atom& atom, const MolecularGraph& molgraph, std::size_t idx);
264 
265  bool canShiftElectrons() const;
266 
267  std::size_t getNumBonds() const;
268 
269  std::size_t getBondIndex(std::size_t list_idx) const;
270 
271  std::size_t getAtomIndex(std::size_t list_idx) const;
272 
273  std::size_t getIndex() const;
274 
275  unsigned int getType() const;
276 
277  double getElectronegativity() const;
278 
279  bool isSP1Hybridized(const StructureData& res_struct) const;
280 
281  bool checkValenceState(const StructureData& res_struct, long val_diff, long charge_diff) const;
282 
283  bool octetRuleFulfilled(const StructureData& res_struct) const;
284 
285  std::size_t countRepChargePairs(const Util::LArray& charges) const;
286 
287  bool getVisitedFlag() const;
288 
289  void setVisitedFlag();
290 
291  bool getInSmallRingFlag() const;
292 
293  void setInSmallRingFlag();
294 
295  private:
296  typedef std::vector<std::size_t> IndexArray;
297 
298  bool canShiftElecs;
299  std::size_t index;
300  unsigned int type;
301  long valElecCount;
302  std::size_t unprdElecCount;
303  std::size_t implHCount;
304  double enegativity;
305  IndexArray bondIndices;
306  IndexArray atomIndices;
307  bool inSmallRing;
308  bool visited;
309  };
310 
311  struct StructureDataPtrHashFunc
312  {
313 
314  std::size_t operator()(const StructureDataPtr& rs_ptr) const;
315  };
316 
317  struct StructureDataPtrCmpFunc
318  {
319 
320  bool operator()(const StructureDataPtr& rs_ptr1, const StructureDataPtr& rs_ptr2) const
321  {
322  return (rs_ptr1->getBondOrders() == rs_ptr2->getBondOrders() &&
323  rs_ptr1->getAtomCharges() == rs_ptr2->getAtomCharges());
324  }
325  };
326 
327  typedef std::vector<AtomData> AtomDataArray;
328  typedef std::vector<const AtomData*> AtomDataPtrArray;
329  typedef std::vector<BondData> BondDataList;
330  typedef std::unordered_set<StructureDataPtr, StructureDataPtrHashFunc, StructureDataPtrCmpFunc> StructureDataSet;
331 
332  void init(const MolecularGraph& molgraph);
333 
334  void createInputResStructData();
335 
336  void extractResBonds();
337  void extractResBonds(AtomData& atom_data);
338 
339  void genStartResStructs();
340  void genStartResStructs(std::size_t depth, std::size_t num_rep_chg_pairs);
341 
342  std::size_t countRepChargePairs() const;
343 
344  void genOutputResStructs();
345  void genOutputResStructs(StructureData& res_struct, std::size_t depth, std::size_t con_idx,
346  std::size_t num_charges);
347 
348  void postprocOutputResStructs();
349 
350  void minimzeResStructProperty(std::size_t (ResonanceStructureGenerator::*prop_func)(const StructureData&) const);
351 
352  std::size_t countOctetRuleViolations(const StructureData& res_struct) const;
353  std::size_t countSP1GeometryViolations(const StructureData& res_struct) const;
354  std::size_t count12ChargedCBonds(const StructureData& res_struct) const;
355 
356  void modifyResStruct(StructureData& res_struct, std::size_t bond_idx, std::size_t atom1_idx, std::size_t atom2_idx,
357  long bond_order_diff, long atom1_chg_diff, long atom2_chg_diff) const;
358 
359  StructureDataPtr copyResStructPtr(const StructureDataPtr& res_struct_ptr);
360  StructureDataPtr copyResStruct(const StructureData& res_struct);
361 
362  StructureDataCache resStructDataCache;
363  bool minOctRuleViolations;
364  bool minSP1GeomViolations;
365  bool minCBond12Charges;
366  std::size_t chargeCountWin;
367  Util::BitSet octRuleCheckAtomTypes;
368  std::size_t maxNumGenStructs;
369  const MolecularGraph* molGraph;
370  AtomDataArray atomData;
371  AtomDataPtrArray resAtoms;
372  BondDataList resBonds;
373  StructureData inputResStruct;
374  StructureDataList startResStructs;
375  StructureDataSet workingResStructs;
376  StructureDataList outputResStructs;
377  StructureDataList tmpOutputResStructs;
378  Util::LArray chargeDiffPtn;
379  Util::BitSet visBondMask;
380  std::size_t minNumRepChargePairs;
381  std::size_t minNumCharges;
382  };
383  } // namespace Chem
384 } // namespace CDPL
385 
386 #endif // CDPL_CHEM_RESONANCESTRUCTUREGENERATOR_HPP
Definition of class CDPL::Util::Array.
Declaration of type CDPL::Util::BitSet.
Definition of the preprocessor macro CDPL_CHEM_API.
#define CDPL_CHEM_API
Tells the compiler/linker which classes, functions and variables are part of the library API.
Definition of class CDPL::Util::ObjectPool.
Abstract base class representing a chemical atom and its bonded neighborhood.
Definition: Atom.hpp:57
Abstract base class for representations of a chemical structure as a graph of bonded atoms.
Definition: MolecularGraph.hpp:57
Holds the per-atom formal charges and per-bond orders that define a single resonance structure.
Definition: ResonanceStructureGenerator.hpp:88
const Util::LArray & getAtomCharges() const
Returns the per-atom formal charges of this resonance structure.
const Util::STArray & getBondOrders() const
Returns the bond orders of this resonance structure.
Enumerates the resonance structures of a molecular graph by redistributing π-electrons across the res...
Definition: ResonanceStructureGenerator.hpp:63
std::shared_ptr< ResonanceStructureGenerator > SharedPointer
A reference-counted smart pointer [SHPTR] for dynamically allocated ResonanceStructureGenerator insta...
Definition: ResonanceStructureGenerator.hpp:77
ConstStructureDataIterator begin() const
Returns a constant iterator pointing to the first generated record (range-based for support).
ResonanceStructureGenerator(const ResonanceStructureGenerator &gen)
Constructs a copy of the ResonanceStructureGenerator instance gen.
void minimizeOctetRuleViolations(bool minimize)
Specifies whether resonance structures violating the octet rule shall be filtered out.
bool octetRuleViolationsMinimized() const
Tells whether octet-rule violations are minimized.
Util::BitSet & getOctetRuleCheckAtomTypes()
Returns the bit mask of atom types subjected to the octet-rule check during minimization.
void setChargeCountWindow(std::size_t win_size)
Sets the maximum allowed difference between the lowest and highest formal charge count of accepted re...
std::size_t getMaxNumGeneratedStructures() const
Returns the upper limit on the number of resonance structures generated per molecule.
ConstStructureDataIterator getStructureDataEnd() const
Returns a constant iterator pointing one past the last generated resonance-structure record.
ConstStructureDataIterator end() const
Returns a constant iterator pointing one past the last generated record (range-based for support).
ResonanceStructureGenerator & operator=(const ResonanceStructureGenerator &gen)
Replaces the state of this generator by a copy of the state of gen.
const StructureData & getStructureData(std::size_t idx) const
Returns the resonance-structure record at index idx.
ResonanceStructureGenerator()
Constructs the ResonanceStructureGenerator instance.
boost::indirect_iterator< StructureDataList::const_iterator, const StructureData > ConstStructureDataIterator
A constant iterator over the generated resonance-structure records.
Definition: ResonanceStructureGenerator.hpp:82
bool sp1GeometryViolationsMinimized() const
Tells whether sp-hybridization-geometry violations are minimized.
ConstStructureDataIterator getStructureDataBegin() const
Returns a constant iterator pointing to the first generated resonance-structure record.
const Util::BitSet & getOctetRuleCheckAtomTypes() const
Returns the bit mask of atom types subjected to the octet-rule check during minimization.
void generate(const MolecularGraph &molgraph)
Generates all unique resonance structures of the molecular graph molgraph.
bool carbonBond12ChargesMinimized() const
Tells whether 1,2-charge separations on adjacent carbon atoms are minimized.
std::size_t getChargeCountWindow() const
Returns the configured charge-count window size.
void minimizeCarbonBond12Charges(bool minimize)
Specifies whether resonance structures with 1,2-charge separations on adjacent carbon atoms shall be ...
virtual ~ResonanceStructureGenerator()
Virtual destructor.
Definition: ResonanceStructureGenerator.hpp:125
void setMaxNumGeneratedStructures(std::size_t max_num)
Sets the upper limit on the number of resonance structures generated per molecule.
void minimizeSP1GeometryViolations(bool minimize)
Specifies whether resonance structures with sp-hybridization-geometry violations shall be filtered ou...
std::size_t getNumStructures() const
Returns the number of generated resonance structures.
std::shared_ptr< ObjectType > SharedObjectPointer
A smart pointer to a borrowed object that returns the object to the pool on destruction.
Definition: ObjectPool.hpp:71
CDPL_CHEM_API unsigned int getType(const Atom &atom)
Returns the value of the Chem::AtomProperty::TYPE property of the atom atom.
Array< std::size_t > STArray
Array storing unsigned integers of type std::size_t.
Definition: Array.hpp:578
Array< long > LArray
Array storing integers of type long.
Definition: Array.hpp:583
boost::dynamic_bitset BitSet
Dynamic bitset class.
Definition: BitSet.hpp:46
The namespace of the Chemical Data Processing Library.