mammos_units
quickstart#
This tutorial provides a short overview of the most important functionality of mammos_units
. For a more in-depth introduction refer to Unit Conversions.
[1]:
import mammos_units as u
Creating quantities#
mammos_units
provides functionality to work with units. It is based on astropy.units. The central object is the Quantity
, the combination of a value and a unit. We can create it by multiplying value and unit:
[2]:
length = 3 * u.m
length
[2]:
We have access to its value
and unit
:
[3]:
length.value
[3]:
np.float64(3.0)
[4]:
length.unit
[4]:
Mathematical operations act on both the value and the unit:
[5]:
length**2
[5]:
Magnetic quantities#
The main focus of mammos_units
is on magnetic units. In the following we show a few quantities relevant in the context of magnetism.
Magnetization \(M\)#
[6]:
1e5 * u.A / u.m
[6]:
Magnetic field strength \(H\)#
Vector quantities can be set with lists or numpy arrays:
[7]:
[1e4, 0, 0] * u.A / u.m
[7]:
Magnetic flux \(B\)#
[8]:
1 * u.T
[8]:
Energy \(E\)#
[9]:
1e-5 * u.J
[9]:
Converting units#
Quantities
can be converted to different units using to(...)
. We can either pass a unit object or a string.
We can use that functionality to add or remove a prefix such as milli or kilo:
[10]:
B = 1e-3 * u.T
B.to("mT")
[10]:
[11]:
M = 300 * u.kA / u.m # we can directly use the prefix when creating the quantity
M
[11]:
[12]:
M.to(u.A / u.m)
[12]:
Similarly, we can convert between SI and cgs:
[13]:
B.to(u.gauss)
[13]:
[14]:
M.to("Oe")
[14]:
Equivalencies#
Equivalencies can be used to convert between incompatible units, which are uniquely related in a given context. Equivalencies must be explicitely turned on to allow conversion between otherwise incompatible units.
In the magnetics context magnetic field strength \(H\) and magnetic induction \(B\) are often used interchangably using the relation \(B = μ_0H\). We can activate this equivalency for the rest of the notebook using the following command:
[15]:
u.set_enabled_equivalencies(u.magnetic_flux_field())
[15]:
<astropy.units.core._UnitContext at 0x7f96c5f8bc50>
Now we can convert between Tesla and Ampere/meter:
[16]:
B
[16]:
[17]:
B.to("A/m")
[17]:
To disable the equivalency we need to run the following command:
[18]:
u.set_enabled_equivalencies(None)
[18]:
<astropy.units.core._UnitContext at 0x7f96c5fe3360>
After disabling the equivalency, the conversion between Tesla and Ampere/meter is no longer possible:
[19]:
B.to("A/m")
---------------------------------------------------------------------------
UnitConversionError Traceback (most recent call last)
Cell In[19], line 1
----> 1 B.to("A/m")
File ~/repos/mammos/mammos-units/.pixi/envs/default/lib/python3.13/site-packages/astropy/units/quantity.py:931, in Quantity.to(self, unit, equivalencies, copy)
927 unit = Unit(unit)
928 if copy:
929 # Avoid using to_value to ensure that we make a copy. We also
930 # don't want to slow down this method (esp. the scalar case).
--> 931 value = self._to_value(unit, equivalencies)
932 else:
933 # to_value only copies if necessary
934 value = self.to_value(unit, equivalencies)
File ~/repos/mammos/mammos-units/.pixi/envs/default/lib/python3.13/site-packages/astropy/units/quantity.py:884, in Quantity._to_value(self, unit, equivalencies)
881 equivalencies = self._equivalencies
882 if not self.dtype.names or isinstance(self.unit, StructuredUnit):
883 # Standard path, let unit to do work.
--> 884 return self.unit.to(
885 unit, self.view(np.ndarray), equivalencies=equivalencies
886 )
888 else:
889 # The .to() method of a simple unit cannot convert a structured
890 # dtype, so we work around it, by recursing.
891 # TODO: deprecate this?
892 # Convert simple to Structured on initialization?
893 result = np.empty_like(self.view(np.ndarray))
File ~/repos/mammos/mammos-units/.pixi/envs/default/lib/python3.13/site-packages/astropy/units/core.py:1208, in UnitBase.to(self, other, value, equivalencies)
1206 return UNITY
1207 else:
-> 1208 return self.get_converter(Unit(other), equivalencies)(value)
File ~/repos/mammos/mammos-units/.pixi/envs/default/lib/python3.13/site-packages/astropy/units/core.py:1137, in UnitBase.get_converter(self, other, equivalencies)
1134 else:
1135 return lambda v: b(converter(v))
-> 1137 raise exc
File ~/repos/mammos/mammos-units/.pixi/envs/default/lib/python3.13/site-packages/astropy/units/core.py:1120, in UnitBase.get_converter(self, other, equivalencies)
1118 # if that doesn't work, maybe we can do it with equivalencies?
1119 try:
-> 1120 return self._apply_equivalencies(
1121 self, other, self._normalize_equivalencies(equivalencies)
1122 )
1123 except UnitsError as exc:
1124 # Last hope: maybe other knows how to do it?
1125 # We assume the equivalencies have the unit itself as first item.
1126 # TODO: maybe better for other to have a `_back_converter` method?
1127 if hasattr(other, "equivalencies"):
File ~/repos/mammos/mammos-units/.pixi/envs/default/lib/python3.13/site-packages/astropy/units/core.py:1071, in UnitBase._apply_equivalencies(self, unit, other, equivalencies)
1068 unit_str = get_err_str(unit)
1069 other_str = get_err_str(other)
-> 1071 raise UnitConversionError(f"{unit_str} and {other_str} are not convertible")
UnitConversionError: 'T' (magnetic flux density) and 'A / m' (magnetic field strength) are not convertible