| [7d5fcd] | 1 | /*
 | 
|---|
 | 2 |  * SaturatedFragment.hpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Mar 3, 2013
 | 
|---|
 | 5 |  *      Author: heber
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #ifndef SATURATEDFRAGMENT_HPP_
 | 
|---|
 | 9 | #define SATURATEDFRAGMENT_HPP_
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | // include config.h
 | 
|---|
 | 12 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 13 | #include <config.h>
 | 
|---|
 | 14 | #endif
 | 
|---|
 | 15 | 
 | 
|---|
| [c39675] | 16 | #include <iosfwd>
 | 
|---|
| [c738f1] | 17 | #include <map>
 | 
|---|
| [7d5fcd] | 18 | #include <set>
 | 
|---|
| [c39675] | 19 | #include <string>
 | 
|---|
| [7d5fcd] | 20 | 
 | 
|---|
| [de2cbf] | 21 | #include "Atom/atom_bondedparticleinfo.hpp"
 | 
|---|
| [c39675] | 22 | #include "Bond/bond.hpp"
 | 
|---|
| [9445081] | 23 | #include "Fragmentation/EdgesPerFragment.hpp"
 | 
|---|
| [7d5fcd] | 24 | #include "Fragmentation/KeySet.hpp"
 | 
|---|
| [c39675] | 25 | #include "Fragmentation/HydrogenSaturation_enum.hpp"
 | 
|---|
 | 26 | #include "Parser/FormatParserStorage.hpp"
 | 
|---|
| [7d5fcd] | 27 | 
 | 
|---|
| [98a293b] | 28 | #include "LinearAlgebra/Vector.hpp"
 | 
|---|
 | 29 | 
 | 
|---|
| [c39675] | 30 | class atom;
 | 
|---|
| [7d5fcd] | 31 | class HydrogenPool;
 | 
|---|
 | 32 | 
 | 
|---|
 | 33 | /** The SaturatedFragment class acts as a wrapper to a KeySet by adding a list
 | 
|---|
 | 34 |  * of saturation hydrogens.
 | 
|---|
 | 35 |  *
 | 
|---|
 | 36 |  * This SaturatedFragment along with a currently leased set of hydrogens from the
 | 
|---|
 | 37 |  * HydrogenPool is all that is required to create a fully storable molecular
 | 
|---|
 | 38 |  * fragment from a given Keyset.
 | 
|---|
 | 39 |  *
 | 
|---|
 | 40 |  * The instance notes down its existence in an external container.
 | 
|---|
 | 41 |  *
 | 
|---|
 | 42 |  */
 | 
|---|
 | 43 | class SaturatedFragment
 | 
|---|
 | 44 | {
 | 
|---|
 | 45 | public:
 | 
|---|
 | 46 |   //!> typedef to a container to mark keysets that are in use
 | 
|---|
 | 47 |   typedef std::set<KeySet> KeySetsInUse_t;
 | 
|---|
 | 48 | 
 | 
|---|
| [98a293b] | 49 |   //!> List of points giving saturation positions for a single bond neighbor
 | 
|---|
 | 50 |   typedef std::list<Vector> SaturationsPositions_t;
 | 
|---|
 | 51 |   //!> map for one atom, containing the saturation points for all its neighbors
 | 
|---|
 | 52 |   typedef std::map<int, SaturationsPositions_t> SaturationsPositionsPerNeighbor_t;
 | 
|---|
 | 53 |   //!> containing the saturation points over all desired atoms required
 | 
|---|
 | 54 |   typedef std::map<int, SaturationsPositionsPerNeighbor_t> GlobalSaturationPositions_t;
 | 
|---|
 | 55 | 
 | 
|---|
| [7d5fcd] | 56 |   /** Constructor of SaturatedFragment requires \a set which we are tightly
 | 
|---|
 | 57 |    * associated.
 | 
|---|
 | 58 |    *
 | 
|---|
 | 59 |    * \param _set KeySet which this instance is associated with
 | 
|---|
 | 60 |    * \param _container container to add KeySet as in-use
 | 
|---|
 | 61 |    * \param _hydrogens pool with hydrogens for saturation
 | 
|---|
| [98a293b] | 62 |    * \param _globalsaturationpositions saturation positions to be used
 | 
|---|
| [7d5fcd] | 63 |    */
 | 
|---|
 | 64 |   SaturatedFragment(
 | 
|---|
 | 65 |       const KeySet &_set,
 | 
|---|
 | 66 |       KeySetsInUse_t &_container,
 | 
|---|
| [c39675] | 67 |       HydrogenPool &_hydrogens,
 | 
|---|
 | 68 |       const enum HydrogenTreatment _treatment,
 | 
|---|
| [98a293b] | 69 |       const enum HydrogenSaturation saturation,
 | 
|---|
 | 70 |       const GlobalSaturationPositions_t &_globalsaturationpositions);
 | 
|---|
| [7d5fcd] | 71 | 
 | 
|---|
 | 72 |   /** Destructor of class SaturatedFragment.
 | 
|---|
 | 73 |    *
 | 
|---|
 | 74 |    */
 | 
|---|
 | 75 |   ~SaturatedFragment();
 | 
|---|
 | 76 | 
 | 
|---|
 | 77 |   /** Getter for the KeySet this instance is associated with.
 | 
|---|
 | 78 |    *
 | 
|---|
 | 79 |    * \return const ref to KeySet
 | 
|---|
 | 80 |    */
 | 
|---|
 | 81 |   const KeySet & getKeySet() const
 | 
|---|
 | 82 |   {
 | 
|---|
 | 83 |     return set;
 | 
|---|
 | 84 |   }
 | 
|---|
 | 85 | 
 | 
|---|
| [c39675] | 86 |   /** Getter for the FullMolecule this instance is associated with.
 | 
|---|
 | 87 |    *
 | 
|---|
 | 88 |    * \return const ref to FullMolecule
 | 
|---|
 | 89 |    */
 | 
|---|
 | 90 |   const KeySet & getFullMolecule() const
 | 
|---|
 | 91 |   {
 | 
|---|
 | 92 |     return FullMolecule;
 | 
|---|
 | 93 |   }
 | 
|---|
 | 94 | 
 | 
|---|
 | 95 |   /** Getter for the SaturationHydrogens this instance is associated with.
 | 
|---|
 | 96 |    *
 | 
|---|
 | 97 |    * \return const ref to SaturationHydrogens
 | 
|---|
 | 98 |    */
 | 
|---|
 | 99 |   const KeySet & getSaturationHydrogens() const
 | 
|---|
 | 100 |   {
 | 
|---|
 | 101 |     return SaturationHydrogens;
 | 
|---|
 | 102 |   }
 | 
|---|
 | 103 | 
 | 
|---|
| [c6ddcb] | 104 |   /** Determines the bounding box of the fragment without performing the hydrogen
 | 
|---|
 | 105 |    * saturation but by simply using the atoms whose bonds are cut.
 | 
|---|
 | 106 |    *
 | 
|---|
 | 107 |    * \return pair of Vector with min and max coordinates
 | 
|---|
 | 108 |    */
 | 
|---|
 | 109 |   std::pair<Vector, Vector> getRoughBoundingBox() const;
 | 
|---|
 | 110 | 
 | 
|---|
| [9445081] | 111 |   /** Returns the edges of the bond graph of this fragment.
 | 
|---|
 | 112 |    *
 | 
|---|
 | 113 |    * \return set of edges
 | 
|---|
 | 114 |    */
 | 
|---|
 | 115 |   FragmentationEdges::edges_t getEdges() const;
 | 
|---|
 | 116 | 
 | 
|---|
| [c39675] | 117 |   /** Prints the config of the fragment of \a _type to \a out.
 | 
|---|
 | 118 |    *
 | 
|---|
 | 119 |    * \param out output stream to write to
 | 
|---|
 | 120 |    * \param _type parser type to write config
 | 
|---|
 | 121 |    */
 | 
|---|
 | 122 |   bool OutputConfig(
 | 
|---|
 | 123 |       std::ostream &out,
 | 
|---|
 | 124 |       const ParserTypes _type) const;
 | 
|---|
 | 125 | 
 | 
|---|
| [c738f1] | 126 |   //!> typedef for the replaced atom (due to cut bonds) and their replacement hydrogens
 | 
|---|
 | 127 |   typedef std::multimap<atomId_t, atomId_t> replaced_atoms_t;
 | 
|---|
 | 128 | 
 | 
|---|
| [c39675] | 129 | private:
 | 
|---|
 | 130 |   /** Helper function to lease and bring in place saturation hydrogens.
 | 
|---|
| [98a293b] | 131 |    *
 | 
|---|
 | 132 |    * Here, we use local information to calculate saturation positions.
 | 
|---|
| [c39675] | 133 |    *
 | 
|---|
 | 134 |    */
 | 
|---|
 | 135 |   void saturate();
 | 
|---|
 | 136 | 
 | 
|---|
| [98a293b] | 137 |   /** Helper function to lease and bring in place saturation hydrogens.
 | 
|---|
 | 138 |    *
 | 
|---|
 | 139 |    * Here, saturation positions have to be calculated before and are fully
 | 
|---|
 | 140 |    * stored in \a _globalsaturationpositions.
 | 
|---|
 | 141 |    *
 | 
|---|
 | 142 |    * \param_globalsaturationpositions
 | 
|---|
 | 143 |    */
 | 
|---|
 | 144 |   void saturate(const GlobalSaturationPositions_t &_globalsaturationpositions);
 | 
|---|
 | 145 | 
 | 
|---|
| [de2cbf] | 146 |   /** Replaces all cut bonds with respect to the given atom by hydrogens.
 | 
|---|
 | 147 |    *
 | 
|---|
 | 148 |    * \param _atom atom whose cut bonds to saturate
 | 
|---|
 | 149 |    * \param _cutbonds list of cut bonds for \a _atom
 | 
|---|
 | 150 |    * \return true - bonds saturated, false - something went wrong
 | 
|---|
 | 151 |    */
 | 
|---|
 | 152 |   bool saturateAtom(atom * const _atom, const BondList &_cutbonds);
 | 
|---|
 | 153 | 
 | 
|---|
| [c39675] | 154 |   /** Helper function to get a hydrogen replacement for a given \a replacement.
 | 
|---|
 | 155 |    *
 | 
|---|
 | 156 |    * \param replacement atom to "replace" with hydrogen in a fragment.
 | 
|---|
 | 157 |    * \return ref to leased hydrogen atom
 | 
|---|
 | 158 |    */
 | 
|---|
 | 159 |   atom * const getHydrogenReplacement(atom * const replacement);
 | 
|---|
 | 160 | 
 | 
|---|
| [98a293b] | 161 |   /** Sets a saturation hydrogen at the given position in place of \a _father.
 | 
|---|
 | 162 |    *
 | 
|---|
 | 163 |    * \param _OwnerAtom atom "owning" the hydrogen (i.e. the one getting saturated)
 | 
|---|
 | 164 |    * \param _position new position relative to \a _OwnerAtom
 | 
|---|
 | 165 |    * \param _distance scale factor to the distance (default 1.)
 | 
|---|
 | 166 |    * \param _father bond partner of \a _OwnerAtom that is replaced
 | 
|---|
 | 167 |    */
 | 
|---|
 | 168 |   const atom& setHydrogenReplacement(
 | 
|---|
 | 169 |       const atom * const _OwnerAtom,
 | 
|---|
 | 170 |       const Vector &_position,
 | 
|---|
 | 171 |       const double _distance,
 | 
|---|
 | 172 |       atom * const _father);
 | 
|---|
 | 173 | 
 | 
|---|
| [c39675] | 174 |   /** Leases and adds a Hydrogen atom in replacement for the given atom \a *partner in bond with a *origin.
 | 
|---|
 | 175 |    * Here, we have to distinguish between single, double or triple bonds as stated by \a BondDegree, that each demand
 | 
|---|
 | 176 |    * a different scheme when adding \a *replacement atom for the given one.
 | 
|---|
 | 177 |    * -# Single Bond: Simply add new atom with bond distance rescaled to typical hydrogen one
 | 
|---|
 | 178 |    * -# Double Bond: Here, we need the **BondList of the \a *origin atom, by scanning for the other bonds instead of
 | 
|---|
 | 179 |    *    *Bond, we use the through these connected atoms to determine the plane they lie in, vector::MakeNormalvector().
 | 
|---|
 | 180 |    *    The orthonormal vector to this plane along with the vector in *Bond direction determines the plane the two
 | 
|---|
 | 181 |    *    replacing hydrogens shall lie in. Now, all remains to do is take the usual hydrogen double bond angle for the
 | 
|---|
 | 182 |    *    element of *origin and form the sin/cos admixture of both plane vectors for the new coordinates of the two
 | 
|---|
 | 183 |    *    hydrogens forming this angle with *origin.
 | 
|---|
 | 184 |    * -# Triple Bond: The idea is to set up a tetraoid (C1-H1-H2-H3) (however the lengths \f$b\f$ of the sides of the base
 | 
|---|
 | 185 |    *    triangle formed by the to be added hydrogens are not equal to the typical bond distance \f$l\f$ but have to be
 | 
|---|
 | 186 |    *    determined from the typical angle \f$\alpha\f$ for a hydrogen triple connected to the element of *origin):
 | 
|---|
 | 187 |    *    We have the height \f$d\f$ as the vector in *Bond direction (from triangle C1-H1-H2).
 | 
|---|
 | 188 |    *    \f[ h = l \cdot \cos{\left (\frac{\alpha}{2} \right )} \qquad b = 2l \cdot \sin{\left (\frac{\alpha}{2} \right)} \quad \rightarrow \quad d = l \cdot \sqrt{\cos^2{\left (\frac{\alpha}{2} \right)}-\frac{1}{3}\cdot\sin^2{\left (\frac{\alpha}{2}\right )}}
 | 
|---|
 | 189 |    *    \f]
 | 
|---|
 | 190 |    *    vector::GetNormalvector() creates one orthonormal vector from this *Bond vector and vector::MakeNormalvector creates
 | 
|---|
 | 191 |    *    the third one from the former two vectors. The latter ones form the plane of the base triangle mentioned above.
 | 
|---|
 | 192 |    *    The lengths for these are \f$f\f$ and \f$g\f$ (from triangle H1-H2-(center of H1-H2-H3)) with knowledge that
 | 
|---|
 | 193 |    *    the median lines in an isosceles triangle meet in the center point with a ratio 2:1.
 | 
|---|
 | 194 |    *    \f[ f = \frac{b}{\sqrt{3}} \qquad g = \frac{b}{2}
 | 
|---|
 | 195 |    *    \f]
 | 
|---|
 | 196 |    *    as the coordination of all three atoms in the coordinate system of these three vectors:
 | 
|---|
 | 197 |    *    \f$\pmatrix{d & f & 0}\f$, \f$\pmatrix{d & -0.5 \cdot f & g}\f$ and \f$\pmatrix{d & -0.5 \cdot f & -g}\f$.
 | 
|---|
 | 198 |    *
 | 
|---|
 | 199 |    * \param TopBond pointer to bond between \a *origin and \a *replacement
 | 
|---|
 | 200 |    * \param Origin atom that is actually contained in the fragment
 | 
|---|
 | 201 |    * \param Replacement pointer to the atom which shall be copied as a hydrogen atom in this molecule
 | 
|---|
 | 202 |    * \param isAngstroem whether the coordination of the given atoms is in AtomicLength (false) or Angstrom(true)
 | 
|---|
 | 203 |    * \return number of atoms added, if < bond::BondDegree then something went wrong
 | 
|---|
 | 204 |    */
 | 
|---|
 | 205 |   bool AddHydrogenReplacementAtom(
 | 
|---|
 | 206 |       bond::ptr TopBond,
 | 
|---|
 | 207 |       atom *Origin,
 | 
|---|
 | 208 |       atom *Replacement,
 | 
|---|
 | 209 |       bool IsAngstroem);
 | 
|---|
 | 210 | 
 | 
|---|
| [7d5fcd] | 211 | private:
 | 
|---|
 | 212 |   //!> container to mark ourselves RAII-style
 | 
|---|
 | 213 |   KeySetsInUse_t &container;
 | 
|---|
 | 214 |   //!> key set this fragment is associated with.
 | 
|---|
 | 215 |   const KeySet &set;
 | 
|---|
 | 216 |   //!> pool with saturation hydrogens
 | 
|---|
 | 217 |   HydrogenPool &hydrogens;
 | 
|---|
 | 218 |   //!> key set containing all atoms used for e.g. storing this to file
 | 
|---|
 | 219 |   KeySet FullMolecule;
 | 
|---|
 | 220 |   //!> key set containing the ids of all hydrogens added for saturation
 | 
|---|
 | 221 |   KeySet SaturationHydrogens;
 | 
|---|
| [c39675] | 222 |   //!> whether hydrogens are generally contained in set or not
 | 
|---|
 | 223 |   const enum HydrogenTreatment treatment;
 | 
|---|
 | 224 |   //!> whether to actually saturate or not
 | 
|---|
 | 225 |   const enum HydrogenSaturation saturation;
 | 
|---|
| [c738f1] | 226 |   //!> list of saturated hydrogens to their original atoms
 | 
|---|
 | 227 |   replaced_atoms_t replaced_atoms;
 | 
|---|
| [7d5fcd] | 228 | };
 | 
|---|
 | 229 | 
 | 
|---|
 | 230 | #endif /* SATURATEDFRAGMENT_HPP_ */
 | 
|---|