/**********************************************************************
ring.h - Deal with rings, find smallest set of smallest rings (SSSR).
Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc.
Some portions Copyright (C) 2001-2005 by Geoffrey R. Hutchison
This file is part of the Open Babel project.
For more information, see
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
***********************************************************************/
#ifndef OB_RING_H
#define OB_RING_H
#include
#include
// TODO: Make this work as a free-standing header
// Currently only used in ring.cpp which imports mol.h beforehand
#include
namespace OpenBabel
{
class OBMol;
class OBAtom;
class OBBond;
// class introduction in ring.cpp
class OBAPI OBRing
{
OBMol *_parent; //!< parent molecule for this ring
public:
//public data members
std::vector _path; //!< the path of this ring (i.e., the atom indexes)
OBBitVec _pathset; //!< the path of this ring as a redundant bit vector
//! \name Constructors
//@{
OBRing() {}
//! Initialize a ring from a set of atom indexes @p path and with @p size
OBRing(std::vector& path, int size);
OBRing(std::vector& path, OBBitVec set) : _path(path), _pathset(set) {}
OBRing(const OBRing &src);
OBRing& operator=(const OBRing &src);
//@}
//member functions
//! \return the size of this ring (i.e., how many atoms in the cycle)
int Size() const { return(_path.size()); }
//! \return the size of this ring (i.e., how many atoms in the cycle)
//! \deprecated Use Size() instead
int PathSize() const { return(_path.size()); }
//! \return whether this ring is aromatic
//! If all atoms in this ring are aromatic, the ring will be considered aromatic
//! \todo This method uses implicit bonding -- bond info is not stored in OBRing
bool IsAromatic();
//! \return Whether atom @p a is a member of this ring
bool IsMember(OBAtom *a);
//! \return Whether both atoms in bond @p b are in this ring
//! \todo This method uses implicit bonding -- bond info is not stored in OBRing
bool IsMember(OBBond *b);
//! \return Whether @p i as an atom index is in this ring
bool IsInRing(int i)
{
return(_pathset.BitIsOn(i));
}
//! Set the parent of this ring to @p m
void SetParent(OBMol *m) { _parent = m; }
//! \return the parent of this ring, or NULL if none has been defined
OBMol *GetParent() { return(_parent);}
//! Set the supplied vectors to the @p center of this ring, along with
//! the @p normal (in both directions).
//! \param center The center of the ring
//! \param norm1 The normal of the best-fit plane for this ring
//! \param norm2 -1 * norm1 (i.e., the opposite direction of norm1)
//! \return True (success)
bool findCenterAndNormal(vector3 & center, vector3 &norm1, vector3 &norm2);
};
//! Comparison function for rings, used by OBRingSearch::SortRings()
//! \return true if a.size() > b.size()
OBAPI bool CompareRingSize(const OBRing *,const OBRing *);
/** \class OBRingSearch ring.h
\brief Internal class to facilitate OBMol::FindSSSR()
**/
class OBAPI OBRingSearch
{
std::vector _bonds; //!< the internal list of closure bonds (deprecated)
std::vector _rlist; //!< the internal list of rings
public:
OBRingSearch() {}
~OBRingSearch();
//! Sort ring sizes from smallest to largest
void SortRings()
{
std::sort(_rlist.begin(),_rlist.end(),CompareRingSize);
}
//! Starting with a full ring set - reduce to SSSR set
void RemoveRedundant(int);
//! Add a new ring from a "closure" bond: See OBBond::IsClosure()
void AddRingFromClosure(OBMol &,OBBond *);
bool SaveUniqueRing(std::deque&,std::deque&);
//! For debugging only, write the rings to std::cout
void WriteRings();
//! \name Iterator methods -- see OBMolRingIter for iteration over a molecule
//@{
//! \return an iterator pointing to the beginning of the list of rings
std::vector::iterator BeginRings()
{
return(_rlist.begin());
}
//! \return an iterator pointing to the end of the list of rings
std::vector::iterator EndRings()
{
return(_rlist.end());
}
//@}
};
/** \class OBRTree ring.h
\brief Internal class for OBRing search algorithms to create a search tree
of OBAtom objects
**/
class OBAPI OBRTree
{
OBAtom *_atom; //!< Atom represented by this node in the tree
OBRTree *_prv; //!< Previous (parent) entry in an OBRing tree
public:
//! Construct a search tree from a possible parent entry and atom entry
OBRTree(OBAtom*,OBRTree*);
~OBRTree() {}
//! \return the OBAtom::GetIdx() index of the atom in this node
int GetAtomIdx();
//! Recursively find the root of this tree, building up a vector of OBAtom nodes.
void PathToRoot(std::vector&);
};
} // end namespace OpenBabel
#endif // OB_RING_H
//! \file ring.h
//! \brief Deal with rings, find smallest set of smallest rings (SSSR).