def test_formulas(x): f = Formula(x) y = str(f) assert y == x print(f.count(), '{:latex}'.format(f)) a, b = divmod(f, 'H2O') assert a * Formula('H2O') + b == f assert f != 117 # check that formula can be compared to non-formula object
def from_formula(self, formula: Formula) -> BagType: formula_dict = formula.count() bag = [0] * self.symbol_table.count() for symbol, value in formula_dict.items(): bag[self.symbol_table.get_index(symbol)] = value return tuple(bag)
def parse_selection(selection, **kwargs): if selection is None or selection == '': expressions = [] elif isinstance(selection, int): expressions = [('id', '=', selection)] elif isinstance(selection, list): expressions = selection else: expressions = [w.strip() for w in selection.split(',')] keys = [] comparisons = [] for expression in expressions: if isinstance(expression, (list, tuple)): comparisons.append(expression) continue if expression.count('<') == 2: value, expression = expression.split('<', 1) if expression[0] == '=': op = '>=' expression = expression[1:] else: op = '>' key = expression.split('<', 1)[0] comparisons.append((key, op, value)) for op in ['!=', '<=', '>=', '<', '>', '=']: if op in expression: break else: if expression in atomic_numbers: comparisons.append((expression, '>', 0)) else: try: count = Formula(expression).count() except ValueError: keys.append(expression) else: comparisons.extend( (symbol, '>', n - 1) for symbol, n in count.items()) continue key, value = expression.split(op) comparisons.append((key, op, value)) cmps = [] for key, value in kwargs.items(): comparisons.append((key, '=', value)) for key, op, value in comparisons: if key == 'age': key = 'ctime' op = invop[op] value = now() - time_string_to_float(value) elif key == 'formula': if op != '=': raise ValueError('Use fomula=...') f = Formula(value) count = f.count() cmps.extend((atomic_numbers[symbol], '=', n) for symbol, n in count.items()) key = 'natoms' value = len(f) elif key in atomic_numbers: key = atomic_numbers[key] value = int(value) elif isinstance(value, str): value = convert_str_to_int_float_or_str(value) if key in numeric_keys and not isinstance(value, (int, float)): msg = 'Wrong type for "{}{}{}" - must be a number' raise ValueError(msg.format(key, op, value)) cmps.append((key, op, value)) return keys, cmps
assert Atoms('MoS2').get_chemical_formula() == 'MoS2' assert Atoms('SnO2').get_chemical_formula(mode='metal') == 'SnO2' if sys.version_info >= (3, 6): assert Formula('A3B2C2D').format('abc') == 'DB2C2A3' for sym in ['', 'Pu', 'Pu2', 'U2Pu2', 'U2((Pu2)2H)']: for mode in ['all', 'reduce', 'hill', 'metal']: for empirical in [False, True]: if empirical and mode in ['all', 'reduce']: continue atoms = Atoms(sym) formula = atoms.get_chemical_formula(mode=mode, empirical=empirical) atoms2 = Atoms(formula) print(repr(sym), '->', repr(formula)) n1 = np.sort(atoms.numbers) n2 = np.sort(atoms2.numbers) if empirical and len(atoms) > 0: reduction = len(n1) // len(n2) n2 = np.repeat(n2, reduction) assert (n1 == n2).all() for x in ['H2O', '10H2O', '2(CuO2(H2O)2)10', 'Cu20+H2', 'H' * 15, 'AuBC2', '']: f = Formula(x) y = str(f) assert y == x print(f.count(), '{:latex}'.format(f)) a, b = divmod(f, 'H2O') assert a * Formula('H2O') + b == f assert f != 117