amberTorsion.h

Go to the documentation of this file.
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