convert.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from typing import Iterable, Union
  2. import numpy as np
  3. def convert(
  4. from_value: Union[float, Iterable],
  5. from_unit: str,
  6. gamma: float = 42.576e6,
  7. to_unit: str = str(),
  8. ) -> Union[float, Iterable]:
  9. """
  10. Converts gradient amplitude or slew rate from unit `from_unit` to unit `to_unit` with gyromagnetic ratio `gamma`.
  11. Parameters
  12. ----------
  13. from_value : float
  14. Gradient amplitude or slew rate to convert from.
  15. from_unit : str
  16. Unit of gradient amplitude or slew rate to convert from.
  17. to_unit : str, default=''
  18. Unit of gradient amplitude or slew rate to convert to.
  19. gamma : float, default=42.576e6
  20. Gyromagnetic ratio. Default is 42.576e6, for Hydrogen.
  21. Returns
  22. -------
  23. out : float
  24. Converted gradient amplitude or slew rate.
  25. Raises
  26. ------
  27. ValueError
  28. If an invalid `from_unit` is passed. Must be one of 'Hz/m', 'mT/m', or 'rad/ms/mm'.
  29. If an invalid `to_unit` is passed. Must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms'.
  30. """
  31. valid_grad_units = ["Hz/m", "mT/m", "rad/ms/mm"]
  32. valid_slew_units = ["Hz/m/s", "mT/m/ms", "T/m/s", "rad/ms/mm/ms"]
  33. valid_units = valid_grad_units + valid_slew_units
  34. if from_unit not in valid_units:
  35. raise ValueError(
  36. "Invalid from_unit. Must be one of 'Hz/m', 'mT/m', or 'rad/ms/mm' for gradients;"
  37. "or must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms' for slew rate."
  38. )
  39. if to_unit != "" and to_unit not in valid_units:
  40. raise ValueError(
  41. "Invalid to_unit. Must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms' for gradients;"
  42. "or must be one of 'Hz/m/s', 'mT/m/ms', 'T/m/s', 'rad/ms/mm/ms' for slew rate.."
  43. )
  44. if to_unit == "":
  45. if from_unit in valid_grad_units:
  46. to_unit = valid_grad_units[0]
  47. elif from_unit in valid_slew_units:
  48. to_unit = valid_slew_units[0]
  49. # Convert to standard units
  50. # Grad units
  51. if from_unit == "Hz/m":
  52. standard = from_value
  53. elif from_unit == "mT/m":
  54. standard = from_value * 1e-3 * gamma
  55. elif from_unit == "rad/ms/mm":
  56. standard = from_value * 1e6 / (2 * np.pi)
  57. # Slew units
  58. elif from_unit == "Hz/m/s":
  59. standard = from_value
  60. elif from_unit == "mT/m/ms" or from_unit == "T/m/s":
  61. standard = from_value * gamma
  62. elif from_unit == "rad/ms/mm/ms":
  63. standard = from_value * 1e9 / (2 * np.pi)
  64. # Convert from standard units
  65. # Grad units
  66. if to_unit == "Hz/m":
  67. out = standard
  68. elif to_unit == "mT/m":
  69. out = 1e3 * standard / gamma
  70. elif to_unit == "rad/ms/mm":
  71. out = standard * 2 * np.pi * 1e-6
  72. # Slew units
  73. elif to_unit == "Hz/m/s":
  74. out = standard
  75. elif to_unit == "mT/m/ms" or to_unit == "T/m/s":
  76. out = standard / gamma
  77. elif to_unit == "rad/ms/mm/ms":
  78. out = standard * 2 * np.pi * 1e-9
  79. return out