64
64
65
65
from nipype .algorithms .rapidart import ArtifactDetect
66
66
from nipype .algorithms .misc import TSNR
67
+ from nipype .algorithms .compcor import ACompCor
67
68
from nipype .interfaces .utility import Rename , Merge , IdentityInterface
68
69
from nipype .utils .filemanip import filename_to_list
69
70
from nipype .interfaces .io import DataSink , FreeSurferSource
@@ -228,51 +229,6 @@ def build_filter1(motion_params, comp_norm, outliers, detrend_poly=None):
228
229
out_files .append (filename )
229
230
return out_files
230
231
231
-
232
- def extract_noise_components (realigned_file , mask_file , num_components = 5 ,
233
- extra_regressors = None ):
234
- """Derive components most reflective of physiological noise
235
-
236
- Parameters
237
- ----------
238
- realigned_file: a 4D Nifti file containing realigned volumes
239
- mask_file: a 3D Nifti file containing white matter + ventricular masks
240
- num_components: number of components to use for noise decomposition
241
- extra_regressors: additional regressors to add
242
-
243
- Returns
244
- -------
245
- components_file: a text file containing the noise components
246
- """
247
- imgseries = nb .load (realigned_file )
248
- components = None
249
- for filename in filename_to_list (mask_file ):
250
- mask = nb .load (filename ).get_data ()
251
- if len (np .nonzero (mask > 0 )[0 ]) == 0 :
252
- continue
253
- voxel_timecourses = imgseries .get_data ()[mask > 0 ]
254
- voxel_timecourses [np .isnan (np .sum (voxel_timecourses , axis = 1 )), :] = 0
255
- # remove mean and normalize by variance
256
- # voxel_timecourses.shape == [nvoxels, time]
257
- X = voxel_timecourses .T
258
- stdX = np .std (X , axis = 0 )
259
- stdX [stdX == 0 ] = 1.
260
- stdX [np .isnan (stdX )] = 1.
261
- stdX [np .isinf (stdX )] = 1.
262
- X = (X - np .mean (X , axis = 0 )) / stdX
263
- u , _ , _ = sp .linalg .svd (X , full_matrices = False )
264
- if components is None :
265
- components = u [:, :num_components ]
266
- else :
267
- components = np .hstack ((components , u [:, :num_components ]))
268
- if extra_regressors :
269
- regressors = np .genfromtxt (extra_regressors )
270
- components = np .hstack ((components , regressors ))
271
- components_file = os .path .join (os .getcwd (), 'noise_components.txt' )
272
- np .savetxt (components_file , components , fmt = b"%.10f" )
273
- return components_file
274
-
275
-
276
232
def rename (in_files , suffix = None ):
277
233
from nipype .utils .filemanip import (filename_to_list , split_filename ,
278
234
list_to_filename )
@@ -592,7 +548,7 @@ def create_workflow(files,
592
548
realign .inputs .slice_info = 2
593
549
realign .plugin_args = {'sbatch_args' : '-c%d' % 4 }
594
550
595
- # Comute TSNR on realigned data regressing polynomials upto order 2
551
+ # Compute TSNR on realigned data regressing polynomials up to order 2
596
552
tsnr = MapNode (TSNR (regress_poly = 2 ), iterfield = ['in_file' ], name = 'tsnr' )
597
553
wf .connect (realign , "out_file" , tsnr , "in_file" )
598
554
@@ -694,14 +650,10 @@ def merge_files(in1, in2):
694
650
filter1 , 'out_res_name' )
695
651
wf .connect (createfilter1 , 'out_files' , filter1 , 'design' )
696
652
697
- createfilter2 = MapNode (Function (input_names = ['realigned_file' , 'mask_file' ,
698
- 'num_components' ,
699
- 'extra_regressors' ],
700
- output_names = ['out_files' ],
701
- function = extract_noise_components ,
702
- imports = imports ),
653
+ createfilter2 = MapNode (ACompCor (),
703
654
iterfield = ['realigned_file' , 'extra_regressors' ],
704
655
name = 'makecompcorrfilter' )
656
+ createfilter2 .inputs .components_file ('noise_components.txt' )
705
657
createfilter2 .inputs .num_components = num_components
706
658
707
659
wf .connect (createfilter1 , 'out_files' , createfilter2 , 'extra_regressors' )
@@ -717,7 +669,7 @@ def merge_files(in1, in2):
717
669
wf .connect (filter1 , 'out_res' , filter2 , 'in_file' )
718
670
wf .connect (filter1 , ('out_res' , rename , '_cleaned' ),
719
671
filter2 , 'out_res_name' )
720
- wf .connect (createfilter2 , 'out_files ' , filter2 , 'design' )
672
+ wf .connect (createfilter2 , 'components_file ' , filter2 , 'design' )
721
673
wf .connect (mask , 'mask_file' , filter2 , 'mask' )
722
674
723
675
bandpass = Node (Function (input_names = ['files' , 'lowpass_freq' ,
@@ -923,7 +875,7 @@ def get_names(files, suffix):
923
875
wf .connect (smooth , 'out_file' , datasink , 'resting.timeseries.@smoothed' )
924
876
wf .connect (createfilter1 , 'out_files' ,
925
877
datasink , 'resting.regress.@regressors' )
926
- wf .connect (createfilter2 , 'out_files ' ,
878
+ wf .connect (createfilter2 , 'components_file ' ,
927
879
datasink , 'resting.regress.@compcorr' )
928
880
wf .connect (maskts , 'out_file' , datasink , 'resting.timeseries.target' )
929
881
wf .connect (sampleaparc , 'summary_file' ,
0 commit comments