generic.h
Go to the documentation of this file.
00001 /**********************************************************************
00002 generic.h - Handle generic data classes. Custom data for atoms, bonds, etc.
00003 
00004 Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc.
00005 Some portions Copyright (C) 2001-2010 by Geoffrey R. Hutchison
00006 
00007 This file is part of the Open Babel project.
00008 For more information, see <http://openbabel.org/>
00009 
00010 This program is free software; you can redistribute it and/or modify
00011 it under the terms of the GNU General Public License as published by
00012 the Free Software Foundation version 2 of the License.
00013 
00014 This program is distributed in the hope that it will be useful,
00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 GNU General Public License for more details.
00018 ***********************************************************************/
00019 
00020 #ifndef OB_GENERIC_H
00021 #define OB_GENERIC_H
00022 
00023 #include <openbabel/babelconfig.h>
00024 
00025 #include <string>
00026 #include <vector>
00027 #include <map>
00028 
00029 #include <openbabel/math/spacegroup.h>
00030 #include <openbabel/obutil.h>
00031 #include <openbabel/base.h>
00032 
00033 namespace OpenBabel
00034 {
00035 
00036   // Forward declarations
00037   class OBBase;
00038   class OBAtom;
00039   class OBBond;
00040   class OBMol;
00041   class OBRing;
00042 
00045  class OBAPI OBCommentData : public OBGenericData
00046   {
00047   protected:
00048     std::string _data;
00049   public:
00050     OBCommentData();
00051     OBCommentData(const OBCommentData&);
00052     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return new OBCommentData(*this);}
00053 
00054     OBCommentData& operator=(const OBCommentData &src);
00055 
00056     void          SetData(const std::string &data)
00057     { _data = data; Trim(_data); }
00058     void          SetData(const char *d)
00059     {_data = d; Trim(_data);     }
00060     const std::string &GetData()              const
00061     {        return(_data);      }
00062     virtual const std::string &GetValue()              const
00063     {        return(_data);      }
00064   };
00065 
00069   class OBAPI OBExternalBond
00070   {
00071     int     _idx;
00072     OBAtom *_atom;
00073     OBBond *_bond;
00074   public:
00075   OBExternalBond(): _idx(0), _atom(NULL), _bond(NULL) {}
00076     OBExternalBond(OBAtom *,OBBond *,int);
00077     OBExternalBond(const OBExternalBond &);
00078     ~OBExternalBond()   {}
00079 
00080     int     GetIdx()  const    {        return(_idx);    }
00081     OBAtom *GetAtom() const    {        return(_atom);   }
00082     OBBond *GetBond() const    {        return(_bond);   }
00083     void SetIdx(int idx)       {        _idx = idx;      }
00084     void SetAtom(OBAtom *atom) {        _atom = atom;    }
00085     void SetBond(OBBond *bond) {        _bond = bond;    }
00086   };
00087 
00090  class OBAPI OBExternalBondData : public OBGenericData
00091   {
00092   protected:
00093     std::vector<OBExternalBond> _vexbnd;
00094   public:
00095     OBExternalBondData();
00096 
00097     //Copying is not used and too much work to set up
00098     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return NULL;}
00099 
00100     void SetData(OBAtom*,OBBond*,int);
00101     std::vector<OBExternalBond> *GetData()
00102       {
00103         return(&_vexbnd);
00104       }
00105   };
00106 
00112  class OBAPI OBPairData : public OBGenericData
00113   {
00114   protected:
00115     std::string _value; 
00116   public:
00117     OBPairData();
00118     virtual OBGenericData* Clone(OBBase* /*parent*/) const
00119       {return new OBPairData(*this);}
00120     void    SetValue(const char *v)        {      _value = v;    }
00121     void    SetValue(const std::string &v) {      _value = v;    }
00122     virtual const std::string &GetValue() const
00123     {      return(_value);    }
00124   };
00125 
00128   // More detailed description in generic.cpp
00129   template <class ValueT>
00130     class OBAPI OBPairTemplate : public OBGenericData
00131   {
00132   protected:
00133     ValueT _value; 
00134   public:
00135   OBPairTemplate():
00136     OBGenericData("PairData", OBGenericDataType::PairData) {};
00137     void SetValue(const ValueT t)             { _value = t;     }
00138     virtual const ValueT &GetGenericValue() const    { return(_value); }
00139   };
00140 
00142   typedef OBPairTemplate<int>     OBPairInteger;
00144   typedef OBPairTemplate<double>  OBPairFloatingPoint;
00145 
00149  class OBAPI OBSetData : public OBGenericData
00150   {
00151   protected:
00152     std::vector<OBGenericData *> _vdata;
00153   public:
00154   OBSetData() : OBGenericData("SetData", OBGenericDataType::SetData) {}
00155     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return new OBSetData(*this);}
00156 
00158     void AddData(OBGenericData *d)
00159     {
00160       if(d)
00161         {
00162           _vdata.push_back(d);
00163         }
00164     }
00165 
00167     void SetData(std::vector<OBGenericData *> &vdata)
00168     {
00169       _vdata = vdata;
00170     }
00171 
00173     OBGenericData *GetData(const char *s)
00174     {
00175       std::vector<OBGenericData*>::iterator i;
00176 
00177       for (i = _vdata.begin();i != _vdata.end();++i)
00178         if ((*i)->GetAttribute() == s)
00179           return(*i);
00180 
00181       return(NULL);
00182     }
00183 
00185     OBGenericData *GetData(const std::string &s)
00186     {
00187       std::vector<OBGenericData*>::iterator i;
00188 
00189       for (i = _vdata.begin();i != _vdata.end();++i)
00190         if ((*i)->GetAttribute() == s)
00191           return(*i);
00192 
00193       return(NULL);
00194     }
00195 
00197     virtual const std::vector<OBGenericData *> &GetData() const //now virtual and const
00198     {
00199       return(_vdata);
00200     }
00201 
00203     std::vector<OBGenericData*>::iterator GetBegin()
00204       {
00205         return _vdata.begin();
00206       }
00207 
00209     std::vector<OBGenericData*>::iterator GetEnd()
00210       {
00211         return _vdata.end();
00212       }
00213 
00215     void DeleteData(OBGenericData *gd)
00216     {
00217       std::vector<OBGenericData*>::iterator i;
00218       for (i = _vdata.begin();i != _vdata.end();++i)
00219         if (*i == gd)
00220           {
00221             delete *i;
00222             _vdata.erase(i);
00223             break; // Done, don't do anything more, since iterator is invalid
00224           }
00225     }
00226 
00227   }; // OBSetData
00228 
00232  class OBAPI OBVirtualBond : public OBGenericData
00233   {
00234   protected:
00235     int _bgn;
00236     int _end;
00237     int _ord;
00238     int _stereo;
00239   public:
00240     OBVirtualBond();
00241     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return new OBVirtualBond(*this);}
00242     OBVirtualBond(int,int,int,int stereo=0);
00243     int GetBgn()    {      return(_bgn);    }
00244     int GetEnd()    {      return(_end);    }
00245     int GetOrder()  {      return(_ord);    }
00246     int GetStereo() {      return(_stereo); }
00247   };
00248 
00251  class OBAPI OBRingData : public OBGenericData
00252   {
00253   protected:
00254     std::vector<OBRing*> _vr;
00255   public:
00256     OBRingData();
00257     OBRingData(const OBRingData &);
00258     // When copying a molecule, don't copy the RingData. Why not? Well,
00259     // if you do, you'll end up with two RingDatas because one will already
00260     // exist due to Kekulize() in EndModify() in operator= in OBMol. Having
00261     // more than one RingData causes problems as one of them can become invalid
00262     // and cause segfaults.
00263     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return NULL;}
00264     ~OBRingData();
00265 
00266     OBRingData &operator=(const OBRingData &);
00267 
00268     void SetData(std::vector<OBRing*> &vr)
00269     {
00270       _vr = vr;
00271     }
00272     void PushBack(OBRing *r)
00273     {
00274       _vr.push_back(r);
00275     }
00276     std::vector<OBRing*> &GetData()
00277       {
00278         return(_vr);
00279       }
00280 
00281     std::vector<OBRing*>::iterator BeginRings()
00282       { return(_vr.begin()); }
00283     std::vector<OBRing*>::iterator EndRings()
00284       { return(_vr.end()); }
00285     OBRing *BeginRing(std::vector<OBRing*>::iterator &i);
00286     OBRing *NextRing(std::vector<OBRing*>::iterator &i);
00287   };
00288 
00293  class OBAPI OBUnitCell: public OBGenericData
00294   {
00295   public:
00296     enum LatticeType { Undefined,
00297                        Triclinic,
00298                        Monoclinic,
00299                        Orthorhombic,
00300                        Tetragonal,
00301                        Rhombohedral ,
00302                        Hexagonal,
00303                        Cubic};
00304 
00305 
00306   protected:
00307     matrix3x3 _mOrtho;// Orthogonal matrix of column vectors
00308     matrix3x3 _mOrient;// Orientation matrix
00309     vector3 _offset;
00310     std::string _spaceGroupName;
00311     const SpaceGroup* _spaceGroup;
00312     LatticeType _lattice;
00313   public:
00315     OBUnitCell();
00316     OBUnitCell(const OBUnitCell &);
00317     virtual OBGenericData* Clone(OBBase* /*parent*/) const
00318     {return new OBUnitCell(*this);}
00319     ~OBUnitCell()    {}
00320 
00321     OBUnitCell &operator=(const OBUnitCell &);
00322 
00332     void SetData(const double a, const double b, const double c,
00333                  const double alpha, const double beta, const double gamma);
00341     void SetData(const vector3 v1, const vector3 v2, const vector3 v3);
00342 
00348     void SetData(const matrix3x3 m);
00349 
00351     void SetOffset(const vector3 v1);
00352 
00355     void SetSpaceGroup(const SpaceGroup* sg) { _spaceGroup = sg; }
00356 
00360     void SetSpaceGroup(const std::string sg) { _spaceGroup = SpaceGroup::GetSpaceGroup (sg);
00361                                                _spaceGroupName = sg; }
00362 
00368     void SetSpaceGroup(const int sg) { _spaceGroup = SpaceGroup::GetSpaceGroup (sg); }
00369 
00371     void SetLatticeType(const LatticeType lt) { _lattice = lt; }
00372 
00375     void FillUnitCell(OBMol *);
00376 
00378     double GetA();
00380     double GetB();
00382     double GetC();
00384     double GetAlpha();
00386     double GetBeta();
00388     double GetGamma();
00390     vector3 GetOffset();
00391 
00393     const SpaceGroup* GetSpaceGroup() { return(_spaceGroup); }
00394 
00396     const std::string GetSpaceGroupName() { return(_spaceGroupName); }
00397 
00399     LatticeType GetLatticeType( int spacegroup );
00400 
00402     LatticeType GetLatticeType();
00403 
00405     std::vector<vector3> GetCellVectors();
00414     matrix3x3   GetCellMatrix();
00421     matrix3x3 GetOrthoMatrix();
00431     matrix3x3 GetOrientationMatrix();
00438     matrix3x3 GetFractionalMatrix();
00439 
00446     vector3 FractionalToCartesian(vector3 frac);
00453     vector3 CartesianToFractional(vector3 cart);
00454 
00458     vector3 WrapCartesianCoordinate(vector3 cart);
00462     vector3 WrapFractionalCoordinate(vector3 frac);
00463 
00465     int GetSpaceGroupNumber( std::string name = "" );
00467     double GetCellVolume();
00468   };
00469 
00475  class OBAPI OBConformerData: public OBGenericData
00476   {
00477   protected:
00479     std::vector<unsigned short>              _vDimension;
00481     std::vector<double>                      _vEnergies;
00483     std::vector< std::vector< vector3 > >    _vForces;
00485     std::vector< std::vector< vector3 > >    _vVelocity;
00487     std::vector< std::vector< vector3 > >    _vDisplace;
00489     std::vector<std::string>                 _vData;
00490 
00491   public:
00492     OBConformerData();
00493     OBConformerData(const OBConformerData &);
00494     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return new OBConformerData(*this);}
00495     ~OBConformerData()    {}
00496 
00497     OBConformerData &operator=(const OBConformerData &);
00498 
00499     void SetDimension(std::vector<unsigned short> vd) { _vDimension = vd; }
00500     void SetEnergies(std::vector<double> ve) { _vEnergies = ve; }
00501     void SetForces(std::vector< std::vector< vector3 > > vf) {_vForces = vf;}
00502     void SetVelocities(std::vector< std::vector< vector3 > > vv)
00503     { _vVelocity = vv; }
00504     void SetDisplacements(std::vector< std::vector< vector3 > > vd)
00505     { _vDisplace = vd; }
00506     void SetData(std::vector<std::string> vdat) { _vData = vdat; }
00507 
00508     std::vector<unsigned short> GetDimension() { return _vDimension; }
00509     std::vector<double>         GetEnergies()  { return _vEnergies; }
00510     std::vector< std::vector< vector3 > > GetForces() {return _vForces; }
00511     std::vector< std::vector< vector3 > > GetVelocities()
00512       {return _vVelocity;}
00513     std::vector< std::vector< vector3 > > GetDisplacements()
00514       {return _vDisplace;}
00515     std::vector<std::string>    GetData() { return _vData; }
00516 
00517   };
00518 
00523  class OBAPI OBSymmetryData: public OBGenericData
00524   {
00525   protected:
00526     std::string _spaceGroup;
00527     std::string _pointGroup;
00528   public:
00529     OBSymmetryData();
00530     OBSymmetryData(const OBSymmetryData &);
00531     virtual OBGenericData* Clone(OBBase* /*parent*/) const{return new OBSymmetryData(*this);}
00532     ~OBSymmetryData()    {}
00533 
00534     OBSymmetryData &operator=(const OBSymmetryData &);
00535 
00536     void SetData(std::string pg, std::string sg = "")
00537     { _pointGroup = pg; _spaceGroup = sg; }
00538     void SetPointGroup(std::string pg) { _pointGroup = pg; }
00539     void SetSpaceGroup(std::string sg) { _spaceGroup = sg; }
00540 
00541     std::string GetPointGroup() { return _pointGroup; }
00542     std::string GetSpaceGroup() { return _spaceGroup; }
00543   };
00544 
00548   class OBAPI OBTorsion
00549   {
00550     friend class OBMol;
00551     friend class OBTorsionData;
00552 
00553   protected:
00554     std::pair<OBAtom*,OBAtom*> _bc;
00556     std::vector<triple<OBAtom*,OBAtom*,double> > _ads;
00557 
00558     OBTorsion(): _bc((OBAtom *)NULL, (OBAtom *)NULL)      {      }
00559     //protected for use only by friend classes
00560     OBTorsion(OBAtom *, OBAtom *, OBAtom *, OBAtom *);
00561 
00562     std::vector<quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> > GetTorsions();
00563 
00564   public:
00565     OBTorsion(const OBTorsion &);
00566     ~OBTorsion()      {}
00567 
00568     OBTorsion& operator=(const OBTorsion &);
00569 
00570     void Clear();
00571     bool Empty()    {      return(_bc.first == 0 && _bc.second == 0);    }
00572 
00573     bool AddTorsion(OBAtom *a,OBAtom *b, OBAtom *c,OBAtom *d);
00574     bool AddTorsion(quad<OBAtom*,OBAtom*,OBAtom*,OBAtom*> &atoms);
00575 
00576     bool SetAngle(double radians, unsigned int index = 0);
00577     bool SetData(OBBond * /*bond*/) { return false; }
00578 
00579     bool GetAngle(double &radians, unsigned int index =0);
00582     unsigned int GetBondIdx();
00583     size_t GetSize() const    {      return _ads.size();    }
00584 
00587     std::pair<OBAtom*,OBAtom*>                  GetBC()
00588       {
00589         return(_bc);
00590       }
00593     std::vector<triple<OBAtom*,OBAtom*,double> > GetADs()
00594     {
00595       return(_ads) ;
00596     }
00597 
00598     bool IsProtonRotor();
00599   };
00600 
00605  class OBAPI OBTorsionData : public OBGenericData
00606   {
00607     friend class OBMol;
00608 
00609   protected:
00610     std::vector<OBTorsion> _torsions;
00611 
00612     OBTorsionData();
00613     OBTorsionData(const OBTorsionData &);
00614 
00615   public:
00616     OBTorsionData &operator=(const OBTorsionData &);
00617 
00619     virtual OBGenericData* Clone(OBBase* /*parent*/) const
00620     {return new OBTorsionData(*this);}
00621 
00622     void Clear();
00623 
00626     std::vector<OBTorsion> GetData() const
00627       {
00628         return _torsions;
00629       }
00630 
00633     size_t      GetSize() const
00634     {
00635       return _torsions.size();
00636     }
00637 
00638     void SetData(OBTorsion &torsion);
00639 
00640     bool FillTorsionArray(std::vector<std::vector<unsigned int> > &torsions);
00641   };
00642 
00645   class OBAPI OBAngle
00646   {
00647     friend class OBMol;
00648     friend class OBAngleData;
00649 
00650   protected:
00651 
00652     //member data
00653 
00654     OBAtom                *_vertex;
00655     std::pair<OBAtom*,OBAtom*>  _termini;
00656     double                  _radians;
00657 
00658     //protected member functions
00659 
00660     OBAngle();  //protect constructor for use only by friend classes
00661     OBAngle(OBAtom *vertex,OBAtom *a,OBAtom *b);
00662 
00663     triple<OBAtom*,OBAtom*,OBAtom*> GetAtoms();
00664     void SortByIndex();
00665 
00666   public:
00667 
00668     OBAngle(const OBAngle &);
00669     ~OBAngle()
00670       {
00671         _vertex = NULL;
00672       }
00673 
00674     OBAngle &operator = (const OBAngle &);
00675     bool     operator ==(const OBAngle &);
00676 
00677     void  Clear();
00678 
00681     double GetAngle() const
00682     {
00683       return(_radians);
00684     }
00687     void  SetAngle(double angle)
00688     {
00689       _radians = angle;
00690     }
00691     void  SetAtoms(OBAtom *vertex,OBAtom *a,OBAtom *b);
00692     void  SetAtoms(triple<OBAtom*,OBAtom*,OBAtom*> &atoms);
00693 
00694   };
00695 
00698  class OBAPI OBAngleData : public OBGenericData
00699   {
00700     friend class OBMol;
00701 
00702   protected:
00703     std::vector<OBAngle> _angles;
00704 
00705     OBAngleData();
00706     OBAngleData(const OBAngleData &);
00708 
00709     std::vector<OBAngle> GetData() const
00710       {
00711         return(_angles);
00712       }
00713 
00714   public:
00715     OBAngleData &operator =(const OBAngleData &);
00716     virtual OBGenericData* Clone(OBBase* /*parent*/) const
00717     {return new OBAngleData(*this);}
00718 
00719     void Clear();
00720     unsigned int FillAngleArray(int **angles, unsigned int &size);
00721     bool FillAngleArray(std::vector<std::vector<unsigned int> > &angles);
00722 
00723     void         SetData(OBAngle &);
00726     size_t GetSize() const
00727     {
00728       return _angles.size();
00729     }
00730   };
00731 
00732   enum atomreftype{
00733     output,     
00734     input,      
00735     calcvolume  
00736   }; // sets which atom4ref is accessed by OBChiralData
00737 
00741  class OBAPI OBChiralData : public OBGenericData
00742   {
00743     friend class OBMol;
00744     friend class OBAtom;
00745 
00746   protected:
00747     std::vector<unsigned int> _atom4refs; 
00748     std::vector<unsigned int> _atom4refo; 
00749     std::vector<unsigned int> _atom4refc; 
00750 
00753     int parity;
00754 
00755   public:
00756 
00757     OBChiralData();
00758     OBChiralData(const OBChiralData &src);
00759     virtual OBGenericData* Clone(OBBase* /*parent*/) const
00760       { return new OBChiralData(*this); }
00761     OBChiralData &operator =(const OBChiralData &);
00762     ~OBChiralData(){}
00763 
00764     void Clear();
00765 
00767     std::vector<unsigned int> GetAtom4Refs(atomreftype t) const;
00769     unsigned int GetAtomRef(int a,atomreftype t);
00770 
00771     bool SetAtom4Refs(std::vector<unsigned int> atom4refs, atomreftype t);
00772     int AddAtomRef(unsigned int atomref, atomreftype t);
00773 
00775     unsigned int GetSize(atomreftype t) const;
00776   };
00777 
00780  class OBSerialNums : public OBGenericData
00781   {
00782   protected:
00783     std::map<int, OBAtom*> _serialMap; 
00784 
00785   public:
00786 
00787   OBSerialNums() :
00788     OBGenericData("obSerialNums", OBGenericDataType::SerialNums)
00789       {}
00790 
00791   OBSerialNums(const OBSerialNums &cp) : OBGenericData(cp)
00792     {
00793       _serialMap = cp._serialMap;
00794     }
00797     virtual OBGenericData* Clone(OBBase* /*parent*/) const
00798     {return new OBSerialNums(*this);}
00799 
00800     std::map<int,OBAtom*> &GetData()    { return _serialMap;    }
00801     void SetData(std::map<int,OBAtom*> &sm) { _serialMap = sm;  }
00802 
00803   };
00804 
00807  class OBAPI OBVibrationData: public OBGenericData
00808   {
00809   protected:
00811     std::vector< std::vector< vector3 > > _vLx;
00812 
00814     std::vector<double>  _vFrequencies;
00815 
00817     std::vector<double>  _vIntensities;
00818 
00820     std::vector<double>  _vRamanActivities;
00821 
00822   public:
00823     OBVibrationData(): OBGenericData("VibrationData", OBGenericDataType::VibrationData){};
00824     virtual ~OBVibrationData() {}
00825     virtual OBGenericData* Clone(OBBase*) const
00826          {return new OBVibrationData(*this);}
00827 
00828     OBVibrationData & operator=(const OBVibrationData &);
00829 
00830     void SetData(const std::vector< std::vector< vector3 > > & lx,
00831                  const std::vector<double> & frequencies,
00832                  const std::vector<double> & intensities);
00833     void SetData(const std::vector< std::vector< vector3 > > &,
00834                  const std::vector<double> &,
00835                  const std::vector<double> &,
00836                  const std::vector<double> &);
00837 
00838     std::vector< std::vector< vector3 > > GetLx() const
00839       { return this->_vLx; }
00840     std::vector<double> GetFrequencies() const
00841       { return this->_vFrequencies; }
00842     std::vector<double> GetIntensities() const
00843       { return this->_vIntensities; }
00844     std::vector<double> GetRamanActivities() const
00845       { return this->_vRamanActivities; }
00846 
00847     unsigned int GetNumberOfFrequencies() const;
00848 };
00849 
00852  class OBAPI OBDOSData: public OBGenericData
00853   {
00854   protected:
00856     double _fermi;
00857 
00859     std::vector<double>  _vEnergies;
00860 
00862     std::vector<double>  _vDensities;
00863 
00865     std::vector<double>  _vIntegration;
00866 
00867   public:
00868     OBDOSData(): OBGenericData("DOSData", OBGenericDataType::DOSData){};
00869     virtual ~OBDOSData() {}
00870     virtual OBGenericData* Clone(OBBase*) const
00871          {return new OBDOSData(*this);}
00872 
00873     OBDOSData & operator=(const OBDOSData &);
00874 
00875     void SetData(double,
00876                  const std::vector<double> &,
00877                  const std::vector<double> &,
00878                  const std::vector<double> &);
00879 
00880     double GetFermiEnergy() const
00881       { return this->_fermi; }
00882     std::vector<double> GetEnergies() const
00883       { return this->_vEnergies; }
00884     std::vector<double> GetDensities() const
00885       { return this->_vDensities; }
00886     std::vector<double> GetIntegration() const
00887       { return this->_vIntegration; }
00888   };
00889 
00893   class OBAPI OBOrbital
00894   {
00895     friend class OBOrbitalData;
00896   protected:
00897     double       _energy;         
00898     double       _occupation;     
00899     std::string  _mullikenSymbol; 
00900   public:
00901     void SetData(double energy, double occupation = 2.0, std::string symbol = "A")
00902     { _energy = energy; _occupation = occupation; _mullikenSymbol = symbol; }
00903 
00904     double GetEnergy() const        { return _energy; }
00905     double GetOccupation() const    { return _occupation; }
00906     std::string GetSymbol() const   { return _mullikenSymbol; }
00907   };
00908 
00911   class OBAPI OBOrbitalData: public OBGenericData
00912   {
00913   public:
00914     OBOrbitalData(): OBGenericData("OrbitalData", OBGenericDataType::ElectronicData),
00915       _alphaHOMO(0), _betaHOMO(0), _openShell(false) {};
00916     virtual ~OBOrbitalData() {}
00917     virtual OBGenericData* Clone(OBBase*) const
00918          {return new OBOrbitalData(*this);}
00919 
00920     OBOrbitalData & operator=(const OBOrbitalData &);
00921 
00922     void SetAlphaOrbitals(std::vector<OBOrbital> orbitalList)
00923     { _alphaOrbitals = orbitalList; }
00924     void SetBetaOrbitals(std::vector<OBOrbital> orbitalList)
00925     { _betaOrbitals = orbitalList; }
00926     void SetHOMO(int alpha, int beta = 0)
00927     { _alphaHOMO = alpha; _betaHOMO = beta; }
00928     void SetOpenShell(bool openShell)
00929     { _openShell = openShell; }
00930 
00931     bool IsOpenShell() { return _openShell; }
00932 
00933     unsigned int GetAlphaHOMO() { return _alphaHOMO; }
00934     unsigned int GetBetaHOMO() { return _betaHOMO; }
00935     std::vector<OBOrbital> GetAlphaOrbitals() { return _alphaOrbitals; }
00936     std::vector<OBOrbital> GetBetaOrbitals() { return _betaOrbitals; }
00937 
00940     void LoadClosedShellOrbitals(std::vector<double> energies, std::vector<std::string> symmetries, int alphaHOMO);
00942     void LoadAlphaOrbitals(std::vector<double> energies, std::vector<std::string> symmetries, int alphaHOMO);
00944     void LoadBetaOrbitals(std::vector<double> energies, std::vector<std::string> symmetries, int betaHOMO);
00945 
00946   protected:
00947     std::vector<OBOrbital> _alphaOrbitals; 
00948     std::vector<OBOrbital> _betaOrbitals;  
00949     unsigned int _alphaHOMO;               
00950     unsigned int _betaHOMO;                
00951     bool _openShell;                       
00952   };
00953 
00956  class OBAPI OBElectronicTransitionData: public OBGenericData
00957   {
00958   protected:
00960     std::vector<double>  _vWavelengths;
00961 
00963     std::vector<double>  _vForces;
00964 
00966     std::vector<double>  _vEDipole;
00967 
00969     std::vector<double>  _vRotatoryStrengthsVelocity;
00970 
00972     std::vector<double>  _vRotatoryStrengthsLength;
00973 
00974   public:
00975     OBElectronicTransitionData(): OBGenericData("ElectronicTransitionData", OBGenericDataType::ElectronicTransitionData) {}
00976     virtual ~OBElectronicTransitionData() {}
00977     virtual OBGenericData* Clone(OBBase*) const
00978          {return new OBElectronicTransitionData(*this);}
00979 
00980     OBElectronicTransitionData & operator=(const OBElectronicTransitionData &);
00981 
00982     void SetData(const std::vector<double> & wavelengths,
00983                  const std::vector<double> & forces);
00984 
00985     void SetEDipole(const std::vector<double> &);
00986     void SetRotatoryStrengthsVelocity(const std::vector<double> &);
00987     void SetRotatoryStrengthsLength(const std::vector<double> &);
00988 
00989     std::vector<double> GetWavelengths() const
00990       { return this->_vWavelengths; }
00991     std::vector<double> GetForces() const
00992       { return this->_vForces; }
00993     std::vector<double> GetEDipole() const
00994       { return this->_vEDipole; }
00995     std::vector<double> GetRotatoryStrengthsVelocity() const
00996       { return this->_vRotatoryStrengthsVelocity; }
00997     std::vector<double> GetRotatoryStrengthsLength() const
00998       { return this->_vRotatoryStrengthsLength; }
00999 };
01000 
01003  class OBAPI OBRotationData: public OBGenericData
01004  {
01005  public:
01006    enum RType{UNKNOWN, ASYMMETRIC, SYMMETRIC, LINEAR};
01007    OBRotationData(): OBGenericData("RotationData", OBGenericDataType::RotationData){}
01008    virtual ~OBRotationData(){};
01009    virtual OBGenericData* Clone(OBBase*) const
01010          {return new OBRotationData(*this);}
01011    void SetData(RType RotorType, std::vector<double> RotationalConstants, int SymmetryNumber)
01012    {
01013      RotConsts = RotationalConstants;
01014      type = RotorType;
01015      SymNum = SymmetryNumber;
01016    }
01017 
01019    std::vector<double> GetRotConsts()const{ return RotConsts; }
01020 
01021    int GetSymmetryNumber()const{ return SymNum; }
01022    RType GetRotorType()const   { return type; }
01023 
01024  protected:
01025    std::vector<double> RotConsts;
01026    int                 SymNum;   
01027    RType               type;     
01028  };
01029 
01033  class OBAPI OBVectorData: public OBGenericData
01034  {
01035  public:
01036    OBVectorData(): OBGenericData("VectorData", OBGenericDataType::VectorData){}
01037    virtual ~OBVectorData(){};
01038    virtual OBGenericData* Clone(OBBase*) const
01039          {return new OBVectorData(*this);}
01040    void SetData(double x, double y, double z)
01041      { _vec = vector3(x, y, z); }
01042    void SetData(vector3 data)
01043      { _vec = data; }
01044    vector3 GetData() const
01045      { return _vec; }
01046 
01047  protected:
01048    vector3            _vec; 
01049  };
01050 
01054   class OBAPI OBMatrixData: public OBGenericData
01055   {
01056   public:
01057     OBMatrixData(): OBGenericData("MatrixData", OBGenericDataType::MatrixData){}
01058     virtual ~OBMatrixData(){};
01059     virtual OBGenericData* Clone(OBBase*) const
01060           {return new OBMatrixData(*this);}
01061     void SetData(matrix3x3 data)
01062       { _matrix = data; }
01063     matrix3x3 GetData() const
01064       { return _matrix; }
01065 
01066   protected:
01067     matrix3x3            _matrix; 
01068   };
01069 
01071   typedef std::vector<OBGenericData*>::iterator OBDataIterator;
01072 
01073 } //end namespace OpenBabel
01074 
01075 #endif // OB_GENERIC_H
01076 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines