Esempio n. 1
0
    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)
Esempio n. 2
0
    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
Esempio n. 3
0
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)
Esempio n. 4
0
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()
Esempio n. 6
0
 def testatomic_number(self):
     self.assertEqual(13, ep.atomic_number(symbol='Al'))
     self.assertEqual(13, ep.atomic_number(name='Aluminium'))
Esempio n. 7
0
 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'))
 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'))