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 #include <openbabel/base.h>
00027
00028
00029 #include <openbabel/mol.h>
00030
00031 #include <iosfwd>
00032 #include <algorithm>
00033 #include <vector>
00034 #include <string>
00035
00036 namespace OpenBabel
00037 {
00038
00039
00040 class OBMol;
00041
00044 class OBAPI OBGrid: public OBBase
00045 {
00046 protected:
00047 double _xmin,_xmax,_ymin,_ymax,_zmin,_zmax;
00048
00049 public:
00050 OBGrid() {}
00051
00055 virtual void Init(OBMol &box);
00056
00058 double GetXmin() const { return(_xmin); }
00060 double GetYmin() const { return(_ymin); }
00062 double GetZmin() const { return(_zmin); }
00064 double GetXmax() const { return(_xmax); }
00066 double GetYmax() const { return(_ymax); }
00068 double GetZmax() const { return(_zmax); }
00069
00071 bool PointIsInBox(double x,double y,double z)
00072 {
00073 return (x>=_xmin) && (x<=_xmax) &&
00074 (y>=_ymin) && (y<=_ymax) &&
00075 (z>=_zmin) && (z<=_zmax);
00076 }
00078 bool PointIsInBox(double *c)
00079 {
00080 return (c[0]>=_xmin) && (c[0]<=_xmax) &&
00081 (c[1]>=_ymin) && (c[1]<=_ymax) &&
00082 (c[2]>=_zmin) && (c[2]<=_zmax);
00083 }
00084
00086 bool PointIsInBox(vector3 v)
00087 {
00088 return (v.x() >= _xmin) && (v.x() <=_xmax) &&
00089 (v.y()>=_ymin) && (v.y()<=_ymax) &&
00090 (v.z()>=_zmin) && (v.z()<=_zmax);
00091 }
00092 };
00093
00101 class OBAPI OBFloatGrid: public OBGrid
00102 {
00103 protected:
00104 std::vector<double> _values;
00105 int *_ival;
00106 double _midz,_midx,_midy;
00107 int _ydim,_xdim,_zdim;
00108 double _spacing,_inv_spa;
00109 double _halfSpace;
00110
00111 vector3 _xAxis, _yAxis, _zAxis;
00112
00113 public:
00114
00115 OBFloatGrid() : _ival(NULL), _halfSpace(0.0) {}
00116 ~OBFloatGrid()
00117 {
00118 if (_ival) delete [] _ival;
00119 }
00120
00123 void Init(OBMol &box,double spacing, double pad=0.0);
00124
00126 vector3 GetMin() { return vector3(_xmin, _ymin, _zmin); }
00127
00131 void GetMin(double *a)
00132 {
00133 a[0]=_xmin;
00134 a[1]=_ymin;
00135 a[2]=_zmin;
00136 }
00137
00139 vector3 GetMax() { return vector3(_xmax, _ymax, _zmax); }
00140
00144 void GetMax(double *a)
00145 {
00146 a[0]=_xmax;
00147 a[1]=_ymax;
00148 a[2]=_zmax;
00149 }
00150
00152 double GetSpacing() const { return(_spacing); }
00156 void GetSpacing(double &s)
00157 {
00158 s=_spacing;
00159 }
00161 double GetScale() const { return(_inv_spa); }
00163 double GetHalfSpace() const {return(_halfSpace);}
00165 int GetXdim() const { return(_xdim); }
00167 int GetYdim() const { return(_ydim); }
00169 int GetZdim() const { return(_zdim); }
00173 void GetDim(int *a)
00174 {
00175 a[0]=_xdim;
00176 a[1]=_ydim;
00177 a[2]=_zdim;
00178 }
00179
00181 vector3 GetMidpointVector()
00182 {
00183 vector3 v;
00184 v.Set(_midx,_midy,_midz);
00185 return(v);
00186 }
00187
00189 vector3 GetXAxis() const
00190 {
00191 return _xAxis;
00192 }
00193
00195 vector3 GetYAxis() const
00196 {
00197 return _yAxis;
00198 }
00199
00201 vector3 GetZAxis() const
00202 {
00203 return _zAxis;
00204 }
00205
00207 void SetNumberOfPoints(int nx, int ny, int nz);
00208
00210 void SetXAxis(vector3);
00212 void SetYAxis(vector3);
00214 void SetZAxis(vector3);
00215
00220 void SetLimits(const vector3& origin, const vector3& x, const vector3& y,
00221 const vector3& z);
00224 void SetLimits(const double origin[3], const double x[3], const double y[3],
00225 const double z[3]);
00226
00228 std::vector<double> GetDataVector();
00232 void SetVals(const std::vector<double> & vals);
00233
00238 double *GetVals() { return(&_values[0]); }
00239
00241 double GetValue(int i, int j, int k)
00242 {
00243 if (i*_ydim*_zdim + j*_zdim + k > _xdim*_ydim*_zdim)
00244 return 0.0;
00245 else
00246 return _values[i*_ydim*_zdim + j*_zdim + k];
00247 }
00248
00251 void SetVals(double *ptr)
00252 {
00253 for (int i = 0; i < _xdim*_ydim*_zdim; ++i)
00254 _values[i] = ptr[i];
00255 }
00256
00258 bool SetValue(int i, int j, int k, double val)
00259 {
00260 if (i*_ydim*_zdim + j*_zdim + k > _xdim*_ydim*_zdim)
00261 return false;
00262
00263 _values[i*_ydim*_zdim + j*_zdim + k] = val;
00264 return true;
00265 }
00266
00268 vector3 Center()
00269 {
00270 return vector3(_midx,_midy,_midz);
00271 }
00272
00273 friend std::ostream& operator<< ( std::ostream&, const OBFloatGrid& ) ;
00274 friend std::istream& operator>> ( std::istream&,OBFloatGrid& ) ;
00275
00277 double Inject(double x,double y,double z);
00278 void IndexToCoords(int idx, double &x, double &y, double &z);
00279 void CoordsToIndex(int*,double*);
00280 int CoordsToIndex(double x, double y, double z);
00282 double Interpolate(double,double,double);
00284 double InterpolateDerivatives(double,double,double,double *derivatives);
00285 };
00286
00287 #ifndef OBPolarGrid
00288 #define OBPolarGrid 0x01
00289 #endif //OBPolarGrid
00290
00291 #ifndef OBLipoGrid
00292 #define OBLipoGrid 0x02
00293 #endif //OBLipoGrid
00294
00298 class OBAPI OBProxGrid: public OBGrid
00299 {
00300 protected:
00301 int _gridtype;
00302 int _nxinc,_nyinc,_nzinc,_maxinc;
00303 double _inc;
00304 std::vector<std::vector<int> > cell;
00305
00306 public:
00307
00308 OBProxGrid(int gridtype=0)
00309 {
00310 _gridtype=gridtype;
00311 }
00312 ~OBProxGrid()
00313 {}
00314 void Setup(OBMol &mol,OBMol &box, double cutoff,double resolution = 0.5);
00315 void Setup(OBMol &mol,OBMol &box, double cutoff,
00316 std::vector<bool> &use,double resolution = 0.5);
00317 std::vector<int> *GetProxVector(double,double,double);
00318 std::vector<int> *GetProxVector(double*);
00319
00320 bool LipoGrid()
00321 {
00322 return((_gridtype&OBLipoGrid) ? true : false);
00323 }
00324 bool PolarGrid()
00325 {
00326 return(_gridtype&OBPolarGrid);
00327 }
00328 void SetGridType(int gridtype)
00329 {
00330 _gridtype = gridtype;
00331 }
00332 };
00333
00334
00335 typedef enum { Undefined = -1, PLP, ChemScore } score_t;
00336
00340 class OBAPI OBScoreGrid
00341 {
00342 protected:
00343 score_t gridtype;
00344 bool verbose;
00345
00346 public:
00347
00348 double score;
00349
00350 OBScoreGrid(void) { verbose = false; }
00351 virtual ~OBScoreGrid(void) {}
00352
00353 void SetVerbose(bool v) { verbose = v; }
00354 void SetType(score_t type) { gridtype = type; }
00355 score_t GetType(void) { return gridtype; }
00356
00357 virtual void Clear(void) { }
00358 virtual double Eval(double *) { return -1; }
00359 virtual double Eval(OBMol &mol){return Eval(mol.GetCoordinates());}
00360 virtual void Init(OBMol &, OBMol &, std::string &, double){}
00361 virtual void Setup(OBMol &) {}
00362 virtual void Setup(OBMol &, std::vector<int> &){}
00363 virtual void Setup(std::vector<int> &) {}
00364 virtual void Config(std::string) {}
00365 virtual bool Read(std::string) { return false; }
00366 virtual bool Write(std::string) { return false; }
00367 virtual vector3 Center() { return VZero; }
00368 virtual vector3 CenterMol(OBMol &) { return VZero; }
00369 };
00370
00371 }
00372
00373 #endif // OB_GRID_H
00374