PeriodicTable.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef _RD_PERIODIC_TABLE_H
00007 #define _RD_PERIODIC_TABLE_H
00008
00009 #include <map>
00010 #include <vector>
00011 #include <RDGeneral/types.h>
00012 #include "atomic_data.h"
00013
00014 namespace RDKit {
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 class PeriodicTable {
00028
00029 public:
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 static PeriodicTable *getTable();
00043
00044 ~PeriodicTable() {
00045 byanum.clear();
00046 byname.clear();
00047 };
00048
00049
00050
00051 double getAtomicWeight( UINT atomicNumber ) const {
00052 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00053 double mass = byanum[atomicNumber].Mass();
00054 return mass;
00055 }
00056
00057 double getAtomicWeight( const std::string &elementSymbol) const {
00058 PRECONDITION(byname.count(elementSymbol),"Element not found");
00059 int anum = byname.find(elementSymbol)->second;
00060 double mass = byanum[anum].Mass();
00061 return mass;
00062 }
00063
00064 double getAtomicWeight( char * elementSymbol ) const {
00065 return getAtomicWeight(std::string(elementSymbol));
00066 }
00067
00068
00069 int getAtomicNumber( char *elementSymbol ) const {
00070 std::string symb(elementSymbol);
00071
00072 return getAtomicNumber(symb);
00073 }
00074
00075 int getAtomicNumber( const std::string &elementSymbol ) const {
00076 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00077 int anum = byname.find(elementSymbol)->second;
00078 return anum;
00079 }
00080
00081
00082 std::string getElementSymbol(UINT atomicNumber) const {
00083 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00084 return byanum[atomicNumber].Symbol();
00085 }
00086
00087
00088 double getRvdw(UINT atomicNumber) const {
00089 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00090 return byanum[atomicNumber].Rvdw();
00091 }
00092
00093 double getRvdw(const std::string &elementSymbol ) const {
00094 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00095 return getRvdw(byname.find(elementSymbol)->second);
00096 }
00097
00098 double getRvdw(char *elementSymbol ) const {
00099 return getRvdw(std::string(elementSymbol));
00100 }
00101
00102
00103 double getRcovalent(UINT atomicNumber) const {
00104 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00105 return byanum[atomicNumber].Rcov();
00106 }
00107
00108 double getRcovalent(const std::string &elementSymbol) const {
00109 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00110 return getRcovalent(byname.find(elementSymbol)->second);
00111 }
00112
00113 double getRcovalent(char *elementSymbol ) const {
00114 return getRcovalent(std::string(elementSymbol));
00115 }
00116
00117
00118 double getRb0(UINT atomicNumber) const {
00119 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00120 return byanum[atomicNumber].Rb0();
00121 }
00122
00123 double getRb0(const std::string &elementSymbol) const {
00124 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00125 return getRb0(byname.find(elementSymbol)->second);
00126 }
00127
00128 double getRb0(char *elementSymbol ) const {
00129 return getRb0(std::string(elementSymbol));
00130 }
00131
00132
00133 int getDefaultValence(UINT atomicNumber) const {
00134 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00135 return byanum[atomicNumber].DefaultValence();
00136 }
00137
00138 int getDefaultValence(const std::string &elementSymbol) const {
00139 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00140 return getDefaultValence(byname.find(elementSymbol)->second);
00141 }
00142
00143 int getDefaultValence(char *elementSymbol ) const {
00144 return getDefaultValence(std::string(elementSymbol));
00145 }
00146
00147
00148
00149
00150 const INT_VECT &getValenceList( UINT atomicNumber ) const {
00151 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00152 return byanum[atomicNumber].ValenceList();
00153 }
00154
00155 const INT_VECT &getValenceList( const std::string &elementSymbol) const {
00156 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00157 return getValenceList(byname.find(elementSymbol)->second);
00158 }
00159
00160 const INT_VECT &getValenceList(char *elementSymbol ) const {
00161 return getValenceList(std::string(elementSymbol));
00162 }
00163
00164
00165 int getNouterElecs( UINT atomicNumber ) const {
00166 PRECONDITION(atomicNumber<byanum.size(),"Atomic number not found");
00167 return byanum[atomicNumber].NumOuterShellElec();
00168 }
00169
00170 int getNouterElecs( const std::string &elementSymbol) const {
00171 PRECONDITION(byname.count(elementSymbol),"Element '" + elementSymbol +"' not found");
00172 return getNouterElecs(byname.find(elementSymbol)->second);
00173 }
00174
00175 int getNouterElecs(char *elementSymbol ) const {
00176 return getNouterElecs(std::string(elementSymbol));
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 bool moreElectroNegative(UINT anum1, UINT anum2) const {
00192 PRECONDITION(anum1<byanum.size(),"Atomic number not found");
00193 PRECONDITION(anum2<byanum.size(),"Atomic number not found");
00194
00195 UINT ne1 = getNouterElecs(anum1);
00196 UINT ne2 = getNouterElecs(anum2);
00197 if (ne1 > ne2) {
00198 return true;
00199 }
00200 if (ne1 == ne2) {
00201 if (anum1 < anum2) {
00202 return true;
00203 }
00204 }
00205 return false;
00206 }
00207
00208
00209 private:
00210
00211 PeriodicTable();
00212 PeriodicTable &operator =( const PeriodicTable & );
00213
00214 static class PeriodicTable *ds_instance;
00215
00216 std::vector<atomicData> byanum;
00217 STR_UINT_MAP byname;
00218 };
00219
00220 };
00221
00222 #endif