bond.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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 };
00311
00313
00315 typedef std::vector<OBBond*>::iterator OBBondIterator;
00316
00317 }
00318
00319 #endif // OB_BOND_H
00320