| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- import numpy as np
- def TSE_k_space_fill(n_ex, ETL, k_steps, TE_eff_number, N_center, order, dummy):
- # function defines phase encoding steps for k space filling in liner order
- # with shifting according to the TE effective number
- if dummy:
- k_space_dummy = ['dummy']*ETL
- k_space_dummy = [k_space_dummy]
- k_space_list_with_zero = []
- for i in range(ETL):
- #k_space_list_with_zero.append(int((ETL - 1) * n_ex - i * n_ex))
- k_space_list_with_zero.append(i * n_ex)
- if n_ex > 1:
- k_space_order_filing_temp = [k_space_list_with_zero]
- for i in range(n_ex - 1):
- k_space_list_temp = []
- for k in k_space_list_with_zero:
- k_space_list_temp.append(k + i + 1)
- k_space_order_filing_temp.append(k_space_list_temp)
- else:
- k_space_order_filing_temp = [k_space_list_with_zero]
- kk = 0
- for k_space_list_with_central_old in k_space_order_filing_temp:
- temporal = abs(k_space_list_with_central_old - N_center)
- center_index = np.argmin(temporal)
- central_line_position_old = center_index
- num_left_old = central_line_position_old
- num_right_old = len(k_space_list_with_central_old) - num_left_old - 1
- for i in range(len(k_space_list_with_central_old)):
- if k_space_list_with_central_old[i] > (k_steps - 1):
- k_space_list_with_central_old[i] = 'skip'
- k_space_list_with_central_new = ['skip'] * len(k_space_list_with_central_old)
- central_line_position_new = TE_eff_number - 1
- num_left_new = central_line_position_new
- num_right_new = len(k_space_list_with_central_new) - num_left_new - 1
- if num_left_new < num_right_new:
- min_new = num_left_new
- max_new = num_right_new
- else:
- min_new = num_right_new
- max_new = num_left_new
- k_space_list_with_central_new[central_line_position_new] = k_space_list_with_central_old[
- central_line_position_old]
- k_space_list_with_central_old[central_line_position_old] = 'passed'
- if min_new == 0: # effective time is first one
- i = 0
- k_space_list_with_central_old_abs = [0] * len(k_space_list_with_central_old)
- for ii in range(len(k_space_list_with_central_old)):
- if k_space_list_with_central_old[ii] != 'skip' and k_space_list_with_central_old[ii] != 'passed':
- k_space_list_with_central_old_abs[ii] = abs(k_space_list_with_central_old[ii] - N_center)
- #type_of_elements = type(k_space_list_with_central_old_abs[0])
- else:
- k_space_list_with_central_old_abs[ii] = k_space_list_with_central_old[ii]
- #type_of_elements = type(k_space_list_with_central_old_abs[0])
- type_of_string = type('passed')
- if num_left_new < num_right_new:
- flag = True
- j = central_line_position_new + i + 1
- while flag:
- a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
- min_index = k_space_list_with_central_old_abs.index(a)
- k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
- k_space_list_with_central_old_abs[min_index] = 'passed'
- k_space_list_with_central_old[min_index] = 'passed'
- j += 1
- flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
- k_space_order_filing_temp[kk] = k_space_list_with_central_new
- kk += 1
- else:
- flag = True
- j = central_line_position_new - i - 1
- while flag:
- a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
- min_index = k_space_list_with_central_old_abs.index(a)
- k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
- k_space_list_with_central_old_abs[min_index] = 'passed'
- k_space_list_with_central_old[min_index] = 'passed'
- j -= 1
- flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
- k_space_order_filing_temp[kk] = k_space_list_with_central_new
- kk += 1
- else:
- for i in range(1, min_new + 1):
- k_space_list_with_central_new[central_line_position_new + i] = k_space_list_with_central_old[
- central_line_position_old + i]
- k_space_list_with_central_old[central_line_position_old + i] = 'passed'
- k_space_list_with_central_new[central_line_position_new - i] = k_space_list_with_central_old[
- central_line_position_old - i]
- k_space_list_with_central_old[central_line_position_old - i] = 'passed'
- k_space_list_with_central_old_abs = [0] * len(k_space_list_with_central_old)
- for ii in range(len(k_space_list_with_central_old)):
- if k_space_list_with_central_old[ii] != 'skip' and k_space_list_with_central_old[ii] != 'passed':
- k_space_list_with_central_old_abs[ii] = abs(k_space_list_with_central_old[ii] - N_center)
- #type_of_elements = type(k_space_list_with_central_old_abs[0])
- else:
- k_space_list_with_central_old_abs[ii] = k_space_list_with_central_old[ii]
- #type_of_elements = type(k_space_list_with_central_old_abs[0])
- type_of_string = type('passed')
- if num_left_new < num_right_new:
- flag = True
- j = central_line_position_new + i + 1
- while flag:
- a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
- min_index = k_space_list_with_central_old_abs.index(a)
- k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
- k_space_list_with_central_old_abs[min_index] = 'passed'
- k_space_list_with_central_old[min_index] = 'passed'
- j += 1
- flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
- k_space_order_filing_temp[kk] = k_space_list_with_central_new
- kk += 1
- else:
- flag = True
- j = central_line_position_new - i - 1
- while flag:
- a = min(filter(lambda i: not isinstance(i, type_of_string), k_space_list_with_central_old_abs))
- min_index = k_space_list_with_central_old_abs.index(a)
- k_space_list_with_central_new[j] = k_space_list_with_central_old[min_index]
- k_space_list_with_central_old_abs[min_index] = 'passed'
- k_space_list_with_central_old[min_index] = 'passed'
- j -= 1
- flag = any(not isinstance(y, (type_of_string)) for y in k_space_list_with_central_old)
- k_space_order_filing_temp[kk] = k_space_list_with_central_new
- kk += 1
- #k_space_order_filing = k_space_order_filing.append(k_space_list_with_central_new)
- """
- k_space_order_filing = []
- n_ex_shift = np.int64(n_ex/2)-1
- a = range(0-n_ex_shift, n_ex-n_ex_shift)
- for i in a:
- k_space_list_temp = []
- for kk in k_space_list_with_central_new:
- value = kk + i
- if value < 0:
- value = value + k_steps
- if value > k_steps - 1:
- value = 'skip'
- k_space_list_temp.append(value)
- k_space_order_filing.append(k_space_list_temp)
- """
- if dummy:
- for list in k_space_order_filing_temp:
- k_space_dummy.append(list)
- else:
- k_space_dummy = k_space_order_filing_temp
- return k_space_dummy
- """
- # find the list where
- i = 1
- for k_space_list_with_central_old in k_space_order_filing_temp:
- if N_center in list:
- k_space_list_with_central_old = list
- num_of_list = i
- else:
- i += 1
- else:
- k_space_list_with_central_old = k_space_list_with_zero
- central_line_position_old = k_space_list_with_central_old.index(N_center)
- num_left_old = central_line_position_old
- num_right_old = len(k_space_list_with_central_old) - num_left_old - 1
- """
- """
- shift = central_line_position_old - central_line_position_new
- if order == 'non_linear':
- a = k_space_list_with_central_old[:((shift-central_line_position_old)*2-1)]
- b = k_space_list_with_central_old[((shift-central_line_position_old)*2-1):]
- for i in range(1, int(len(b)/2)+1):
- a.append(b[i-1])
- a.append(b[-i])
- a.append(b[i])
- k_space_list_with_central_new = a
- """
- """
- for j in range(np.int32(np.ceil((max_new - min_new - 1)/ 2))):
- a = min(filter(lambda i: isinstance(i, type_of_elements), k_space_list_with_central_old))
- min_index = k_space_list_with_central_old.index(a)
- k_space_list_with_central_new[central_line_position_new + (i + j + 1)] = k_space_list_with_central_old[min_index]
- k_space_list_with_central_old[min_index] = 'passed'
- for j in range(np.int32(np.ceil((max_new - min_new - 1)/ 2))):
- k_space_list_with_central_new[central_line_position_new + (i + 2 * j + 1)] = N_center - n_ex * (i + j + 1)
- if N_center + n_ex * (i + j + 1) > max(k_space_list_with_central_old):
- 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
- else:
- k_space_list_with_central_new[central_line_position_new + (i + 2 * j + 2)] = N_center + n_ex * (
- i + j + 1)
- k_space_list_with_central_new[central_line_position_new + (i + 2 * (j + 1) + 1)] = N_center - n_ex * (i + (j + 1) + 1)
- k_space_order_filing = k_space_list_with_central_new
- if central_line_position_new < central_line_position_old:
- for j in range(central_line_position_old - i):
- k_space_list_with_central_new[central_line_position_new + i + 2*j + 1] = k_space_list_with_central_old[
- central_line_position_old - i - j - 1]
- k_space_list_with_central_new[central_line_position_new + i + 2*j + 2] = k_space_list_with_central_old[
- central_line_position_old + i + j + 1]
- if (len(k_space_list_with_central_new) % 2) == 0:
- k_space_list_with_central_new[-1] = k_space_list_with_central_old[-1]
- else:
- for j in range(central_line_position_old - i):
- k_space_list_with_central_new[central_line_position_new - i - 2*j - 1] = k_space_list_with_central_old[
- central_line_position_old - i - j - 1]
- k_space_list_with_central_new[central_line_position_new - i - 2*j - 2] = k_space_list_with_central_old[
- central_line_position_old + i + j + 1]
- #if (len(k_space_list_with_central_new) % 2) == 0:
- # k_space_list_with_central_new[0] = k_space_list_with_central_old[-1]
- """
|