Esempio n. 1
0
def avgb0_wf(name='AvgB0Workflow'):
    """
    Implements workflow to calculate the average of dwi b0 images.

    .. workflow::

        from mriqc.workflows.diffusion import avgb0_wf
        wf = avgb0_wf

    """

    workflow = pe.Workflow(name=name)

    inputnode = pe.Node(niu.IdentityInterface(
        fields=['in_files']),
        name='inputnode')
    outputnode = pe.Node(niu.IdentityInterface(fields=['out_file']),
                            name='outputnode')

    merge = pe.Node(fsl.Merge(dimension='t'), name='Merge')

    avg = pe.Node(fsl.maths.MeanImage(), name='AvgImage')

    workflow.connect([
        (inputnode, merge, [('in_files', 'in_files')]),
        (merge, avg, [('merged_file', 'in_file')]),
        (avg, outputnode, [('out_file', 'out_file')])
    ])
    return workflow
Esempio n. 2
0
    def _run_interface(self, runtime):
        in_files = self.inputs.in_files
        if not isinstance(in_files, list):
            in_files = [self.inputs.in_files]

        # Generate output average name early
        self._results['out_avg'] = genfname(self.inputs.in_files[0],
                                            suffix='avg')

        if self.inputs.to_ras:
            in_files = [reorient(inf) for inf in in_files]

        if len(in_files) == 1:
            filenii = nb.load(in_files[0])
            filedata = filenii.get_data()

            # magnitude files can have an extra dimension empty
            if filedata.ndim == 5:
                sqdata = np.squeeze(filedata)
                if sqdata.ndim == 5:
                    raise RuntimeError('Input image (%s) is 5D' % in_files[0])
                else:
                    in_files = [genfname(in_files[0], suffix='squeezed')]
                    nb.Nifti1Image(sqdata, filenii.get_affine(),
                                   filenii.get_header()).to_filename(
                                       in_files[0])

            if np.squeeze(nb.load(in_files[0]).get_data()).ndim < 4:
                self._results['out_file'] = in_files[0]
                self._results['out_avg'] = in_files[0]
                # TODO: generate identity out_mats and zero-filled out_movpar
                return runtime
            in_files = in_files[0]
        else:
            magmrg = fsl.Merge(dimension='t', in_files=self.inputs.in_files)
            in_files = magmrg.run().outputs.merged_file
        mcflirt = fsl.MCFLIRT(cost='normcorr',
                              save_mats=True,
                              save_plots=True,
                              ref_vol=0,
                              in_file=in_files)
        mcres = mcflirt.run()
        self._results['out_mats'] = mcres.outputs.mat_file
        self._results['out_movpar'] = mcres.outputs.par_file
        self._results['out_file'] = mcres.outputs.out_file

        hmcnii = nb.load(mcres.outputs.out_file)
        hmcdat = hmcnii.get_data().mean(axis=3)
        if self.inputs.zero_based_avg:
            hmcdat -= hmcdat.min()

        nb.Nifti1Image(hmcdat, hmcnii.get_affine(),
                       hmcnii.get_header()).to_filename(
                           self._results['out_avg'])

        return runtime