Ignore:
Timestamp:
Apr 8, 2013, 11:56:08 AM (12 years ago)
Author:
Frederik Heber <heber@…>
Branches:
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
Children:
7cdf58
Parents:
6cabaac
git-author:
Frederik Heber <heber@…> (03/03/13 21:15:14)
git-committer:
Frederik Heber <heber@…> (04/08/13 11:56:08)
Message:

Added saturate() to SaturatedFragment.

  • basically, this is AddHydrogenReplacementAtom() but stripped down a bit as we use hydrogens from the pool and as atoms for the fragment need not be copied anymore, we don't need all the father mambo jumbo.
  • SaturatedFragment additionally now needs to know about how hydrogens are treated and whether we actually saturate.
  • SaturatedFragmentUnitTest requires libLinearAlgebra.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Exporters/SaturatedFragment.hpp

    r6cabaac rc39675  
    1414#endif
    1515
     16#include <iosfwd>
    1617#include <set>
     18#include <string>
    1719
     20#include "Bond/bond.hpp"
    1821#include "Fragmentation/KeySet.hpp"
     22#include "Fragmentation/HydrogenSaturation_enum.hpp"
     23#include "Parser/FormatParserStorage.hpp"
    1924
     25class atom;
    2026class HydrogenPool;
    2127
     
    4652      const KeySet &_set,
    4753      KeySetsInUse_t &_container,
    48       HydrogenPool &_hydrogens);
     54      HydrogenPool &_hydrogens,
     55      const enum HydrogenTreatment _treatment,
     56      const enum HydrogenSaturation saturation);
    4957
    5058  /** Destructor of class SaturatedFragment.
     
    6270  }
    6371
     72  /** Getter for the FullMolecule this instance is associated with.
     73   *
     74   * \return const ref to FullMolecule
     75   */
     76  const KeySet & getFullMolecule() const
     77  {
     78    return FullMolecule;
     79  }
     80
     81  /** Getter for the SaturationHydrogens this instance is associated with.
     82   *
     83   * \return const ref to SaturationHydrogens
     84   */
     85  const KeySet & getSaturationHydrogens() const
     86  {
     87    return SaturationHydrogens;
     88  }
     89
     90  /** Prints the config of the fragment of \a _type to \a out.
     91   *
     92   * \param out output stream to write to
     93   * \param _type parser type to write config
     94   */
     95  bool OutputConfig(
     96      std::ostream &out,
     97      const ParserTypes _type) const;
     98
     99private:
     100  /** Helper function to lease and bring in place saturation hydrogens.
     101   *
     102   */
     103  void saturate();
     104
     105  /** Helper function to get a hydrogen replacement for a given \a replacement.
     106   *
     107   * \param replacement atom to "replace" with hydrogen in a fragment.
     108   * \return ref to leased hydrogen atom
     109   */
     110  atom * const getHydrogenReplacement(atom * const replacement);
     111
     112  /** Leases and adds a Hydrogen atom in replacement for the given atom \a *partner in bond with a *origin.
     113   * Here, we have to distinguish between single, double or triple bonds as stated by \a BondDegree, that each demand
     114   * a different scheme when adding \a *replacement atom for the given one.
     115   * -# Single Bond: Simply add new atom with bond distance rescaled to typical hydrogen one
     116   * -# Double Bond: Here, we need the **BondList of the \a *origin atom, by scanning for the other bonds instead of
     117   *    *Bond, we use the through these connected atoms to determine the plane they lie in, vector::MakeNormalvector().
     118   *    The orthonormal vector to this plane along with the vector in *Bond direction determines the plane the two
     119   *    replacing hydrogens shall lie in. Now, all remains to do is take the usual hydrogen double bond angle for the
     120   *    element of *origin and form the sin/cos admixture of both plane vectors for the new coordinates of the two
     121   *    hydrogens forming this angle with *origin.
     122   * -# 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
     123   *    triangle formed by the to be added hydrogens are not equal to the typical bond distance \f$l\f$ but have to be
     124   *    determined from the typical angle \f$\alpha\f$ for a hydrogen triple connected to the element of *origin):
     125   *    We have the height \f$d\f$ as the vector in *Bond direction (from triangle C1-H1-H2).
     126   *    \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 )}}
     127   *    \f]
     128   *    vector::GetNormalvector() creates one orthonormal vector from this *Bond vector and vector::MakeNormalvector creates
     129   *    the third one from the former two vectors. The latter ones form the plane of the base triangle mentioned above.
     130   *    The lengths for these are \f$f\f$ and \f$g\f$ (from triangle H1-H2-(center of H1-H2-H3)) with knowledge that
     131   *    the median lines in an isosceles triangle meet in the center point with a ratio 2:1.
     132   *    \f[ f = \frac{b}{\sqrt{3}} \qquad g = \frac{b}{2}
     133   *    \f]
     134   *    as the coordination of all three atoms in the coordinate system of these three vectors:
     135   *    \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$.
     136   *
     137   * \param TopBond pointer to bond between \a *origin and \a *replacement
     138   * \param Origin atom that is actually contained in the fragment
     139   * \param Replacement pointer to the atom which shall be copied as a hydrogen atom in this molecule
     140   * \param isAngstroem whether the coordination of the given atoms is in AtomicLength (false) or Angstrom(true)
     141   * \return number of atoms added, if < bond::BondDegree then something went wrong
     142   */
     143  bool AddHydrogenReplacementAtom(
     144      bond::ptr TopBond,
     145      atom *Origin,
     146      atom *Replacement,
     147      bool IsAngstroem);
     148
    64149private:
    65150  //!> container to mark ourselves RAII-style
     
    73158  //!> key set containing the ids of all hydrogens added for saturation
    74159  KeySet SaturationHydrogens;
     160  //!> whether hydrogens are generally contained in set or not
     161  const enum HydrogenTreatment treatment;
     162  //!> whether to actually saturate or not
     163  const enum HydrogenSaturation saturation;
    75164};
    76165
Note: See TracChangeset for help on using the changeset viewer.