Source code for ewoksid16a.tasks.fluo.fitreport
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 26 17:04:36 2026
@author: blissadm
"""
import os
import h5py
from ewokscore import Task
from pyicat_plus.metadata.drac_report_builder import DracReportBuilder
from silx.io import h5py_utils
from silx.io.url import DataUrl
DEFAULTS = {}
[docs]
class SumfitSummaryReport(
Task,
input_names=["output_root_uri", "bliss_scan_uri"],
optional_input_names=[],
output_names=["output_root_uri", "bliss_scan_uri"],
):
"""Generate a report of sumfit tasks for the data portal"""
[docs]
def run(self):
pars = {**DEFAULTS, **self.get_input_values()}
# From https://pyicat-plus.readthedocs.io/en/stable/other_features.html#drac-report-builder
output_root_uri = DataUrl(pars["output_root_uri"])
gallery_path = os.path.join(
os.path.dirname(output_root_uri.file_path()), "gallery"
)
fitting_results = {}
detectors = set()
with h5py_utils.open_item(
output_root_uri.file_path(), output_root_uri.data_path()
) as scan:
for k in scan:
if isinstance(scan[k], h5py.Group) and "sumfit" in scan[k]:
detectors.add(k)
fitgrp = scan[k]["sumfit"]
for elm in fitgrp["areal_density"]:
if elm not in fitting_results:
fitting_results[elm] = {}
fitting_results[elm][k] = (
fitgrp["areal_density"][elm][()],
fitgrp["fitarea"][elm][()],
)
table_results = []
table_title = ["Element"]
for d in detectors:
table_title += [
f"{d} fit area",
f"{d} areal density (ng/mm2)",
]
if len(detectors) > 1:
table_title += ["Total fit area", "Average areal density (ng/mmg2)"]
for elm, v in fitting_results.items():
area = 0.0
prod = 0.0
row = [
elm,
]
for d in detectors:
vals = v.get(d, None)
if vals is None:
row += ["N/A", "N/A"]
else:
area += vals[1]
prod += vals[0] * vals[1]
row += [f"{vals[1]:.5g}", f"{vals[0]:.5g}"]
if len(detectors) > 1:
weighted = prod / area
row += [f"{area:.5g}", f"{weighted:.5g}"]
table_results += [
row,
]
# Create report
report = DracReportBuilder(
dataset_type="xrf_fitting",
dataset_title="XRF fitting report",
)
# Add text elements
# report.add_info("This is a demo info item.")
# report.add_warning("Warning !")
# Add a row of images (must be inside an image list)
report.start_image_list()
for d in detectors:
filepath = os.path.join(gallery_path, f"{d}_sumfit.jpg")
if os.path.isfile(filepath):
report.add_image(
path_to_image=filepath,
image_title=f"{d} sumfit",
thumbnail_height=200,
)
report.end_image_list()
# Add a table
report.add_table(
title="Fitting results",
columns=table_title,
data=table_results,
orientation="vertical",
)
# Export DRAC JSON
report.render_json(
path_to_json_dir=gallery_path,
)
self.outputs.output_root_uri = pars["output_root_uri"]
self.outputs.bliss_scan_uri = pars["bliss_scan_uri"]