def test_dry_run_prevents_command_from_running(self, mock_popen): mock_popen.return_value.communicate.return_value = ('', '') mock_popen.return_value.returncode = 0 utilities.run('touch ./test_file.txt', dryrun=True) assert mock_popen.call_count == 0
def test_handles_list_commands(self, mock_popen): mock_popen.return_value.communicate.return_value = ('', '') mock_popen.return_value.returncode = 0 cmd = ['touch', './test_file.txt'] utilities.run(cmd) assert mock_popen.call_count == 1 assert mock_popen.call_args_list[0][0][0] == " ".join(cmd)
def test_handles_string_commands(self, mock_popen): mock_popen.return_value.communicate.return_value = ('', '') mock_popen.return_value.returncode = 0 cmd = 'touch ./test_file.txt' utilities.run(cmd) assert mock_popen.call_count == 1 # First item in list, first argument in tuple format, # first item of this tuple assert mock_popen.call_args_list[0][0][0] == cmd
def transform_to_MNI(input_fMRI, MNIspacefMRI, cost_function, degrees_of_freedom, HCPData, Subject, RegTemplate): ''' transform the fMRI image to MNI space 2x2x2mm using FSL RegTemplate An optional 3D MRI Image from the functional to use for registration ''' ### these inputs should already be in the subject HCP folder T1wImage = os.path.join(HCPData, Subject, 'T1w', 'T1w_brain.nii.gz') T1w2MNI_mat = os.path.join(HCPData, Subject, 'MNINonLinear', 'xfms', 'T1w2StandardLinear.mat') T1w2MNI_warp = os.path.join(HCPData, Subject, 'MNINonLinear', 'xfms', 'T1w2Standard_warp_noaffine.nii.gz') MNITemplate2mm = os.path.join(os.environ['FSLDIR'], 'data', 'standard', 'MNI152_T1_2mm_brain.nii.gz') ResultsFolder = os.path.dirname(MNIspacefMRI) ## make the directory to hold the transforms if it doesn't exit run(['mkdir', '-p', os.path.join(ResultsFolder, 'native')], dryrun=DRYRUN) ### calculate the linear transform to the T1w func2T1w_mat = os.path.join(ResultsFolder, 'native', 'mat_EPI_to_T1.mat') ## make a target registration file if it doesn't exist if RegTemplate: func3D = RegTemplate else: func3D = os.path.join(tmpdir, "func3D.nii.gz") run(['fslmaths', input_fMRI, '-Tmean', func3D], dryrun=DRYRUN) ## calculate the fMRI to native T1w transform run([ 'flirt', '-in', func3D, '-ref', T1wImage, '-omat', func2T1w_mat, '-dof', str(degrees_of_freedom), '-cost', cost_function, '-searchcost', cost_function, '-searchrx', '-180', '180', '-searchry', '-180', '180', '-searchrz', '-180', '180' ], dryrun=DRYRUN) ## concatenate the transforms func2MNI_mat = os.path.join(ResultsFolder, 'native', 'mat_EPI_to_TAL.mat') run([ 'convert_xfm', '-omat', func2MNI_mat, '-concat', T1w2MNI_mat, func2T1w_mat ], dryrun=DRYRUN) ## now apply the warp!! run([ 'applywarp', '--ref={}'.format(MNITemplate2mm), '--in={}'.format(input_fMRI), '--warp={}'.format(T1w2MNI_warp), '--premat={}'.format( os.path.join(ResultsFolder, 'native', 'mat_EPI_to_TAL.mat')), '--interp=spline', '--out={}'.format(MNIspacefMRI) ], dryrun=DRYRUN)
def mask_and_resample(input_native, output_lowres, roi_native, roi_lowres, mid_surf_native, mid_surf_lowres, sphere_reg_native, sphere_reg_lowres): ''' Does three steps that happen often after surface projection to native space. 1. mask in natve space (to remove the middle/subcortical bit) 2. resample to the low-res-mesh (32k mesh) 3. mask again in the low (32k space) ''' run(['wb_command', '-metric-mask', input_native, roi_native, input_native], dryrun=DRYRUN) run([ 'wb_command', '-metric-resample', input_native, sphere_reg_native, sphere_reg_lowres, 'ADAP_BARY_AREA', output_lowres, '-area-surfs', mid_surf_native, mid_surf_lowres, '-current-roi', roi_native ], dryrun=DRYRUN) run([ 'wb_command', '-metric-mask', output_lowres, roi_lowres, output_lowres ], dryrun=DRYRUN)
def main(arguments, tmpdir): input_fMRI = arguments["<func.nii.gz>"] HCPData = arguments["--hcp-data-dir"] Subject = arguments["<Subject>"] NameOffMRI = arguments["<NameOffMRI>"] SmoothingFWHM = arguments["<SmoothingFWHM>"] DilateBelowPct = arguments["--DilateBelowPct"] OutputSurfDiagnostics = arguments['--OutputSurfDiagnostics'] FinalfMRIResolution = arguments['--FinalfMRIResolution'] noMNItransform = arguments['--no-MNItransform'] RegTemplate = arguments['--FLIRT-template'] FLIRT_dof = arguments['--FLIRT-dof'] FLIRT_cost = arguments['--FLIRT-cost'] NeighborhoodSmoothing = arguments['--NeighborhoodSmoothing'] DilateFactor = arguments['--Dilate-MM'] CI_limit = arguments['--CI'] if HCPData == None: HCPData = ciftify.config.find_hcp_data() ## write a bunch of info about the environment to the logs log_build_environment() logger.info('Arguments:') logger.info("\tinput_fMRI: {}".format(input_fMRI)) if not os.path.isfile(input_fMRI): logger.error("input_fMRI does not exist :(..Exiting") sys.exit(1) logger.info("\tHCP_DATA: {}".format(HCPData)) logger.info("\thcpSubject: {}".format(Subject)) logger.info("\tNameOffMRI: {}".format(NameOffMRI)) logger.info("\tSmoothingFWHM: {}".format(SmoothingFWHM)) if DilateBelowPct: logger.info( "\tWill fill holes defined as data with intensity below {} percentile" .format(DilateBelowPct)) # Setup PATHS GrayordinatesResolution = "2" LowResMesh = "32" RegName = "FS" #Templates and settings AtlasSpaceFolder = os.path.join(HCPData, Subject, "MNINonLinear") DownSampleFolder = os.path.join(AtlasSpaceFolder, "fsaverage_LR32k") ResultsFolder = os.path.join(AtlasSpaceFolder, "Results", NameOffMRI) ROIFolder = os.path.join(AtlasSpaceFolder, "ROIs") AtlasSpaceNativeFolder = os.path.join(AtlasSpaceFolder, "Native") logger.info("The following settings are set by default:") logger.info( "\nGrayordinatesResolution: {}".format(GrayordinatesResolution)) logger.info('\nLowResMesh: {}k'.format(LowResMesh)) logger.info( 'Native space surfaces are in: {}'.format(AtlasSpaceNativeFolder)) logger.info( 'The resampled surfaces (those matching the final result are in: {})'. format(DownSampleFolder)) # PipelineScripts=${HCPPIPEDIR_fMRISurf} HCPPIPEDIR_Config = os.path.join(ciftify.config.find_ciftify_global(), 'hcp_config') input_fMRI_4D = os.path.join(ResultsFolder, '{}.nii.gz'.format(NameOffMRI)) input_fMRI_3D = os.path.join(tmpdir, '{}_Mean.nii.gz'.format(NameOffMRI)) # output files if OutputSurfDiagnostics: DiagnosticsFolder = os.path.join(ResultsFolder, 'RibbonVolumeToSurfaceMapping') logger.info("Diagnostic Files will be written to: {}".format( DiagnosticsFolder)) run(['mkdir', '-p', DiagnosticsFolder], dryrun=DRYRUN) else: DiagnosticsFolder = tmpdir outputRibbon = os.path.join(DiagnosticsFolder, 'ribbon_only.nii.gz') goodvoxels = os.path.join(DiagnosticsFolder, 'goodvoxels.nii.gz') ###### from end of volume mapping pipeline ## copy inputs into the ResultsFolder run(['mkdir', '-p', ResultsFolder], dryrun=DRYRUN) ## either transform or copy the input_fMRI if noMNItransform: run(['cp', input_fMRI, input_fMRI_4D], dryrun=DRYRUN) else: logger.info(section_header('MNI Transform')) logger.info( 'Running transform to MNIspace with costfunction {} and dof {}'. format(FLIRT_cost, FLIRT_dof)) transform_to_MNI(input_fMRI, input_fMRI_4D, FLIRT_cost, FLIRT_dof, HCPData, Subject, RegTemplate) run(['fslmaths', input_fMRI_4D, '-Tmean', input_fMRI_3D], dryrun=DRYRUN) ## read the number of TR's and the TR from the header TR_num = first_word(get_stdout(['fslval', input_fMRI_4D, 'dim4'])) logger.info('Number of TRs: {}'.format(TR_num)) MiddleTR = int(TR_num) // 2 logger.info('Middle TR: {}'.format(MiddleTR)) TR_vol = first_word(get_stdout(['fslval', input_fMRI_4D, 'pixdim4'])) logger.info('TR(ms): {}'.format(TR_vol)) #Make fMRI Ribbon #Noisy Voxel Outlier Exclusion #Ribbon-based Volume to Surface mapping and resampling to standard surface logger.info(section_header('Making fMRI Ribbon')) RegName = "reg.reg_LR" LeftGreyRibbonValue = "1" RightGreyRibbonValue = "1" for Hemisphere in ['L', 'R']: if Hemisphere == "L": GreyRibbonValue = LeftGreyRibbonValue elif Hemisphere == "R": GreyRibbonValue = RightGreyRibbonValue ## the inputs are.. white_surf = os.path.join( AtlasSpaceNativeFolder, '{}.{}.white.native.surf.gii'.format(Subject, Hemisphere)) pial_surf = os.path.join( AtlasSpaceNativeFolder, '{}.{}.pial.native.surf.gii'.format(Subject, Hemisphere)) ## create a volume of distances from the surface tmp_white_vol = os.path.join( tmpdir, '{}.{}.white.native.nii.gz'.format(Subject, Hemisphere)) tmp_pial_vol = os.path.join( tmpdir, '{}.{}.pial.native.nii.gz'.format(Subject, Hemisphere)) run([ 'wb_command', '-create-signed-distance-volume', white_surf, input_fMRI_3D, tmp_white_vol ], dryrun=DRYRUN) run([ 'wb_command', '-create-signed-distance-volume', pial_surf, input_fMRI_3D, tmp_pial_vol ], dryrun=DRYRUN) ## threshold and binarise these distance files tmp_whtie_vol_thr = os.path.join( tmpdir, '{}.{}.white_thr0.native.nii.gz'.format(Subject, Hemisphere)) tmp_pial_vol_thr = os.path.join( tmpdir, '{}.{}.pial_uthr0.native.nii.gz'.format(Subject, Hemisphere)) run([ 'fslmaths', tmp_white_vol, '-thr', '0', '-bin', '-mul', '255', tmp_whtie_vol_thr ], dryrun=DRYRUN) run(['fslmaths', tmp_whtie_vol_thr, '-bin', tmp_whtie_vol_thr], dryrun=DRYRUN) run([ 'fslmaths', tmp_pial_vol, '-uthr', '0', '-abs', '-bin', '-mul', '255', tmp_pial_vol_thr ], dryrun=DRYRUN) run(['fslmaths', tmp_pial_vol_thr, '-bin', tmp_pial_vol_thr], dryrun=DRYRUN) ## combine the pial and white to get the ribbon tmp_ribbon = os.path.join( tmpdir, '{}.{}.ribbon.nii.gz'.format(Subject, Hemisphere)) run([ 'fslmaths', tmp_pial_vol_thr, '-mas', tmp_whtie_vol_thr, '-mul', '255', tmp_ribbon ], dryrun=DRYRUN) run([ 'fslmaths', tmp_ribbon, '-bin', '-mul', GreyRibbonValue, os.path.join(tmpdir, '{}.{}.ribbon.nii.gz'.format( Subject, Hemisphere)) ], dryrun=DRYRUN) # combine the left and right ribbons into one mask run([ 'fslmaths', os.path.join(tmpdir, '{}.L.ribbon.nii.gz'.format(Subject)), '-add', os.path.join(tmpdir, '{}.R.ribbon.nii.gz'.format(Subject)), outputRibbon ], dryrun=DRYRUN) ## calculate Coefficient of Variation (cov) of the fMRI TMeanVol = os.path.join(tmpdir, 'Mean.nii.gz') TstdVol = os.path.join(tmpdir, 'SD.nii.gz') covVol = os.path.join(tmpdir, 'cov.nii.gz') run(['fslmaths', input_fMRI_4D, '-Tmean', TMeanVol, '-odt', 'float'], dryrun=DRYRUN) run(['fslmaths', input_fMRI_4D, '-Tstd', TstdVol, '-odt', 'float'], dryrun=DRYRUN) run(['fslmaths', TstdVol, '-div', TMeanVol, covVol], dryrun=DRYRUN) ## calculate a cov ribbon - modulated by the NeighborhoodSmoothing factor cov_ribbon = os.path.join(tmpdir, 'cov_ribbon.nii.gz') cov_ribbon_norm = os.path.join(tmpdir, 'cov_ribbon_norm.nii.gz') SmoothNorm = os.path.join(tmpdir, 'SmoothNorm.nii.gz') cov_ribbon_norm_smooth = os.path.join(tmpdir, 'cov_ribbon_norm_smooth.nii.gz') cov_norm_modulate = os.path.join(tmpdir, 'cov_norm_modulate.nii.gz') cov_norm_modulate_ribbon = os.path.join(tmpdir, 'cov_norm_modulate_ribbon.nii.gz') run(['fslmaths', covVol, '-mas', outputRibbon, cov_ribbon], dryrun=DRYRUN) cov_ribbonMean = first_word(get_stdout(['fslstats', cov_ribbon, '-M'])) cov_ribbonMean = cov_ribbonMean.rstrip(os.linesep) ## remove return run(['fslmaths', cov_ribbon, '-div', cov_ribbonMean, cov_ribbon_norm], dryrun=DRYRUN) run([ 'fslmaths', cov_ribbon_norm, '-bin', '-s', NeighborhoodSmoothing, SmoothNorm ], dryrun=DRYRUN) run([ 'fslmaths', cov_ribbon_norm, '-s', NeighborhoodSmoothing, '-div', SmoothNorm, '-dilD', cov_ribbon_norm_smooth ], dryrun=DRYRUN) run([ 'fslmaths', covVol, '-div', cov_ribbonMean, '-div', cov_ribbon_norm_smooth, cov_norm_modulate ], dryrun=DRYRUN) run([ 'fslmaths', cov_norm_modulate, '-mas', outputRibbon, cov_norm_modulate_ribbon ], dryrun=DRYRUN) ## get stats from the modulated cov ribbon file and log them ribbonMean = first_word( get_stdout(['fslstats', cov_norm_modulate_ribbon, '-M'])) logger.info('Ribbon Mean: {}'.format(ribbonMean)) ribbonSTD = first_word( get_stdout(['fslstats', cov_norm_modulate_ribbon, '-S'])) logger.info('Ribbon STD: {}'.format(ribbonSTD)) ribbonLower = float(ribbonMean) - (float(ribbonSTD) * float(CI_limit)) logger.info('Ribbon Lower: {}'.format(ribbonLower)) ribbonUpper = float(ribbonMean) + (float(ribbonSTD) * float(CI_limit)) logger.info('Ribbon Upper: {}'.format(ribbonUpper)) ## get a basic brain mask from the mean img bmaskVol = os.path.join(tmpdir, 'mask.nii.gz') run(['fslmaths', TMeanVol, '-bin', bmaskVol], dryrun=DRYRUN) ## make a goodvoxels mask img run([ 'fslmaths', cov_norm_modulate, '-thr', str(ribbonUpper), '-bin', '-sub', bmaskVol, '-mul', '-1', goodvoxels ], dryrun=DRYRUN) logger.info(section_header('Mapping fMRI to 32k Surface')) for Hemisphere in ["L", "R"]: ## the input surfaces for this section in the AtlasSpaceNativeFolder mid_surf_native = os.path.join( AtlasSpaceNativeFolder, '{}.{}.midthickness.native.surf.gii'.format(Subject, Hemisphere)) pial_surf = os.path.join( AtlasSpaceNativeFolder, '{}.{}.pial.native.surf.gii'.format(Subject, Hemisphere)) white_surf = os.path.join( AtlasSpaceNativeFolder, '{}.{}.white.native.surf.gii'.format(Subject, Hemisphere)) roi_native_gii = os.path.join( AtlasSpaceNativeFolder, '{}.{}.roi.native.shape.gii'.format(Subject, Hemisphere)) sphere_reg_native = os.path.join( AtlasSpaceNativeFolder, '{}.{}.sphere.{}.native.surf.gii'.format(Subject, Hemisphere, RegName)) ## the inputs for this section from the DownSampleFolder mid_surf_32k = os.path.join( DownSampleFolder, '{}.{}.midthickness.{}k_fs_LR.surf.gii'.format( Subject, Hemisphere, LowResMesh)) roi_32k_gii = os.path.join( DownSampleFolder, '{}.{}.atlasroi.{}k_fs_LR.shape.gii'.format( Subject, Hemisphere, LowResMesh)) sphere_reg_32k = os.path.join( DownSampleFolder, '{}.{}.sphere.{}k_fs_LR.surf.gii'.format(Subject, Hemisphere, LowResMesh)) ## now finally, actually project the fMRI input input_func_native = os.path.join( tmpdir, '{}.{}.native.func.gii'.format(NameOffMRI, Hemisphere)) run([ 'wb_command', '-volume-to-surface-mapping', input_fMRI_4D, mid_surf_native, input_func_native, '-ribbon-constrained', white_surf, pial_surf, '-volume-roi', goodvoxels ], dryrun=DRYRUN) ## dilate to get rid of wholes caused by the goodvoxels mask run([ 'wb_command', '-metric-dilate', input_func_native, mid_surf_native, DilateFactor, input_func_native, '-nearest' ], dryrun=DRYRUN) ## Erin's new addition - find what is below a certain percentile and dilate.. ## Erin's new addition - find what is below a certain percentile and dilate.. if DilateBelowPct: DilThres = get_stdout([ 'wb_command', '-metric-stats', input_func_native, '-percentile', str(DilateBelowPct), '-column', str(MiddleTR), '-roi', roi_native_gii ]) lowvoxels_gii = os.path.join( tmpdir, '{}.lowvoxels.native.func.gii'.format(Hemisphere)) run([ 'wb_command', '-metric-math', '"(x < {})"'.format(DilThres), lowvoxels_gii, '-var', 'x', input_func_native, '-column', str(MiddleTR) ], dryrun=DRYRUN) run([ 'wb_command', '-metric-dilate', input_func_native, mid_surf_native, str(DilateFactor), input_func_native, '-bad-vertex-roi', lowvoxels_gii, '-nearest' ], dryrun=DRYRUN) ## back to the HCP program - do the mask and resample ## mask resample than mask combo input_func_32k = os.path.join( tmpdir, '{}.{}.atlasroi.{}k_fs_LR.func.gii'.format(NameOffMRI, Hemisphere, LowResMesh)) mask_and_resample(input_func_native, input_func_32k, roi_native_gii, roi_32k_gii, mid_surf_native, mid_surf_32k, sphere_reg_native, sphere_reg_32k) #Surface Smoothing Sigma = FWHM2Sigma(float(SmoothingFWHM)) logger.info(section_header("Surface Smoothing")) logger.info("FWHM: {}".format(SmoothingFWHM)) logger.info("Sigma: {}".format(Sigma)) run([ 'wb_command', '-metric-smoothing', mid_surf_32k, input_func_32k, '{}'.format(Sigma), os.path.join( tmpdir, '{}_s{}.atlasroi.{}.{}k_fs_LR.func.gii'.format( NameOffMRI, SmoothingFWHM, Hemisphere, LowResMesh)), '-roi', roi_32k_gii ], dryrun=DRYRUN) if OutputSurfDiagnostics: logger.info( section_header('Writing Surface Mapping Diagnotic Files')) for mapname in ["mean", "cov"]: if mapname == "mean": map_vol = TMeanVol if mapname == "cov": map_vol = covVol ## the output directories for this section map_native_gii = os.path.join( tmpdir, '{}.{}.native.func.gii'.format(mapname, Hemisphere)) map_32k_gii = os.path.join( tmpdir, "{}.{}.{}k_fs_LR.func.gii".format(Hemisphere, mapname, LowResMesh)) run([ 'wb_command', '-volume-to-surface-mapping', map_vol, mid_surf_native, map_native_gii, '-ribbon-constrained', white_surf, pial_surf, '-volume-roi', goodvoxels ], dryrun=DRYRUN) run([ 'wb_command', '-metric-dilate', map_native_gii, mid_surf_native, DilateFactor, map_native_gii, '-nearest' ], dryrun=DRYRUN) mask_and_resample(map_native_gii, map_32k_gii, roi_native_gii, roi_32k_gii, mid_surf_native, mid_surf_32k, sphere_reg_native, sphere_reg_32k) mapall_native_gii = os.path.join( tmpdir, '{}_all.{}.native.func.gii'.format(mapname, Hemisphere)) mapall_32k_gii = os.path.join( tmpdir, "{}.{}_all.{}k_fs_LR.func.gii".format( Hemisphere, mapname, LowResMesh)) run([ 'wb_command', '-volume-to-surface-mapping', map_vol, mid_surf_native, mapall_native_gii, '-ribbon-constrained', white_surf, pial_surf ], dryrun=DRYRUN) mask_and_resample(mapall_native_gii, mapall_32k_gii, roi_native_gii, roi_32k_gii, mid_surf_native, mid_surf_32k, sphere_reg_native, sphere_reg_32k) ## now project the goodvoxels to the surface goodvoxels_native_gii = os.path.join( tmpdir, '{}.goodvoxels.native.func.gii'.format(Hemisphere)) goodvoxels_32k_gii = os.path.join( tmpdir, '{}.goodvoxels.{}k_fs_LR.func.gii'.format( Hemisphere, LowResMesh)) run([ 'wb_command', '-volume-to-surface-mapping', goodvoxels, mid_surf_native, goodvoxels_native_gii, '-ribbon-constrained', white_surf, pial_surf ], dryrun=DRYRUN) mask_and_resample(goodvoxels_native_gii, goodvoxels_32k_gii, roi_native_gii, roi_32k_gii, mid_surf_native, mid_surf_32k, sphere_reg_native, sphere_reg_32k) ## Also ouput the resampled low voxels if DilateBelowPct: lowvoxels_32k_gii = os.path.join( tmpdir, '{}.lowvoxels.{}k_fs_LR.func.gii'.format( Hemisphere, LowResMesh)) mask_and_resample(lowvoxels_gii, lowvoxels_32k_gii, roi_native_gii, roi_32k_gii, mid_surf_native, mid_surf_32k, sphere_reg_native, sphere_reg_32k) if OutputSurfDiagnostics: Maps = ['goodvoxels', 'mean', 'mean_all', 'cov', 'cov_all'] if DilateBelowPct: Maps.append('lowvoxels') # import pbd; pdb.set_trace() for Map in Maps: run([ 'wb_command', '-cifti-create-dense-scalar', os.path.join( DiagnosticsFolder, '{}.atlasroi.{}k_fs_LR.dscalar.nii'.format( Map, LowResMesh)), '-left-metric', os.path.join(tmpdir, 'L.{}.{}k_fs_LR.func.gii'.format( Map, LowResMesh)), '-roi-left', os.path.join( DownSampleFolder, '{}.L.atlasroi.{}k_fs_LR.shape.gii'.format( Subject, LowResMesh)), '-right-metric', os.path.join(tmpdir, 'R.{}.{}k_fs_LR.func.gii'.format( Map, LowResMesh)), '-roi-right', os.path.join( DownSampleFolder, '{}.R.atlasroi.{}k_fs_LR.shape.gii'.format( Subject, LowResMesh)) ], dryrun=DRYRUN) ############ The subcortical resampling step... logger.info(section_header("Subcortical Processing")) logger.info("VolumefMRI: {}".format(input_fMRI_4D)) Sigma = FWHM2Sigma(float(SmoothingFWHM)) logger.info("Sigma: {}".format(Sigma)) Atlas_Subcortical = os.path.join( tmpdir, '{}_AtlasSubcortical_s{}.nii.gz'.format(NameOffMRI, SmoothingFWHM)) ##unset POSIXLY_CORRECT if GrayordinatesResolution == FinalfMRIResolution: logger.info( "Doing volume parcel resampling without first applying warp") ## inputs for this section ROIvols = os.path.join( ROIFolder, 'ROIs.{}.nii.gz'.format(GrayordinatesResolution)) AtlasROIvols = os.path.join( ROIFolder, 'Atlas_ROIs.{}.nii.gz'.format(GrayordinatesResolution)) run([ 'wb_command', '-volume-parcel-resampling', input_fMRI_4D, ROIvols, AtlasROIvols, '{}'.format(Sigma), Atlas_Subcortical, '-fix-zeros' ], dryrun=DRYRUN) else: logger.info("Doing applywarp and volume label import") ## inputs for this version wmparc = os.path.join(AtlasSpaceFolder, 'wmparc.nii.gz') AtlasROIvols = os.path.join( ROIFolder, 'Atlas_ROIs.{}.nii.gz'.format(GrayordinatesResolution)) ## resample the wmparc masks to input_fMRI_4D wmparc_res = os.path.join( tmpdir, 'wmparc.{}.nii.gz'.format(FinalfMRIResolution)) run([ 'applywarp', '--interp=nn', '-i', wmparc, '-r', input_fMRI_4D, '-o', wmparc_res ], dryrun=DRYRUN) ## import the labels into the wparc file rois_res = os.path.join(ResultsFolder, 'ROIs.{}.nii.gz'.format(FinalfMRIResolution)) run([ 'wb_command', '-volume-label-import', wmparc_res, os.path.join(HCPPIPEDIR_Config, 'FreeSurferSubcorticalLabelTableLut.txt'), rois_res, '-discard-others' ], dryrun=DRYRUN) logger.info( "Doing volume parcel resampling after applying warp and doing a volume label import" ) run([ 'wb_command', '-volume-parcel-resampling-generic', input_fMRI_4D, roi_res, AtlasROIvols, '{}'.format(Sigma), Atlas_Subcortical, '-fix-zeros' ], dryrun=DRYRUN) #Generation of Dense Timeseries logger.info(section_header("Generation of Dense Timeseries")) run([ 'wb_command', '-cifti-create-dense-timeseries', os.path.join( ResultsFolder, '{}_Atlas_s{}.dtseries.nii'.format( NameOffMRI, SmoothingFWHM)), '-volume', Atlas_Subcortical, AtlasROIvols, '-left-metric', os.path.join( tmpdir, '{}_s{}.atlasroi.L.{}k_fs_LR.func.gii'.format( NameOffMRI, SmoothingFWHM, LowResMesh)), '-roi-left', os.path.join( DownSampleFolder, '{}.L.atlasroi.{}k_fs_LR.shape.gii'.format( Subject, LowResMesh)), '-right-metric', os.path.join( tmpdir, '{}_s{}.atlasroi.L.{}k_fs_LR.func.gii'.format( NameOffMRI, SmoothingFWHM, LowResMesh)), '-roi-right', os.path.join( DownSampleFolder, '{}.L.atlasroi.{}k_fs_LR.shape.gii'.format( Subject, LowResMesh)), '-timestep', TR_vol ], dryrun=DRYRUN) logger.info(section_header("Done"))