-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfmri_reorder_parcellated_timeseries.py
140 lines (119 loc) · 4.47 KB
/
fmri_reorder_parcellated_timeseries.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
import numpy as np
import sys
import argparse
from scipy.io import loadmat,savemat
import os.path
from utils import *
#this will concat ROIs 1-18 from in1_ts.mat and 1-N in in2_ts.mat
#python fmri_reorder_parcellated_timeseries.py --output out_ts.mat --input in1_ts.mat 1-18 --input in2_ts.mat
def argument_parse(argv):
parser=argparse.ArgumentParser(description='Reorder and/or merge ROIs in time series')
parser.add_argument('--input',action='append',dest='inputlist',nargs='*')
parser.add_argument('--output',action='store',dest='outputfile')
return parser.parse_args(argv)
#########################################################
#this old version splits by "," first, but really we want to use commas within an roi input set eg: 1,2=4 and just use spaces for separate inputs
#but keep this here for now for reference in case another script used it and I forgot
def parse_roilist_oldtype(roilist):
inlist=[]
outlist=[]
for s in roilist:
for p in s.split(","):
if not p:
continue
outval=None
if "=" in p:
p_eq=p.split("=")
p=p_eq[0]
outval=float(p_eq[-1])
if "-" in p:
pp=p.split("-")
ppval=np.arange(float(pp[0]),float(pp[-1])+1).tolist()
else:
ppval=[float(p)]
if outval is None:
outval=ppval
else:
outval=[outval]*len(ppval)
inlist+=ppval
outlist+=outval
return inlist,outlist
def parse_roilist(roilist):
inlist=[]
outlist=[]
for p in roilist:
outval=None
if "=" in p:
p_eq=p.split("=")
p=p_eq[0]
outval=float(p_eq[-1])
if "-" in p:
pp=p.split("-")
ppval=np.arange(float(pp[0]),float(pp[-1])+1).tolist()
elif "," in p:
pp=p.split(",")
ppval=[float(ppi) for ppi in pp]
else:
ppval=[float(p)]
if outval is None:
outval=ppval
else:
outval=[outval]*len(ppval)
inlist+=ppval
outlist+=outval
return inlist,outlist
def fmri_reorder_parcellated_timeseries(argv):
args = argument_parse(argv)
outputfile=args.outputfile
inputlist=args.inputlist
inputstruct_list=[]
for i in inputlist:
inputfile=i[0]
input_labels, output_labels=parse_roilist(i[1:])
inputstruct_list+=[{'file':inputfile,'input_labels':input_labels,'output_labels':output_labels}]
Mnew=None
tsdict_valshift=0
tsdict_vals={}
tsdict_sizelist={}
for inputinfo in inputstruct_list:
M=loadmat(inputinfo['file'])
roivals=M['roi_labels'].flatten()
#roisizes=M['roi_sizes'].astype(np.float).flatten()
roisizes=M['roi_sizes'].astype(float).flatten()
if Mnew is None:
Mnew=M.copy()
if len(inputinfo['input_labels']) == 0:
inputinfo['input_labels']=roivals
inputinfo['output_labels']=roivals + tsdict_valshift
for i,vi in enumerate(inputinfo['input_labels']):
vo=inputinfo['output_labels'][i]
m=roivals==vi
if not any(m):
#fill zeros if this roi label is not found in input
rts=np.zeros(M['ts'][:,0].shape)
rsize=0
else:
midx=np.where(m)[0][0]
rts=M['ts'][:,midx]
rsize=roisizes[midx]
if vo in tsdict_vals:
tsdict_vals[vo]=tsdict_vals[vo] + rts*rsize
tsdict_sizelist[vo]+=rsize
else:
tsdict_vals[vo]=rts*rsize
tsdict_sizelist[vo]=rsize
tsdict_valshift=max(list(tsdict_vals.keys()))
uvals=np.sort(np.unique(list(tsdict_vals.keys())))
Mnew['ts']=np.zeros((Mnew['ts'].shape[0], len(uvals)))
Mnew['roi_labels']=uvals.astype(np.int32)
Mnew['roi_sizes']=np.array([tsdict_sizelist[u] for u in uvals],dtype=np.int64)
for i, u in enumerate(uvals):
if tsdict_sizelist[u] > 0:
sz=tsdict_sizelist[u]
else:
sz=1
Mnew['ts'][:,i]=tsdict_vals[u]/sz
savemat(outputfile,Mnew,format='5',do_compression=True)
print('Saved %s [%d x %d]' % (outputfile,Mnew['ts'].shape[0],Mnew['ts'].shape[1]))
if __name__ == "__main__":
fmri_reorder_parcellated_timeseries(sys.argv[1:])