| 1 |
tim |
741 |
/********************************************************************** |
| 2 |
|
|
data.h - Global data and resource file parsers. |
| 3 |
|
|
|
| 4 |
|
|
Copyright (C) 1998-2001 by OpenEye Scientific Software, Inc. |
| 5 |
|
|
Some portions Copyright (C) 2001-2005 by Geoffrey R. Hutchison |
| 6 |
|
|
|
| 7 |
|
|
This file is part of the Open Babel project. |
| 8 |
|
|
For more information, see <http://openbabel.sourceforge.net/> |
| 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_DATA_H |
| 21 |
|
|
#define OB_DATA_H |
| 22 |
|
|
|
| 23 |
gezelter |
751 |
#include "config.h" |
| 24 |
tim |
741 |
|
| 25 |
|
|
#include <stdio.h> |
| 26 |
|
|
|
| 27 |
|
|
#if HAVE_IOSTREAM |
| 28 |
|
|
#include <iostream> |
| 29 |
|
|
#elif HAVE_IOSTREAM_H |
| 30 |
|
|
#include <iostream.h> |
| 31 |
|
|
#endif |
| 32 |
|
|
|
| 33 |
|
|
#if HAVE_FSTREAM |
| 34 |
|
|
#include <fstream> |
| 35 |
|
|
#elif HAVE_FSTREAM_H |
| 36 |
|
|
#include <fstream.h> |
| 37 |
|
|
#endif |
| 38 |
|
|
|
| 39 |
|
|
#include <vector> |
| 40 |
|
|
#include <string> |
| 41 |
|
|
|
| 42 |
|
|
namespace OpenBabel |
| 43 |
|
|
{ |
| 44 |
|
|
|
| 45 |
|
|
class OBElement; |
| 46 |
|
|
class OBAtom; |
| 47 |
|
|
class OBElementTable; |
| 48 |
|
|
|
| 49 |
|
|
class OBMol; |
| 50 |
|
|
class OBBitVec; |
| 51 |
|
|
|
| 52 |
|
|
//! \brief Base data table class, handles reading data files |
| 53 |
|
|
//! |
| 54 |
|
|
//! Base data table class--reads ASCII data files in various formats |
| 55 |
gezelter |
751 |
//! -# Checks for the environment variable _envvar (defaults to "FORCE_PARAM_PATH") |
| 56 |
tim |
741 |
//! - Tries the _subdir directory if defined (def. "data") and then the main directory |
| 57 |
|
|
//! -# Checks for the directory _dir (def. determined by the build environment) |
| 58 |
|
|
//! - Tries the subdirectory corresponding to this version, then the main directory |
| 59 |
|
|
//! -# Reverts to the compiled-in default data |
| 60 |
|
|
class OBAPI OBGlobalDataBase |
| 61 |
|
|
{ |
| 62 |
|
|
protected: |
| 63 |
|
|
bool _init; //!< whether the data been read already |
| 64 |
|
|
const char *_dataptr; //!< default data table if file is unreadable |
| 65 |
|
|
std::string _filename; //!< file to search for |
| 66 |
|
|
std::string _dir; //!< data directory for file if _envvar fails |
| 67 |
|
|
std::string _subdir; //!< subdirectory (if using environment variable) |
| 68 |
|
|
std::string _envvar; //!< environment variable to check first |
| 69 |
|
|
|
| 70 |
|
|
public: |
| 71 |
|
|
//! Constructor |
| 72 |
|
|
OBGlobalDataBase() |
| 73 |
|
|
{ |
| 74 |
|
|
_init = false; |
| 75 |
|
|
_dataptr = (char*)NULL; |
| 76 |
|
|
} |
| 77 |
|
|
//! Destructor |
| 78 |
|
|
virtual ~OBGlobalDataBase() {} |
| 79 |
|
|
//! Read in the data file, falling back as needed |
| 80 |
|
|
void Init(); |
| 81 |
|
|
//! \return the size of the database (for error checking) |
| 82 |
|
|
virtual unsigned int GetSize() { return 0;} |
| 83 |
|
|
//! Set the directory before calling Init() |
| 84 |
|
|
void SetReadDirectory(char *dir) { _dir = dir; } |
| 85 |
|
|
//! Set the environment variable to use before calling Init() |
| 86 |
|
|
void SetEnvironmentVariable(char *var) { _envvar = var; } |
| 87 |
|
|
//! Specified by particular table classes (parses an individual data line) |
| 88 |
|
|
virtual void ParseLine(const char*) {} |
| 89 |
|
|
}; |
| 90 |
|
|
|
| 91 |
|
|
//! \brief Individual element data type |
| 92 |
|
|
//! |
| 93 |
|
|
//! Stores a variety of data about an individual element |
| 94 |
|
|
class OBAPI OBElement |
| 95 |
|
|
{ |
| 96 |
|
|
int _num; |
| 97 |
|
|
char _symbol[3]; |
| 98 |
|
|
std::string _name; |
| 99 |
|
|
double _Rcov,_Rvdw,_mass,_elNeg,_ionize,_elAffinity; |
| 100 |
|
|
double _red, _green, _blue; |
| 101 |
|
|
int _maxbonds; |
| 102 |
|
|
public: |
| 103 |
|
|
OBElement() {} |
| 104 |
|
|
OBElement(int num, const char *sym, double rcov, double rvdw, |
| 105 |
|
|
int maxbo, double mass, double elNeg, double ionize, |
| 106 |
|
|
double elAffin, double red, double green, double blue, |
| 107 |
|
|
std::string name) : |
| 108 |
|
|
_num(num), _name(name), _Rcov(rcov), _Rvdw(rvdw), _mass(mass), |
| 109 |
|
|
_elNeg(elNeg), _ionize(ionize), _elAffinity(elAffin), |
| 110 |
|
|
_red(red), _green(green), _blue(blue), |
| 111 |
|
|
_maxbonds(maxbo) |
| 112 |
|
|
{ |
| 113 |
|
|
strncpy(_symbol, sym, 3); |
| 114 |
|
|
} |
| 115 |
|
|
|
| 116 |
|
|
//! \return the atomic number of this element |
| 117 |
|
|
int GetAtomicNum() { return(_num); } |
| 118 |
|
|
//! \return the atomic symbol for this element |
| 119 |
|
|
char *GetSymbol() { return(_symbol); } |
| 120 |
|
|
//! \return the covalent radius of this element |
| 121 |
|
|
double GetCovalentRad() { return(_Rcov); } |
| 122 |
|
|
//! \return the van der Waals radius of this element |
| 123 |
|
|
double GetVdwRad() { return(_Rvdw); } |
| 124 |
|
|
//! \return the standard atomic mass for this element (in amu) |
| 125 |
|
|
double GetMass() { return(_mass); } |
| 126 |
|
|
//! \return the maximum expected number of bonds to this element |
| 127 |
|
|
int GetMaxBonds() { return(_maxbonds);} |
| 128 |
|
|
//! \return the Pauling electronegativity for this element |
| 129 |
|
|
double GetElectroNeg() { return(_elNeg); } |
| 130 |
|
|
//! \return the ionization potential (in eV) of this element |
| 131 |
|
|
double GetIonization() { return(_ionize); } |
| 132 |
|
|
//! \return the electron affinity (in eV) of this element |
| 133 |
|
|
double GetElectronAffinity(){ return(_elAffinity); } |
| 134 |
|
|
//! \return the name of this element (in English) |
| 135 |
|
|
std::string GetName() { return(_name); } |
| 136 |
|
|
//! \return the red component of this element's default visualization color |
| 137 |
|
|
double GetRed() { return(_red); } |
| 138 |
|
|
//! \return the green component of this element's default color |
| 139 |
|
|
double GetGreen() { return(_green); } |
| 140 |
|
|
//! \return the blue component of this element's default color |
| 141 |
|
|
double GetBlue() { return(_blue); } |
| 142 |
|
|
}; |
| 143 |
|
|
|
| 144 |
|
|
// class introduction in data.cpp |
| 145 |
|
|
class OBAPI OBElementTable : public OBGlobalDataBase |
| 146 |
|
|
{ |
| 147 |
|
|
std::vector<OBElement*> _element; |
| 148 |
|
|
|
| 149 |
|
|
public: |
| 150 |
|
|
|
| 151 |
|
|
OBElementTable(void); |
| 152 |
|
|
~OBElementTable(); |
| 153 |
|
|
|
| 154 |
|
|
void ParseLine(const char*); |
| 155 |
|
|
|
| 156 |
|
|
//! \return the number of elements in the periodic table |
| 157 |
|
|
unsigned int GetNumberOfElements(); |
| 158 |
|
|
unsigned int GetSize() { return GetNumberOfElements(); } |
| 159 |
|
|
|
| 160 |
|
|
//! \deprecated Does not properly handle 'D' or 'T' hydrogen isotopes |
| 161 |
|
|
int GetAtomicNum(const char *); |
| 162 |
|
|
//! \return the atomic number matching the element symbol passed |
| 163 |
|
|
//! or 0 if not defined. For 'D' or 'T' hydrogen isotopes, will return |
| 164 |
|
|
//! a value in the second argument |
| 165 |
|
|
int GetAtomicNum(const char *, int &iso); |
| 166 |
|
|
//! \return the element symbol matching the atomic number passed |
| 167 |
|
|
char *GetSymbol(int); |
| 168 |
|
|
//! \return the van der Waals radius for this atomic number |
| 169 |
|
|
double GetVdwRad(int); |
| 170 |
|
|
//! \return the covalent radius for this atomic number |
| 171 |
|
|
double GetCovalentRad(int); |
| 172 |
|
|
//! \return the average atomic mass for this element. |
| 173 |
|
|
//! For exact isotope masses, use OpenBabel::OBIsotopeTable |
| 174 |
|
|
double GetMass(int); |
| 175 |
|
|
//! \return a "corrected" bonding radius based on the hybridization. |
| 176 |
|
|
//! Scales the covalent radius by 0.95 for sp2 and 0.90 for sp hybrids |
| 177 |
|
|
double CorrectedBondRad(int,int = 3); // atomic #, hybridization |
| 178 |
|
|
//! \return a "corrected" vdW radius based on the hybridization. |
| 179 |
|
|
//! Scales the van der Waals radius by 0.95 for sp2 and 0.90 for sp hybrids |
| 180 |
|
|
double CorrectedVdwRad(int,int = 3); // atomic #, hybridization |
| 181 |
|
|
//! \return the maximum expected number of bonds to this element |
| 182 |
|
|
int GetMaxBonds(int); |
| 183 |
|
|
//! \return the Pauling electronegativity for this element |
| 184 |
|
|
double GetElectroNeg(int); |
| 185 |
|
|
//! \return the ionization potential (in eV) for this element |
| 186 |
|
|
double GetIonization(int); |
| 187 |
|
|
//! \return the electron affinity (in eV) for this element |
| 188 |
|
|
double GetElectronAffinity(int); |
| 189 |
|
|
//! \return a vector with red, green, blue color values for this element |
| 190 |
|
|
std::vector<double> GetRGB(int); |
| 191 |
|
|
//! \return the name of this element |
| 192 |
|
|
std::string GetName(int); |
| 193 |
|
|
}; |
| 194 |
|
|
|
| 195 |
|
|
// class introduction in data.cpp |
| 196 |
|
|
class OBAPI OBIsotopeTable : public OBGlobalDataBase |
| 197 |
|
|
{ |
| 198 |
|
|
std::vector<std::vector<std::pair <unsigned int, double> > > _isotopes; |
| 199 |
|
|
|
| 200 |
|
|
public: |
| 201 |
|
|
|
| 202 |
|
|
OBIsotopeTable(void); |
| 203 |
|
|
~OBIsotopeTable() {} |
| 204 |
|
|
|
| 205 |
|
|
//! \return the number of elements in the isotope table |
| 206 |
|
|
unsigned int GetSize() { return _isotopes.size(); } |
| 207 |
|
|
|
| 208 |
|
|
void ParseLine(const char*); |
| 209 |
|
|
//! \return the exact masss of the isotope |
| 210 |
|
|
//! (or by default (i.e. "isotope 0") the most abundant isotope) |
| 211 |
|
|
double GetExactMass(const unsigned int atomicNum, |
| 212 |
|
|
const unsigned int isotope = 0); |
| 213 |
|
|
}; |
| 214 |
|
|
|
| 215 |
|
|
// class introduction in data.cpp |
| 216 |
|
|
class OBAPI OBTypeTable : public OBGlobalDataBase |
| 217 |
|
|
{ |
| 218 |
|
|
int _linecount; |
| 219 |
|
|
unsigned int _ncols,_nrows; |
| 220 |
|
|
int _from,_to; |
| 221 |
|
|
std::vector<std::string> _colnames; |
| 222 |
|
|
std::vector<std::vector<std::string> > _table; |
| 223 |
|
|
|
| 224 |
|
|
public: |
| 225 |
|
|
|
| 226 |
|
|
OBTypeTable(void); |
| 227 |
|
|
~OBTypeTable() {} |
| 228 |
|
|
|
| 229 |
|
|
void ParseLine(const char*); |
| 230 |
|
|
|
| 231 |
|
|
//! \return the number of atom types in the translation table |
| 232 |
|
|
unsigned int GetSize() { return _table.size(); } |
| 233 |
|
|
|
| 234 |
|
|
//! Set the initial atom type to be translated |
| 235 |
|
|
bool SetFromType(const char*); |
| 236 |
|
|
//! Set the destination atom type for translation |
| 237 |
|
|
bool SetToType(const char*); |
| 238 |
|
|
//! Translate atom types |
| 239 |
|
|
bool Translate(char *to, const char *from); // to, from |
| 240 |
|
|
//! Translate atom types |
| 241 |
|
|
bool Translate(std::string &to, const std::string &from); // to, from |
| 242 |
|
|
|
| 243 |
|
|
//! \return the initial atom type to be translated |
| 244 |
|
|
std::string GetFromType(); |
| 245 |
|
|
//! \return the destination atom type for translation |
| 246 |
|
|
std::string GetToType(); |
| 247 |
|
|
}; |
| 248 |
|
|
|
| 249 |
|
|
//! \brief Table of common biomolecule residues (for PDB or other files). |
| 250 |
|
|
//! Can assign atom types and bond orders for arbitrary residues |
| 251 |
|
|
class OBAPI OBResidueData : public OBGlobalDataBase |
| 252 |
|
|
{ |
| 253 |
|
|
int _resnum; |
| 254 |
|
|
std::vector<std::string> _resname; |
| 255 |
|
|
std::vector<std::vector<std::string> > _resatoms; |
| 256 |
|
|
std::vector<std::vector<std::pair<std::string,int> > > _resbonds; |
| 257 |
|
|
|
| 258 |
|
|
//variables used only temporarily for parsing resdata.txt |
| 259 |
|
|
std::vector<std::string> _vatmtmp; |
| 260 |
|
|
std::vector<std::pair<std::string,int> > _vtmp; |
| 261 |
|
|
public: |
| 262 |
|
|
|
| 263 |
|
|
OBResidueData(); |
| 264 |
|
|
void ParseLine(const char*); |
| 265 |
|
|
|
| 266 |
|
|
//! \return the number of residues in the table |
| 267 |
|
|
unsigned int GetSize() { return _resname.size(); } |
| 268 |
|
|
|
| 269 |
|
|
//! Sets the table to access the residue information for a specified |
| 270 |
|
|
//! residue name |
| 271 |
|
|
//! \return whether this residue name is in the table |
| 272 |
|
|
bool SetResName(const std::string &); |
| 273 |
|
|
//! \return the bond order for the bond specified in the current residue |
| 274 |
|
|
//! \deprecated Easier to use the two-argument form |
| 275 |
|
|
int LookupBO(const std::string &); |
| 276 |
|
|
//! \return the bond order for the bond specified between the two specified |
| 277 |
|
|
//! atom labels |
| 278 |
|
|
int LookupBO(const std::string &, const std::string&); |
| 279 |
|
|
//! Look up the atom type and hybridization for the atom label specified |
| 280 |
|
|
//! in the first argument for the current residue |
| 281 |
|
|
//! \return whether the atom label specified is found in the current residue |
| 282 |
|
|
bool LookupType(const std::string &,std::string&,int&); |
| 283 |
|
|
//! Assign bond orders, atom types and residues for the supplied OBMol |
| 284 |
|
|
//! based on the residue information assigned to atoms |
| 285 |
|
|
//! \deprecated second OBBitVec argument is ignored |
| 286 |
|
|
bool AssignBonds(OBMol &,OBBitVec &); |
| 287 |
|
|
}; |
| 288 |
|
|
|
| 289 |
|
|
// Used by other code for reading files |
| 290 |
|
|
#ifdef WIN32 |
| 291 |
|
|
#define FILE_SEP_CHAR "\\" |
| 292 |
|
|
#else |
| 293 |
|
|
#define FILE_SEP_CHAR "/" |
| 294 |
|
|
#endif |
| 295 |
|
|
|
| 296 |
|
|
} // end namespace OpenBabel |
| 297 |
|
|
|
| 298 |
|
|
#endif //DATA_H |
| 299 |
|
|
|
| 300 |
|
|
//! \file data.h |
| 301 |
|
|
//! \brief Global data and resource file parsers. |