Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def charge(self) -> u.Quantity:
"""
Return the particle's electron charge in coulombs.
This attribute will raise a `~plasmapy.utils.ChargeError` if the
charge has not been specified.
Examples
--------
>>> electron = Particle('e-')
>>> electron.charge
"""
if self._attributes["charge"] is None:
raise ChargeError(f"The charge of particle {self} has not been specified.")
if self._attributes["integer charge"] == 1:
return const.e.si
return self._attributes["charge"]
>>> Particle("Fe 6+").recombine()
Particle("Fe 5+")
>>> helium_particle = Particle("He-4 2+")
>>> helium_particle.recombine(n=2, inplace=True)
>>> helium_particle
Particle("He-4 0+")
"""
if not self.element:
raise InvalidElementError(
f"{self.particle} cannot undergo recombination because "
f"it is not a neutral atom or ion."
)
if not self.is_category(any_of={"charged", "uncharged"}):
raise ChargeError(
f"{self.particle} cannot undergo recombination because "
f"its charge is not specified."
)
if not isinstance(n, Integral):
raise TypeError("n must be a positive integer.")
if n <= 0:
raise ValueError("n must be a positive number.")
base_particle = self.isotope if self.isotope else self.element
new_integer_charge = self.integer_charge - n
if inplace:
self.__init__(base_particle, Z=new_integer_charge)
else:
return Particle(base_particle, Z=new_integer_charge)
def integer_charge(self) -> Integral:
"""
Return the particle's integer charge.
This attribute will raise a `~plasmapy.utils.ChargeError` if the
charge has not been specified.
Examples
--------
>>> muon = Particle('mu-')
>>> muon.integer_charge
-1
"""
if self._attributes["integer charge"] is None:
raise ChargeError(f"The charge of particle {self} has not been specified.")
return self._attributes["integer charge"]
--------
>>> Particle("Fe 6+").ionize()
Particle("Fe 7+")
>>> helium_particle = Particle("He-4 0+")
>>> helium_particle.ionize(n=2, inplace=True)
>>> helium_particle
Particle("He-4 2+")
"""
if not self.element:
raise InvalidElementError(
f"Cannot ionize {self.particle} because it is not a "
f"neutral atom or ion."
)
if not self.is_category(any_of={"charged", "uncharged"}):
raise ChargeError(
f"Cannot ionize {self.particle} because its charge "
f"is not specified."
)
if self.integer_charge == self.atomic_number:
raise InvalidIonError(
f"The particle {self.particle} is already fully "
f"ionized and cannot be ionized further."
)
if not isinstance(n, Integral):
raise TypeError("n must be a positive integer.")
if n <= 0:
raise ValueError("n must be a positive number.")
base_particle = self.isotope if self.isotope else self.element
new_integer_charge = self.integer_charge + n
def Z_mean(self) -> np.float64:
"""Return the mean integer charge"""
if np.nan in self.ionic_fractions:
raise ChargeError(
"Z_mean cannot be found because no ionic fraction "
f"information is available for {self.base_particle}."
)
return np.sum(self.ionic_fractions * np.arange(self.atomic_number + 1))
if int_charge is None:
return IonizationState(
particle=particle,
ionic_fractions=self.ionic_fractions[particle],
T_e=self._pars["T_e"],
n_elem=np.sum(self.number_densities[particle]),
tol=self.tol,
)
else:
if not isinstance(int_charge, Integral):
raise TypeError(
f"{int_charge} is not a valid charge for {particle}."
)
elif not 0 <= int_charge <= atomic_number(particle):
raise ChargeError(
f"{int_charge} is not a valid charge for {particle}."
)
return State(
integer_charge=int_charge,
ionic_fraction=self.ionic_fractions[particle][int_charge],
ionic_symbol=particle_symbol(particle, Z=int_charge),
number_density=self.number_densities[particle][int_charge],
)
except Exception as exc:
raise IndexError(errmsg) from exc
same_isotope = value.isotope == self.isotope
has_charge_info = value.is_category(any_of=["charged", "uncharged"])
if same_element and same_isotope and has_charge_info:
Z = value.integer_charge
result = State(
Z,
self.ionic_fractions[Z],
self.ionic_symbols[Z],
self.number_densities[Z],
)
else:
if not same_element or not same_isotope:
raise AtomicError("Inconsistent element or isotope.")
elif not has_charge_info:
raise ChargeError("No integer charge provided.")
return result
# Some functions require that particles be charged, or
# at least that particles have charge information.
_integer_charge = particle._attributes["integer charge"]
must_be_charged = "charged" in require
must_have_charge_info = set(any_of) == {"charged", "uncharged"}
uncharged = _integer_charge == 0
lacks_charge_info = _integer_charge is None
if must_be_charged and (uncharged or must_have_charge_info):
raise ChargeError(f"A charged particle is required for {funcname}.")
if must_have_charge_info and lacks_charge_info:
raise ChargeError(f"Charge information is required for {funcname}.")
# Some functions require particles that belong to more complex
# classification schemes. Again, be sure to provide a
# maximally useful error message.
if not particle.is_category(require=require, exclude=exclude, any_of=any_of):
raise AtomicError(
_category_errmsg(particle, require, exclude, any_of, funcname)
)
return particle
f"{argname}."
)
# Some functions require that particles be charged, or
# at least that particles have charge information.
_integer_charge = particle._attributes["integer charge"]
must_be_charged = "charged" in require
must_have_charge_info = set(any_of) == {"charged", "uncharged"}
uncharged = _integer_charge == 0
lacks_charge_info = _integer_charge is None
if must_be_charged and (uncharged or must_have_charge_info):
raise ChargeError(f"A charged particle is required for {funcname}.")
if must_have_charge_info and lacks_charge_info:
raise ChargeError(f"Charge information is required for {funcname}.")
# Some functions require particles that belong to more complex
# classification schemes. Again, be sure to provide a
# maximally useful error message.
if not particle.is_category(require=require, exclude=exclude, any_of=any_of):
raise AtomicError(
_category_errmsg(particle, require, exclude, any_of, funcname)
)
return particle