1
1
# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
2
2
# vi: set ft=python sts=4 ts=4 sw=4 et:
3
3
import os
4
+ import re
4
5
5
6
import nibabel as nb
6
7
import numpy as np
@@ -62,6 +63,30 @@ def test_compcor(self):
62
63
components_file = 'acc_components_file' ), expected_components ,
63
64
'aCompCor' )
64
65
66
+ def test_compcor_variance_threshold_and_metadata (self ):
67
+ expected_components = [['-0.2027150345' , '-0.4954813834' ],
68
+ ['0.2565929051' , '0.7866217875' ],
69
+ ['-0.3550986008' , '-0.0089784905' ],
70
+ ['0.7512786244' , '-0.3599828482' ],
71
+ ['-0.4500578942' , '0.0778209345' ]]
72
+ expected_metadata = {
73
+ 'component' : 'CompCor00' ,
74
+ 'mask' : '0' ,
75
+ 'singular_value' : '4.0720553036' ,
76
+ 'variance_explained' : '0.5527211465' ,
77
+ 'cumulative_variance_explained' : '0.5527211465'
78
+ }
79
+ ccinterface = CompCor (
80
+ variance_threshold = 0.7 ,
81
+ realigned_file = self .realigned_file ,
82
+ mask_files = self .mask_files ,
83
+ mask_index = 1 ,
84
+ save_metadata = True )
85
+ self .run_cc (ccinterface = ccinterface ,
86
+ expected_components = expected_components ,
87
+ expected_n_components = 2 ,
88
+ expected_metadata = expected_metadata )
89
+
65
90
def test_tcompcor (self ):
66
91
ccinterface = TCompCor (num_components = 6 ,
67
92
realigned_file = self .realigned_file , percentile_threshold = 0.75 )
@@ -155,7 +180,9 @@ def test_tcompcor_multi_mask_no_index(self):
155
180
def run_cc (self ,
156
181
ccinterface ,
157
182
expected_components ,
158
- expected_header = 'CompCor' ):
183
+ expected_header = 'CompCor' ,
184
+ expected_n_components = None ,
185
+ expected_metadata = None ):
159
186
# run
160
187
ccresult = ccinterface .run ()
161
188
@@ -166,10 +193,12 @@ def run_cc(self,
166
193
assert os .path .getsize (expected_file ) > 0
167
194
168
195
with open (ccresult .outputs .components_file , 'r' ) as components_file :
169
- expected_n_components = min (ccinterface .inputs .num_components ,
170
- self .fake_data .shape [3 ])
196
+ if expected_n_components is None :
197
+ expected_n_components = min (ccinterface .inputs .num_components ,
198
+ self .fake_data .shape [3 ])
171
199
172
- components_data = [line .split ('\t ' ) for line in components_file ]
200
+ components_data = [re .sub ('\n ' , '' , line ).split ('\t ' )
201
+ for line in components_file ]
173
202
174
203
# the first item will be '#', we can throw it out
175
204
header = components_data .pop (0 )
@@ -183,9 +212,24 @@ def run_cc(self,
183
212
num_got_timepoints = len (components_data )
184
213
assert num_got_timepoints == self .fake_data .shape [3 ]
185
214
for index , timepoint in enumerate (components_data ):
186
- assert (len (timepoint ) == ccinterface .inputs .num_components
187
- or len (timepoint ) == self .fake_data .shape [3 ])
215
+ assert (len (timepoint ) == expected_n_components )
188
216
assert timepoint [:2 ] == expected_components [index ]
217
+
218
+ if ccinterface .inputs .save_metadata :
219
+ expected_metadata_file = (
220
+ ccinterface ._list_outputs ()['metadata_file' ])
221
+ assert ccresult .outputs .metadata_file == expected_metadata_file
222
+ assert os .path .exists (expected_metadata_file )
223
+ assert os .path .getsize (expected_metadata_file ) > 0
224
+
225
+ with open (ccresult .outputs .metadata_file , 'r' ) as metadata_file :
226
+ components_metadata = [re .sub ('\n ' , '' , line ).split ('\t ' )
227
+ for line in metadata_file ]
228
+ components_metadata = {i : j for i , j in
229
+ zip (components_metadata [0 ],
230
+ components_metadata [1 ])}
231
+ assert components_metadata == expected_metadata
232
+
189
233
return ccresult
190
234
191
235
@staticmethod
0 commit comments