1 /**********************************************************************
2 rotamer.h - Handle rotamer list data.
3 
4 Copyright (C) 1998-2000 by OpenEye Scientific Software, Inc.
5 Some portions Copyright (C) 2001-2006 by Geoffrey R. Hutchison
6 
7 This file is part of the Open Babel project.
8 For more information, see <http://openbabel.org/>
9 
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation version 2 of the License.
13 
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18 ***********************************************************************/
19 
20 #ifndef OB_ROTAMER_H
21 #define OB_ROTAMER_H
22 
23 #include <vector>
24 #include <map>
25 
26 #include <openbabel/rotor.h>
27 #include <openbabel/generic.h>
28 
29 namespace OpenBabel
30 {
31   class OBMol;
32 
33   //! \brief Supports a set of rotamer coordinate sets for some number of potentially rotatable bonds
34   // Further class introduction in rotamer.cpp
35  class OBAPI OBRotamerList : public OBGenericData
36   {
37     //! Number of atoms in the base coordinate set (i.e., OBMol::NumAtoms())
38     unsigned int                         _NBaseCoords;
39     //! Base coordinate sets (i.e., existing conformers to be modified)
40     std::vector<double*>                 _c;
41     //! Individual bond rotors (from an OBRotor object or other)
42     std::vector<std::pair<OBAtom**,std::vector<int> > > _vrotor;
43     //! \brief Index of each rotor's different sampling states ("resolution")
44     //! Usually from OBRotor::GetResolution()
45     std::vector<std::vector<double> >    _vres;
46     //! Individual rotamer states (i.e., the array of rotor settings)
47     std::vector<unsigned char*>          _vrotamer;
48     //! Rotors in rings
49     std::vector<std::vector<int> >       _vrings;
50     //! Dihedral angles of ring bonds
51     std::vector<std::vector<double> >    _vringTors;
52 
53   public:
OBRotamerList()54     OBRotamerList()
55       {
56         _NBaseCoords=0;
57         _type= OBGenericDataType::RotamerList;
58         _attr="RotamerList";
59       }
60 		virtual OBGenericData* Clone(OBBase* parent) const;
61 
62     ~OBRotamerList();
63     //! Set up a rotamer list based on an already created OBRotorList
64     void Setup(OBMol&,OBRotorList&);
65     //! Set up a rotamer list based on the supplied reference atoms and the number of rotors
66     //! \param mol The molecule to evaluate
67     //! \param ref An array of the 4 dihedral atoms for each rotor
68     //! \param nrotors The number of rotors (i.e., the size of ref / 4)
69     void Setup(OBMol &mol,unsigned char*ref,int nrotors);
70     //! \return the number of rotatable bonds considered
NumRotors()71     unsigned int NumRotors()   const
72     {
73       return (unsigned int)_vrotor.size();
74     }
75     //! \return the number of rotamer (conformation) coordinate sets
NumRotamers()76     unsigned int NumRotamers() const
77     {
78       return (unsigned int)_vrotamer.size();
79     }
80     //! Add a rotamer to the list based on the supplied coordinate set as a double*
81     void AddRotamer(double*);
82     //! Add a rotamer to the list based on @p key as a configuration of the individual rotor bonds
83     void AddRotamer(int *key);
84     //! Add a rotamer to the list based on @p key as a configuration of the individual rotor bonds
85     void AddRotamer(std::vector<int> key);
86     //! Add a rotamer to the list based on @p key as a configuration of the individual rotor bonds
87     void AddRotamer(unsigned char *key);
88     //! Add @p nconf rotamers based on @p as an array of configurations much like AddRotamer()
89     void AddRotamers(unsigned char *arr,int nconf);
90     //! \return A reference array (as used by AddRotamer() as a configuration of the individual rotor bonds
91     void GetReferenceArray(unsigned char*) const;
92 
93     //! \name Iterator methods
94     //@{
BeginRotamer()95     std::vector<unsigned char*>::iterator BeginRotamer()
96       {
97         return _vrotamer.begin();
98       }
EndRotamer()99     std::vector<unsigned char*>::iterator EndRotamer()
100       {
101         return _vrotamer.end();
102       }
103     //@}
104 
105     //! \brief Create a conformer list using the internal base set of coordinates
106     //! \return The set of coordinates by rotating the bonds in each rotamer
107     std::vector<double*> CreateConformerList(OBMol& mol);
108 
109     //! \brief Create a conformer list using the internal base set of coordinates
110     //! \return The set of coordinates as a reference in @p confs
111     void ExpandConformerList(OBMol&mol,std::vector<double*>& confs);
112 
113     bool SetCurrentCoordinates(OBMol &mol, std::vector<int> arr);
114 
115     //! \brief Copies the mol's conformers (the coordinates, NOT the pointers)
116     //! into the object as base coordinates
117     void SetBaseCoordinateSets(OBMol& mol);
118 
119     //! Copies the coordinates in bc, NOT the pointers, into this object
120     /** \param bc The conformer set for the molecule
121         \param N  The number of atoms in the molecule
122      **/
123     void SetBaseCoordinateSets(std::vector<double*> bc, unsigned int N);
124 
125     //! \return The number of "base" coordinate sets (i.e., the number of conformers in the base OBMol)
NumBaseCoordinateSets()126     unsigned int NumBaseCoordinateSets() const
127     {
128       return static_cast<unsigned int> (_c.size());
129     }
130 
131     //! Get a pointer to a specific base pointer (i.e., specific conformer)
GetBaseCoordinateSet(unsigned int i)132     double *GetBaseCoordinateSet(unsigned int i) const
133     {
134       return (i<_c.size()) ? _c[i] : nullptr;
135     }
136 
137     //! \return The number of atoms in the base OBMol
NumAtoms()138     unsigned int NumAtoms() const
139     {
140       return _NBaseCoords;
141     }
142   };
143 
144   //! Swap Byte instruction (i.e., handle transfers between endian forms)
145   int Swab(int);
146 
147 }
148 
149 #endif // OB_ROTAMER_H
150 
151 //! \file rotamer.h
152 //! \brief Handle rotamer list data.
153