def calculate_composition(composition): # Replace symbol keys with integer for key in list(composition.keys()): if isinstance(key, str): composition[ep.atomic_number(key)] = composition.pop(key) # Replace wildcard totalfraction = 0.0 countwildcard = 0 for z, fraction in composition.items(): if z <= 0 or z >= 99: raise ValueError("Atomic number '%i' must be between [1, 99]" % z) if fraction == '?': countwildcard += 1 else: totalfraction += float(fraction) if countwildcard > 0: if totalfraction <= 1.0: wildcardfraction = (1.0 - totalfraction) / float(countwildcard) else: raise ValueError('Wild card(s) could not be replaced since total fraction is already 1.0') for z, fraction in composition.items(): if fraction == '?': fraction = wildcardfraction composition[z] = float(fraction) # Check total fraction totalfraction = sum(composition.values()) if abs(totalfraction - 1.0) > 1e-6: raise ValueError("The total weight fraction (%s) should be 1.0." % totalfraction) return defaultdict(float, composition)
def composition_from_formula(formula): # Parse chemical formula formulaData = CHEMICAL_FORMULA_PARSER.parseString(formula) zs = [] atomicfractions = [] for symbol, atomicfraction in formulaData: zs.append(ep.atomic_number(symbol=symbol)) atomicfractions.append(float(atomicfraction)) # Calculate total atomic mass totalatomicmass = 0.0 for z, atomicfraction in zip(zs, atomicfractions): atomicmass = ep.atomic_mass_kg_mol(z) totalatomicmass += atomicfraction * atomicmass # Create composition composition = defaultdict(float) for z, atomicfraction in zip(zs, atomicfractions): atomicmass = ep.atomic_mass_kg_mol(z) weightfraction = atomicfraction * atomicmass / totalatomicmass composition[z] += weightfraction return composition
def from_string(s): """ Returns a :class:`Transition` or :class:`transitionset` from the given string. The first word must be the symbol of the element followed by either the Siegbahn (e.g. ``Al Ka1``) or IUPAC (``Al K-L3``) notation of the transition. The second word can also represent transition family (e.g. ``Al K``) or shell (``Al LIII``). :arg s: string representing the transition :return: transition or set of transitions """ words = s.split(" ") if len(words) != 2: raise ValueError("The transition string must have 2 words: " + \ "1. the symbol of the element and 2. the transition notation") z = ep.atomic_number(symbol=words[0]) notation = words[1] # Fix to be compatible with old transition, e.g. N5N6/N6N7 if '/' in notation: notation = notation[:notation.index('/')] if notation == 'Le': notation = 'Ln' notation = _siegbahn_ascii_to_unicode(notation) if notation in _SIEGBAHNS: # Transition with Siegbahn notation return Transition(z, siegbahn=notation) elif notation in _TRANSITIONSETS: # transitionset from Family, group or shell return _TRANSITIONSETS[notation](z) elif '-' in notation: # Transition with IUPAC notation dest, src = notation.split('-') return Transition(z, src=Subshell(z, iupac=src), dest=Subshell(z, iupac=dest)) else: raise ValueError("Cannot parse transition string: %s" % s)
def setSelection(self, selection): def _uncheckedAll(): for widget in self._group.buttons(): widget.setChecked(False) if selection is None: _uncheckedAll() self.selectionChanged.emit() return if isinstance(selection, (int, six.string_types)): selection = [selection] if not self.isMultipleSelection() and len(selection) > 1: raise ValueError('Multiple selection mode is off. Cannot select more than one element') _uncheckedAll() for z in selection: if isinstance(z, six.string_types): z = ep.atomic_number(z.strip()) self._group.button(z).setChecked(True) self.selectionChanged.emit()
def testatomic_number(self): self.assertEqual(13, ep.atomic_number(symbol='Al')) self.assertEqual(13, ep.atomic_number(name='Aluminium'))
def testatomic_number(self): self.assertEqual(1, ep.atomic_number(symbol='H')) self.assertEqual(1, ep.atomic_number(name='Hydrogen')) self.assertEqual(118, ep.atomic_number(symbol='Uuo')) self.assertEqual(118, ep.atomic_number(name='Ununoctium'))