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
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