00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef OB_GRID_H
00022 #define OB_GRID_H
00023
00024 #include <openbabel/babelconfig.h>
00025 #include <openbabel/math/vector3.h>
00026
00027 #include <iosfwd>
00028 #include <algorithm>
00029 #include <vector>
00030 #include <string>
00031
00032 namespace OpenBabel
00033 {
00034
00035
00036 class OBMol;
00037
00040 class OBAPI OBGrid: public OBBase
00041 {
00042 protected:
00043 double _xmin,_xmax,_ymin,_ymax,_zmin,_zmax;
00044
00045 public:
00046 OBGrid() {}
00047
00051 virtual void Init(OBMol &box);
00052
00054 double GetXmin() const { return(_xmin); }
00056 double GetYmin() const { return(_ymin); }
00058 double GetZmin() const { return(_zmin); }
00060 double GetXmax() const { return(_xmax); }
00062 double GetYmax() const { return(_ymax); }
00064 double GetZmax() const { return(_zmax); }
00065
00067 bool PointIsInBox(double x,double y,double z)
00068 {
00069 return (x>=_xmin) && (x<=_xmax) &&
00070 (y>=_ymin) && (y<=_ymax) &&
00071 (z>=_zmin) && (z<=_zmax);
00072 }
00074 bool PointIsInBox(double *c)
00075 {
00076 return (c[0]>=_xmin) && (c[0]<=_xmax) &&
00077 (c[1]>=_ymin) && (c[1]<=_ymax) &&
00078 (c[2]>=_zmin) && (c[2]<=_zmax);
00079 }
00080
00082 bool PointIsInBox(vector3 v)
00083 {
00084 return (v.x() >= _xmin) && (v.x() <=_xmax) &&
00085 (v.y()>=_ymin) && (v.y()<=_ymax) &&
00086 (v.z()>=_zmin) && (v.z()<=_zmax);
00087 }
00088 };
00089
00097 class OBAPI OBFloatGrid: public OBGrid
00098 {
00099 protected:
00100 std::vector<double> _values;
00101 int *_ival;
00102 double _midz,_midx,_midy;
00103 int _ydim,_xdim,_zdim;
00104 double _spacing,_inv_spa;
00105 double _halfSpace;
00106
00107 vector3 _xAxis, _yAxis, _zAxis;
00108
00109 public:
00110
00111 OBFloatGrid() : _ival(NULL), _halfSpace(0.0) {}
00112 ~OBFloatGrid()
00113 {
00114 if (_ival) delete [] _ival;
00115 }
00116
00119 void Init(OBMol &box,double spacing, double pad=0.0);
00120
00122 vector3 GetMin() { return vector3(_xmin, _ymin, _zmin); }
00123
00127 void GetMin(double *a)
00128 {
00129 a[0]=_xmin;
00130 a[1]=_ymin;
00131 a[2]=_zmin;
00132 }
00133
00135 vector3 GetMax() { return vector3(_xmax, _ymax, _zmax); }
00136
00140 void GetMax(double *a)
00141 {
00142 a[0]=_xmax;
00143 a[1]=_ymax;
00144 a[2]=_zmax;
00145 }
00146
00148 double GetSpacing() const { return(_spacing); }
00152 void GetSpacing(double &s)
00153 {
00154 s=_spacing;
00155 }
00157 double GetScale() const { return(_inv_spa); }
00159 double GetHalfSpace() const {return(_halfSpace);}
00161 int GetXdim() const { return(_xdim); }
00163 int GetYdim() const { return(_ydim); }
00165 int GetZdim() const { return(_zdim); }
00169 void GetDim(int *a)
00170 {
00171 a[0]=_xdim;
00172 a[1]=_ydim;
00173 a[2]=_zdim;
00174 }
00175
00177 vector3 GetMidpointVector()
00178 {
00179 vector3 v;
00180 v.Set(_midx,_midy,_midz);
00181 return(v);
00182 }
00183
00185 vector3 GetXAxis() const
00186 {
00187 return _xAxis;
00188 }
00189
00191 vector3 GetYAxis() const
00192 {
00193 return _yAxis;
00194 }
00195
00197 vector3 GetZAxis() const
00198 {
00199 return _zAxis;
00200 }
00201
00203 void SetNumberOfPoints(int nx, int ny, int nz);
00204
00206 void SetXAxis(vector3);
00208 void SetYAxis(vector3);
00210 void SetZAxis(vector3);
00211
00216 void SetLimits(const vector3& origin, const vector3& x, const vector3& y,
00217 const vector3& z);
00220 void SetLimits(const double origin[3], const double x[3], const double y[3],
00221 const double z[3]);
00222
00224 std::vector<double> GetDataVector();
00228 void SetVals(const std::vector<double> & vals);
00229
00234 double *GetVals() { return(&_values[0]); }
00235
00237 double GetValue(int i, int j, int k)
00238 {
00239 if (i*_ydim*_zdim + j*_zdim + k > _xdim*_ydim*_zdim)
00240 return 0.0;
00241 else
00242 return _values[i*_ydim*_zdim + j*_zdim + k];
00243 }
00244
00247 void SetVals(double *ptr)
00248 {
00249 for (int i = 0; i < _xdim*_ydim*_zdim; ++i)
00250 _values[i] = ptr[i];
00251 }
00252
00254 bool SetValue(int i, int j, int k, double val)
00255 {
00256 if (i*_ydim*_zdim + j*_zdim + k > _xdim*_ydim*_zdim)
00257 return false;
00258
00259 _values[i*_ydim*_zdim + j*_zdim + k] = val;
00260 return true;
00261 }
00262
00264 vector3 Center()
00265 {
00266 return vector3(_midx,_midy,_midz);
00267 }
00268
00269 friend std::ostream& operator<< ( std::ostream&, const OBFloatGrid& ) ;
00270 friend std::istream& operator>> ( std::istream&,OBFloatGrid& ) ;
00271
00273 double Inject(double x,double y,double z);
00274 void IndexToCoords(int idx, double &x, double &y, double &z);
00275 void CoordsToIndex(int*,double*);
00276 int CoordsToIndex(double x, double y, double z);
00278 double Interpolate(double,double,double);
00280 double InterpolateDerivatives(double,double,double,double *derivatives);
00281 };
00282
00283 #ifndef OBPolarGrid
00284 #define OBPolarGrid 0x01
00285 #endif //OBPolarGrid
00286
00287 #ifndef OBLipoGrid
00288 #define OBLipoGrid 0x02
00289 #endif //OBLipoGrid
00290
00294 class OBAPI OBProxGrid: public OBGrid
00295 {
00296 protected:
00297 int _gridtype;
00298 int _nxinc,_nyinc,_nzinc,_maxinc;
00299 double _inc;
00300 std::vector<std::vector<int> > cell;
00301
00302 public:
00303
00304 OBProxGrid(int gridtype=0)
00305 {
00306 _gridtype=gridtype;
00307 }
00308 ~OBProxGrid()
00309 {}
00310 void Setup(OBMol &mol,OBMol &box, double cutoff,double resolution = 0.5);
00311 void Setup(OBMol &mol,OBMol &box, double cutoff,
00312 std::vector<bool> &use,double resolution = 0.5);
00313 std::vector<int> *GetProxVector(double,double,double);
00314 std::vector<int> *GetProxVector(double*);
00315
00316 bool LipoGrid()
00317 {
00318 return((_gridtype&OBLipoGrid) ? true : false);
00319 }
00320 bool PolarGrid()
00321 {
00322 return(_gridtype&OBPolarGrid);
00323 }
00324 void SetGridType(int gridtype)
00325 {
00326 _gridtype = gridtype;
00327 }
00328 };
00329
00330
00331 typedef enum { Undefined = -1, PLP, ChemScore } score_t;
00332
00336 class OBAPI OBScoreGrid
00337 {
00338 protected:
00339 score_t gridtype;
00340 bool verbose;
00341
00342 public:
00343
00344 double score;
00345
00346 OBScoreGrid(void) { verbose = false; }
00347 virtual ~OBScoreGrid(void) {}
00348
00349 void SetVerbose(bool v) { verbose = v; }
00350 void SetType(score_t type) { gridtype = type; }
00351 score_t GetType(void) { return gridtype; }
00352
00353 virtual void Clear(void) { }
00354 virtual double Eval(double *) { return -1; }
00355 virtual double Eval(OBMol &mol){return Eval(mol.GetCoordinates());}
00356 virtual void Init(OBMol &, OBMol &, std::string &, double){}
00357 virtual void Setup(OBMol &) {}
00358 virtual void Setup(OBMol &, std::vector<int> &){}
00359 virtual void Setup(std::vector<int> &) {}
00360 virtual void Config(std::string) {}
00361 virtual bool Read(std::string) { return false; }
00362 virtual bool Write(std::string) { return false; }
00363 virtual vector3 Center() { return VZero; }
00364 virtual vector3 CenterMol(OBMol &) { return VZero; }
00365 };
00366
00367 }
00368
00369 #endif // OB_GRID_H
00370