-
Notifications
You must be signed in to change notification settings - Fork 0
/
TMS_To_MRI_Mapping.py
171 lines (96 loc) · 3.93 KB
/
TMS_To_MRI_Mapping.py
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
159
160
161
162
163
164
165
166
167
168
169
# Note that some of these packages might need to be installed, as they are not on the Martinos server natively...
import os
import nibabel as nb
from glob import glob
import numpy as np
from os.path import isfile, join
import sys
import pandas as pd
from mne.transforms import apply_trans
import openpyxl
import re
import xlsxwriter
import shutil
from pathlib import Path
#-----------MRI portion------------
# Specify input path to T1w image as such: /autofs/space/nicc_001/data/TMS-EEG/sourcedata/sub-ou1neuroc003/MRI/ou1neuroc003/MEMPRAGE_4e_p2_1mm_iso/007/MPRAGE.nii
user_in = input('Specify path to MRI data (Must be isotropic):')
if os.path.exists(user_in):
print('')
print('File path found.')
else:
print('ERROR: File path not found.')
nii = nb.load(user_in)
img = nii.get_fdata()
examine_header = nii.header
voxel_dims = (nii.header["pixdim"])[1:4]
print('')
print(voxel_dims)
isotropic_target = [1, 1, 1]
if (voxel_dims==isotropic_target).all():
print('Isotropic volume found.')
else:
print('')
print('ERROR: This program expects an isotropic image (e.g., 1x1x1 dimensions).')
sys.exit()
matrix_dims = (nii.header["dim"])[1:4]
MRI_x_dims = matrix_dims[0]
MRI_y_dims = matrix_dims[1]
MRI_z_dims = matrix_dims[2]
print("Image dimensions:",[MRI_x_dims, MRI_y_dims, MRI_z_dims])
#-----------TMS portion------------
# Specify input path to TMS-EEG sessions spreadsheet file as such: /autofs/space/nicc_001/data/TMS-EEG/sourcedata/sub-ou1neuroc003/ses-01/ou1neuroc003_ses01.xlsx
session = input('Specify path to TMS session spreadsheet data:')
if os.path.exists(session):
print('')
print('File path found.')
else:
print('ERROR: File path not found.')
sys.exit()
print(session)
#-----------CONVERSION PORTION FOR TMS-TO-MRI COORDINATES------------
# NO DATA IS OVERWRITTEN. ALL SPREADSHEETS AND DATA REMAIN INTACT AND A NEW SPREADSHEET WILL BE GENERATED AFTER RUNNING. THIS WILL CONVERT EACH TMS-EEG SESSION TO MULTIPLE SHEETS
# IN ONE .xlsx file
pd.set_option('display.float_format', lambda x: '%.5f' % x)
x_col = [19]
y_col = [20]
z_col = [21]
target_cols = x_col + y_col + z_col
wb = openpyxl.load_workbook(session)
pd.set_option('display.max_rows', None, 'display.max_columns', None)
writer = pd.ExcelWriter('TMS_MRI_Coordinates.xlsx', engine='xlsxwriter')
for sheet in wb.sheetnames:
if re.findall('Session.+', sheet):
df = pd.read_excel(session, sheet, header=None)
df1 = df[df.columns[target_cols]]
x_targ = df1[df.columns[19]]
y_targ = df1[df.columns[20]]
z_targ = df1[df.columns[21]]
df1 = pd.to_numeric(x_targ,
errors = 'coerce')
df2 = pd.to_numeric(y_targ,
errors = 'coerce')
df3 = pd.to_numeric(z_targ,
errors = 'coerce')
df1 = MRI_x_dims - df1 / 1
df2 = MRI_z_dims - df2 / 1
df3 = MRI_y_dims - df3 / 1
df['x_val'] = df1
df['y_val'] = df2
df['z_val'] = df3
MRI_coords = [24, 25, 26]
df_new = df[df.columns[MRI_coords]]
x = apply_trans(nii.affine, df_new)
a = pd.DataFrame(x)
r = a.round(3)
r.to_excel(writer, sheet_name=sheet, header=['RAS_x', 'RAS_y', 'RAS_z'])
writer.save() # Add something before this line if you wish to have the writer write to a specific directory, otherwise a new .xlsx spreadsheet will be written to your current wd
# where you are running the ipynb.
b = os.getcwd()
a = os.path.dirname(session)
for src_file in Path(b).glob('*TMS_MRI_Coordinates*'):
shutil.copy(src_file, a)
final_dir = os.path.join(a, src_file)
print('Success!')
print('')
print('MRI transforms written to:', final_dir)