00001 // -*- Mode: C++; tab-width: 2; -*- 00002 // vi: set ts=2: 00003 // 00004 // $Id: amberTorsion.h,v 1.23.18.1 2007/03/25 21:23:47 oliver Exp $ 00005 // 00006 00007 // Molecular Mechanics: Amber force field, bond stretch component 00008 00009 #ifndef BALL_MOLMEC_AMBER_AMBERTORSION_H 00010 #define BALL_MOLMEC_AMBER_AMBERTORSION_H 00011 00012 #ifndef BALL_COMMON_H 00013 # include <BALL/common.h> 00014 #endif 00015 00016 #ifndef BALL_MOLMEC_PARAMETER_COSINETORSION_H 00017 # include <BALL/MOLMEC/PARAMETER/cosineTorsion.h> 00018 #endif 00019 00020 #ifndef BALL_MOLMEC_COMMON_FORCEFIELDCOMPONENT_H 00021 # include <BALL/MOLMEC/COMMON/forceFieldComponent.h> 00022 #endif 00023 00024 #ifndef BALL_MOLMEC_COMMON_FORCEFIELD_H 00025 # include <BALL/MOLMEC/COMMON/forceField.h> 00026 #endif 00027 00028 namespace BALL 00029 { 00033 class BALL_EXPORT AmberTorsion 00034 : public ForceFieldComponent 00035 { 00036 public: 00037 00039 #define AMBER_TORSIONS_ENABLED "enable Torsions" 00040 00044 00045 struct SingleAmberTorsion 00046 { 00047 Atom::StaticAtomAttributes* atom1; 00048 Atom::StaticAtomAttributes* atom2; 00049 Atom::StaticAtomAttributes* atom3; 00050 Atom::StaticAtomAttributes* atom4; 00051 00052 float V; 00053 unsigned char f; 00054 float phase; 00055 00056 SingleAmberTorsion() 00057 : atom1(0), 00058 atom2(0), 00059 atom3(0), 00060 atom4(0), 00061 V(0), 00062 f(0), 00063 phase(0) 00064 { 00065 } 00066 00067 00068 SingleAmberTorsion(CosineTorsion::SingleData& t) 00069 { 00070 atom1 = &Atom::getAttributes()[t.atom1->getIndex()]; 00071 atom2 = &Atom::getAttributes()[t.atom2->getIndex()]; 00072 atom3 = &Atom::getAttributes()[t.atom3->getIndex()]; 00073 atom4 = &Atom::getAttributes()[t.atom4->getIndex()]; 00074 00075 V = t.values.V / t.values.n; 00076 f = (unsigned char)t.values.f; 00077 phase = ((2.0 * BALL::Constants::PI)/360.0) * t.values.phase; 00078 } 00079 }; 00080 00082 00086 00087 BALL_CREATE(AmberTorsion) 00088 00089 00091 AmberTorsion(); 00092 00095 AmberTorsion(ForceField& force_field); 00096 00099 AmberTorsion(const AmberTorsion& amber_stretch); 00100 00103 virtual ~AmberTorsion(); 00104 00106 00109 00112 virtual bool setup() 00113 throw(Exception::TooManyErrors); 00114 00116 00119 00122 virtual double updateEnergy(); 00123 00126 virtual void updateForces(); 00127 00129 00130 private: 00131 00132 /*_ @name Private Attributes 00133 */ 00134 //_@{ 00135 00136 /*_ array with the torsions 00137 */ 00138 vector<SingleAmberTorsion> torsion_; 00139 00140 CosineTorsion torsion_parameters_; 00141 00142 CosineTorsion improper_parameters_; 00143 00144 ParameterSection impropers_; 00145 00146 //_@} 00147 00148 }; 00149 } // namespace BALL 00150 00151 #endif // BALL_MOLMEC_AMBER_AMBERTORSION_H