def parse_directory(deriv_dir, work_dir, analysis): fl_layout = BIDSLayout( deriv_dir, config=['bids', 'derivatives', 'fitlins'], validate=False) wd_layout = BIDSLayout( str(Path(work_dir) / 'reportlets' / 'fitlins'), validate=False) contrast_svgs = fl_layout.get(extensions='.svg', suffix='contrasts') analyses = [] for contrast_svg in contrast_svgs: ents = contrast_svg.entities ents.pop('suffix') ents.setdefault('subject', None) correlation_matrix = fl_layout.get(extensions='.svg', suffix='corr', **ents) design_matrix = fl_layout.get(extensions='.svg', suffix='design', **ents) job_desc = { 'ents': {k: v for k, v in ents.items() if v is not None}, 'dataset': analysis.layout.root, 'model_name': analysis.model['name'], 'contrasts_svg': contrast_svg.path, } if ents.get('subject'): job_desc['subject_id'] = ents.get('subject') if correlation_matrix: job_desc['correlation_matrix_svg'] = correlation_matrix[0].path if design_matrix: job_desc['design_matrix_svg'] = design_matrix[0].path snippet = wd_layout.get(extensions='.html', suffix='snippet', **ents) if snippet: with open(snippet[0].path) as fobj: job_desc['warning'] = fobj.read() contrasts = fl_layout.get(extensions='.png', suffix='ortho', **ents) # TODO: Split contrasts from estimates job_desc['contrasts'] = [{'image_file': c.path, 'name': fl_layout.parse_file_entities( c.path)['contrast']} for c in contrasts] analyses.append(job_desc) return analyses
def _run_interface(self, runtime): from bids.layout import BIDSLayout derivatives = self.inputs.derivatives layout = BIDSLayout(self.inputs.bids_dir, derivatives=derivatives) bold_files = [] mask_files = [] entities = [] for ents in self.inputs.entities: selectors = {**self.inputs.selectors, **ents} bold_file = layout.get(**selectors) if len(bold_file) == 0: raise FileNotFoundError( "Could not find BOLD file in {} with entities {}" "".format(self.inputs.bids_dir, selectors)) elif len(bold_file) > 1: raise ValueError( "Non-unique BOLD file in {} with entities {}.\n" "Matches:\n\t{}" "".format( self.inputs.bids_dir, selectors, "\n\t".join('{} ({})'.format( f.path, layout.files[f.path].entities) for f in bold_file))) # Select exactly matching mask file (may be over-cautious) bold_ents = layout.parse_file_entities(bold_file[0].path) bold_ents['suffix'] = 'mask' bold_ents['desc'] = 'brain' bold_ents['extension'] = ['.nii', '.nii.gz'] mask_file = layout.get(**bold_ents) bold_ents.pop('suffix') bold_ents.pop('desc') bold_files.append(bold_file[0].path) mask_files.append(mask_file[0].path if mask_file else None) entities.append(bold_ents) self._results['bold_files'] = bold_files self._results['mask_files'] = mask_files self._results['entities'] = entities return runtime