TSE_k_space_fill.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import numpy as np
  2. def TSE_k_space_fill(n_ex, ETL, k_steps, TE_eff_number, N_center, order, dummy):
  3. # function defines phase encoding steps for k space filling in liner order
  4. # with shifting according to the TE effective number
  5. if dummy:
  6. k_space_dummy = ['dummy']*ETL
  7. k_space_dummy = [k_space_dummy]
  8. k_space_list_with_zero = []
  9. for i in range(ETL):
  10. #k_space_list_with_zero.append(int((ETL - 1) * n_ex - i * n_ex))
  11. k_space_list_with_zero.append(i * n_ex)
  12. if n_ex > 1:
  13. k_space_order_filing_temp = [k_space_list_with_zero]
  14. for i in range(n_ex - 1):
  15. k_space_list_temp = []
  16. for k in k_space_list_with_zero:
  17. k_space_list_temp.append(k + i + 1)
  18. k_space_order_filing_temp.append(k_space_list_temp)
  19. else:
  20. k_space_order_filing_temp = [k_space_list_with_zero]
  21. kk = 0
  22. for k_space_list_with_central_old in k_space_order_filing_temp:
  23. temporal = abs(k_space_list_with_central_old - N_center)
  24. center_index = np.argmin(temporal)
  25. central_line_position_old = center_index
  26. num_left_old = central_line_position_old
  27. num_right_old = len(k_space_list_with_central_old) - num_left_old - 1
  28. for i in range(len(k_space_list_with_central_old)):
  29. if k_space_list_with_central_old[i] > (k_steps - 1):
  30. k_space_list_with_central_old[i] = 'skip'
  31. k_space_list_with_central_new = ['skip'] * len(k_space_list_with_central_old)
  32. central_line_position_new = TE_eff_number - 1
  33. num_left_new = central_line_position_new
  34. num_right_new = len(k_space_list_with_central_new) - num_left_new - 1
  35. if num_left_new < num_right_new:
  36. min_new = num_left_new
  37. max_new = num_right_new
  38. else:
  39. min_new = num_right_new
  40. max_new = num_left_new
  41. k_space_list_with_central_new[central_line_position_new] = k_space_list_with_central_old[
  42. central_line_position_old]
  43. k_space_list_with_central_old[central_line_position_old] = 'passed'
  44. if min_new == 0: # effective time is first one
  45. i = 0
  46. k_space_list_with_central_old_abs = [0] * len(k_space_list_with_central_old)
  47. for ii in range(len(k_space_list_with_central_old)):
  48. if k_space_list_with_central_old[ii] != 'skip' and k_space_list_with_central_old[ii] != 'passed':
  49. k_space_list_with_central_old_abs[ii] = abs(k_space_list_with_central_old[ii] - N_center)
  50. #type_of_elements = type(k_space_list_with_central_old_abs[0])
  51. else:
  52. k_space_list_with_central_old_abs[ii] = k_space_list_with_central_old[ii]
  53. #type_of_elements = type(k_space_list_with_central_old_abs[0])
  54. type_of_string = type('passed')
  55. if num_left_new < num_right_new:
  56. flag = True
  57. j = central_line_position_new + i + 1
  58. while flag:
  59. a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
  60. min_index = k_space_list_with_central_old_abs.index(a)
  61. k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
  62. k_space_list_with_central_old_abs[min_index] = 'passed'
  63. k_space_list_with_central_old[min_index] = 'passed'
  64. j += 1
  65. flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
  66. k_space_order_filing_temp[kk] = k_space_list_with_central_new
  67. kk += 1
  68. else:
  69. flag = True
  70. j = central_line_position_new - i - 1
  71. while flag:
  72. a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
  73. min_index = k_space_list_with_central_old_abs.index(a)
  74. k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
  75. k_space_list_with_central_old_abs[min_index] = 'passed'
  76. k_space_list_with_central_old[min_index] = 'passed'
  77. j -= 1
  78. flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
  79. k_space_order_filing_temp[kk] = k_space_list_with_central_new
  80. kk += 1
  81. else:
  82. for i in range(1, min_new + 1):
  83. k_space_list_with_central_new[central_line_position_new + i] = k_space_list_with_central_old[
  84. central_line_position_old + i]
  85. k_space_list_with_central_old[central_line_position_old + i] = 'passed'
  86. k_space_list_with_central_new[central_line_position_new - i] = k_space_list_with_central_old[
  87. central_line_position_old - i]
  88. k_space_list_with_central_old[central_line_position_old - i] = 'passed'
  89. k_space_list_with_central_old_abs = [0] * len(k_space_list_with_central_old)
  90. for ii in range(len(k_space_list_with_central_old)):
  91. if k_space_list_with_central_old[ii] != 'skip' and k_space_list_with_central_old[ii] != 'passed':
  92. k_space_list_with_central_old_abs[ii] = abs(k_space_list_with_central_old[ii] - N_center)
  93. #type_of_elements = type(k_space_list_with_central_old_abs[0])
  94. else:
  95. k_space_list_with_central_old_abs[ii] = k_space_list_with_central_old[ii]
  96. #type_of_elements = type(k_space_list_with_central_old_abs[0])
  97. type_of_string = type('passed')
  98. if num_left_new < num_right_new:
  99. flag = True
  100. j = central_line_position_new + i + 1
  101. while flag:
  102. a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
  103. min_index = k_space_list_with_central_old_abs.index(a)
  104. k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
  105. k_space_list_with_central_old_abs[min_index] = 'passed'
  106. k_space_list_with_central_old[min_index] = 'passed'
  107. j += 1
  108. flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
  109. k_space_order_filing_temp[kk] = k_space_list_with_central_new
  110. kk += 1
  111. else:
  112. flag = True
  113. j = central_line_position_new - i - 1
  114. while flag:
  115. a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
  116. min_index = k_space_list_with_central_old_abs.index(a)
  117. k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
  118. k_space_list_with_central_old_abs[min_index] = 'passed'
  119. k_space_list_with_central_old[min_index] = 'passed'
  120. j -= 1
  121. flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
  122. k_space_order_filing_temp[kk] = k_space_list_with_central_new
  123. kk += 1
  124. #k_space_order_filing = k_space_order_filing.append(k_space_list_with_central_new)
  125. """
  126. k_space_order_filing = []
  127. n_ex_shift = np.int64(n_ex/2)-1
  128. a = range(0-n_ex_shift, n_ex-n_ex_shift)
  129. for i in a:
  130. k_space_list_temp = []
  131. for kk in k_space_list_with_central_new:
  132. value = kk + i
  133. if value < 0:
  134. value = value + k_steps
  135. if value > k_steps - 1:
  136. value = 'skip'
  137. k_space_list_temp.append(value)
  138. k_space_order_filing.append(k_space_list_temp)
  139. """
  140. if dummy:
  141. for list in k_space_order_filing_temp:
  142. k_space_dummy.append(list)
  143. else:
  144. k_space_dummy = k_space_order_filing_temp
  145. return k_space_dummy
  146. """
  147. # find the list where
  148. i = 1
  149. for k_space_list_with_central_old in k_space_order_filing_temp:
  150. if N_center in list:
  151. k_space_list_with_central_old = list
  152. num_of_list = i
  153. else:
  154. i += 1
  155. else:
  156. k_space_list_with_central_old = k_space_list_with_zero
  157. central_line_position_old = k_space_list_with_central_old.index(N_center)
  158. num_left_old = central_line_position_old
  159. num_right_old = len(k_space_list_with_central_old) - num_left_old - 1
  160. """
  161. """
  162. shift = central_line_position_old - central_line_position_new
  163. if order == 'non_linear':
  164. a = k_space_list_with_central_old[:((shift-central_line_position_old)*2-1)]
  165. b = k_space_list_with_central_old[((shift-central_line_position_old)*2-1):]
  166. for i in range(1, int(len(b)/2)+1):
  167. a.append(b[i-1])
  168. a.append(b[-i])
  169. a.append(b[i])
  170. k_space_list_with_central_new = a
  171. """
  172. """
  173. for j in range(np.int32(np.ceil((max_new - min_new - 1)/ 2))):
  174. a = min(filter(lambda i: isinstance(i, type_of_elements), k_space_list_with_central_old))
  175. min_index = k_space_list_with_central_old.index(a)
  176. k_space_list_with_central_new[central_line_position_new + (i + j + 1)] = k_space_list_with_central_old[min_index]
  177. k_space_list_with_central_old[min_index] = 'passed'
  178. for j in range(np.int32(np.ceil((max_new - min_new - 1)/ 2))):
  179. k_space_list_with_central_new[central_line_position_new + (i + 2 * j + 1)] = N_center - n_ex * (i + j + 1)
  180. if N_center + n_ex * (i + j + 1) > max(k_space_list_with_central_old):
  181. k_space_list_with_central_new[central_line_position_new + (i + 2 * j + 2)] = N_center + n_ex * (i + j + 1) - max(k_space_list_with_central_old) - 1
  182. else:
  183. k_space_list_with_central_new[central_line_position_new + (i + 2 * j + 2)] = N_center + n_ex * (
  184. i + j + 1)
  185. k_space_list_with_central_new[central_line_position_new + (i + 2 * (j + 1) + 1)] = N_center - n_ex * (i + (j + 1) + 1)
  186. k_space_order_filing = k_space_list_with_central_new
  187. if central_line_position_new < central_line_position_old:
  188. for j in range(central_line_position_old - i):
  189. k_space_list_with_central_new[central_line_position_new + i + 2*j + 1] = k_space_list_with_central_old[
  190. central_line_position_old - i - j - 1]
  191. k_space_list_with_central_new[central_line_position_new + i + 2*j + 2] = k_space_list_with_central_old[
  192. central_line_position_old + i + j + 1]
  193. if (len(k_space_list_with_central_new) % 2) == 0:
  194. k_space_list_with_central_new[-1] = k_space_list_with_central_old[-1]
  195. else:
  196. for j in range(central_line_position_old - i):
  197. k_space_list_with_central_new[central_line_position_new - i - 2*j - 1] = k_space_list_with_central_old[
  198. central_line_position_old - i - j - 1]
  199. k_space_list_with_central_new[central_line_position_new - i - 2*j - 2] = k_space_list_with_central_old[
  200. central_line_position_old + i + j + 1]
  201. #if (len(k_space_list_with_central_new) % 2) == 0:
  202. # k_space_list_with_central_new[0] = k_space_list_with_central_old[-1]
  203. """