def _run_interface(self, runtime): import bids from bids.analysis import auto_model models = self.inputs.model if not isinstance(models, list): # model is not yet standardized, so validate=False layout = bids.BIDSLayout(self.inputs.bids_dir, validate=False) if not isdefined(models): models = layout.get(suffix='smdl', return_type='file') if not models: raise ValueError("No models found") elif models == 'default': models = auto_model(layout) models = [_ensure_model(m) for m in models] if self.inputs.selectors: # This is almost certainly incorrect models = [ model for model in models if all(val in model['input'].get(key, [val]) for key, val in self.inputs.selectors.items()) ] self._results['model_spec'] = models return runtime
def _run_interface(self, runtime): import bids from bids.analysis import auto_model models = self.inputs.model if not isinstance(models, list): database_path = self.inputs.database_path layout = bids.BIDSLayout.load(database_path=database_path) if not isdefined(models): # model is not yet standardized, so validate=False # Ignore all subject directories and .git/ and .datalad/ directories small_layout = bids.BIDSLayout( layout.root, derivatives=[d.root for d in layout.derivatives.values()], validate=False, ignore=[re.compile(r'sub-'), re.compile(r'\.(git|datalad)')]) # PyBIDS can double up, so find unique models models = list(set(small_layout.get(suffix='smdl', return_type='file'))) if not models: raise ValueError("No models found") elif models == 'default': models = auto_model(layout) models = [_ensure_model(m) for m in models] if self.inputs.selectors: # This is almost certainly incorrect models = [model for model in models if all(val in model['input'].get(key, [val]) for key, val in self.inputs.selectors.items())] self._results['model_spec'] = models return runtime
def _run_interface(self, runtime): models = self.inputs.model if not isinstance(models, list): layout = gb.BIDSLayout(self.inputs.bids_dir) if not isdefined(models): models = layout.get(type='model') if not models: raise ValueError("No models found") elif models == 'default': models = ba.auto_model(layout) models = [_ensure_model(m) for m in models] if self.inputs.selectors: # This is almost certainly incorrect models = [ model for model in models if all(val in model['input'].get(key, [val]) for key, val in self.inputs.selectors.items()) ] self._results['model_spec'] = models return runtime
def run_fitlins(argv=None): warnings.showwarning = _warn_redirect opts = get_parser().parse_args(argv) if opts.debug: logger.setLevel(logging.DEBUG) subject_list = None if opts.participant_label is not None: subject_list = bids.collect_participants( opts.bids_dir, participant_label=opts.participant_label) ncpus = opts.n_cpus if ncpus < 1: ncpus = cpu_count() plugin_settings = { 'plugin': 'MultiProc', 'plugin_args': { 'n_procs': ncpus, 'raise_insufficient': False, 'maxtasksperchild': 1, } } # Build main workflow logger.log(25, INIT_MSG( version=__version__, subject_list=subject_list) ) model = default_path(opts.model, opts.bids_dir, 'model.json') if opts.model in (None, 'default') and not op.exists(model): model = 'default' preproc_dir = default_path(opts.preproc_dir, op.join(opts.bids_dir, 'derivatives'), 'fmriprep') if not op.exists(preproc_dir): preproc_dir = default_path(opts.preproc_dir, opts.output_dir, 'fmriprep') if not op.exists(preproc_dir): raise RuntimeError("Preprocessed data could not be found") pipeline_name = 'fitlins' if opts.derivative_label: pipeline_name += '_' + opts.derivative_label deriv_dir = op.join(opts.output_dir, pipeline_name) os.makedirs(deriv_dir, exist_ok=True) bids.write_derivative_description(opts.bids_dir, deriv_dir) work_dir = mkdtemp() if opts.work_dir is None else opts.work_dir fitlins_wf = init_fitlins_wf( opts.bids_dir, preproc_dir, deriv_dir, opts.space, model=model, participants=subject_list, base_dir=work_dir, include_pattern=opts.include, exclude_pattern=opts.exclude ) retcode = 0 try: fitlins_wf.run(**plugin_settings) except Exception: retcode = 1 layout = BIDSLayout(opts.bids_dir) models = auto_model(layout) if model == 'default' else [model] run_context = {'version': __version__, 'command': ' '.join(sys.argv), 'timestamp': time.strftime('%Y-%m-%d %H:%M:%S %z'), } for model in models: analysis = Analysis(layout, model=model) report_dicts = parse_directory(deriv_dir, work_dir, analysis) write_report('unknown', report_dicts, run_context, deriv_dir) return retcode
def run_fitlins(argv=None): import re from nipype import logging as nlogging warnings.showwarning = _warn_redirect opts = get_parser().parse_args(argv) force_index = [ # If entry looks like `/<pattern>/`, treat `<pattern>` as a regex re.compile(ign[1:-1]) if (ign[0], ign[-1]) == ('/', '/') else ign # Iterate over empty tuple if undefined for ign in opts.force_index or () ] ignore = [ # If entry looks like `/<pattern>/`, treat `<pattern>` as a regex re.compile(ign[1:-1]) if (ign[0], ign[-1]) == ('/', '/') else ign # Iterate over empty tuple if undefined for ign in opts.ignore or () ] log_level = 25 + 5 * (opts.quiet - opts.verbose) logger.setLevel(log_level) nlogging.getLogger('nipype.workflow').setLevel(log_level) nlogging.getLogger('nipype.interface').setLevel(log_level) nlogging.getLogger('nipype.utils').setLevel(log_level) if not opts.space: # make it an explicit None opts.space = None if not opts.desc_label: # make it an explicit None opts.desc_label = None ncpus = opts.n_cpus if ncpus < 1: ncpus = cpu_count() plugin_settings = { 'plugin': 'MultiProc', 'plugin_args': { 'n_procs': ncpus, 'raise_insufficient': False, 'maxtasksperchild': 1, } } if opts.mem_gb: plugin_settings['plugin_args']['memory_gb'] = opts.mem_gb model = default_path(opts.model, opts.bids_dir, 'model-default_smdl.json') if opts.model in (None, 'default') and not op.exists(model): model = 'default' derivatives = True if not opts.derivatives else opts.derivatives # Need this when specifying args directly (i.e. neuroscout) # god bless neuroscout, but let's make it work for others! if isinstance(derivatives, list) and len(derivatives) == 1: # WRONG AND EVIL to those who have spaces in their paths... bad bad practice # TODO - fix neuroscout derivatives = derivatives[0].split(" ") pipeline_name = 'fitlins' if opts.derivative_label: pipeline_name += '_' + opts.derivative_label deriv_dir = op.join(opts.output_dir, pipeline_name) os.makedirs(deriv_dir, exist_ok=True) bids.write_derivative_description(opts.bids_dir, deriv_dir) work_dir = mkdtemp() if opts.work_dir is None else opts.work_dir # Go ahead and initialize the layout database if opts.database_path is None: database_path = Path(work_dir) / 'dbcache' reset_database = True else: database_path = opts.database_path reset_database = False layout = BIDSLayout(opts.bids_dir, derivatives=derivatives, ignore=ignore, force_index=force_index, database_path=database_path, reset_database=reset_database) subject_list = None if opts.participant_label is not None: subject_list = bids.collect_participants( layout, participant_label=opts.participant_label) # Build main workflow logger.log(25, INIT_MSG(version=__version__, subject_list=subject_list)) fitlins_wf = init_fitlins_wf( database_path, deriv_dir, analysis_level=opts.analysis_level, model=model, space=opts.space, desc=opts.desc_label, participants=subject_list, base_dir=work_dir, smoothing=opts.smoothing, drop_missing=opts.drop_missing, ) fitlins_wf.config = deepcopy(config.get_fitlins_config()._sections) if opts.work_dir: # dump crashes in working directory (non /tmp) fitlins_wf.config['execution']['crashdump_dir'] = opts.work_dir retcode = 0 if not opts.reports_only: try: fitlins_wf.run(**plugin_settings) except Exception: retcode = 1 models = auto_model(layout) if model == 'default' else [model] run_context = { 'version': __version__, 'command': ' '.join(sys.argv), 'timestamp': time.strftime('%Y-%m-%d %H:%M:%S %z'), } selectors = {'desc': opts.desc_label, 'space': opts.space} if subject_list is not None: selectors['subject'] = subject_list for model in models: analysis = Analysis(layout, model=model) analysis.setup(**selectors) report_dict = build_report_dict(deriv_dir, work_dir, analysis) write_full_report(report_dict, run_context, deriv_dir) return retcode
def run_fitlins(argv=None): warnings.showwarning = _warn_redirect opts = get_parser().parse_args(argv) if opts.debug: logger.setLevel(logging.DEBUG) if not opts.space: # make it an explicit None opts.space = None subject_list = None if opts.participant_label is not None: subject_list = bids.collect_participants( opts.bids_dir, participant_label=opts.participant_label) ncpus = opts.n_cpus if ncpus < 1: ncpus = cpu_count() plugin_settings = { 'plugin': 'MultiProc', 'plugin_args': { 'n_procs': ncpus, 'raise_insufficient': False, 'maxtasksperchild': 1, } } # Build main workflow logger.log(25, INIT_MSG( version=__version__, subject_list=subject_list) ) model = default_path(opts.model, opts.bids_dir, 'model-default_smdl.json') if opts.model in (None, 'default') and not op.exists(model): model = 'default' derivatives = True if not opts.derivatives else opts.derivatives # Need this when specifying args directly (i.e. neuroscout) # god bless neuroscout, but let's make it work for others! if isinstance(derivatives, list) and len(derivatives) == 1: # WRONG AND EVIL to those who have spaces in their paths... bad bad practice # TODO - fix neuroscout derivatives = derivatives[0].split(" ") pipeline_name = 'fitlins' if opts.derivative_label: pipeline_name += '_' + opts.derivative_label deriv_dir = op.join(opts.output_dir, pipeline_name) os.makedirs(deriv_dir, exist_ok=True) bids.write_derivative_description(opts.bids_dir, deriv_dir) work_dir = mkdtemp() if opts.work_dir is None else opts.work_dir fitlins_wf = init_fitlins_wf( opts.bids_dir, derivatives, deriv_dir, analysis_level=opts.analysis_level, model=model, space=opts.space, desc=opts.desc_label, participants=subject_list, base_dir=work_dir, force_index=opts.force_index, ignore=opts.ignore, smoothing=opts.smoothing, ) if opts.work_dir: # dump crashes in working directory (non /tmp) fitlins_wf.config['execution']['crashdump_dir'] = opts.work_dir # easy to read crashfiles fitlins_wf.config['execution']['crashfile_format'] = 'txt' retcode = 0 if not opts.reports_only: try: fitlins_wf.run(**plugin_settings) except Exception: retcode = 1 layout = BIDSLayout(opts.bids_dir, derivatives=derivatives) models = auto_model(layout) if model == 'default' else [model] run_context = {'version': __version__, 'command': ' '.join(sys.argv), 'timestamp': time.strftime('%Y-%m-%d %H:%M:%S %z'), } selectors = {'desc': opts.desc_label} if opts.space is not None: selectors['space'] = opts.space if subject_list is not None: selectors['subject'] = subject_list for model in models: analysis = Analysis(layout, model=model) analysis.setup(**selectors) report_dict = build_report_dict(deriv_dir, work_dir, analysis) write_full_report(report_dict, run_context, deriv_dir) return retcode