cosineTorsion.h

Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 // $Id: cosineTorsion.h,v 1.21 2005/12/23 17:01:54 amoll Exp $
00005 //
00006  
00007 #ifndef BALL_MOLMEC_PARAMETER_COSINETORSION_H
00008 #define BALL_MOLMEC_PARAMETER_COSINETORSION_H
00009 
00010 #ifndef BALL_FORMAT_PARAMETERSECTION_H
00011 # include <BALL/FORMAT/parameterSection.h>
00012 #endif
00013 
00014 #ifndef BALL_MOLMEC_PARAMETER_ATOMTYPES_H
00015 # include <BALL/MOLMEC/PARAMETER/atomTypes.h>
00016 #endif
00017 
00018 namespace BALL 
00019 {
00027   class BALL_EXPORT CosineTorsion 
00028     : public ParameterSection
00029   {
00030     public:
00031 
00032     enum 
00033     {
00034       UNKNOWN
00035     };
00036 
00037     struct SingleValues
00038     {
00039       float phase;
00040       float V;
00041       float f;
00042       float n;
00043 
00044       SingleValues(const SingleValues& v)
00045         : phase(v.phase),
00046           V(v.V),
00047           f(v.f),
00048           n(v.n)
00049       {
00050       }
00051         
00052       SingleValues()
00053         : phase(0),
00054           V(0),
00055           f(0),
00056           n(0)
00057       {
00058       }
00059 
00060       bool operator == (const SingleValues& rhs)
00061       {
00062         return ((phase == rhs.phase) && (V == rhs.V) 
00063                 && (f == rhs.f) && (n == rhs.n));
00064       }
00065     };
00066 
00067     struct BALL_EXPORT Values 
00068     {
00070       Size  n;
00072       SingleValues*   values;
00073 
00074       Values()
00075         : n(0),
00076           values(0)
00077       {
00078       }
00079       
00080       Values(Size number)
00081         : n((unsigned char)number),
00082           values(new SingleValues[number])
00083       {
00084       }
00085       
00086       Values(const Values& v)
00087       {
00088         n = v.n;
00089         values = new SingleValues[n];
00090         for (Position i = 0; i < n; i++)
00091         {
00092           values[i].phase = v.values[i].phase;
00093           values[i].V = v.values[i].V;
00094           values[i].f = v.values[i].f;
00095           values[i].n = v.values[i].n;
00096         }
00097       }
00098 
00099       void set(const Values& v)
00100       {
00101         delete [] values;
00102 
00103         n = v.n;
00104         values = new SingleValues[n];
00105         for (Position i = 0; i < n; i++)
00106         {
00107           values[i] = v.values[i];
00108         }
00109       }
00110 
00111       ~Values()
00112       {
00113         delete [] values;
00114       }
00115         
00116       bool operator == (const Values& rhs) const
00117       {
00118         if (n != rhs.n) 
00119         {
00120           return false;
00121         }
00122         for (Position i = 0; i < n; ++i)
00123         {
00124           if (!(values[i] == rhs.values[i]))
00125           {
00126             return false;
00127           }
00128         }
00129         return true;
00130       }
00131       
00132       bool operator != (const Values& rhs) const
00133       {
00134         return ! operator == (rhs);
00135       }
00136     };
00137 
00138     struct BALL_EXPORT Data
00139     {
00140       Atom*   atom1;
00141       Atom*   atom2;
00142       Atom*   atom3;
00143       Atom*   atom4;
00144 
00145       Values  values;
00146     };
00147 
00148     struct BALL_EXPORT SingleData
00149     {
00150       Atom*     atom1;
00151       Atom*     atom2;
00152       Atom*     atom3;
00153       Atom*     atom4;
00154 
00155       SingleValues  values;
00156     };
00157 
00161 
00164     CosineTorsion();
00165     
00168     CosineTorsion(const CosineTorsion& cosine_torsion);
00169 
00172     virtual ~CosineTorsion() ;
00173 
00176     virtual void clear() ;
00177 
00179     
00183 
00190     virtual bool extractSection(ForceFieldParameters& parameters, const String& section_name);
00191 
00193     virtual bool extractSection(Parameters& parameters, const String& section_name);
00194 
00197     bool hasParameters(Atom::Type I, Atom::Type J, Atom::Type K, Atom::Type L) const;
00198     
00201     CosineTorsion::Values getParameters(Atom::Type I, Atom::Type J, Atom::Type K, Atom::Type L) const;
00202     
00207     bool assignParameters(CosineTorsion::Values& parameters, Atom::Type I, 
00208                           Atom::Type J, Atom::Type K, Atom::Type L) const;
00209 
00211 
00214 
00217     CosineTorsion& operator = (const CosineTorsion& cosine_torsion);
00218     
00220 
00224 
00227     bool operator == (const CosineTorsion& cosine_torsion) const;
00228 
00230 
00231     protected:
00232 
00233     Size                  number_of_atom_types_;
00234 
00235     vector<Values>        torsions_;
00236     
00237     HashMap<Size, Size>   torsion_hash_map_;
00238   };
00239 
00240 } // namespace BALL
00241 
00242 #endif // BALL_MOLMEC_PARAMETER_COSINETORSION_H