00001
00002
00003
00004
00005
00006
00007 #ifndef BALL_MOLMEC_MMFF94_MMFF94TORSION_H
00008 #define BALL_MOLMEC_MMFF94_MMFF94TORSION_H
00009
00010 #ifndef BALL_MOLMEC_COMMON_FORCEFIELDCOMPONENT_H
00011 # include <BALL/MOLMEC/COMMON/forceFieldComponent.h>
00012 #endif
00013
00014 #ifndef BALL_MOLMEC_COMMON_FORCEFIELD_H
00015 # include <BALL/MOLMEC/COMMON/forceField.h>
00016 #endif
00017
00018 #ifndef BALL_MOLMEC_MMFF94_MMFF94PARAMETERS_H
00019 # include <BALL/MOLMEC/MMFF94/MMFF94Parameters.h>
00020 #endif
00021
00022 namespace BALL
00023 {
00027 class BALL_EXPORT MMFF94Torsion
00028 : public ForceFieldComponent
00029 {
00030 public:
00031
00033 struct BALL_EXPORT Torsion
00034 {
00035 Torsion();
00036
00037 Index type;
00038 Atom* atom1;
00039 Atom* atom2;
00040 Atom* atom3;
00041 Atom* atom4;
00042 double v1, v2, v3;
00043
00044 double energy;
00045 double angle;
00046 bool heuristic;
00047 };
00048
00052
00054 #define MMFF94_TORSIONS_ENABLED "enable Torsions"
00055
00056
00060
00061 BALL_CREATE(MMFF94Torsion)
00062
00063
00065 MMFF94Torsion();
00066
00069 MMFF94Torsion(ForceField& force_field);
00070
00073 MMFF94Torsion(const MMFF94Torsion& MMFF94_stretch);
00074
00077 virtual ~MMFF94Torsion();
00078
00080
00083
00086 virtual bool setup()
00087 throw(Exception::TooManyErrors);
00088
00090
00093
00096 virtual double updateEnergy();
00097
00100 virtual void updateForces();
00101
00103 Position getTorsionType(const vector<Atom*>& atoms) const;
00104
00106 const vector<Torsion>& getTorsions() const { return torsions_;}
00107
00109
00110 protected:
00111
00112
00113 inline void AddDV3_(Vector3& f3, const TVector3<double> d3);
00114
00115 double getU_(Position e);
00116 double getV_(Position e);
00117 bool calculateHeuristic_(const Atom& aj, const Atom& ak, double& v1, double& v2, double& v3);
00118
00119 vector<Torsion> torsions_;
00120 MMFF94TorsionParameters parameters_;
00121 };
00122 }
00123
00124 #endif // BALL_MOLMEC_MMFF94_MMFF94TORSION_H