Source code for exatomic.base

# -*- coding: utf-8 -*-
# Copyright (c) 2015-2022, Exa Analytics Development Team
# Distributed under the terms of the Apache License 2.0
"""
Base Functionality
############################
"""
import os
from platform import system
from IPython.display import display_html
from exatomic. exa.util import isotopes

# For numba compiled functions
sysname= system().lower()
#nbpll = "linux" in sysname
nbpll = False
nbtgt = "parallel" if nbpll else "cpu"
nbche = not nbtgt

isotopedf = isotopes.as_df()
sym2z = isotopedf.drop_duplicates("symbol").set_index("symbol")["Z"].to_dict()
z2sym = {v: k for k, v in sym2z.items()}
sym2mass = {}
sym2radius = {}
sym2color = {}
for k, v in vars(isotopes).items():
    if isinstance(v, isotopes.Element):
        sym2mass[k] = v.mass
        sym2radius[k] = [v.cov_radius, v.van_radius]
        sym2color[k] = '#' + v.color[-2:] + v.color[3:5] + v.color[1:3]

[docs]def staticdir(): """Return the location of the static data directory.""" root = os.path.abspath(os.path.dirname(__file__)) return os.path.join(root, "static")
[docs]def resource(name): """ Return the full path of a named resource in the static directory. If multiple files with the same name exist, **name** should contain the first directory as well. .. code-block:: python resource("myfile") resource("test01/test.txt") resource("test02/test.txt") """ for path, _, files in os.walk(staticdir()): if name in files: return os.path.abspath(os.path.join(path, name))
[docs]def list_resources(): """ Helper to return a list of all available resources (test input/output/etc) files. .. code-block:: python list_resources() # Displays a list of available input/output/etc files path = resource("qe.inp") # Get full path of an example file Returns: resources (list): List of file names """ files = [] for _, _, files_ in os.walk(staticdir()): files.extend(files_) return files
[docs]def display_side_by_side(*args): """Simple function to display 2 dataframes side by side in a notebook.""" html_str = ''.join([df.to_html() for df in args]) display_html(html_str.replace('table','table style=\"display:inline\"'), raw=True)
[docs]def sym2isomass(symbol): """ Function to get a mapper dictionary to get isotopic masses rather than isotopically weigthed atomic masses. .. code-block:: python >>> sym2isomass('Ni') {'Ni': 57.9353429} >>> sym2isomass(['Ni', 'H', 'C']) {'H': 1.0078250321, 'C': 12.0, 'Ni': 57.9353429} Args: symbol (list or iterable): Elements of interest Returns: masses (dict): Dictionary that can be used inplace of sym2mass """ # TODO: generalize so we can get the isotopic mass of any isotope # not only the most abundant # this may have to work in concert with the atom parsers to get the # isotope in the quantum codes # side note: this may not have much use as we generally only deal with the # most abundant isotopes if isinstance(symbol, str): symbol = [symbol] # remove duplicates symbol = list(dict.fromkeys(symbol)) # get a dataframe made up of the given symbols tmp = isotopedf.groupby('symbol').filter(lambda x: x['symbol'].unique() in symbol) # sort it by the abundance and get the first entry in each element df = tmp.sort_values(by=['af'], ascending=False).groupby('symbol').head(1) # convert to a dict masses = df.set_index('symbol')['mass'].to_dict() return masses