Chemical Data Processing Library C++ API - Version 1.4.0
BondOrderCalculator.hpp
Go to the documentation of this file.
1 /*
2  * BondOrderCalculator.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_BONDORDERCALCULATOR_HPP
30 #define CDPL_CHEM_BONDORDERCALCULATOR_HPP
31 
32 #include <cstddef>
33 #include <vector>
34 #include <utility>
35 #include <memory>
36 
37 #include "CDPL/Chem/APIPrefix.hpp"
38 #include "CDPL/Math/Vector.hpp"
39 #include "CDPL/Util/Array.hpp"
40 #include "CDPL/Util/BitSet.hpp"
41 
42 
43 namespace CDPL
44 {
45 
46  namespace Chem
47  {
48 
49  class SubstructureSearch;
50  class Fragment;
51  class MolecularGraph;
52  class Atom;
53  class Bond;
54  class AtomBondMapping;
55 
65  {
66 
67  public:
72 
82  BondOrderCalculator(const MolecularGraph& molgraph, Util::STArray& orders, bool undef_only = true);
83 
89  void undefinedOnly(bool undef_only);
90 
95  bool undefinedOnly() const;
96 
105  void calculate(const MolecularGraph& molgraph, Util::STArray& orders);
106 
107  private:
108  enum Geometry
109  {
110 
111  UNDEF,
112  TERMINAL,
113  LINEAR,
114  TRIG_PLANAR,
116  };
117 
118  typedef std::shared_ptr<MolecularGraph> MolecularGraphPtr;
119  typedef std::shared_ptr<SubstructureSearch> SubstructureSearchPtr;
120  typedef std::vector<const Bond*> BondList;
121  typedef std::vector<const Atom*> AtomList;
122  typedef std::vector<std::size_t> UIntTable;
123  typedef std::vector<Geometry> GeometryTable;
124  typedef std::vector<MolecularGraphPtr> MolecularGraphPtrList;
125  typedef std::vector<std::pair<double, const AtomBondMapping*> > ABMappingList;
126 
127  class AtomMatchExpression;
128  class BondMatchExpression;
129 
130  friend class BondMatchExpression;
131 
132  void init(const MolecularGraph& molgraph, Util::STArray& orders);
133 
134  void calcFreeAtomValences(Util::STArray& orders);
135  void perceiveAtomGeometries(Util::STArray& orders);
136  void assignBondOrders(Util::STArray& orders);
137 
138  void assignTetrahedralAtomBondOrders(Util::STArray& orders);
139  void assignFunctionalGroupBondOrders(Util::STArray& orders);
140  void assignConjPiSystemBondOrders(Util::STArray& orders);
141  void assignRemainingBondOrders(Util::STArray& orders);
142  void fixNitroGroups(Util::STArray& orders);
143 
144  void assignFragBondOrders(std::size_t depth, Util::STArray& orders);
145 
146  double calcHybridizationMatchScore();
147  double calcMappingScore(const AtomBondMapping& mapping) const;
148 
149  void markPlanarPiBonds(Util::STArray& orders);
150 
151  Geometry perceiveInitialGeometry(const Atom& atom);
152  void fixRingAtomGeometries(const Fragment& ring);
153  void postprocessGeometry(const Atom& atom, Util::STArray& orders);
154 
155  void assignNbrBondOrders(const Atom& atom, Util::STArray& orders);
156 
157  void getNeighborAtoms(const Atom& atom, AtomList& atom_list, const Atom* exclude_atom) const;
158  std::size_t countBondsWithOrder(const Atom& atom, std::size_t order, const UIntTable& order_table) const;
159 
160  template <typename Pred>
161  void getUndefBondFragment(const Atom& atom, bool add_atoms, const Pred& bond_pred);
162 
163  double calcAvgBondAngle(const Atom& atom, const AtomList& nbr_atoms) const;
164  double calcDihedralAngle(const Atom& atom1, const Atom& atom2, const Atom& atom3, const Atom& atom4) const;
165  double calcDihedralAngle(const Math::Vector3D& atom1_pos, const Math::Vector3D& atom2_pos,
166  const Math::Vector3D& atom3_pos, const Math::Vector3D& atom4_pos) const;
167  double calcAvgTorsionAngle(const Fragment& ring) const;
168 
169  bool isPlanarPiBond(const Bond& bond) const;
170 
171  const MolecularGraph* molGraph;
172  bool undefOnly;
173  Util::BitSet defOrderMask;
174  Util::BitSet multibondAtomMask;
175  UIntTable freeAtomValences;
176  GeometryTable atomGeometries;
177  BondList undefBonds;
178  BondList fragBondList;
179  AtomList fragAtomList;
180  AtomList nbrAtomList1;
181  AtomList nbrAtomList2;
182  UIntTable fragBondOrders;
183  UIntTable workingBondOrders;
184  double currOrderAssmentScore;
185  double bestOrderAssmentScore;
186  SubstructureSearchPtr substructSearch;
187  MolecularGraphPtrList funcGroupPatterns;
188  ABMappingList funcGroupMappings;
189  Util::BitSet procMappingMask;
190  Util::BitSet bondMappingMask1;
191  Util::BitSet bondMappingMask2;
192  Util::BitSet planarPiBondMask;
193  };
194  } // namespace Chem
195 } // namespace CDPL
196 
197 #endif // CDPL_CHEM_BONDORDERCALCULATOR_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 vector data types.
Data structure for the common storage of related atom to atom and bond to bond mappings.
Definition: AtomBondMapping.hpp:55
Abstract base class representing a chemical atom and its bonded neighborhood.
Definition: Atom.hpp:57
Perceives bond orders of a molecular graph from its 3D structure and atom connectivity.
Definition: BondOrderCalculator.hpp:65
bool undefinedOnly() const
Tells whether or not only undefined bond orders have to be perceived.
BondOrderCalculator(const MolecularGraph &molgraph, Util::STArray &orders, bool undef_only=true)
Constructs the BondOrderCalculator instance and perceives the order of the bonds in the molecular gra...
void undefinedOnly(bool undef_only)
Allows to specify whether already defined bond orders should be left unchanged.
void calculate(const MolecularGraph &molgraph, Util::STArray &orders)
Perceives the order of the bonds in the molecular graph molgraph from its 3D structure and atom conne...
BondOrderCalculator()
Constructs the BondOrderCalculator instance.
Abstract base class representing a chemical bond between two Chem::Atom instances.
Definition: Bond.hpp:54
Concrete Chem::MolecularGraph implementation that stores references to a selectable subset of atoms a...
Definition: Fragment.hpp:57
Abstract base class for representations of a chemical structure as a graph of bonded atoms.
Definition: MolecularGraph.hpp:57
constexpr unsigned int UNDEF
Specifies that the data format version is undefined.
Definition: PDBFormatVersion.hpp:49
CVector< double, 3 > Vector3D
Bounded 3 element vector holding floating point values of type double.
Definition: Vector.hpp:2937
constexpr unsigned int LINEAR
Specifies linear geometry.
Definition: CoordinationGeometry.hpp:58
constexpr unsigned int TETRAHEDRAL
Specifies tetrahedral geometry.
Definition: CoordinationGeometry.hpp:68
Array< std::size_t > STArray
Array storing unsigned integers of type std::size_t.
Definition: Array.hpp:575
boost::dynamic_bitset BitSet
Dynamic bitset class.
Definition: BitSet.hpp:46
The namespace of the Chemical Data Processing Library.