Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
The binding energy of a nucleon equals 0 joules.
>>> neutron = Particle('n')
>>> proton = Particle('p+')
>>> neutron.binding_energy
>>> proton.binding_energy
"""
if self._attributes["baryon number"] == 1:
return 0 * u.J
if not self.isotope:
raise InvalidIsotopeError(
f"The nuclear binding energy may only be calculated for nucleons and isotopes."
)
number_of_protons = self.atomic_number
number_of_neutrons = self.mass_number - self.atomic_number
mass_of_protons = number_of_protons * const.m_p
mass_of_neutrons = number_of_neutrons * const.m_n
mass_of_nucleons = mass_of_protons + mass_of_neutrons
mass_defect = mass_of_nucleons - self.nuclide_mass
nuclear_binding_energy = mass_defect * const.c ** 2
return nuclear_binding_energy.to(u.J)
If stability information is not available.
Examples
--------
>>> is_stable("H-1")
True
>>> is_stable("tritium")
False
>>> is_stable("e-")
True
>>> is_stable("tau+")
False
"""
if particle.element and not particle.isotope:
raise InvalidIsotopeError(
"The input to is_stable must be either an isotope or a special particle."
)
return particle.is_category("stable")
) from e
# We will need to do the same error checks whether or not the
# argument is already an instance of the Particle class.
if already_particle:
particle = argval
# If the name of the argument annotated with Particle in the
# decorated function is element, isotope, or ion; then this
# decorator should raise the appropriate exception when the
# particle ends up not being an element, isotope, or ion.
cat_table = [
("element", particle.element, InvalidElementError),
("isotope", particle.isotope, InvalidIsotopeError),
("ion", particle.ionic_symbol, InvalidIonError),
]
for category_name, category_symbol, CategoryError in cat_table:
if argname == category_name and not category_symbol:
raise CategoryError(
f"The argument {argname} = {repr(argval)} to "
f"{funcname} does not correspond to a valid "
f"{argname}."
)
# Some functions require that particles be charged, or
# at least that particles have charge information.
_integer_charge = particle._attributes["integer charge"]
Examples
--------
>>> alpha = Particle('He-4++')
>>> alpha.neutron_number
2
>>> Particle('n').neutron_number
1
"""
if self.particle == "n":
return 1
elif self.isotope:
return self.mass_number - self.atomic_number
else: # coverage: ignore
raise InvalidIsotopeError(_category_errmsg(self, "isotope"))
`~plasmapy.utils.InvalidIsotopeError`.
Examples
--------
>>> deuterium = Particle("D")
>>> deuterium.isotope_name
'deuterium'
>>> iron_isotope = Particle("Fe-56", Z=16)
>>> iron_isotope.isotope_name
'iron-56'
"""
if not self.element:
raise InvalidElementError(_category_errmsg(self.particle, "element"))
elif not self.isotope:
raise InvalidIsotopeError(_category_errmsg(self, "isotope"))
if self.isotope == "D":
isotope_name = "deuterium"
elif self.isotope == "T":
isotope_name = "tritium"
else:
isotope_name = f"{self.element_name}-{self.mass_number}"
return isotope_name
If the isotopic abundance is not available, this attribute will
raise a `~plasmapy.utils.MissingAtomicDataError`. If the
particle is not an isotope or is an ion of an isotope, then this
attribute will raise an `~plasmapy.utils.InvalidIsotopeError`.
Examples
--------
>>> D = Particle('deuterium')
>>> D.isotopic_abundance
0.000115
"""
from .atomic import common_isotopes
if not self.isotope or self.is_ion: # coverage: ignore
raise InvalidIsotopeError(_category_errmsg(self.particle, "isotope"))
abundance = self._attributes.get("isotopic abundance", 0.0)
if not common_isotopes(self.element):
warnings.warn(
f"No isotopes of {self.element} have an isotopic abundance. "
f"The isotopic abundance of {self.isotope} is being returned as 0.0",
AtomicWarning,
)
return abundance
This attribute will return the number of protons plus the number
of neutrons in an isotope or nuclide.
If the particle is not an isotope, then this attribute will
raise an `~plasmapy.utils.InvalidIsotopeError`.
Examples
--------
>>> alpha = Particle('helium-4 2+')
>>> alpha.mass_number
4
"""
if not self.isotope:
raise InvalidIsotopeError(_category_errmsg(self, "isotope"))
return self._attributes["mass number"]
with half-life information.
Particles that do not have sufficiently well-constrained
half-lives will return a `str` containing the information
that is available about the half-life and issue a
`~plasmapy.utils.MissingAtomicDataWarning`.
Examples
--------
>>> neutron = Particle('n')
>>> neutron.half_life
"""
if self.element and not self.isotope:
raise InvalidIsotopeError(_category_errmsg(self.particle, "isotope"))
if isinstance(self._attributes["half-life"], str):
warnings.warn(
f"The half-life for {self.particle} is not known precisely; "
"returning string with estimated value.",
MissingAtomicDataWarning,
)
if self._attributes["half-life"] is None:
raise MissingAtomicDataError(
f"The half-life of '{self.particle}' is not available."
)
return self._attributes["half-life"]
>>> deuterium.nuclide_mass
"""
if self.isotope == "H-1":
return const.m_p
elif self.isotope == "D":
return _special_ion_masses["D 1+"]
elif self.isotope == "T":
return _special_ion_masses["T 1+"]
elif self.particle == "n":
return const.m_n
if not self.isotope:
raise InvalidIsotopeError(_category_errmsg(self, "isotope"))
base_mass = self._attributes["isotope mass"]
if base_mass is None: # coverage: ignore
raise MissingAtomicDataError(
f"The mass of a {self.isotope} nuclide is not available."
)
_nuclide_mass = (
self._attributes["isotope mass"] - self.atomic_number * const.m_e
)
return _nuclide_mass.to(u.kg)