00001
00002
00003
00004 #ifndef BALL_MOLMEC_SLICK_SLICKROTATION_H
00005 #define BALL_MOLMEC_SLICK_SLICKROTATION_H
00006
00007 #include <stack>
00008
00009 #include <BALL/SCORING/COMMON/scoringComponent.h>
00010 #include <BALL/DATATYPE/hashSet.h>
00011 #include <BALL/DATATYPE/hashGrid.h>
00012
00013 namespace BALL
00014 {
00015
00019 class RotationalEntropyLoss
00020 : public ScoringComponent
00021 {
00022
00023 public:
00024
00025 enum AlgorithmType
00026 {
00028 ALGORITHM__GUESS = 0,
00030 ALGORITHM__DATABASE = 1
00031 };
00032
00033 enum CalculationMethod
00034 {
00036 CALCULATION__ORIGINAL = 1,
00037
00039 CALCULATION__BOEHM = 2,
00040
00042 CALCULATION__GLYCOSIDIC_BONDS = 3,
00043
00045 CALCULATION__FROZEN_GLYCOSIDIC_BONDS = 4,
00046
00048 CALCULATION__GLYCOSIDIC_CONTRIBUTION = 5
00049 };
00050
00053 struct Option
00054 {
00057 static const char* ROT_BIND_OFFSET;
00058
00061 static const char* ROT_GRID_SPACING;
00062
00065 static const char* ROT_ALGORITHM;
00066
00069 static const char* ROT_METHOD;
00070
00073 static const char* VERBOSITY;
00074
00075 };
00076
00079 struct Default
00080 {
00081
00084 static const float ROT_BIND_OFFSET;
00085
00088 static const float ROT_GRID_SPACING;
00089
00092 static const Size ROT_ALGORITHM;
00093
00096 static const Size ROT_METHOD;
00097
00100 static const Size VERBOSITY;
00101
00102 };
00103
00107
00110 RotationalEntropyLoss()
00111 ;
00112
00115 RotationalEntropyLoss(ScoringFunction& sf)
00116 ;
00117
00120 RotationalEntropyLoss(const RotationalEntropyLoss& fr)
00121 ;
00122
00125 virtual ~RotationalEntropyLoss()
00126 ;
00127
00129
00132
00135 const RotationalEntropyLoss& operator = (const RotationalEntropyLoss& fr)
00136 ;
00137
00140 virtual void clear()
00141 ;
00142
00144
00147
00148 bool operator == (const RotationalEntropyLoss& fr) const
00149 ;
00150
00152
00155
00158 virtual bool setup()
00159 ;
00160
00162
00165
00168 virtual double calculateScore()
00169 ;
00170
00172
00173 private:
00174
00175
00176
00177 std::vector<const Bond*> rotatable_bonds_;
00178
00179
00180
00181 HashSet<const Bond*> glycosidic_bonds_;
00182
00183
00184
00185 Size N_rot_;
00186
00187
00188
00189
00190 std::vector<bool> is_frozen_;
00191
00192
00193
00194
00195 Size algorithm_type_;
00196
00197
00198
00199
00200 std::vector< std::pair<double, double> > heavy_atom_fractions_;
00201
00202
00203
00204
00205 HashGrid3<const Atom*>* grid_;
00206
00207
00208
00209 float grid_spacing_;
00210
00211
00212
00213 Molecule* receptor_;
00214
00215
00216
00217 Molecule* ligand_;
00218
00219
00220
00221 float bind_distance_offset_;
00222
00223
00224
00225 Size calculation_method_;
00226
00227
00228
00229 HashMap<const Atom*, Size> fresno_types_;
00230
00231
00232
00233
00234 void cycleDFS_(const Atom* atom,
00235 HashSet<const Atom*>& visited,
00236 HashSet<const Bond*>& tree,
00237 std::stack<const Bond*>& possible_cycle_bonds,
00238 HashSet<const Bond*>& cycle_bonds,
00239 int& cycle_count)
00240 ;
00241
00242
00243
00244
00245
00246 void heavyAtomsDFS_(const Atom* atom, const Bond* bond,
00247 HashSet<const Atom*>& visited,
00248 int& heavy_atom_count, int& nonlip_heavy_atom_count)
00249 ;
00250
00251
00252
00253 void updateFrozenBonds_()
00254 ;
00255
00256
00257
00258 bool frozenBondsDFS_(const Atom* atom,
00259 HashSet<const Atom*>& visited)
00260 ;
00261 };
00262
00263 }
00264
00265 #endif // BALL_MOLMEC_SLICK_SLICKROTATION_H