bond.h

Go to the documentation of this file.
00001 /**********************************************************************
00002 bond.h - Handle OBBond class.
00003  
00004 Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc.
00005 Some portions Copyright (C) 2001-2006 by Geoffrey R. Hutchison
00006 Some portions Copyright (C) 2003 by Michael Banck
00007 Some portions Copyright (C) 2008 by Tim Vandermeersch
00008  
00009 This file is part of the Open Babel project.
00010 For more information, see <http://openbabel.sourceforge.net/>
00011  
00012 This program is free software; you can redistribute it and/or modify
00013 it under the terms of the GNU General Public License as published by
00014 the Free Software Foundation version 2 of the License.
00015  
00016 This program is distributed in the hope that it will be useful,
00017 but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 GNU General Public License for more details.
00020 ***********************************************************************/
00021 
00022 #ifndef OB_BOND_H
00023 #define OB_BOND_H
00024 
00025 #include <openbabel/babelconfig.h>
00026 
00027 #ifndef EXTERN
00028 #  define EXTERN extern
00029 #endif
00030 
00031 #include <openbabel/base.h>
00032 #include <openbabel/atom.h>
00033 
00034 namespace OpenBabel
00035 {
00036   class OBAtom;
00037 
00039   typedef OBBond OBEdgeBase;
00040 
00041   //BOND Property Macros (flags)
00043 #define OB_AROMATIC_BOND  (1<<1)
00045 #define OB_WEDGE_BOND     (1<<2)
00047 #define OB_HASH_BOND      (1<<3)
00049 #define OB_RING_BOND      (1<<4)
00051 #define OB_TORUP_BOND     (1<<5)
00053 #define OB_TORDOWN_BOND   (1<<6)
00055 #define OB_KSINGLE_BOND   (1<<7)
00057 #define OB_KDOUBLE_BOND   (1<<8)
00059 #define OB_KTRIPLE_BOND   (1<<9)
00061 #define OB_CLOSURE_BOND   (1<<10)
00062   // 11-16 currently unused
00063 
00064 #define OB_WEDGE_OR_HASH_BOND     (1<<11)
00065 #define OB_CIS_OR_TRANS_BOND     (1<<12)
00067 
00068   //class OBBondPrivate;
00069   class OBAPI OBBond: public OBBase
00070   {
00071     protected:
00072       unsigned int                _idx;   
00073       OBMol                      *_parent;
00074       OBAtom                     *_bgn;   
00075       OBAtom                     *_end;   
00076       char                        _order; 
00077       unsigned short int          _flags; 
00078       unsigned long                 _id;        
00079       //OBBondPrivate * const d;
00080 
00084       bool HasFlag(int flag) const { return ((_flags & flag) != 0); }
00088       void SetFlag(int flag) { _flags |= flag; }
00092       void UnsetFlag(int flag) { _flags &= (~(flag)); }
00093 
00094     public:
00095       enum Flag {
00096         Aromatic = (1<<1), 
00097         Ring     = (1<<4), 
00098         Closure  = (1<<10) 
00099       };
00100       enum StereoFlag {
00101         Wedge       = (1<<2),  
00102         Hash        = (1<<3),  
00103         WedgeOrHash = (1<<11), 
00104         CisOrTrans  = (1<<12)  
00105       };
00107 
00108       bool Visit;
00109 
00111       OBBond();
00113       virtual ~OBBond();
00114 
00116 
00117 
00118 
00120       void SetIdx(int idx)        {          _idx = idx;        }
00121       void SetId(unsigned long id) { _id = id; }
00123 
00124       void SetBO(int order);
00126       void SetBondOrder(int order);
00128       void SetBegin(OBAtom *begin){          _bgn = begin;      }
00130       void SetEnd(OBAtom *end)    {          _end = end;        }
00132       void SetParent(OBMol *ptr)  {        _parent= ptr;        }
00134       void SetLength(OBAtom *fixed,double length);
00137       void SetLength(double length);
00139       void Set(int index, OBAtom* begin,OBAtom* end,int order,int flags);
00141       void SetKSingle();
00143       void SetKDouble();
00145       void SetKTriple();
00147       void SetAromatic()    { SetFlag(OB_AROMATIC_BOND); }
00152       void SetWedge() { SetFlag(Wedge); }
00157       void SetHash() { SetFlag(Hash); }
00162       void SetWedgeOrHash() { SetFlag(WedgeOrHash); }
00164       void SetUp()          { SetFlag(OB_TORUP_BOND); UnsetFlag(OB_TORDOWN_BOND); }
00166       void SetDown()        { SetFlag(OB_TORDOWN_BOND); UnsetFlag(OB_TORUP_BOND);   }
00168       void SetInRing(bool set=true) { if(set)SetFlag(OB_RING_BOND); else UnsetFlag(OB_RING_BOND);}
00170 
00173       void SetClosure()     { SetFlag(OB_CLOSURE_BOND);  }
00175       void UnsetHash()      { UnsetFlag(OB_HASH_BOND);    }
00177       void UnsetWedge()     { UnsetFlag(OB_WEDGE_BOND);   }
00179       void UnsetUp()        { UnsetFlag(OB_TORUP_BOND);   }
00181       void UnsetDown()      { UnsetFlag(OB_TORDOWN_BOND); }
00183       void UnsetAromatic()  { UnsetFlag(OB_AROMATIC_BOND);}
00185       void UnsetKekule()
00186         {
00187           _flags &= (~(OB_KSINGLE_BOND|OB_KDOUBLE_BOND|OB_KTRIPLE_BOND));
00188         }
00190 
00192 
00193 
00194       unsigned int     GetIdx()           const { return(_idx);  }
00195       unsigned long GetId()           const { return _id; }
00197 
00198       unsigned int     GetBO()            const { return(_order); }
00200       unsigned int     GetBondOrder()     const { return(_order); }
00202       unsigned int     GetFlags()         const { return(_flags);      }
00204       unsigned int     GetBeginAtomIdx()  const 
00205         { return (_bgn ? _bgn->GetIdx() : 0); }
00207       unsigned int     GetEndAtomIdx()    const 
00208         { return (_end ? _end->GetIdx() : 0); }
00210       OBAtom *GetBeginAtom()    { return(_bgn);    }
00211       const OBAtom *GetBeginAtom() const 
00212         { return(_bgn);    }
00214       OBAtom *GetEndAtom()      { return(_end);    }
00215       const OBAtom *GetEndAtom() const
00216         { return(_end);    }
00218 
00220       OBAtom *GetNbrAtom(OBAtom *ptr)
00221         {
00222           return((ptr != _bgn)? _bgn : _end);
00223         }
00225       OBMol  *GetParent()                 {return(_parent);}
00227 
00228       double  GetEquibLength() const;
00230       double  GetLength() const;
00232 
00234       unsigned int     GetNbrAtomIdx(OBAtom *ptr)
00235         {
00236           if (ptr!=_bgn)
00237             return (_bgn ? _bgn->GetIdx() : 0); 
00238           else
00239             return (_end ? _end->GetIdx() : 0); 
00240         }
00242 
00244 
00245 
00246 
00247 
00248       bool IsAromatic() const;
00250       bool IsInRing() const;
00252 
00257       bool IsRotor();
00259       bool IsAmide();
00261       bool IsPrimaryAmide();
00263       bool IsSecondaryAmide();
00265       bool IsEster();
00267       bool IsCarbonyl();
00269       bool IsSingle();
00271       bool IsDouble();
00273       bool IsTriple();
00275       bool IsKSingle();
00277       bool IsKDouble();
00279       bool IsKTriple();
00281       bool IsClosure();
00284       bool IsUp()    {    return(HasFlag(OB_TORUP_BOND));    }
00287       bool IsDown()  {    return(HasFlag(OB_TORDOWN_BOND));  }
00290       bool IsWedge() {    return(HasFlag(OB_WEDGE_BOND));    }
00293       bool IsHash()  {    return(HasFlag(OB_HASH_BOND));     }
00299       bool IsWedgeOrHash() const { return(HasFlag(WedgeOrHash)); }
00304       bool IsCisOrTrans() const { return(HasFlag(CisOrTrans)); }
00305  
00307       bool IsDoubleBondGeometry();
00309 
00310     }; // class OBBond
00311   
00313 
00315   typedef std::vector<OBBond*>::iterator OBBondIterator;
00316 
00317 }// namespace OpenBabel
00318 
00319 #endif   // OB_BOND_H
00320