-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocess_orientation.py
More file actions
158 lines (139 loc) · 7.03 KB
/
process_orientation.py
File metadata and controls
158 lines (139 loc) · 7.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import argparse
import os
import sys
import glob
import numpy as np
import nibabel as nib
from nifty_utils.orientation import nr_affine_to_flirt, flirt_affine_to_nr, \
do_reorientation, check_coronal, check_axial, check_anisotropy, \
check_sagittal, four_to_five, five_to_four, save_sform
CHOICES = ['LAS', 'LAI', 'LPS', 'LPI', 'LSA', 'LSP', 'LIA', 'LIP',
'RAS', 'RAI', 'RPS', 'RPI', 'RSA', 'RSP', 'RIA', 'RIP',
'SRP', 'SRA', 'SLP', 'SLA', 'SPR', 'SPL', 'SAR', 'SAL',
'IRP', 'IRA', 'ILP', 'ILA', 'IPR', 'IPL', 'IAR', 'IAL',
'ALS', 'ALI', 'ARS', 'ARI', 'ASL', 'ASR', 'AIL', 'AIR',
'PLS', 'PLI', 'PRS', 'PRI', 'PSL', 'PSR', 'PIL', 'PIR']
def main(argv):
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subcommand')
# subparser for checks on orientation and acquisition
parser_check = subparsers.add_parser('checks')
parser_check.add_argument('-f', dest='file_pattern',
metavar='filename_input',
type=str, required=True,
help='file or file pattern where information '
'is located')
parser_check.add_argument('-p', dest='output_path', action='store',
default=os.getcwd(),
help='output_path')
parser_check.add_argument('-iso', dest='iso_flag', action='store_true')
parser_check.add_argument('-ori', dest='ori_flag', action='store_true')
# subparser for flirtnr
parser_flirtnr = subparsers.add_parser('flirtnr')
parser_flirtnr.add_argument('-t_flirt', dest='flirt_transform',
metavar='filename_input',
type=str, default=None,
help='file with flirt transform')
parser_flirtnr.add_argument('-ref', dest='ref_file', required=True)
parser_flirtnr.add_argument('-flo', dest='flo_file', required=True)
parser_flirtnr.add_argument('-t_nr', dest='nr_transform', action='store',
type=str, default=None,
help='file with nr_transform')
parser_flirtnr.add_argument('-o', dest='output_name', action='store',
type=str, help='filename where to store '
'transformed data', default=None)
parser_reor = subparsers.add_parser('reor')
parser_reor.add_argument('-new_ori', dest='final_or', choices=CHOICES,
required=True)
parser_reor.add_argument('-f', dest='file', required=True)
parser_reor.add_argument('-o', dest='output_name', action='store', type=str,
help='filename where to store transformed data',
default=None)
parser_4to5 = subparsers.add_parser('4to5')
parser_4to5.add_argument('-f', dest='file', required=True)
parser_4to5.add_argument('-o', dest='output_name', action='store', type=str,
help='filename where to store transformed data',
default=None)
parser_5to4 = subparsers.add_parser('5to4')
parser_5to4.add_argument('-f', dest='file', required=True)
parser_5to4.add_argument('-o', dest='output_name', action='store', type=str,
help='filename where to store transformed data',
default=None)
parser_5to4 = subparsers.add_parser('sform')
parser_5to4.add_argument('-f', dest='file', required=True)
parser_5to4.add_argument('-o', dest='output_name', action='store', type=str,
help='filename where to store transformed data',
default=None)
try:
args = parser.parse_args(argv)
except argparse.ArgumentTypeError:
print('process_orientation.py flirtnr -t_flirt -o')
sys.exit(2)
if args.subcommand == 'checks':
list_files = glob.glob(args.file_pattern)
for filename in list_files:
if args.ori_flag:
print("%s is coronal: %s" % (filename, check_coronal(filename)))
print("%s is axial: %s" % (filename, check_axial(filename)))
print("%s is sagittal: %s" % (filename, check_sagittal(
filename)))
if args.iso_flag:
print("%s is isotropic: %s" % (filename, check_anisotropy(
filename)))
if args.subcommand == 'flirtnr':
if args.flirt_transform is None:
transfo = nr_affine_to_flirt(args.ref_file, args.flo_file,
args.nr_transform)
if args.output_name is None:
path_name = os.path.split(args.nr_transform)[0]
name_transfo = os.path.split(args.nr_transform)[1]
name_new = name_transfo.rstrip('.*') + '_flirt.txt'
name_save = os.path.join(path_name, name_new)
else:
name_save = args.output_name
np.savetxt(name_save, transfo)
return
if args.nr_transform is None:
transfo = flirt_affine_to_nr(args.ref_file, args.flo_file,
args.flirt_transform)
if args.output_name is None:
path_name = os.path.split(args.flirt_transform)[0]
name_transfo = os.path.split(args.flirt_transform)[1]
name_new = name_transfo.rstrip('.*') + '_nr.txt'
name_save = os.path.join(path_name, name_new)
else:
name_save = args.output_name
np.savetxt(name_save, transfo)
return
if args.subcommand == '5to4':
new_nii = five_to_four(args.file)
if args.output_name is None:
name_save = args.file.rstrip('.nii.gz')+'_5to4.nii.gz'
else:
name_save = args.output_name
nib.save(new_nii, name_save)
if args.subcommand == '4to5':
new_nii = four_to_five(args.file)
if args.output_name is None:
name_save = args.file.rstrip('.nii.gz')+'_4to5.nii.gz'
else:
name_save = args.output_name
nib.save(new_nii, name_save)
if args.subcommand == 'sform':
save_sform(args.file)
if args.subcommand == 'reor':
file_nii = nib.load(args.file)
init_orient = nib.orientations.io_orientation(file_nii.affine)
init_axcodes = nib.orientations.ornt2axcodes(init_orient)
data_new, affine_new, transfo = do_reorientation(file_nii, init_axcodes,
tuple(args.final_or))
new_nii = nib.Nifti1Image(data_new, affine_new)
if args.output_name is None:
name_save = args.file.rstrip('.nii.gz')+'_'+args.final_or+'.nii.gz'
else:
name_save = args.output_name
name_save_trans = name_save.rstrip('.nii.gz') + '.txt'
nib.save(new_nii, name_save)
np.savetxt(name_save_trans, transfo, fmt='%3.2f')
if __name__ == "__main__":
main(sys.argv[1:])