| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from typing import Iterable, Union
- import numpy as np
- def convert(
- from_value: Union[float, Iterable],
- from_unit: str,
- gamma: float = 42.576e6,
- to_unit: str = str(),
- ) -> Union[float, Iterable]:
- """
- Converts gradient amplitude or slew rate from unit `from_unit` to unit `to_unit` with gyromagnetic ratio `gamma`.
- Parameters
- ----------
- from_value : float
- Gradient amplitude or slew rate to convert from.
- from_unit : str
- Unit of gradient amplitude or slew rate to convert from.
- to_unit : str, default=''
- Unit of gradient amplitude or slew rate to convert to.
- gamma : float, default=42.576e6
- Gyromagnetic ratio. Default is 42.576e6, for Hydrogen.
- Returns
- -------
- out : float
- Converted gradient amplitude or slew rate.
- Raises
- ------
- ValueError
- If an invalid `from_unit` is passed. Must be one of 'Hz/m', 'mT/m', or 'rad/ms/mm'.
- If an invalid `to_unit` is passed. Must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms'.
- """
- valid_grad_units = ["Hz/m", "mT/m", "rad/ms/mm"]
- valid_slew_units = ["Hz/m/s", "mT/m/ms", "T/m/s", "rad/ms/mm/ms"]
- valid_units = valid_grad_units + valid_slew_units
- if from_unit not in valid_units:
- raise ValueError(
- "Invalid from_unit. Must be one of 'Hz/m', 'mT/m', or 'rad/ms/mm' for gradients;"
- "or must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms' for slew rate."
- )
- if to_unit != "" and to_unit not in valid_units:
- raise ValueError(
- "Invalid to_unit. Must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms' for gradients;"
- "or must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms' for slew rate.."
- )
- if to_unit == "":
- if from_unit in valid_grad_units:
- to_unit = valid_grad_units[0]
- elif from_unit in valid_slew_units:
- to_unit = valid_slew_units[0]
- # Convert to standard units
- # Grad units
- if from_unit == "Hz/m":
- standard = from_value
- elif from_unit == "mT/m":
- standard = from_value * 1e-3 * gamma
- elif from_unit == "rad/ms/mm":
- standard = from_value * 1e6 / (2 * np.pi)
- # Slew units
- elif from_unit == "Hz/m/s":
- standard = from_value
- elif from_unit == "mT/m/ms" or from_unit == "T/m/s":
- standard = from_value * gamma
- elif from_unit == "rad/ms/mm/ms":
- standard = from_value * 1e9 / (2 * np.pi)
- # Convert from standard units
- # Grad units
- if to_unit == "Hz/m":
- out = standard
- elif to_unit == "mT/m":
- out = 1e3 * standard / gamma
- elif to_unit == "rad/ms/mm":
- out = standard * 2 * np.pi * 1e-6
- # Slew units
- elif to_unit == "Hz/m/s":
- out = standard
- elif to_unit == "mT/m/ms" or to_unit == "T/m/s":
- out = standard / gamma
- elif to_unit == "rad/ms/mm/ms":
- out = standard * 2 * np.pi * 1e-9
- return out
|