@@ -386,6 +386,10 @@ class CompCorInputSpec(BaseInterfaceInputSpec):
386
386
requires = ['mask_files' ],
387
387
desc = ('Position of mask in `mask_files` to use - '
388
388
'first is the default.' ))
389
+ mask_names = traits .List (traits .Str ,
390
+ desc = 'Names for provided masks (for printing into metadata). '
391
+ 'If provided, it must be as long as the final mask list '
392
+ '(after any merge and indexing operations).' )
389
393
components_file = traits .Str (
390
394
'components_file.txt' ,
391
395
usedefault = True ,
@@ -563,7 +567,7 @@ def _run_interface(self, runtime):
563
567
components , filter_basis , metadata = compute_noise_components (
564
568
imgseries .get_data (), mask_images , self .inputs .num_components ,
565
569
self .inputs .pre_filter , degree , self .inputs .high_pass_cutoff , TR ,
566
- self .inputs .failure_mode )
570
+ self .inputs .failure_mode , self . inputs . mask_names )
567
571
568
572
if skip_vols :
569
573
old_comp = components
@@ -612,13 +616,11 @@ def _run_interface(self, runtime):
612
616
613
617
if self .inputs .save_metadata :
614
618
metadata_file = self ._list_outputs ()['metadata_file' ]
615
- np .savetxt (
616
- metadata_file ,
617
- np .vstack (metadata .values ()).T ,
618
- fmt = ['%s' , b'%.10f' , b'%.10f' , b'%.10f' ],
619
- delimiter = '\t ' ,
620
- header = '\t ' .join (list (metadata .keys ())),
621
- comments = '' )
619
+ with open (metadata_file , 'w' ) as f :
620
+ f .write ('{}\t {}\t {}\t {}\n ' .format (* list (metadata .keys ())))
621
+ for i in zip (* metadata .values ()):
622
+ f .write ('{0[0]}\t {0[1]:.10f}\t {0[2]:.10f}\t '
623
+ '{0[3]:.10f}\n ' .format (i ))
622
624
623
625
return runtime
624
626
@@ -650,6 +652,9 @@ def _make_headers(self, num_col):
650
652
headers = ['{}{:02d}' .format (header , i ) for i in range (num_col )]
651
653
return '\t ' .join (headers )
652
654
655
+ def _print_metadata (self , x , f ):
656
+ f .write ('{0[0]}\t {0[1]:.10f}\t {0[2]:.10f}\t {0[3]:.10f}\n ' .format (x ))
657
+
653
658
654
659
class ACompCor (CompCor ):
655
660
"""
@@ -1170,7 +1175,8 @@ def combine_mask_files(mask_files, mask_method=None, mask_index=None):
1170
1175
1171
1176
def compute_noise_components (imgseries , mask_images , components_criterion = 0.5 ,
1172
1177
filter_type = False , degree = 0 , period_cut = 128 ,
1173
- repetition_time = None , failure_mode = 'error' ):
1178
+ repetition_time = None , failure_mode = 'error' ,
1179
+ mask_names = '' ):
1174
1180
"""Compute the noise components from the imgseries for each mask
1175
1181
1176
1182
Parameters
@@ -1213,7 +1219,9 @@ def compute_noise_components(imgseries, mask_images, components_criterion=0.5,
1213
1219
"""
1214
1220
components = None
1215
1221
basis = np .array ([])
1216
- for i , img in enumerate (mask_images ):
1222
+ if not mask_names :
1223
+ mask_names = range (len (mask_images ))
1224
+ for i , img in zip (mask_names , mask_images ):
1217
1225
mask = img .get_data ().astype (np .bool ).squeeze ()
1218
1226
if imgseries .shape [:3 ] != mask .shape :
1219
1227
raise ValueError (
0 commit comments