00001
00002
00003
00004
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 }
00241
00242 #endif // BALL_MOLMEC_PARAMETER_COSINETORSION_H