Source code for paftacular.comps.util
"""Utility functions for formula and composition conversions"""
from collections import Counter
from tacular import ELEMENT_LOOKUP, ElementInfo
from ..util import parse_formula
[docs]
def formula_to_composition(formula: str) -> Counter[ElementInfo]:
"""Convert chemical formula string to elemental composition"""
elem_counts: Counter[str] = parse_formula(formula)
return Counter({ELEMENT_LOOKUP[elem]: count for elem, count in elem_counts.items()})
[docs]
def composition_to_proforma_formula_string(comp: Counter[ElementInfo], hill_order: bool = True) -> str:
"""Convert composition to ProForma-style formula string"""
keys = list(sorted(comp.keys()))
comps = []
for key in keys:
elem_info, cnt = key, comp[key]
if cnt == 0:
continue
comps.append(elem_info.serialize(cnt))
return "".join(comps)
[docs]
def composition_to_formula_string(comp: Counter[ElementInfo]) -> str:
"""Convert composition to standard chemical formula string"""
if not comp:
return ""
all_positive = all(count >= 0 for count in comp.values())
all_negative = all(count <= 0 for count in comp.values())
if not (all_positive or all_negative):
raise ValueError("Composition must have all positive or all negative counts to convert to formula string")
keys = list(sorted(comp.keys()))
comps = []
for key in keys:
elem_info, cnt = key, comp[key]
if cnt == 0:
continue
comps.append(elem_info.serialize(abs(cnt)))
return "".join(comps)