| 1 | /*
 | 
|---|
| 2 |  * RandomInserter.hpp
 | 
|---|
| 3 |  *
 | 
|---|
| 4 |  *  Created on: Feb 21, 2012
 | 
|---|
| 5 |  *      Author: heber
 | 
|---|
| 6 |  */
 | 
|---|
| 7 | 
 | 
|---|
| 8 | #ifndef RANDOMINSERTER_HPP_
 | 
|---|
| 9 | #define RANDOMINSERTER_HPP_
 | 
|---|
| 10 | 
 | 
|---|
| 11 | 
 | 
|---|
| 12 | // include config.h
 | 
|---|
| 13 | #ifdef HAVE_CONFIG_H
 | 
|---|
| 14 | #include <config.h>
 | 
|---|
| 15 | #endif
 | 
|---|
| 16 | 
 | 
|---|
| 17 | #include "InserterBase.hpp"
 | 
|---|
| 18 | 
 | 
|---|
| 19 | #include <vector>
 | 
|---|
| 20 | 
 | 
|---|
| 21 | #include "LinearAlgebra/Vector.hpp"
 | 
|---|
| 22 | 
 | 
|---|
| 23 | class RandomNumberGenerator;
 | 
|---|
| 24 | class RealSpaceMatrix;
 | 
|---|
| 25 | 
 | 
|---|
| 26 | /** RandomInserter implements Inserter interface such that the given \a Cluster
 | 
|---|
| 27 |  * is inserted at the position with a slight random variation.
 | 
|---|
| 28 |  *
 | 
|---|
| 29 |  * \warning As the RandomInserter rotates the molecule, the only bounding shape in
 | 
|---|
| 30 |  * Cluster that makes sense is a sphere. Otherwise, RandomInserter::Max_Attempts
 | 
|---|
| 31 |  * attempts are made at finding a lucky shot where all atoms, though rotated
 | 
|---|
| 32 |  * and randomly translated, remain inside but after that the cluster is inserted
 | 
|---|
| 33 |  * as it is.
 | 
|---|
| 34 |  */
 | 
|---|
| 35 | class RandomInserter : public InserterBase
 | 
|---|
| 36 | {
 | 
|---|
| 37 | public:
 | 
|---|
| 38 |   RandomInserter(const double _MaxAtomComponent, const double _MaxMoleculeComponent, const bool _DoRandomRotation);
 | 
|---|
| 39 |   ~RandomInserter();
 | 
|---|
| 40 | 
 | 
|---|
| 41 |   bool operator()(ClusterInterface::Cluster_impl cluster, const Vector &offset) const;
 | 
|---|
| 42 | 
 | 
|---|
| 43 | private:
 | 
|---|
| 44 |   bool AreClustersAtomsInside(ClusterInterface::Cluster_impl cluster) const;
 | 
|---|
| 45 |   Vector getRandomVector(const double range, const double offset) const;
 | 
|---|
| 46 | 
 | 
|---|
| 47 |   void doTranslation(
 | 
|---|
| 48 |       ClusterInterface::Cluster_impl cluster,
 | 
|---|
| 49 |       const RealSpaceMatrix &Rotations,
 | 
|---|
| 50 |       const std::vector<Vector> &RandomAtomTranslations,
 | 
|---|
| 51 |       const Vector &RandomMoleculeTranslations) const;
 | 
|---|
| 52 |   void undoTranslation(
 | 
|---|
| 53 |       ClusterInterface::Cluster_impl cluster,
 | 
|---|
| 54 |       const RealSpaceMatrix &Rotations,
 | 
|---|
| 55 |       const std::vector<Vector> &RandomAtomTranslations,
 | 
|---|
| 56 |       const Vector &RandomMoleculeTranslations) const;
 | 
|---|
| 57 | 
 | 
|---|
| 58 | private:
 | 
|---|
| 59 |   //!> internal random number generator
 | 
|---|
| 60 |   RandomNumberGenerator &random;
 | 
|---|
| 61 |   //!> minimum value of the random number distribution
 | 
|---|
| 62 |   const double rng_min;
 | 
|---|
| 63 |   //!> maximum value of the random number distribution
 | 
|---|
| 64 |   const double rng_max;
 | 
|---|
| 65 |   //!> range is maximum component for atom translations
 | 
|---|
| 66 |   const double MaxAtomComponent;
 | 
|---|
| 67 |   //!> range is maximum component for molecule translations
 | 
|---|
| 68 |   const double MaxMoleculeComponent;
 | 
|---|
| 69 |   //!> whether to randomly rotate or not
 | 
|---|
| 70 |   const bool DoRandomRotation;
 | 
|---|
| 71 | 
 | 
|---|
| 72 |   //!> maximum number of tries to find a suitable randomized position
 | 
|---|
| 73 |   static size_t Max_Attempts;
 | 
|---|
| 74 | };
 | 
|---|
| 75 | 
 | 
|---|
| 76 | 
 | 
|---|
| 77 | #endif /* RANDOMINSERTER_HPP_ */
 | 
|---|