def individual_reports(settings, name='ReportsWorkflow'): """Encapsulates nodes writing plots""" from mriqc.interfaces import PlotMosaic from mriqc.reports import individual_html verbose = settings.get('verbose_reports', False) pages = 2 extra_pages = 0 if verbose: extra_pages = 7 workflow = pe.Workflow(name=name) inputnode = pe.Node(niu.IdentityInterface(fields=[ 'orig', 'brainmask', 'headmask', 'airmask', 'artmask', 'segmentation', 'inu_corrected', 'noisefit', 'in_iqms', 'mni_report' ]), name='inputnode') # T1w mosaic plot mosaic_zoom = pe.Node(PlotMosaic(out_file='plot_anat_mosaic1_zoomed.svg', title='T1w - zoomed', cmap='Greys_r'), name='PlotMosaicZoomed') mosaic_noise = pe.Node(PlotMosaic(out_file='plot_anat_mosaic2_noise.svg', title='T1w - noise enhanced', only_noise=True, cmap='viridis_r'), name='PlotMosaicNoise') mplots = pe.Node(niu.Merge(pages + extra_pages), name='MergePlots') rnode = pe.Node(niu.Function(input_names=['in_iqms', 'in_plots'], output_names=['out_file'], function=individual_html), name='GenerateReport') # Link images that should be reported dsplots = pe.Node(nio.DataSink(base_directory=settings['output_dir'], parameterization=False), name='dsplots') dsplots.inputs.container = 'reports' workflow.connect([ (inputnode, rnode, [('in_iqms', 'in_iqms')]), (inputnode, mosaic_zoom, [('orig', 'in_file'), ('brainmask', 'bbox_mask_file')]), (inputnode, mosaic_noise, [('orig', 'in_file')]), (mosaic_zoom, mplots, [('out_file', "in1")]), (mosaic_noise, mplots, [('out_file', "in2")]), (mplots, rnode, [('out', 'in_plots')]), (rnode, dsplots, [('out_file', "@html_report")]), ]) if not verbose: return workflow from mriqc.interfaces.viz import PlotContours from mriqc.interfaces.viz_utils import plot_bg_dist plot_bgdist = pe.Node(niu.Function(input_names=['in_file'], output_names=['out_file'], function=plot_bg_dist), name='PlotBackground') plot_segm = pe.Node(PlotContours(display_mode='z', levels=[.5, 1.5, 2.5], cut_coords=10, colors=['r', 'g', 'b']), name='PlotSegmentation') plot_bmask = pe.Node(PlotContours(display_mode='z', levels=[.5], colors=['r'], cut_coords=10, out_file='bmask'), name='PlotBrainmask') plot_airmask = pe.Node(PlotContours(display_mode='x', levels=[.5], colors=['r'], cut_coords=6, out_file='airmask'), name='PlotAirmask') plot_headmask = pe.Node(PlotContours(display_mode='x', levels=[.5], colors=['r'], cut_coords=6, out_file='headmask'), name='PlotHeadmask') plot_artmask = pe.Node(PlotContours(display_mode='z', levels=[.5], colors=['r'], cut_coords=10, out_file='artmask', saturate=True), name='PlotArtmask') workflow.connect([ (inputnode, plot_segm, [('orig', 'in_file'), ('segmentation', 'in_contours')]), (inputnode, plot_bmask, [('orig', 'in_file'), ('brainmask', 'in_contours')]), (inputnode, plot_headmask, [('orig', 'in_file'), ('headmask', 'in_contours')]), (inputnode, plot_airmask, [('orig', 'in_file'), ('airmask', 'in_contours')]), (inputnode, plot_artmask, [('orig', 'in_file'), ('artmask', 'in_contours')]), (inputnode, plot_bgdist, [('noisefit', 'in_file')]), (inputnode, mplots, [('mni_report', "in%d" % (pages + 1))]), (plot_bmask, mplots, [('out_file', 'in%d' % (pages + 2))]), (plot_segm, mplots, [('out_file', 'in%d' % (pages + 3))]), (plot_artmask, mplots, [('out_file', 'in%d' % (pages + 4))]), (plot_headmask, mplots, [('out_file', 'in%d' % (pages + 5))]), (plot_airmask, mplots, [('out_file', 'in%d' % (pages + 6))]), (plot_bgdist, mplots, [('out_file', 'in%d' % (pages + 7))]) ]) return workflow
def individual_reports(settings, name='ReportsWorkflow'): """Encapsulates nodes writing plots""" from mriqc.interfaces import PlotMosaic, PlotSpikes from mriqc.reports import individual_html verbose = settings.get('verbose_reports', False) pages = 5 extra_pages = 0 if verbose: extra_pages = 3 workflow = pe.Workflow(name=name) inputnode = pe.Node(niu.IdentityInterface(fields=[ 'in_iqms', 'orig', 'epi_mean', 'brainmask', 'hmc_fd', 'epi_parc', 'in_dvars', 'in_stddev', 'outliers', 'in_spikes', 'exclude_index', 'mni_report']), name='inputnode') spmask = pe.Node(niu.Function( input_names=['in_file', 'in_mask'], output_names=['out_file', 'out_plot'], function=spikes_mask), name='SpikesMask') spikes = pe.Node(Spikes(), name='SpikesFinder') spikes_bg = pe.Node(Spikes(no_zscore=True, detrend=False), name='SpikesFinderBgMask') bigplot = pe.Node(niu.Function( input_names=['in_func', 'in_mask', 'in_segm', 'in_spikes', 'in_spikes_bg', 'fd', 'dvars', 'outliers'], output_names=['out_file'], function=_big_plot), name='BigPlot') workflow.connect([ (inputnode, spikes_bg, [('orig', 'in_file')]), (inputnode, spikes, [('orig', 'in_file'), ('brainmask', 'in_mask')]), (inputnode, spmask, [('orig', 'in_file')]), (inputnode, bigplot, [('orig', 'in_func'), ('brainmask', 'in_mask'), ('hmc_fd', 'fd'), ('in_dvars', 'dvars'), ('epi_parc', 'in_segm'), ('outliers', 'outliers')]), (spikes, bigplot, [('out_tsz', 'in_spikes')]), (spikes_bg, bigplot, [('out_tsz', 'in_spikes_bg')]), (spmask, spikes_bg, [('out_file', 'in_mask')]), ]) mosaic_mean = pe.Node(PlotMosaic( out_file='plot_func_mean_mosaic1.svg', title='EPI mean session', cmap='Greys_r'), name='PlotMosaicMean') mosaic_stddev = pe.Node(PlotMosaic( out_file='plot_func_stddev_mosaic2_stddev.svg', title='EPI SD session', cmap='viridis'), name='PlotMosaicSD') mosaic_spikes = pe.Node(PlotSpikes( out_file='plot_spikes.svg', cmap='viridis', title='High-Frequency spikes'), name='PlotSpikes') mplots = pe.Node(niu.Merge(pages + extra_pages), name='MergePlots') rnode = pe.Node(niu.Function( input_names=['in_iqms', 'in_plots', 'exclude_index', 'wf_details'], output_names=['out_file'], function=individual_html), name='GenerateReport') wf_details = [] if settings.get('hmc_afni', False): wf_details.append('Framewise Displacement was computed using AFNI <code>3dvolreg</code>') else: wf_details.append('Framewise Displacement was computed using FSL <code>mcflirt</code>') rnode.inputs.wf_details = wf_details # Link images that should be reported dsplots = pe.Node(nio.DataSink( base_directory=settings['output_dir'], parameterization=False), name='dsplots') dsplots.inputs.container = 'reports' workflow.connect([ (inputnode, rnode, [('in_iqms', 'in_iqms'), ('exclude_index', 'exclude_index')]), (inputnode, mosaic_mean, [('epi_mean', 'in_file')]), (inputnode, mosaic_stddev, [('in_stddev', 'in_file')]), (inputnode, mosaic_spikes, [('orig', 'in_file'), ('in_spikes', 'in_spikes')]), (mosaic_mean, mplots, [('out_file', 'in1')]), (mosaic_stddev, mplots, [('out_file', 'in2')]), (bigplot, mplots, [('out_file', 'in3')]), (mosaic_spikes, mplots, [('out_file', 'in4')]), (inputnode, mplots, [('mni_report', 'in5')]), (mplots, rnode, [('out', 'in_plots')]), (rnode, dsplots, [('out_file', '@html_report')]), ]) if not verbose: return workflow mosaic_zoom = pe.Node(PlotMosaic( out_file='plot_anat_mosaic1_zoomed.svg', title='Zoomed-in EPI mean', cmap='Greys_r'), name='PlotMosaicZoomed') mosaic_noise = pe.Node(PlotMosaic( out_file='plot_anat_mosaic2_noise.svg', title='Enhanced noise in EPI mean', only_noise=True, cmap='viridis_r'), name='PlotMosaicNoise') # Verbose-reporting goes here from mriqc.interfaces.viz import PlotContours from mriqc.interfaces.viz_utils import plot_bg_dist plot_bmask = pe.Node(PlotContours( display_mode='z', levels=[.5], colors=['r'], cut_coords=10, out_file='bmask'), name='PlotBrainmask') workflow.connect([ (inputnode, plot_bmask, [('epi_mean', 'in_file'), ('brainmask', 'in_contours')]), (inputnode, mosaic_zoom, [('epi_mean', 'in_file'), ('brainmask', 'bbox_mask_file')]), (inputnode, mosaic_noise, [('epi_mean', 'in_file')]), (mosaic_zoom, mplots, [('out_file', 'in%d' % (pages + 1))]), (mosaic_noise, mplots, [('out_file', 'in%d' % (pages + 2))]), (plot_bmask, mplots, [('out_file', 'in%d' % (pages + 3))]) ]) return workflow