Source code for roentgen.util.util

import numpy as np

import astropy.units as u

import roentgen

__all__ = [
    "is_an_element",
    "get_atomic_number",
    "is_in_known_compounds",
    "get_compound_index",
    "get_material_density",
    "get_element_symbol",
    "density_ideal_gas",
    "get_material_name",
    "get_material_symbol",
]


[docs] def is_an_element(element_str): """Returns True if the string represents an element""" result = False lower_case_list = list([s.lower() for s in roentgen.elements["symbol"]]) if (len(element_str) <= 2) and (element_str.lower() in lower_case_list): result = True else: lower_case_list = list([s.lower() for s in roentgen.elements["name"]]) if element_str.lower() in lower_case_list: result = True return result
[docs] def get_element_symbol(element): """Return the symbol of an element given its long or its atomic number.""" lower_case_symbol_list = list([s.lower() for s in roentgen.elements["symbol"]]) if isinstance(element, str): if element.lower() in lower_case_symbol_list: # already a symbol return element.capitalize() elif is_an_element(element): lower_case_list = list([s.lower() for s in roentgen.elements["name"]]) return roentgen.elements[lower_case_list.index(element.lower())]["symbol"].capitalize() else: raise ValueError(f"{element} not recognized.") elif isinstance(element, (int, np.integer)): if element < 0: raise ValueError(f"{element} of type {type(element)} not recognized.") return roentgen.elements["symbol"][element - 1] else: raise ValueError(f"{element} of type {type(element)} not recognized.")
[docs] def get_atomic_number(element_str): """Return the atomic number of the element""" # check to see if element_str is symbol if is_an_element(element_str): if len(element_str) <= 2: lower_case_list = list([s.lower() for s in roentgen.elements["symbol"]]) atomic_number = roentgen.elements[lower_case_list.index(element_str.lower())]["z"] else: lower_case_list = list([s.lower() for s in roentgen.elements["name"]]) atomic_number = roentgen.elements[lower_case_list.index(element_str.lower())]["z"] else: raise ValueError(f"{element_str} not recognized.") return atomic_number
[docs] def is_in_known_compounds(compound_str): """Returns True is the compound is in the list of known compounds""" lcase_symbols_list = list([s.lower() for s in roentgen.compounds["symbol"]]) lcase_name_list = list([s.lower() for s in roentgen.compounds["name"]]) case1 = compound_str.lower() in lcase_symbols_list case2 = compound_str.lower() in lcase_name_list return case1 or case2
[docs] def get_compound_index(compound_str): """Return the index of the compound in the compound table""" if is_in_known_compounds(compound_str): lower_case_symbols_list = list([s.lower() for s in roentgen.compounds["symbol"]]) if compound_str.lower() in lower_case_symbols_list: return lower_case_symbols_list.index(compound_str.lower()) lcase_name_list = list([s.lower() for s in roentgen.compounds["name"]]) if compound_str.lower() in lcase_name_list: return lcase_name_list.index(compound_str.lower()) else: raise ValueError(f"{compound_str} not recognized.")
def get_material_value(material_str, column_str): if is_an_element(material_str): ind = get_atomic_number(material_str) - 1 return roentgen.elements[ind][column_str] elif is_in_known_compounds(material_str): # not using loc because table indexing is not yet stable # density = roentgen.compounds.loc[material_str]['density'] index = get_compound_index(material_str) return roentgen.compounds[index][column_str] else: raise ValueError(f"{material_str} not recognized.")
[docs] def get_material_symbol(material_str): """Given a material name return the symbol""" return get_material_value(material_str, "symbol")
[docs] def get_material_name(material_str): """Given a material name return the official name""" return get_material_value(material_str, "name")
[docs] def get_material_density(material_str): """Given a material name return the default density""" return get_material_value(material_str, "density")
[docs] @u.quantity_input(pressure=u.pascal, temperature=u.deg_C, equivalencies=u.temperature()) def density_ideal_gas(pressure, temperature) -> u.kg / u.m**3: """Given the pressure and temperature of a dry gas, return the density using the ideal gas law""" R = 287.058 * u.J / u.kg / u.Kelvin result = pressure / (R * temperature.to(u.K, equivalencies=u.temperature())) return result.decompose()