gui_STEAM.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Jul 3 17:53:21 2023
  4. @author: zilya
  5. """
  6. import tkinter as tk
  7. from tkinter import ttk
  8. from math import ceil
  9. import numpy as np
  10. from types import SimpleNamespace
  11. from seqgen_STEAM import seqgen_STEAM
  12. from datetime import datetime
  13. import json
  14. def set_limits():
  15. # Задание общих аппаратных характкристик
  16. gamma = 42.576e6 # Hz/T Гиромагнитное отношение водорода
  17. G_amp_max = 37.8 # mT/m. Максимальный градиент
  18. G_amp_max = G_amp_max*1e-3*gamma # Hz/m. Максимальный градиент
  19. G_slew_max = 121 # T/m/s. Максимальная скорость нарастания
  20. G_slew_max = G_slew_max*gamma # Hz/m/s. Максимальная скорость нарастания
  21. rf_raster_time = 5e-7 # s. Растр РЧ импульса
  22. grad_raster_time = 10e-6 # s. Растр градиентов
  23. tau_max = G_amp_max/G_slew_max # s. Максимальное время нарастания градиента с учетом макс скорости нарастания
  24. tau_max = np.ceil(tau_max/ grad_raster_time)*grad_raster_time
  25. # --- Параметры РЧ импульса -----
  26. rf_ringdown_time=20e-6
  27. rf_dead_time=100e-6
  28. adc_dead_time=10e-6
  29. # Чтение заданных в интерфэйс значений
  30. average = float(M0_dj.textBox9.get())
  31. voxel_thkn = 10e-3
  32. BW_per_point = 2
  33. N_point = 512
  34. tau1 = 5.8e-3
  35. tau2 = 3.4e-3
  36. t_ex = 5.510e-3 # s. Длительность возбуждающего импульса
  37. t_BW_product_ex = 2.18 # - Time bandwidth product
  38. flip_angle = 90
  39. apodization = 0.3 # s. Длительность возбуждающего импульса
  40. BW_ex_pulse = t_BW_product_ex/t_ex # Hz. BW импульса
  41. TR = 3
  42. voxel_thkn = 10e-3
  43. BW_per_point = 2
  44. N_point = 512
  45. BW_full = BW_per_point*N_point
  46. t_read = 1/BW_per_point
  47. M0_dj.label1_1.configure(text = BW_per_point)
  48. M0_dj.label2_1.configure(text = N_point)
  49. M0_dj.label4_1.configure(text = BW_full)
  50. M0_dj.label5_1.configure(text = str(ceil(voxel_thkn*1000)/1000))
  51. M0_dj.label6_1.configure(text = str(ceil(tau1*10000)/10000))
  52. M0_dj.label7_1.configure(text = str(ceil(tau2*10000)/10000))
  53. M0_dj.label8_1.configure(text = str(ceil(TR*1000)/1000))
  54. global param
  55. param = SimpleNamespace()
  56. param.G_amp_max = G_amp_max
  57. param.G_slew_max = G_slew_max
  58. param.gamma = gamma
  59. param.grad_raster_time = grad_raster_time
  60. param.rf_raster_time = rf_raster_time
  61. param.t_ex = t_ex
  62. param.t_BW_product_ex = t_BW_product_ex
  63. param.FA = flip_angle
  64. param.apodization = apodization
  65. param.BW_ex_pulse = BW_ex_pulse
  66. param.rf_ringdown_time = rf_ringdown_time
  67. param.rf_dead_time = rf_dead_time
  68. param.adc_dead_time = adc_dead_time
  69. param.voxel_thkn = voxel_thkn
  70. param.N_point = N_point
  71. param.BW_per_point = BW_per_point
  72. param.dG = tau_max
  73. param.tau1 = tau1
  74. param.tau2 = tau2
  75. param.TR = TR
  76. param.average = average
  77. def save_param():
  78. output_filename = str(M0_dj.textBox17.get())
  79. output_sequence = seqgen_STEAM(param)
  80. output_sequence.plot(time_range = (0.000, 0.03))
  81. output_sequence.write(output_filename)
  82. file = open(output_filename + ".json", 'w')
  83. json.dump(param.__dict__, file, indent = 4)
  84. file.close()
  85. ### Defoult values ###
  86. average = 1
  87. win = tk.Tk()
  88. win.title('STEAM')
  89. win.geometry("520x420+100+100")
  90. win.resizable(False,False)
  91. # создаем набор вкладок
  92. notebook = ttk.Notebook()
  93. notebook.pack(expand=True, fill='both')
  94. Main = tk.Frame(notebook)
  95. Main.pack(fill='both', expand=True)
  96. notebook.add(Main, text="Main")
  97. M0_dj = SimpleNamespace()
  98. tk.Label(Main, text = 'BW_per_point, Hz').grid(row=1, column=0,sticky = "E")
  99. M0_dj.label1_1 = tk.Label(Main)
  100. M0_dj.label1_1.grid(row=1, column=2)
  101. tk.Label(Main, text = 'N_point').grid(row=2, column=0,sticky = "E")
  102. M0_dj.label2_1 = tk.Label(Main)
  103. M0_dj.label2_1.grid(row=2, column=2)
  104. M0_dj.label4 = tk.Label(Main, text = 'BW_full, Hz')
  105. M0_dj.label4.grid(row=3, column=0,sticky = "E")
  106. M0_dj.label4_1 = tk.Label(Main)
  107. M0_dj.label4_1.grid(row=3, column=2)
  108. M0_dj.label5 = tk.Label(Main, text = 'sl_thkn, m')
  109. M0_dj.label5.grid(row=4, column=0,sticky = "E")
  110. M0_dj.label5_1 = tk.Label(Main)
  111. M0_dj.label5_1.grid(row=4, column=2)
  112. M0_dj.label6 = tk.Label(Main, text = 'tau1')
  113. M0_dj.label6.grid(row=5, column=0,sticky = "E")
  114. M0_dj.label6_1 = tk.Label(Main)
  115. M0_dj.label6_1.grid(row=5, column=2)
  116. M0_dj.label7 = tk.Label(Main, text = 'tau2')
  117. M0_dj.label7.grid(row=6, column=0,sticky = "E")
  118. M0_dj.label7_1 = tk.Label(Main)
  119. M0_dj.label7_1.grid(row=6, column=2)
  120. M0_dj.label8 = tk.Label(Main, text = 'TR')
  121. M0_dj.label8.grid(row=7, column=0,sticky = "E")
  122. M0_dj.label8_1 = tk.Label(Main)
  123. M0_dj.label8_1.grid(row=7, column=2)
  124. tk.Label(Main, text = 'Averages').grid(row=8, column=0,sticky = "E")
  125. M0_dj.textBox9 = tk.Entry(Main, width = 6)
  126. M0_dj.textBox9.insert(0, average)
  127. M0_dj.textBox9.grid(row=8, column=1)
  128. M0_dj.label9_1 = tk.Label(Main)
  129. M0_dj.label9_1.grid(row=8, column=2)
  130. set_limits()
  131. M0_dj.btn1 = tk.Button(Main, text = 'Set', command = set_limits, width = 10)
  132. M0_dj.btn1.grid(row=1, column=5,sticky = "W")
  133. M0_dj.btn1 = tk.Button(Main, text = 'Save', command = save_param, width = 10)
  134. M0_dj.btn1.grid(row=4, column=5,sticky = "W")
  135. # filename
  136. M0_dj.label17= tk.Label(Main, text = 'Output file name',width = 13)
  137. M0_dj.label17.grid(row=6, column=5,sticky = "W")
  138. M0_dj.textBox17 = tk.Entry(Main,width = 25)
  139. M0_dj.textBox17.insert(0, "STEAM_" + datetime.now().strftime("%d%m%y_%H%M"))
  140. M0_dj.textBox17.grid(row=7, column=5, columnspan=3,sticky = "W")
  141. win.mainloop()