NWChem/contrib/marat/nwchem-python/atom_params.py
2021-10-29 15:39:53 -07:00

523 lines
14 KiB
Python

'''
testing pydoc
'''
import re
import string
import sys
class AtomParams():
'''
Stores static information about atoms
such as their full name (e.g. Hydrogen)
Van der Waals radius, covalent radius, and weights.
Private dictionaries are used.
Also includes helper function to get element name from atom name. e.g. to infer that
3HW or 3hW is actually is H.
'''
@staticmethod
def genProperty(a,d):
'''
Helper function to assist accessing atom
dictionaries by digesting "nonstandard" atom name
such O2 or 3HW through succession of steps
1. converting into all caps (h -> H)
2. removing all digits (1HW -> HW)
3. stripping to just the first found letter (1HW -> H)
'''
a0 = string.upper(a)
try:
return d[a0.strip()],a0
except KeyError:
pass
s1=re.match(r" *[0-9]*([A-Z]+) *", a0)
try:
return d[s1.group(1)],s1.group(1)
except KeyError:
pass
s1=re.match(r" *[0-9]*([A-Z] *)", a0)
try:
return d[s1.group(1)],s1.group(1)
except KeyError:
print("Cannot match name", a)
sys.exit(1)
@staticmethod
def fullName(s):
return AtomParams.genProperty(s, AtomParams.__fulename)[0]
@staticmethod
def elementName(s):
return AtomParams.genProperty(s, AtomParams.__fulename)[1]
@staticmethod
def vdwRadius(s):
return AtomParams.genProperty(s, AtomParams.__vdw)[0]
@staticmethod
def covRadius(s):
return AtomParams.genProperty(s, AtomParams.__rc)[0]
@staticmethod
def weight(s):
return AtomParams.genProperty(s, AtomParams.__weight)[0]
__weight = {}
__weight['H']=1.008000
__weight['He']=4.003000
__weight['Li']=6.941000
__weight['Be']=9.012000
__weight['B']=10.811000
__weight['C']=12.011000
__weight['N']=14.007000
__weight['O']=15.999000
__weight['F']=18.998000
__weight['Ne']=20.180000
__weight['Na']=22.991000
__weight['Mg']=24.305000
__weight['Al']=26.982000
__weight['Si']=28.086000
__weight['P']=30.974000
__weight['S']=32.066000
__weight['Cl']=35.453000
__weight['Ar']=39.948000
__weight['K']=39.098000
__weight['Ca']=40.078000
__weight['Sc']=44.956000
__weight['Ti']=47.867000
__weight['V']=50.942000
__weight['Cr']=51.996000
__weight['Mn']=54.938000
__weight['Fe']=55.845000
__weight['Co']=58.933000
__weight['Ni']=58.693000
__weight['Cu']=63.546000
__weight['Zn']=65.390000
__weight['Ga']=69.723000
__weight['Ge']=72.610000
__weight['As']=74.922000
__weight['Se']=78.960000
__weight['Br']=79.904000
__weight['Kr']=83.800000
__weight['Rb']=85.468000
__weight['Sr']=87.620000
__weight['Y']=88.906000
__weight['Zr']=91.224000
__weight['Nb']=92.906000
__weight['Mo']=95.940000
__weight['Tc']=0.000000
__weight['Ru']=101.070000
__weight['Rh']=102.906000
__weight['Pd']=106.420000
__weight['Ag']=107.868000
__weight['Cd']=112.411000
__weight['In']=114.818000
__weight['Sn']=118.710000
__weight['Sb']=121.760000
__weight['Te']=127.600000
__weight['I']=126.904000
__weight['Xe']=131.290000
__weight['Cs']=132.905000
__weight['Ba']=137.327000
__weight['Lu']=174.967000
__weight['Hf']=178.490000
__weight['Ta']=180.948000
__weight['W']=183.840000
__weight['Re']=186.207000
__weight['Os']=190.230000
__weight['Ir']=192.217000
__weight['Pt']=195.078000
__weight['Au']=196.967000
__weight['Hg']=200.590000
__weight['Tl']=204.383000
__weight['Pb']=207.200000
__weight['Bi']=208.980000
__weight['Po']=0.000000
__weight['At']=0.000000
__weight['Rn']=0.000000
__weight['Ce']=140.116000
__weight['Dy']=162.500000
__weight['Er']=167.260000
__weight['Eu']=151.964000
__weight['Gd']=157.250000
__weight['Ho']=164.930000
__weight['La']=138.906000
__weight['Nd']=144.240000
__weight['Pm']=0.000000
__weight['Pr']=140.908000
__weight['Sm']=150.360000
__weight['Tb']=158.925000
__weight['Tm']=168.934000
__weight['Yb']=173.040000
__weight['Fr']=0.000000
__weight['Ra']=0.000000
__weight['Lr']=0.000000
__weight['Rf']=0.000000
__weight['Db']=0.000000
__weight['Sg']=0.000000
__weight['Bh']=0.000000
__weight['Hs']=0.000000
__weight['Mt']=0.000000
__weight['Ds']=0.000000
__weight['Ac']=0.000000
__weight['Am']=0.000000
__weight['Bk']=0.000000
__weight['Cf']=0.000000
__weight['Cm']=0.000000
__weight['Es']=0.000000
__weight['Fm']=0.000000
__weight['Md']=0.000000
__weight['No']=0.000000
__weight['Np']=0.000000
__weight['Pa']=231.036000
__weight['Pu']=0.000000
__weight['Th']=232.038000
__weight['U']=238.029000
__rc = {}
__rc['H']=0.370000
__rc['He']=1.500000
__rc['Li']=1.280000
__rc['Be']=0.960000
__rc['B']=0.830000
__rc['C']=0.680000
__rc['N']=0.680000
__rc['O']=0.680000
__rc['F']=0.640000
__rc['Ne']=1.500000
__rc['Na']=1.660000
__rc['Mg']=1.410000
__rc['Al']=1.210000
__rc['Si']=1.200000
__rc['P']=1.050000
__rc['S']=1.020000
__rc['Cl']=0.990000
__rc['Ar']=1.510000
__rc['K']=2.030000
__rc['Ca']=1.760000
__rc['Sc']=1.700000
__rc['Ti']=1.600000
__rc['V']=1.530000
__rc['Cr']=1.390000
__rc['Mn']=1.610000
__rc['Fe']=1.520000
__rc['Co']=1.260000
__rc['Ni']=1.240000
__rc['Cu']=1.320000
__rc['Zn']=1.220000
__rc['Ga']=1.220000
__rc['Ge']=1.170000
__rc['As']=1.210000
__rc['Se']=1.220000
__rc['Br']=1.210000
__rc['Kr']=1.500000
__rc['Rb']=2.200000
__rc['Sr']=1.950000
__rc['Y']=1.900000
__rc['Zr']=1.750000
__rc['Nb']=1.640000
__rc['Mo']=1.540000
__rc['Tc']=1.470000
__rc['Ru']=1.460000
__rc['Rh']=1.450000
__rc['Pd']=1.390000
__rc['Ag']=1.450000
__rc['Cd']=1.440000
__rc['In']=1.420000
__rc['Sn']=1.390000
__rc['Sb']=1.390000
__rc['Te']=1.470000
__rc['I']=1.400000
__rc['Xe']=1.500000
__rc['Cs']=2.440000
__rc['Ba']=2.150000
__rc['Lu']=1.870000
__rc['Hf']=1.750000
__rc['Ta']=1.700000
__rc['W']=1.620000
__rc['Re']=1.510000
__rc['Os']=1.440000
__rc['Ir']=1.410000
__rc['Pt']=1.360000
__rc['Au']=1.500000
__rc['Hg']=1.320000
__rc['Tl']=1.450000
__rc['Pb']=1.460000
__rc['Bi']=1.480000
__rc['Po']=1.400000
__rc['At']=1.210000
__rc['Rn']=1.500000
__rc['Ce']=2.040000
__rc['Dy']=1.920000
__rc['Er']=1.890000
__rc['Eu']=1.980000
__rc['Gd']=1.960000
__rc['Ho']=1.920000
__rc['La']=2.070000
__rc['Nd']=2.010000
__rc['Pm']=1.990000
__rc['Pr']=2.030000
__rc['Sm']=1.980000
__rc['Tb']=1.940000
__rc['Tm']=1.900000
__rc['Yb']=1.870000
__rc['Fr']=2.600000
__rc['Ra']=2.210000
__rc['Lr']=1.500000
__rc['Rf']=1.500000
__rc['Db']=1.500000
__rc['Sg']=1.500000
__rc['Bh']=1.500000
__rc['Hs']=1.500000
__rc['Mt']=1.500000
__rc['Ds']=1.500000
__rc['Ac']=2.150000
__rc['Am']=1.800000
__rc['Bk']=1.540000
__rc['Cf']=1.830000
__rc['Cm']=1.690000
__rc['Es']=1.500000
__rc['Fm']=1.500000
__rc['Md']=1.500000
__rc['No']=1.500000
__rc['Np']=1.900000
__rc['Pa']=2.000000
__rc['Pu']=1.870000
__rc['Th']=2.060000
__rc['U']=1.960000
__fulename = {}
__fulename['H']='Hydrogen'
__fulename['He']='Helium'
__fulename['Li']='Lithium'
__fulename['Be']='Beryllium'
__fulename['B']='Boron'
__fulename['C']='Carbon'
__fulename['N']='Nitrogen'
__fulename['O']='Oxygen'
__fulename['F']='Fluorine'
__fulename['Ne']='Neon'
__fulename['Na']='Sodium'
__fulename['Mg']='Magnesium'
__fulename['Al']='Aluminium'
__fulename['Si']='Silicon'
__fulename['P']='Phosphorus'
__fulename['S']='Sulphur'
__fulename['Cl']='Chlorine'
__fulename['Ar']='Argon'
__fulename['K']='Potassium'
__fulename['Ca']='Calcium'
__fulename['Sc']='Scandium'
__fulename['Ti']='Titanium'
__fulename['V']='Vanadium'
__fulename['Cr']='Chromium'
__fulename['Mn']='Manganese'
__fulename['Fe']='Iron'
__fulename['Co']='Cobalt'
__fulename['Ni']='Nickel'
__fulename['Cu']='Copper'
__fulename['Zn']='Zinc'
__fulename['Ga']='Gallium'
__fulename['Ge']='Germanium'
__fulename['As']='Arsenic'
__fulename['Se']='Selenium'
__fulename['Br']='Bromine'
__fulename['Kr']='Krypton'
__fulename['Rb']='Rubidium'
__fulename['Sr']='Strontium'
__fulename['Y']='Yttrium'
__fulename['Zr']='Zirconium'
__fulename['Nb']='Niobium'
__fulename['Mo']='Molybdenum'
__fulename['Tc']='Technetium'
__fulename['Ru']='Ruthenium'
__fulename['Rh']='Rhodium'
__fulename['Pd']='Palladium'
__fulename['Ag']='Silver'
__fulename['Cd']='Cadmium'
__fulename['In']='Indium'
__fulename['Sn']='Tin'
__fulename['Sb']='Antimony'
__fulename['Te']='Tellurium'
__fulename['I']='Iodine'
__fulename['Xe']='Xenon'
__fulename['Cs']='Caesium'
__fulename['Ba']='Barium'
__fulename['Lu']='Lutetium'
__fulename['Hf']='Hafnium'
__fulename['Ta']='Tantalum'
__fulename['W']='Tungsten'
__fulename['Re']='Rhenium'
__fulename['Os']='Osmium'
__fulename['Ir']='Iridium'
__fulename['Pt']='Platinum'
__fulename['Au']='Gold'
__fulename['Hg']='Mercury'
__fulename['Tl']='Thallium'
__fulename['Pb']='Lead'
__fulename['Bi']='Bismuth'
__fulename['Po']='Polonium'
__fulename['At']='Astatine'
__fulename['Rn']='Radon'
__fulename['Ce']='Cerium'
__fulename['Dy']='Dysprosium'
__fulename['Er']='Erbium'
__fulename['Eu']='Europium'
__fulename['Gd']='Gadolinium'
__fulename['Ho']='Holmium'
__fulename['La']='Lanthanum'
__fulename['Nd']='Neodymium'
__fulename['Pm']='Promethium'
__fulename['Pr']='Praseodymium'
__fulename['Sm']='Samarium'
__fulename['Tb']='Terbium'
__fulename['Tm']='Thulium'
__fulename['Yb']='Ytterbium'
__fulename['Fr']='Francium'
__fulename['Ra']='Radium'
__fulename['Lr']='Lawrencium'
__fulename['Rf']='Rutherfordium'
__fulename['Db']='Dubnium'
__fulename['Sg']='Seaborgium'
__fulename['Bh']='Bohrium'
__fulename['Hs']='Hassium'
__fulename['Mt']='Meitnerium'
__fulename['Ds']='Darmstadtium'
__fulename['Ac']='Actinium'
__fulename['Am']='Americium'
__fulename['Bk']='Berkelium'
__fulename['Cf']='Californium'
__fulename['Cm']='Curium'
__fulename['Es']='Einsteinium'
__fulename['Fm']='Fermium'
__fulename['Md']='Mendelevium'
__fulename['No']='Nobelium'
__fulename['Np']='Neptunium'
__fulename['Pa']='Protactinium'
__fulename['Pu']='Plutonium'
__fulename['Th']='Thorium'
__fulename['U']='Uranium'
__vdw={}
__vdw['H']=1.090000
__vdw['He']=1.400000
__vdw['Li']=1.820000
__vdw['Be']=2.000000
__vdw['B']=2.000000
__vdw['C']=1.700000
__vdw['N']=1.550000
__vdw['O']=1.520000
__vdw['F']=1.470000
__vdw['Ne']=1.540000
__vdw['Na']=2.270000
__vdw['Mg']=1.730000
__vdw['Al']=2.000000
__vdw['Si']=2.100000
__vdw['P']=1.800000
__vdw['S']=1.800000
__vdw['Cl']=1.750000
__vdw['Ar']=1.880000
__vdw['K']=2.750000
__vdw['Ca']=2.000000
__vdw['Sc']=2.000000
__vdw['Ti']=2.000000
__vdw['V']=2.000000
__vdw['Cr']=2.000000
__vdw['Mn']=2.000000
__vdw['Fe']=2.000000
__vdw['Co']=2.000000
__vdw['Ni']=1.630000
__vdw['Cu']=1.400000
__vdw['Zn']=1.390000
__vdw['Ga']=1.870000
__vdw['Ge']=2.000000
__vdw['As']=1.850000
__vdw['Se']=1.900000
__vdw['Br']=1.850000
__vdw['Kr']=2.020000
__vdw['Rb']=2.000000
__vdw['Sr']=2.000000
__vdw['Y']=2.000000
__vdw['Zr']=2.000000
__vdw['Nb']=2.000000
__vdw['Mo']=2.000000
__vdw['Tc']=2.000000
__vdw['Ru']=2.000000
__vdw['Rh']=2.000000
__vdw['Pd']=1.630000
__vdw['Ag']=1.720000
__vdw['Cd']=1.580000
__vdw['In']=1.930000
__vdw['Sn']=2.170000
__vdw['Sb']=2.000000
__vdw['Te']=2.060000
__vdw['I']=1.980000
__vdw['Xe']=2.160000
__vdw['Cs']=2.000000
__vdw['Ba']=2.000000
__vdw['Lu']=2.000000
__vdw['Hf']=2.000000
__vdw['Ta']=2.000000
__vdw['W']=2.000000
__vdw['Re']=2.000000
__vdw['Os']=2.000000
__vdw['Ir']=2.000000
__vdw['Pt']=1.720000
__vdw['Au']=1.660000
__vdw['Hg']=1.550000
__vdw['Tl']=1.960000
__vdw['Pb']=2.020000
__vdw['Bi']=2.000000
__vdw['Po']=2.000000
__vdw['At']=2.000000
__vdw['Rn']=2.000000
__vdw['Ce']=2.000000
__vdw['Dy']=2.000000
__vdw['Er']=2.000000
__vdw['Eu']=2.000000
__vdw['Gd']=2.000000
__vdw['Ho']=2.000000
__vdw['La']=2.000000
__vdw['Nd']=2.000000
__vdw['Pm']=2.000000
__vdw['Pr']=2.000000
__vdw['Sm']=2.000000
__vdw['Tb']=2.000000
__vdw['Tm']=2.000000
__vdw['Yb']=2.000000
__vdw['Fr']=2.000000
__vdw['Ra']=2.000000
__vdw['Lr']=2.000000
__vdw['Rf']=2.000000
__vdw['Db']=2.000000
__vdw['Sg']=2.000000
__vdw['Bh']=2.000000
__vdw['Hs']=2.000000
__vdw['Mt']=2.000000
__vdw['Ds']=2.000000
__vdw['Ac']=2.000000
__vdw['Am']=2.000000
__vdw['Bk']=2.000000
__vdw['Cf']=2.000000
__vdw['Cm']=2.000000
__vdw['Es']=2.000000
__vdw['Fm']=2.000000
__vdw['Md']=2.000000
__vdw['No']=2.000000
__vdw['Np']=2.000000
__vdw['Pa']=2.000000
__vdw['Pu']=2.000000
__vdw['Th']=2.000000
__vdw['U']=1.860000
if __name__ == '__main__':
print(AtomParams.fullName(' H1 '))
print(AtomParams.vdwRadius('h'))