@@ -388,24 +388,26 @@ class CompCorInputSpec(BaseInterfaceInputSpec):
388
388
requires = ['mask_files' ],
389
389
desc = ('Position of mask in `mask_files` to use - '
390
390
'first is the default.' ))
391
- mask_names = traits .List (traits .Str ,
391
+ mask_names = traits .List (
392
+ traits .Str ,
392
393
desc = 'Names for provided masks (for printing into metadata). '
393
394
'If provided, it must be as long as the final mask list '
394
395
'(after any merge and indexing operations).' )
395
396
components_file = traits .Str (
396
397
'components_file.txt' ,
397
398
usedefault = True ,
398
399
desc = 'Filename to store physiological components' )
399
- num_components = traits .Either ('all' , traits . Range ( low = 1 ),
400
- xor = ['variance_threshold' ],
400
+ num_components = traits .Either (
401
+ 'all' , traits . Range ( low = 1 ), xor = ['variance_threshold' ],
401
402
desc = 'Number of components to return from the decomposition. If '
402
403
'`num_components` is `all`, then all components will be '
403
404
'retained.' )
404
- # 6 for BOLD, 4 for ASL
405
- # automatically instantiated to 6 in CompCor below if neither
406
- # `num_components` nor `variance_threshold` is defined (for
407
- # backward compatibility)
408
- variance_threshold = traits .Float (xor = ['num_components' ],
405
+ # 6 for BOLD, 4 for ASL
406
+ # automatically instantiated to 6 in CompCor below if neither
407
+ # `num_components` nor `variance_threshold` is defined (for
408
+ # backward compatibility)
409
+ variance_threshold = traits .Range (
410
+ low = 0.0 , high = 1.0 , exclude_low = True , exclude_high = True , xor = ['num_components' ],
409
411
desc = 'Select the number of components to be returned automatically '
410
412
'based on their ability to explain variance in the dataset. '
411
413
'`variance_threshold` is a fractional value between 0 and 1; '
@@ -438,9 +440,11 @@ class CompCorInputSpec(BaseInterfaceInputSpec):
438
440
desc = 'Repetition time (TR) of series - derived from image header if '
439
441
'unspecified' )
440
442
save_pre_filter = traits .Either (
441
- traits .Bool , File , desc = 'Save pre-filter basis as text file' )
443
+ traits .Bool , File , default = False , usedefault = True ,
444
+ desc = 'Save pre-filter basis as text file' )
442
445
save_metadata = traits .Either (
443
- traits .Bool , File , desc = 'Save component metadata as text file' )
446
+ traits .Bool , File , default = False , usedefault = True ,
447
+ desc = 'Save component metadata as text file' )
444
448
ignore_initial_volumes = traits .Range (
445
449
low = 0 ,
446
450
usedefault = True ,
@@ -497,20 +501,20 @@ class CompCor(SimpleInterface):
497
501
input_spec = CompCorInputSpec
498
502
output_spec = CompCorOutputSpec
499
503
references_ = [{
504
+ 'tags' : ['method' , 'implementation' ],
500
505
'entry' :
501
- BibTeX (
502
- "@article{compcor_2007,"
503
- "title = {A component based noise correction method (CompCor) for BOLD and perfusion based},"
504
- "volume = {37},"
505
- "number = {1},"
506
- "doi = {10.1016/j.neuroimage.2007.04.042},"
507
- "urldate = {2016-08-13},"
508
- "journal = {NeuroImage},"
509
- "author = {Behzadi, Yashar and Restom, Khaled and Liau, Joy and Liu, Thomas T.},"
510
- "year = {2007},"
511
- "pages = {90-101},}" ),
512
- 'tags' : ['method' , 'implementation' ]
513
- }]
506
+ BibTeX ("""\
507
+ @article{compcor_2007,
508
+ title = {A component based noise correction method (CompCor) for BOLD and perfusion based},
509
+ volume = {37},
510
+ number = {1},
511
+ doi = {10.1016/j.neuroimage.2007.04.042},
512
+ urldate = {2016-08-13},
513
+ journal = {NeuroImage},
514
+ author = {Behzadi, Yashar and Restom, Khaled and Liau, Joy and Liu, Thomas T.},
515
+ year = {2007},
516
+ pages = {90-101}
517
+ }""" )}]
514
518
515
519
def __init__ (self , * args , ** kwargs ):
516
520
''' exactly the same as compcor except the header '''
@@ -606,57 +610,60 @@ def _run_interface(self, runtime):
606
610
delimiter = '\t ' ,
607
611
header = '\t ' .join (components_header ),
608
612
comments = '' )
609
- self ._results ['components_file' ] = os .path .abspath (
610
- self .inputs .components_file )
613
+ self ._results ['components_file' ] = os .path .join (
614
+ runtime .cwd , self .inputs .components_file )
615
+
616
+ save_pre_filter = False
617
+ if self .inputs .pre_filter in ['polynomial' , 'cosine' ]:
618
+ save_pre_filter = self .inputs .save_pre_filter
611
619
612
- save_pre_filter = self .inputs .save_pre_filter
613
620
if save_pre_filter :
614
621
self ._results ['pre_filter_file' ] = save_pre_filter
615
622
if save_pre_filter is True :
616
- self ._results ['pre_filter_file' ] = os .path .abspath ('pre_filter.tsv' )
617
- if self .inputs .pre_filter :
618
- ftype = {
619
- 'polynomial' : 'Legendre' ,
620
- 'cosine' : 'Cosine'
621
- }[self .inputs .pre_filter ]
622
- ncols = filter_basis .shape [1 ] if filter_basis .size > 0 else 0
623
- header = ['{}{:02d}' .format (ftype , i ) for i in range (ncols )]
624
- if skip_vols :
625
- old_basis = filter_basis
626
- # nrows defined above
627
- filter_basis = np .zeros (
628
- (nrows , ncols + skip_vols ), dtype = filter_basis .dtype )
629
- if old_basis .size > 0 :
630
- filter_basis [skip_vols :, :ncols ] = old_basis
631
- filter_basis [:skip_vols , - skip_vols :] = np .eye (skip_vols )
632
- header .extend ([
633
- 'NonSteadyStateOutlier{:02d}' .format (i )
634
- for i in range (skip_vols )
635
- ])
636
- np .savetxt (
637
- self ._results ['pre_filter_file' ],
638
- filter_basis ,
639
- fmt = b'%.10f' ,
640
- delimiter = '\t ' ,
641
- header = '\t ' .join (header ),
642
- comments = '' )
623
+ self ._results ['pre_filter_file' ] = os .path .join (
624
+ runtime .cwd , 'pre_filter.tsv' )
625
+
626
+ ftype = {
627
+ 'polynomial' : 'Legendre' ,
628
+ 'cosine' : 'Cosine'
629
+ }[self .inputs .pre_filter ]
630
+ ncols = filter_basis .shape [1 ] if filter_basis .size > 0 else 0
631
+ header = ['{}{:02d}' .format (ftype , i ) for i in range (ncols )]
632
+ if skip_vols :
633
+ old_basis = filter_basis
634
+ # nrows defined above
635
+ filter_basis = np .zeros (
636
+ (nrows , ncols + skip_vols ), dtype = filter_basis .dtype )
637
+ if old_basis .size > 0 :
638
+ filter_basis [skip_vols :, :ncols ] = old_basis
639
+ filter_basis [:skip_vols , - skip_vols :] = np .eye (skip_vols )
640
+ header .extend ([
641
+ 'NonSteadyStateOutlier{:02d}' .format (i )
642
+ for i in range (skip_vols )
643
+ ])
644
+ np .savetxt (
645
+ self ._results ['pre_filter_file' ],
646
+ filter_basis ,
647
+ fmt = b'%.10f' ,
648
+ delimiter = '\t ' ,
649
+ header = '\t ' .join (header ),
650
+ comments = '' )
643
651
644
652
metadata_file = self .inputs .save_metadata
645
653
if metadata_file :
646
654
self ._results ['metadata_file' ] = metadata_file
647
655
if metadata_file is True :
648
656
self ._results ['metadata_file' ] = (
649
- os .path .abspath ( 'component_metadata.tsv' ))
657
+ os .path .join ( runtime . cwd , 'component_metadata.tsv' ))
650
658
components_names = np .empty (len (metadata ['mask' ]),
651
- dtype = 'object_' )
659
+ dtype = 'object_' )
652
660
retained = np .where (metadata ['retained' ])
653
661
not_retained = np .where (np .logical_not (metadata ['retained' ]))
654
662
components_names [retained ] = components_header
655
663
components_names [not_retained ] = ([
656
664
'dropped{}' .format (i ) for i in range (len (not_retained [0 ]))])
657
665
with open (self ._results ['metadata_file' ], 'w' ) as f :
658
- f .write ('{}\t {}\t {}\t {}\t {}\n ' .format ('component' ,
659
- * list (metadata .keys ())))
666
+ f .write ('\t ' .join (['component' ] + list (metadata .keys ())) + '\n ' )
660
667
for i in zip (components_names , * metadata .values ()):
661
668
f .write ('{0[0]}\t {0[1]}\t {0[2]:.10f}\t '
662
669
'{0[3]:.10f}\t {0[4]:.10f}\n ' .format (i ))
@@ -1317,9 +1324,8 @@ def compute_noise_components(imgseries, mask_images, components_criterion=0.5,
1317
1324
metadata ['cumulative_variance_explained' ] = (
1318
1325
np .hstack ((metadata ['cumulative_variance_explained' ],
1319
1326
cumulative_variance_explained )))
1320
- metadata ['retained' ] = (metadata ['retained' ]
1321
- + [i < num_components
1322
- for i in range (len (s ))])
1327
+ metadata ['retained' ] = (
1328
+ metadata ['retained' ] + [i < num_components for i in range (len (s ))])
1323
1329
if components is None :
1324
1330
if failure_mode == 'error' :
1325
1331
raise ValueError ('No components found' )
0 commit comments