param_constants.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Mar 18 11:38:59 2024
  4. @author: zilya
  5. """
  6. from types import SimpleNamespace
  7. from math import ceil, pi
  8. def param_hardware():
  9. hardware = SimpleNamespace()
  10. hardware.gamma = 42.576e6 # Hz/T Гиромагнитное отношение водорода
  11. G_amp_max = 37.8 # mT/m. Максимальный градиент
  12. hardware.G_amp_max = G_amp_max*1e-3*hardware.gamma # Hz/m. Максимальный градиент
  13. G_slew_max = 121 # T/m/s. Максимальная скорость нарастания
  14. hardware.G_slew_max = G_slew_max*hardware.gamma # Hz/m/s. Максимальная скорость нарастания
  15. hardware.rf_raster_time = 1e-6 # s. Растр РЧ импульса
  16. hardware.grad_raster_time = 10e-6 # s. Растр градиентов
  17. tau_max = hardware.G_amp_max/hardware.G_slew_max # s. Максимальное время нарастания градиента с учетом макс скорости нарастания
  18. hardware.tau_max = ceil(tau_max/ hardware.grad_raster_time)*hardware.grad_raster_time
  19. hardware.B0 = 1.5
  20. hardware.fat_ppm = -3.5
  21. hardware.rf_ringdown_time=20e-6
  22. hardware.rf_dead_time=100e-6
  23. hardware.adc_dead_time=10e-6
  24. return hardware
  25. def param_rf_SE(sl_thkn):
  26. gamma = 42.576e6
  27. G_amp_max = 37.8
  28. G_amp_max = G_amp_max*1e-3*gamma
  29. rf_SE = SimpleNamespace()
  30. rf_SE.t_BW_product_ex1 = 3.8
  31. rf_SE.t_BW_product_ref1 = 4.2
  32. rf_SE.t_BW_product_ex2 = 3.55
  33. rf_SE.t_BW_product_ref2 = 3.55
  34. rf_SE.t_ex1 = 2.05e-3
  35. rf_SE.t_ref1 = 2.56e-3
  36. rf_SE.t_ex2 = 3.10e-3
  37. rf_SE.t_ref2 = 3.88e-3
  38. if sl_thkn > rf_SE.t_BW_product_ex1/(rf_SE.t_ex1*G_amp_max):
  39. rf_SE.t_BW_product_ex = rf_SE.t_BW_product_ex1
  40. rf_SE.t_BW_product_ref = rf_SE.t_BW_product_ref1
  41. else:
  42. rf_SE.t_BW_product_ex = rf_SE.t_BW_product_ex2
  43. rf_SE.t_BW_product_ref = rf_SE.t_BW_product_ref2
  44. if sl_thkn > rf_SE.t_BW_product_ex2/(rf_SE.t_ex1*G_amp_max):
  45. rf_SE.t_ex = rf_SE.t_ex1
  46. rf_SE.t_ref = rf_SE.t_ref1
  47. else:
  48. rf_SE.t_ex = rf_SE.t_ex2
  49. rf_SE.t_ref = rf_SE.t_ref2
  50. rf_SE.apodization = 0.27
  51. return rf_SE
  52. def param_rf_HASTE(sl_thkn):
  53. gamma = 42.576e6
  54. G_amp_max = 37.8
  55. G_amp_max = G_amp_max*1e-3*gamma
  56. rf_HASTE = SimpleNamespace()
  57. rf_HASTE.t_BW_product_ex1 = 3.55
  58. rf_HASTE.t_BW_product_ref1 = 3.55
  59. rf_HASTE.t_BW_product_ex2 = 3.55
  60. rf_HASTE.t_BW_product_ref2 = 3.55
  61. rf_HASTE.t_ex1 = 1.02e-3
  62. rf_HASTE.t_ref1 = 1.28e-3
  63. rf_HASTE.t_ex2 = 1.28e-3
  64. rf_HASTE.t_ref2 = 1.79e-3
  65. if sl_thkn > rf_HASTE.t_BW_product_ex1/(rf_HASTE.t_ex1*G_amp_max):
  66. rf_HASTE.t_ex = rf_HASTE.t_ex1
  67. rf_HASTE.t_ref = rf_HASTE.t_ref1
  68. else:
  69. rf_HASTE.t_ex = rf_HASTE.t_ex2
  70. rf_HASTE.t_ref = rf_HASTE.t_ref2
  71. rf_HASTE.t_BW_product_ex = rf_HASTE.t_BW_product_ex1
  72. rf_HASTE.t_BW_product_ref = rf_HASTE.t_BW_product_ref1
  73. rf_HASTE.apodization = 0.27
  74. return rf_HASTE
  75. def param_rf_GRE():
  76. rf_GRE = SimpleNamespace()
  77. rf_GRE.t_ex = 0.510e-3
  78. rf_GRE.t_BW_product_ex = 2.13
  79. rf_GRE.apodization = 0.3
  80. return rf_GRE
  81. def param_rf_TONE():
  82. rf_TONE = SimpleNamespace()
  83. rf_TONE.t_ex = 1.020e-3
  84. rf_TONE.t_BW_product_ex = 5
  85. rf_TONE.apodization = 0.3
  86. return rf_TONE
  87. def param_rf_FS():
  88. rf_FS = SimpleNamespace()
  89. B0 = 1.5
  90. gamma = 42.576e6
  91. rf_FS.FS_sat_ppm = -3.5
  92. rf_FS.FS_pulse_duration = 8e-3
  93. rf_FS.flip_FS = 90
  94. #rf_FS.flip_FS = round(rf_FS.flip_FS * pi / 180, 3)
  95. #rf_FS.BW_sat = 100
  96. rf_FS.BW_sat = B0 * 1e-6 * rf_FS.FS_sat_ppm * gamma*0.8
  97. return rf_FS
  98. def param_rf_inv():
  99. rf_inv = SimpleNamespace()
  100. rf_inv.t_inv = 2.56e-3
  101. rf_inv.t_BW_product_inv = 4.2
  102. rf_inv.inv_flip_angle = 180
  103. return rf_inv
  104. def param_rf_we():
  105. rf_we = SimpleNamespace()
  106. rf_we.t_we_ex = 0.510e-3
  107. rf_we.t_BW_product_we_ex = 2.13
  108. rf_we.we_tau = 2.38*10E-4
  109. return rf_we
  110. def param_rf_sat():
  111. rf_sat = SimpleNamespace()
  112. rf_sat.t_sat = 0.510e-3
  113. rf_sat.t_BW_product_sat = 2.13
  114. rf_sat.sat_flip_angle = 90
  115. rf_sat.ssp_spoil_area = [2000, 2000, 2000]
  116. rf_sat.ssp_spoil_dur = [0.002, 0.002, 0.002]
  117. return rf_sat
  118. def param_rf_sat_TOF():
  119. rf_sat = SimpleNamespace()
  120. rf_sat.t_sat_TOF = 0.510e-3
  121. rf_sat.t_BW_product_sat_TOF = 2.13
  122. rf_sat.flip_angle_sat_TOF = 90
  123. return rf_sat
  124. def param_rf_PRESS():
  125. rf_PRESS = SimpleNamespace()
  126. rf_PRESS.t_ex = 2.05e-3
  127. rf_PRESS.t_BW_product_ex = 3.8
  128. rf_PRESS.t_echo1 = 2.56e-3
  129. rf_PRESS.t_BW_product_echo1 = 4.2
  130. rf_PRESS.t_echo2 = 2.56e-3
  131. rf_PRESS.t_BW_product_echo2 = 4.2
  132. return rf_PRESS
  133. def param_rf_STEAM():
  134. rf_STEAM = SimpleNamespace()
  135. rf_STEAM.t_rf_x = 1e-3
  136. rf_STEAM.t_BW_product_rf_x = 2.13
  137. rf_STEAM.t_rf_y = 1e-3
  138. rf_STEAM.t_BW_product_rf_y = 2.13
  139. rf_STEAM.t_rf_z = 1e-3
  140. rf_STEAM.t_BW_product_rf_z = 2.13
  141. return rf_STEAM
  142. def param_rf_CHESS():
  143. rf_CHESS = SimpleNamespace()
  144. rf_CHESS.ws_angle = 120
  145. rf_CHESS.gr_ws_spoiler_area = 600
  146. rf_CHESS.t_spectro_ws = 15e-3
  147. rf_CHESS.t_BW_product_ws = 2
  148. rf_CHESS.ws_freq_offset = 0
  149. return rf_CHESS
  150. def param_phase_cycling_sets_PRESS():
  151. phase_cycling_sets = {"rf_ex_phases" : [90, 90, 90, 90, 270, 270, 270, 270],
  152. "rf_echo1_phases" : [0, 90, 180, 270, 0, 90, 180, 270],
  153. "rf_echo2_phases" : [90, 180, 270, 0, 0, 90, 180, 270]}
  154. return phase_cycling_sets
  155. def param_phase_cycling_sets_STEAM():
  156. phase_cycling_sets = {"rf_x_phases" : [0, 0, 0, 0, 90, 90, 90, 90],
  157. "rf_y_phases" : [0, 0, 90, 90, 0, 0, 90, 90],
  158. "rf_z_phases" : [0, 90, 0, 90, 0, 90, 0, 90],
  159. "adc_phases" : [0, 90, 90, 0, 90, 0, 0, 90]}
  160. return phase_cycling_sets
  161. def param_default():
  162. default = SimpleNamespace()
  163. default.sl_groups = 1
  164. default.sl_nb = 1
  165. default.sl_thkn = 10e-3
  166. default.sl_gap = 100
  167. default.slab_thkn = 100e-3
  168. default.FoV_f = 250e-3
  169. default.FoV_p_image = 250e-3
  170. default.Nf = 128
  171. default.Np_image = 128
  172. default.Nss_image = 8
  173. default.BW_pixel = 500
  174. default.TE = 50e-3
  175. default.N_TE = 1
  176. default.IE = 10e-3
  177. default.ETL = 8
  178. default.contrasts = 2
  179. default.concats = 1
  180. default.TR = 1000e-3
  181. default.TD = 0
  182. default.alpha = 90
  183. default.beta = 180
  184. default.spoil_strenght = 4
  185. default.RF_spoil = 117
  186. default.average = 1
  187. default.D_scans = 10
  188. default.num_dynamics = 1
  189. default.ph_over_phase = 0
  190. default.ph_over_slice = 0
  191. default.TI = 200e-3
  192. default.TI_extra = 200e-3
  193. default.phi_wing = 149
  194. default.N_wings = 14
  195. default.TEeff = 200e-3
  196. default.flip_SR = 40
  197. default.N_TI = 1
  198. default.b = 1000
  199. default.sat_thickness = 0.05
  200. default.sat_offcenter = 0.2
  201. default.AT_sync = 0.05
  202. default.T_sync = 0.2
  203. default.na_delay = 5
  204. default.ph_per_ds = 8
  205. default.PI_prescan_lines = 8
  206. default.PI_prescan_lines_ss = 8
  207. return default