# -*- coding: utf-8 -*-
symbols = (
'H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al',
'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe',
'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr',
'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn',
'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm',
'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W',
'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn',
'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf',
'Es', 'Fm', 'Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds',
'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og'
)
period_lengths = (2, 8, 8, 18, 18, 32, 32)
accum_period_lengths = (2, 10, 18, 36, 54, 86, 118)
# icosagens, crystallogens, pnictogens, chalcogens, halogens
groups = {g: tuple(x - 18 + g for x in accum_period_lengths[1:]) for g in range(13, 18)}
groups[1] = (1,) + tuple(x + 1 for x in accum_period_lengths[:-1]) # alkali metals
groups[2] = tuple(x + 2 for x in accum_period_lengths[:-1]) # alkaline earth metals
groups[18] = accum_period_lengths # noble gases
names = (
'Hydrogen', 'Helium', 'Lithium', 'Beryllium',
'Boron', 'Carbon', 'Nitrogen', 'Oxygen', 'Fluorine', 'Neon', 'Sodium',
'Magnesium', 'Aluminium', 'Silicon', 'Phosphorus', 'Sulfur',
'Chlorine', 'Argon', 'Potassium', 'Calcium', 'Scandium', 'Titanium',
'Vanadium', 'Chromium', 'Manganese', 'Iron', 'Cobalt', 'Nickel',
'Copper', 'Zinc', 'Gallium', 'Germanium', 'Arsenic', 'Selenium',
'Bromine', 'Krypton', 'Rubidium', 'Strontium', 'Yttrium', 'Zirconium',
'Niobium', 'Molybdenum', 'Technetium', 'Ruthenium', 'Rhodium',
'Palladium', 'Silver', 'Cadmium', 'Indium', 'Tin', 'Antimony',
'Tellurium', 'Iodine', 'Xenon', 'Caesium', 'Barium', 'Lanthanum',
'Cerium', 'Praseodymium', 'Neodymium', 'Promethium', 'Samarium',
'Europium', 'Gadolinium', 'Terbium', 'Dysprosium', 'Holmium',
'Erbium', 'Thulium', 'Ytterbium', 'Lutetium', 'Hafnium', 'Tantalum',
'Tungsten', 'Rhenium', 'Osmium', 'Iridium', 'Platinum', 'Gold',
'Mercury', 'Thallium', 'Lead', 'Bismuth', 'Polonium', 'Astatine',
'Radon', 'Francium', 'Radium', 'Actinium', 'Thorium', 'Protactinium',
'Uranium', 'Neptunium', 'Plutonium', 'Americium', 'Curium',
'Berkelium', 'Californium', 'Einsteinium', 'Fermium', 'Mendelevium',
'Nobelium', 'Lawrencium', 'Rutherfordium', 'Dubnium', 'Seaborgium',
'Bohrium', 'Hassium', 'Meitnerium', 'Darmstadtium', 'Roentgenium',
'Copernicium', 'Nihonium', 'Flerovium', 'Moscovium',
'Livermorium', 'Tennessine', 'Oganesson'
)
lower_names = tuple(n.lower().lstrip('(').rstrip(')') for n in names)
[docs]def atomic_number(name):
try:
return symbols.index(name) + 1
except ValueError:
return lower_names.index(name.lower()) + 1
# The data in '_relative_atomic_masses' is licensed under the CC-SA license
# https://en.wikipedia.org/w/index.php?title=List_of_elements&oldid=700476748
_relative_atomic_masses = (
"1.008 4.002602(2) 6.94 9.0121831(5) 10.81 12.011 14.007 15.999"
" 18.998403163(6) 20.1797(6) 22.98976928(2) 24.305 26.9815385(7) 28.085"
" 30.973761998(5) 32.06 35.45 39.948(1) 39.0983(1) 40.078(4)"
" 44.955908(5) 47.867(1) 50.9415(1) 51.9961(6) 54.938044(3) 55.845(2)"
" 58.933194(4) 58.6934(4) 63.546(3) 65.38(2) 69.723(1) 72.630(8)"
" 74.921595(6) 78.971(8) 79.904 83.798(2) 85.4678(3) 87.62(1)"
" 88.90584(2) 91.224(2) 92.90637(2) 95.95(1) [98] 101.07(2) 102.90550(2)"
" 106.42(1) 107.8682(2) 112.414(4) 114.818(1) 118.710(7) 121.760(1)"
" 127.60(3) 126.90447(3) 131.293(6) 132.90545196(6) 137.327(7)"
" 138.90547(7) 140.116(1) 140.90766(2) 144.242(3) [145] 150.36(2)"
" 151.964(1) 157.25(3) 158.92535(2) 162.500(1) 164.93033(2) 167.259(3)"
" 168.93422(2) 173.045(10) 174.9668(1) 178.49(2) 180.94788(2) 183.84(1)"
" 186.207(1) 190.23(3) 192.217(3) 195.084(9) 196.966569(5) 200.592(3)"
" 204.38 207.2(1) 208.98040(1) [209] [210] [222] [223] [226] [227]"
" 232.0377(4) 231.03588(2) 238.02891(3) [237] [244] [243] [247] [247]"
" [251] [252] [257] [258] [259] [266] [267] [268] [269] [270] [271]"
" [278] [281] [282] [285] [286] [289] [290] [293] [294] [294]"
)
def _get_relative_atomic_masses():
for mass in _relative_atomic_masses.split():
if mass.startswith('[') and mass.endswith(']'):
yield float(mass[1:-1])
elif '(' in mass:
yield float(mass.split('(')[0])
else:
yield(float(mass))
relative_atomic_masses = tuple(_get_relative_atomic_masses())
[docs]def mass_from_composition(composition):
""" Calculates molecular mass from atomic weights
Parameters
----------
composition: dict
Dictionary mapping int (atomic number) to int (coefficient)
Returns
-------
float
molecular weight in atomic mass units
Notes
-----
Atomic number 0 denotes charge or "net electron defficiency"
Examples
--------
>>> '%.2f' % mass_from_composition({0: -1, 1: 1, 8: 1})
'17.01'
"""
mass = 0.0
for k, v in composition.items():
if k == 0: # electron
mass -= v*5.489e-4
else:
mass += v*relative_atomic_masses[k-1]
return mass