def _run_interface(self, runtime): mask = None if isdefined(self.inputs.in_mask): mask = self.inputs.in_mask title = self.inputs.title if isdefined(self.inputs.subject): title += ', subject %s' % self.inputs.subject if isdefined(self.inputs.metadata): title += ' (' + '_'.join(self.inputs.metadata) + ')' if isdefined(self.inputs.figsize): fig = plot_mosaic( self.inputs.in_file, title=title, overlay_mask=mask, figsize=self.inputs.figsize) else: fig = plot_mosaic( self.inputs.in_file, title=title, overlay_mask=mask) fig.savefig(self.inputs.out_file, dpi=self.inputs.dpi) return runtime
def plot_anat_mosaic_helper(in_file, subject_id, session_id, run_id, out_name, bbox_mask_file=None, title='T1w session: {session_id} run: {run_id}', only_plot_noise=False): from mriqc.interfaces.viz_utils import plot_mosaic import os title = title.format(**{"session_id": session_id, "run_id": run_id}) fig = plot_mosaic(in_file, bbox_mask_file=bbox_mask_file, title=title, only_plot_noise=only_plot_noise) fig.savefig(out_name, format=out_name.split('.')[-1], dpi=300) return os.path.abspath(out_name)
def _subject_plots(self, subid): # Get subject-specific info subdf = self.dataframe.loc[self.dataframe['subject_id'] == subid] sessions = sorted(pd.unique(subdf.session_id.ravel())) subject_plots = [] # Create figure here to avoid too many figures fig = plt.Figure(figsize=DINA4_LANDSCAPE) # Re-build mosaic location for sesid in sessions: sesdf = subdf.loc[subdf['session_id'] == sesid] scans = sorted(pd.unique(sesdf.run_id.ravel())) # Each scan has a volume and (optional) fd plot for scanid in scans: nii_paths = op.join(self.report_dir, self.qctype[:4], '{}_ses-{}_{}/mosaic*.nii.gz'.format(subid, sesid, scanid)) nii_files = sorted(glob(nii_paths)) log.info('Found mosaic files: %s', nii_files) for mosaic in nii_files: fname, ext = op.splitext(op.basename(mosaic)) if ext == '.gz': fname, _ = op.splitext(fname) fname = fname[7:] out_mosaic = op.join( self.work_dir, 'mosaic_{}_{}_ses-{}_run-{}_{}.pdf'.format( self.qctype[:4], subid, sesid, scanid, fname)) title = 'Filename: {}, session: {}, other: {}'.format(fname, sesid, scanid) fig = plot_mosaic(mosaic, fig=fig, title=title) fig.savefig(out_mosaic, dpi=self.dpi) fig.clf() subject_plots.append(out_mosaic) plots = op.join(self.report_dir, self.qctype[:4], '{}_ses-{}_{}/plot_*.pdf'.format(subid, sesid, scanid)) for fname in sorted(glob(plots)): if op.isfile(fname): subject_plots.append(fname) plt.close() # Summary cover sfailed = [] if self.failed: sfailed = ['%s (%s)' % (s[1], s[2]) for s in self.failed if subid == s[0]] out_sum = op.join(self.work_dir, '%s_summary_%s.pdf' % (self.qctype, subid)) self.summary_cover(sub_id=subid, out_file=out_sum) subject_plots.insert(0, out_sum) # Summary (violinplots) of QC measures qc_ms = op.join(self.work_dir, '%s_measures_%s.pdf' % (self.qctype, subid)) func = getattr(self, '_report_' + self.qctype) func(subject=subid, out_file=qc_ms) subject_plots.append(qc_ms) sub_path = None if len(subject_plots) > 0: # Generate final report with collected pdfs in plots sub_path = op.join(self.out_dir, '{}_{}.pdf'.format(self.qctype, subid)) concat_pdf(subject_plots, sub_path) self.result[subid] = {'success': True, 'path': sub_path} return sub_path
def _subject_plots(self, subid): # Get subject-specific info subdf = self.dataframe.loc[self.dataframe['subject_id'] == subid] sessions = sorted(pd.unique(subdf.session_id.ravel())) subject_plots = [] # Create figure here to avoid too many figures fig = plt.Figure(figsize=DINA4_LANDSCAPE) # Re-build mosaic location for sesid in sessions: sesdf = subdf.loc[subdf['session_id'] == sesid] scans = sorted(pd.unique(sesdf.run_id.ravel())) # Each scan has a volume and (optional) fd plot for scanid in scans: nii_paths = op.join(self.report_dir, self.qctype[:4], '{}_ses-{}_{}/mosaic*.nii.gz'.format(subid, sesid, scanid)) nii_files = sorted(glob(nii_paths)) if not nii_files: nii_paths = op.join( self.report_dir, self.qctype[:4], '{}_ses-[u]{}_[u]{}/mosaic*.nii.gz'.format( subid, sesid, scanid)) nii_files = sorted(glob(nii_paths)) if not nii_files: MRIQC_REPORT_LOG.warning( 'No mosaic files were found for subject %s, session %s', subid, sesid) for mosaic in nii_files: fname, ext = op.splitext(op.basename(mosaic)) if ext == '.gz': fname, _ = op.splitext(fname) fname = fname[7:] out_mosaic = op.join( self.work_dir, 'mosaic_{}_{}_ses-{}_run-{}_{}.pdf'.format( self.qctype[:4], subid, sesid, scanid, fname)) title = 'Filename: {}, session: {}, other: {}'.format(fname, sesid, scanid) fig = plot_mosaic(mosaic, fig=fig, title=title) fig.savefig(out_mosaic, dpi=self.dpi) fig.clf() subject_plots.append(out_mosaic) plots = op.join(self.report_dir, self.qctype[:4], '{}_ses-{}_{}/plot_*.pdf'.format(subid, sesid, scanid)) pdf_plots = sorted(glob(plots)) if not pdf_plots: plots = op.join( self.report_dir, self.qctype[:4], '{}_ses-[u]{}_[u]{}/plot_*.pdf'.format(subid, sesid, scanid)) pdf_plots = sorted(glob(plots)) if not pdf_plots: MRIQC_REPORT_LOG.warning( 'No PDF plots were found for subject %s, session %s', subid, sesid) for fname in sorted(pdf_plots): if op.isfile(fname): subject_plots.append(fname) plt.close() # Summary cover # sfailed = [] # if self.failed: # sfailed = ['%s (%s)' % (s[1], s[2]) # for s in self.failed if subid == s[0]] out_sum = op.join(self.work_dir, '%s_summary_%s.pdf' % (self.qctype, subid)) self.summary_cover(sub_id=subid, out_file=out_sum) subject_plots.insert(0, out_sum) # Summary (violinplots) of QC measures qc_ms = op.join(self.work_dir, '%s_measures_%s.pdf' % (self.qctype, subid)) func = getattr(self, '_report_' + self.qctype) func(subject=subid, out_file=qc_ms) subject_plots.append(qc_ms) sub_path = None if len(subject_plots) > 0: # Generate final report with collected pdfs in plots sub_path = op.join(self.out_dir, '{}_{}.pdf'.format(self.qctype, subid)) concat_pdf(subject_plots, sub_path) self.result[subid] = {'success': True, 'path': sub_path} MRIQC_REPORT_LOG.info( 'Generated individual %s report (%s) for subject %s', self.qctype, sub_path, subid) return sub_path