Source code for chempy.util.periodic

# -*- 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