Exemplo n.º 1
0
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
Exemplo n.º 2
0
    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