stereo.h Source File

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files
- Examples

- File List
- File Members

stereo.h
Go to the documentation of this file.

    00001 /**********************************************************************
    00002   stereo.h - OBStereo & OBStereoBase
    00003
    00004   Copyright (C) 2009-2010 by Tim Vandermeersch
    00005
    00006   This file is part of the Open Babel project.
    00007   For more information, see <http://openbabel.org/>
    00008
    00009   This program is free software; you can redistribute it and/or modify
    00010   it under the terms of the GNU General Public License as published by
    00011   the Free Software Foundation; either version 2 of the License, or
    00012   (at your option) any later version.
    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   You should have received a copy of the GNU General Public License
    00020   along with this program; if not, write to the Free Software
    00021   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    00022   02110-1301, USA.
    00023  **********************************************************************/
    00024 #ifndef OB_STEREO_H
    00025 #define OB_STEREO_H
    00026
    00027 #include <openbabel/base.h> // OBGenericData
    00028 #include <openbabel/isomorphism.h> // Automorphisms
    00029 #include <vector>
    00030 #include <map>
    00031 #include <set>
    00032 #include <climits> // UINT_MAX
    00033
    00034 namespace OpenBabel {
    00035
    00038
    00075   struct OBAPI OBStereo
    00076   {
    00080     enum Type {
    00081       CisTrans            = (1<<0),
    00082       ExtendedCisTrans    = (1<<1),
    00083       SquarePlanar        = (1<<2),
    00084       Tetrahedral         = (1<<3),
    00085       ExtendedTetrahedral = (1<<4),
    00086       TrigonalBipyramidal = (1<<5),
    00087       Octahedral          = (1<<6)
    00088     };
    00089
    00094     enum BondDirection { // Values taken from MDL format
    00095       NotStereo =   0,
    00096       UpBond =      1,
    00097       DownBond =    6,
    00098       UnknownDir =  4
    00099     };
    00100
    00108     enum Shape {
    00109       ShapeU = 1,
    00110       ShapeZ = 2,
    00111       Shape4 = 3
    00112     };
    00113
    00119     enum View
    00120     {
    00121       ViewFrom = 1,
    00122       ViewTowards = 2
    00123     };
    00124
    00130     enum Winding {
    00131       Clockwise = 1,
    00132       AntiClockwise = 2,
    00133       UnknownWinding = 3
    00134     };
    00135
    00137
    00138
    00145     typedef unsigned long Ref;
    00149     enum {
    00150       NoRef = UINT_MAX,
    00151       ImplicitRef = UINT_MAX - 1
    00152     };
    00156     typedef std::vector<Ref> Refs;
    00160     typedef Refs::iterator RefIter;
    00164     typedef Refs::const_iterator ConstRefIter;
    00166
    00168
    00169
    00175     static Refs MakeRefs(Ref ref1, Ref ref2, Ref ref3, Ref ref4 = NoRef)
    00176     {
    00177       Refs refs(3);
    00178       refs[0] = ref1;
    00179       refs[1] = ref2;
    00180       refs[2] = ref3;
    00181       if (ref4 != NoRef)
    00182         refs.push_back(ref4);
    00183       return refs;
    00184     }
    00197     static bool ContainsSameRefs(const Refs &refs1, const Refs &refs2);
    00201     static bool ContainsRef(const Refs &refs, unsigned long ref);
    00203
    00205
    00206
    00226     static int NumInversions(const Refs &refs);
    00236     static void Permutate(Refs &refs, int i, int j);
    00248     static Refs Permutated(const Refs &refs, int i, int j);
    00250
    00251   };
    00252
    00258   struct OBStereoUnit
    00259   {
    00264     OBStereoUnit() : type(static_cast<OBStereo::Type>(0)), id(OBStereo::NoRef), para(false)
    00265     {
    00266     }
    00267
    00271     OBStereoUnit(OBStereo::Type _type, unsigned long _id, bool _para = false) :
    00272         type(_type), id(_id), para(_para)
    00273     {
    00274     }
    00275
    00276     OBStereo::Type type;
    00277     unsigned long id;
    00278     bool para;
    00279   };
    00287   typedef std::vector<OBStereoUnit> OBStereoUnitSet;
    00294   typedef std::vector<OBStereoUnitSet> OBStereoUnitSetOfSets;
    00295
    00296
    00297   // fwd decl
    00298   class OBMol;
    00321   class OBAPI OBStereoBase : public OBGenericData
    00322   {
    00323     public:
    00330       OBStereoBase(OBMol *mol) :
    00331         OBGenericData("StereoData", OBGenericDataType::StereoData, perceived),
    00332         m_mol(mol), m_specified(true)
    00333       {
    00334       }
    00338       virtual ~OBStereoBase() { m_mol = 0; }
    00339
    00341
    00342
    00346       OBMol* GetMolecule() const { return m_mol; }
    00350       virtual OBStereo::Type GetType() const = 0;
    00356       void SetSpecified(bool specified) { m_specified = specified; }
    00360       bool IsSpecified() const { return m_specified; }
    00362     private:
    00363       OBMol *m_mol;
    00364       bool m_specified;
    00365   };
    00366
    00367   // fwd decl
    00368   class OBTetrahedralStereo;
    00369   class OBCisTransStereo;
    00370   class OBSquarePlanarStereo;
    00384   class OBAPI OBStereoFacade
    00385   {
    00386     public:
    00394       OBStereoFacade(OBMol *mol, bool perceive = true) :
    00395           m_mol(mol), m_init(false), m_perceive(perceive)
    00396       {
    00397       }
    00398
    00401
    00404       unsigned int NumTetrahedralStereo();
    00409       bool HasTetrahedralStereo(unsigned long atomId);
    00415       OBTetrahedralStereo* GetTetrahedralStereo(unsigned long atomId);
    00417
    00420
    00423       unsigned int NumCisTransStereo();
    00428       bool HasCisTransStereo(unsigned long bondId);
    00434       OBCisTransStereo* GetCisTransStereo(unsigned long bondId);
    00436
    00439
    00442       unsigned int NumSquarePlanarStereo();
    00447       bool HasSquarePlanarStereo(unsigned long atomId);
    00453       OBSquarePlanarStereo* GetSquarePlanarStereo(unsigned long atomId);
    00455
    00456       template<int StereoType>
    00457       bool HasStereo(unsigned long id);
    00458       template<typename T>
    00459       T* GetStereo(unsigned long id);
    00460
    00461
    00462     private:
    00466       inline void EnsureInit() { if (!m_init) InitMaps(); }
    00472       void InitMaps();
    00473
    00474       OBMol *m_mol;
    00475       bool m_init;
    00476       bool m_perceive;
    00477       std::map<unsigned long, OBTetrahedralStereo*> m_tetrahedralMap;
    00478       std::map<unsigned long, OBCisTransStereo*> m_cistransMap;
    00479       std::map<unsigned long, OBSquarePlanarStereo*> m_squarePlanarMap;
    00480   };
    00481
    00482   // fwd decl
    00483   class OBBond;
    00486
    00494   OBAPI void PerceiveStereo(OBMol *mol, bool force = false);
    00526   OBAPI void StereoFrom2D(OBMol *mol,
    00527     std::map<OBBond*, enum OBStereo::BondDirection> *updown = NULL, bool force = false);
    00544   OBAPI void StereoFrom3D(OBMol *mol, bool force = false);
    00560   OBAPI void StereoFrom0D(OBMol *mol);
    00562
    00565
    00603   OBAPI std::vector<OBTetrahedralStereo*> TetrahedralFrom3D(OBMol *mol,
    00604       const OBStereoUnitSet &stereoUnits, bool addToMol = true);
    00649   OBAPI std::vector<OBTetrahedralStereo*> TetrahedralFrom2D(OBMol *mol,
    00650       const OBStereoUnitSet &stereoUnits, bool addToMol = true);
    00670   OBAPI std::vector<OBTetrahedralStereo*> TetrahedralFrom0D(OBMol *mol,
    00671       const OBStereoUnitSet &stereoUnits, bool addToMol = true);
    00672
    00709   OBAPI std::vector<OBCisTransStereo*> CisTransFrom3D(OBMol *mol,
    00710       const OBStereoUnitSet &stereoUnits, bool addToMol = true);
    00741   OBAPI std::vector<OBCisTransStereo*> CisTransFrom2D(OBMol *mol,
    00742       const OBStereoUnitSet &stereoUnits,
    00743       const std::map<OBBond*, enum OBStereo::BondDirection> *updown = NULL, bool addToMol = true);
    00770   OBAPI bool TetStereoToWedgeHash(OBMol &mol,
    00771       std::map<OBBond*, enum OBStereo::BondDirection> &updown,
    00772       std::map<OBBond*, OBStereo::Ref> &from);
    00784   OBAPI std::set<OBBond*> GetUnspecifiedCisTrans(OBMol& mol);
    00796   OBAPI void StereoRefToImplicit(OBMol& mol, OBStereo::Ref atomId);
    00816   OBAPI std::vector<OBCisTransStereo*> CisTransFrom0D(OBMol *mol,
    00817       const OBStereoUnitSet &stereoUnits,
    00818       bool addToMol = true);
    00820
    00821
    00824
    00904   OBAPI OBStereoUnitSet FindStereogenicUnits(OBMol *mol,
    00905       const std::vector<unsigned int> &symClasses);
    00982   OBAPI OBStereoUnitSet FindStereogenicUnits(OBMol *mol,
    00983       const std::vector<unsigned int> &symClasses,
    00984       const Automorphisms &automorphisms);
    00986
    01136
    01137 }
    01138
    01139 #endif
    01140

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines