Source code for mriqc.reports.utils

# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
# vi: set ft=python sts=4 ts=4 sw=4 et:
#
# Copyright 2021 The NiPreps Developers <nipreps@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# We support and encourage derived works from this project, please read
# about our expectations at
#
#     https://www.nipreps.org/community/licensing/
#
"""Helpers in report generation."""


[docs]def iqms2html(indict, table_id): """Converts a dictionary into an HTML table""" columns = sorted(unfold_columns(indict)) if not columns: return None depth = max([len(col) for col in columns]) result_str = '<table id="%s" class="table table-sm table-striped">\n' % table_id td = "<td{1}>{0}</td>".format for line in columns: result_str += "<tr>" ncols = len(line) for i, col in enumerate(line): colspan = 0 colstring = "" if (depth - ncols) > 0 and i == ncols - 2: colspan = (depth - ncols) + 1 colstring = " colspan=%d" % colspan result_str += td(col, colstring) result_str += "</tr>\n" result_str += "</table>\n" return result_str
[docs]def unfold_columns(indict, prefix=None): """Converts an input dict with flattened keys to an array of columns""" if prefix is None: prefix = [] keys = sorted(set(list(indict.keys()))) data = [] subdict = {} for key in keys: col = key.split("_", 1) if len(col) == 1: value = indict[col[0]] data.append(prefix + [col[0], value]) else: if subdict.get(col[0]) is None: subdict[col[0]] = {} subdict[col[0]][col[1]] = indict[key] if subdict: for skey in sorted(list(subdict.keys())): sskeys = list(subdict[skey].keys()) if len(sskeys) == 1: value = subdict[skey][sskeys[0]] newkey = "_".join([skey] + sskeys) data.append(prefix + [newkey, value]) else: data += unfold_columns(subdict[skey], prefix=prefix + [skey]) return data
[docs]def read_report_snippet(in_file): """Add a snippet into the report""" import os.path as op import re from io import open # pylint: disable=W0622 is_svg = op.splitext(op.basename(in_file))[1] == ".svg" with open(in_file) as thisfile: if not is_svg: return thisfile.read() svg_tag_line = 0 content = thisfile.read().split("\n") corrected = [] for i, line in enumerate(content): if "<svg " in line: line = re.sub(' height="[0-9.]+[a-z]*"', "", line) line = re.sub(' width="[0-9.]+[a-z]*"', "", line) if svg_tag_line == 0: svg_tag_line = i corrected.append(line) return "\n".join(corrected[svg_tag_line:])
# def check_reports(dataset, settings, save_failed=True): # """Check if reports have been created""" # import os.path as op # import pandas as pd # from mriqc.utils.misc import BIDS_COMP, BIDS_EXPR # supported_components = list(BIDS_COMP.keys()) # expr = re.compile(BIDS_EXPR) # reports_missed = False # missing = {} # for mod, files in list(dataset.items()): # missing[mod] = [] # qctype = 'anatomical' if mod == 't1w' else 'functional' # for fname in files: # m = expr.search(op.basename(fname)).groupdict() # components = [m.get(key) for key in supported_components if m.get(key)] # components.insert(0, qctype) # report_fname = op.join( # settings['report_dir'], '_'.join(components) + '_report.html') # if not op.isfile(report_fname): # missing[mod].append( # {key: m.get(key) for key in supported_components if m.get(key)}) # mod_missing = missing[mod] # if mod_missing: # reports_missed = True # if mod_missing and save_failed: # out_file = op.join(settings['output_dir'], 'failed_%s.csv' % qctype) # miss_cols = list(set(supported_components) & set(list(mod_missing[0].keys()))) # dframe = pd.DataFrame.from_dict(mod_missing).sort_values( # by=miss_cols) # dframe[miss_cols].to_csv(out_file, index=False) # return reports_missed