00001 // -*- Mode: C++; tab-width: 2; -*- 00002 // vi: set ts=2: 00003 // 00004 // $Id: charmmTorsion.h,v 1.20.18.1 2007/03/25 21:23:49 oliver Exp $ 00005 // 00006 00007 // Molecular Mechanics: CHARMM force field, proper torsion component 00008 00009 #ifndef BALL_MOLMEC_CHARMM_CHARMMTORSION_H 00010 #define BALL_MOLMEC_CHARMM_CHARMMTORSION_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_PARAMETER_RESIDUETORSIONS_H 00021 # include <BALL/MOLMEC/PARAMETER/residueTorsions.h> 00022 #endif 00023 00024 #ifndef BALL_MOLMEC_COMMON_FORCEFIELDCOMPONENT_H 00025 # include <BALL/MOLMEC/COMMON/forceFieldComponent.h> 00026 #endif 00027 00028 #ifndef BALL_MOLMEC_COMMON_FORCEFIELD_H 00029 # include <BALL/MOLMEC/COMMON/forceField.h> 00030 #endif 00031 00032 namespace BALL 00033 { 00038 class BALL_EXPORT CharmmTorsion 00039 : public ForceFieldComponent 00040 { 00041 public: 00042 00044 #define CHARMM_TORSIONS_ENABLED "enable Torsions" 00045 00049 00050 struct SingleCharmmTorsion 00051 { 00052 Atom* atom1; 00053 Atom* atom2; 00054 Atom* atom3; 00055 Atom* atom4; 00056 00057 float V; 00058 unsigned char f; 00059 float phase; 00060 00061 SingleCharmmTorsion() 00062 : atom1(0), 00063 atom2(0), 00064 atom3(0), 00065 atom4(0), 00066 V(0), 00067 f(0), 00068 phase(0) 00069 { 00070 } 00071 00072 SingleCharmmTorsion(CosineTorsion::SingleData& t) 00073 { 00074 atom1 = t.atom1; 00075 atom2 = t.atom2; 00076 atom3 = t.atom3; 00077 atom4 = t.atom4; 00078 00079 V = t.values.V / t.values.n; 00080 f = (unsigned char)t.values.f; 00081 00082 // convert phase from degrees to radiant 00083 phase = (float)(BALL::Constants::PI / 180.0) * t.values.phase; 00084 } 00085 }; 00086 00088 00091 00092 BALL_CREATE(CharmmTorsion) 00093 00094 00096 CharmmTorsion(); 00097 00100 CharmmTorsion(ForceField& force_field); 00101 00104 CharmmTorsion(const CharmmTorsion& charmm_stretch); 00105 00108 virtual ~CharmmTorsion(); 00109 00111 00114 00117 virtual bool setup() 00118 throw(Exception::TooManyErrors); 00119 00121 00124 00127 virtual double updateEnergy(); 00128 00131 virtual void updateForces(); 00132 00134 00135 private: 00136 00137 /*_ @name Private Attributes 00138 */ 00139 //_@{ 00140 00141 /*_ Vector containing the parameters for each torsion. 00142 */ 00143 vector<SingleCharmmTorsion> torsion_; 00144 00145 /*_ Contents of the [Torsions] section of the parameter file. 00146 */ 00147 CosineTorsion torsion_parameters_; 00148 00149 /*_ Contents of the [ResidueTorsions] section of the parameter file. 00150 */ 00151 ResidueTorsions residue_torsions_; 00152 00153 /*_ true, if the torsions are read from the ResidueTorsions section. 00154 */ 00155 bool use_residue_torsion_list_; 00156 00157 //_@} 00158 00159 }; 00160 } // namespace BALL 00161 00162 #endif // BALL_MOLMEC_CHARMM_CHARMMTORSION_H