def init_spaces(checkpoint=True): """Initialize the :attr:`~workflow.spaces` setting.""" from niworkflows.utils.spaces import Reference, SpatialReferences spaces = execution.output_spaces or SpatialReferences() if not isinstance(spaces, SpatialReferences): spaces = SpatialReferences([ ref for s in spaces.split(" ") for ref in Reference.from_string(s) ]) if checkpoint and not spaces.is_cached(): spaces.checkpoint() # # Add the default standard space if not already present (required by several sub-workflows) # if "MNI152NLin2009cAsym" not in spaces.get_spaces(nonstandard=False, dim=(3,)): # spaces.add(Reference("MNI152NLin2009cAsym", {})) # Ensure user-defined spatial references for outputs are correctly parsed. # Certain options require normalization to a space not explicitly defined by users. # These spaces will not be included in the final outputs. # if workflow.use_aroma: # # Make sure there's a normalization to FSL for AROMA to use. # spaces.add(Reference("MNI152NLin6Asym", {"res": "2"})) cifti_output = workflow.cifti_output if workflow.cifti_output: # CIFTI grayordinates to corresponding FSL-MNI resolutions. vol_res = "2" if cifti_output == "91k" else "1" spaces.add(Reference("fsaverage", {"den": "164k"})) spaces.add(Reference("MNI152NLin6Asym", {"res": vol_res})) # Make the SpatialReferences object available workflow.spaces = spaces
def init_spaces(checkpoint=True): """Initialize the :attr:`~workflow.spaces` setting.""" from niworkflows.utils.spaces import Reference, SpatialReferences spaces = execution.output_spaces or SpatialReferences() if not isinstance(spaces, SpatialReferences): spaces = SpatialReferences( [ref for s in spaces.split(' ') for ref in Reference.from_string(s)] ) if checkpoint and not spaces.is_cached(): spaces.checkpoint() # Add the default standard space if not already present (required by several sub-workflows) if "Fischer344" not in spaces.get_spaces(nonstandard=False, dim=(3,)): spaces.add( Reference("Fischer344", {}) ) # Make the SpatialReferences object available workflow.spaces = spaces
def parse_args(args=None, namespace=None): """Parse args and run further checks on the command line.""" import logging from niworkflows.utils.spaces import Reference, SpatialReferences parser = _build_parser() opts = parser.parse_args(args, namespace) config.execution.log_level = int( max(25 - 5 * opts.verbose_count, logging.DEBUG)) config.from_dict(vars(opts)) config.loggers.init() # Initialize --output-spaces if not defined if config.execution.output_spaces is None: config.execution.output_spaces = SpatialReferences( [Reference("MNI152NLin2009cAsym", {"res": "native"})]) # Retrieve logging level build_log = config.loggers.cli if config.execution.fs_license_file is None: raise RuntimeError("""\ ERROR: a valid license file is required for FreeSurfer to run. fMRIPrep looked for an existing \ license file at several paths, in this order: 1) command line argument ``--fs-license-file``; \ 2) ``$FS_LICENSE`` environment variable; and 3) the ``$FREESURFER_HOME/license.txt`` path. Get it \ (for free) by registering at https://surfer.nmr.mgh.harvard.edu/registration.html""" ) os.environ['FS_LICENSE'] = str(config.execution.fs_license_file) # Load base plugin_settings from file if --use-plugin if opts.use_plugin is not None: from yaml import load as loadyml with open(opts.use_plugin) as f: plugin_settings = loadyml(f) _plugin = plugin_settings.get('plugin') if _plugin: config.nipype.plugin = _plugin config.nipype.plugin_args = plugin_settings.get('plugin_args', {}) config.nipype.nprocs = config.nipype.plugin_args.get( 'nprocs', config.nipype.nprocs) # Resource management options # Note that we're making strong assumptions about valid plugin args # This may need to be revisited if people try to use batch plugins if 1 < config.nipype.nprocs < config.nipype.omp_nthreads: build_log.warning( 'Per-process threads (--omp-nthreads=%d) exceed total ' 'threads (--nthreads/--n_cpus=%d)', config.nipype.omp_nthread, config.nipype.nprocs) bids_dir = config.execution.bids_dir output_dir = config.execution.output_dir work_dir = config.execution.work_dir version = config.environment.version if config.execution.fs_subjects_dir is None: config.execution.fs_subjects_dir = output_dir / 'freesurfer' # Wipe out existing work_dir if opts.clean_workdir and work_dir.exists(): from niworkflows.utils.misc import clean_directory build_log.log("Clearing previous fMRIPrep working directory: %s", work_dir) if not clean_directory(work_dir): build_log.warning( "Could not clear all contents of working directory: %s", work_dir) # Ensure input and output folders are not the same if output_dir == bids_dir: parser.error( 'The selected output folder is the same as the input BIDS folder. ' 'Please modify the output path (suggestion: %s).' % bids_dir / 'derivatives' / ('fmriprep-%s' % version.split('+')[0])) if bids_dir in work_dir.parents: parser.error( 'The selected working directory is a subdirectory of the input BIDS folder. ' 'Please modify the output path.') # Validate inputs if not opts.skip_bids_validation: from ..utils.bids import validate_input_dir build_log.info( "Making sure the input data is BIDS compliant (warnings can be ignored in most " "cases).") validate_input_dir(config.environment.exec_env, opts.bids_dir, opts.participant_label) # Setup directories config.execution.log_dir = output_dir / 'fmriprep' / 'logs' # Check and create output and working directories config.execution.log_dir.mkdir(exist_ok=True, parents=True) output_dir.mkdir(exist_ok=True, parents=True) work_dir.mkdir(exist_ok=True, parents=True) # Force initialization of the BIDSLayout config.execution.init() all_subjects = config.execution.layout.get_subjects() if config.execution.participant_label is None: config.execution.participant_label = all_subjects participant_label = set(config.execution.participant_label) missing_subjects = participant_label - set(all_subjects) if missing_subjects: parser.error( "One or more participant labels were not found in the BIDS directory: " "%s." % ", ".join(missing_subjects)) config.execution.participant_label = sorted(participant_label) config.workflow.skull_strip_template = config.workflow.skull_strip_template[ 0]
def parse_args(args=None, namespace=None): """Parse args and run further checks on the command line.""" import logging from niworkflows.utils.spaces import Reference, SpatialReferences parser = _build_parser() opts = parser.parse_args(args, namespace) config.execution.log_level = int( max(25 - 5 * opts.verbose_count, logging.DEBUG)) config.from_dict(vars(opts)) # Initialize --output-spaces if not defined if config.execution.output_spaces is None: config.execution.output_spaces = SpatialReferences( [Reference("MNI152NLin2009cAsym", {"res": "native"})]) # Retrieve logging level build_log = config.loggers.cli # Load base plugin_settings from file if --use-plugin if opts.use_plugin is not None: import yaml with open(opts.use_plugin) as f: plugin_settings = yaml.load(f, Loader=yaml.FullLoader) _plugin = plugin_settings.get("plugin") if _plugin: config.nipype.plugin = _plugin config.nipype.plugin_args = plugin_settings.get("plugin_args", {}) config.nipype.nprocs = opts.nprocs or config.nipype.plugin_args.get( "n_procs", config.nipype.nprocs) # Resource management options # Note that we're making strong assumptions about valid plugin args # This may need to be revisited if people try to use batch plugins if 1 < config.nipype.nprocs < config.nipype.omp_nthreads: build_log.warning( f"Per-process threads (--omp-nthreads={config.nipype.omp_nthreads}) exceed " f"total threads (--nthreads/--n_cpus={config.nipype.nprocs})") # Inform the user about the risk of using brain-extracted images if config.workflow.skull_strip_t1w == "auto": build_log.warning("""\ Option ``--skull-strip-t1w`` was set to 'auto'. A heuristic will be \ applied to determine whether the input T1w image(s) have already been skull-stripped. If that were the case, brain extraction and INU correction will be skipped for those T1w \ inputs. Please, BEWARE OF THE RISKS TO THE CONSISTENCY of results when using varying \ processing workflows across participants. To determine whether a participant has been run \ through the shortcut pipeline (meaning, brain extraction was skipped), please check the \ citation boilerplate. When reporting results with varying pipelines, please make sure you \ mention this particular variant of fMRIPrep listing the participants for which it was \ applied.""") bids_dir = config.execution.bids_dir output_dir = config.execution.output_dir work_dir = config.execution.work_dir version = config.environment.version if config.execution.fs_subjects_dir is None: config.execution.fs_subjects_dir = output_dir / "freesurfer" # Wipe out existing work_dir if opts.clean_workdir and work_dir.exists(): from niworkflows.utils.misc import clean_directory build_log.info( f"Clearing previous fMRIPrep working directory: {work_dir}") if not clean_directory(work_dir): build_log.warning( f"Could not clear all contents of working directory: {work_dir}" ) # Ensure input and output folders are not the same if output_dir == bids_dir: parser.error( "The selected output folder is the same as the input BIDS folder. " "Please modify the output path (suggestion: %s)." % bids_dir / "derivatives" / ("fmriprep-%s" % version.split("+")[0])) if bids_dir in work_dir.parents: parser.error( "The selected working directory is a subdirectory of the input BIDS folder. " "Please modify the output path.") # Validate inputs if not opts.skip_bids_validation: from ..utils.bids import validate_input_dir build_log.info( "Making sure the input data is BIDS compliant (warnings can be ignored in most " "cases).") validate_input_dir(config.environment.exec_env, opts.bids_dir, opts.participant_label) # Setup directories config.execution.log_dir = output_dir / "fmriprep" / "logs" # Check and create output and working directories config.execution.log_dir.mkdir(exist_ok=True, parents=True) output_dir.mkdir(exist_ok=True, parents=True) work_dir.mkdir(exist_ok=True, parents=True) # Force initialization of the BIDSLayout config.execution.init() all_subjects = config.execution.layout.get_subjects() if config.execution.participant_label is None: config.execution.participant_label = all_subjects participant_label = set(config.execution.participant_label) missing_subjects = participant_label - set(all_subjects) if missing_subjects: parser.error( "One or more participant labels were not found in the BIDS directory: " "%s." % ", ".join(missing_subjects)) config.execution.participant_label = sorted(participant_label) config.workflow.skull_strip_template = config.workflow.skull_strip_template[ 0]
Exec, Select, MergeColumns, ApplyTransforms, MakeResultdicts, ResultdictDatasink, Vals, FilterRegressor, ) from ...resource import get as getresource from ...utils import firststr, loadints from ..constants import constants from ..memory import MemoryCalculator spaces = SpatialReferences([Reference("MNI152NLin6Asym", {"res": "2"})]) if not spaces.is_cached(): spaces.checkpoint() def _aroma_column_names(melodic_mix=None, aroma_noise_ics=None): import numpy as np from halfpipe.utils import ncol ncomponents = ncol(melodic_mix) leading_zeros = int(np.ceil(np.log10(ncomponents))) column_names = [] for i in range(1, ncomponents + 1): if i in aroma_noise_ics: column_names.append(f"aroma_noise_{i:0{leading_zeros}d}") else: