From 750b63cfa7302ae3584bfdc464933da6e9d972c5 Mon Sep 17 00:00:00 2001
From: Thomas Kluyver <thomas.kluyver@xfel.eu>
Date: Fri, 7 Feb 2025 17:55:34 +0000
Subject: [PATCH] Rough sketch of injecting new constants after report creation

---
 src/xfel_calibrate/calibrate.py | 12 +++++++++++-
 src/xfel_calibrate/finalize.py  | 19 ++++++++++++++++++-
 src/xfel_calibrate/nb_args.py   |  4 ++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/xfel_calibrate/calibrate.py b/src/xfel_calibrate/calibrate.py
index 61f35e0a8..0b4b1173f 100755
--- a/src/xfel_calibrate/calibrate.py
+++ b/src/xfel_calibrate/calibrate.py
@@ -208,7 +208,9 @@ def create_finalize_script(fmt_args, cal_work_dir, job_list) -> str:
                              report_to='{{report_to}}',
                              data_path='{{in_folder}}',
                              request_time='{{request_time}}',
-                             submission_time='{{submission_time}}')
+                             submission_time='{{submission_time}}',
+                             inject={{inject}},
+                            )
 
                     """)
 
@@ -851,6 +853,13 @@ def run(argv=None):
         ))
         errors = False
 
+    # If the notebook has a db_output parameter, assume it will do the injection
+    # itself.
+    inject = args['db_output'] and 'db_output' not in default_params_by_name
+    if inject and nb_details.caltype == 'CORRECT':
+        print("Ignoring --db-output for CORRECT task (this is for characterisation")
+        inject = False
+
     fmt_args = {'cal_work_dir': cal_work_dir,
                 'out_path': out_path,
                 'version': version,
@@ -860,6 +869,7 @@ def run(argv=None):
                 'in_folder': folder,
                 'request_time': request_time.isoformat(),
                 'submission_time': submission_time.isoformat(),
+                'inject': inject,
                 }
 
     joblist.append(run_finalize(
diff --git a/src/xfel_calibrate/finalize.py b/src/xfel_calibrate/finalize.py
index c2c46b513..d5e6ef07f 100644
--- a/src/xfel_calibrate/finalize.py
+++ b/src/xfel_calibrate/finalize.py
@@ -10,10 +10,13 @@ from tempfile import TemporaryDirectory
 from textwrap import dedent
 from typing import Dict, List
 
+import h5py
 import tabulate
 from jinja2 import Template
 
 import cal_tools.tools
+from cal_tools.constants import inject_ccv
+from cal_tools.restful_config import extra_calibration_client
 
 from .settings import logo_path
 
@@ -387,7 +390,7 @@ def tex_escape(text):
 
 
 def finalize(joblist, finaljob, cal_work_dir, out_path, version, title, author, report_to, data_path='Unknown',
-             request_time='', submission_time=''):
+             request_time='', submission_time='', inject=False):
     cal_work_dir = Path(cal_work_dir)
     out_path = Path(out_path)
 
@@ -458,3 +461,17 @@ def finalize(joblist, finaljob, cal_work_dir, out_path, version, title, author,
         tmp_path = Path(td, f"calibration_metadata.yml")
         copy(md_path, tmp_path)
         tmp_path.replace(out_path / "calibration_metadata.yml")
+
+    if inject:
+        client = extra_calibration_client(inject=True)
+        consts = list(out_path.glob("*.h5"))
+        print(f"Injecting constants from {len(consts)} files")
+        for p in consts:
+            print(f"  {p.name}")
+            with h5py.File(p, "r") as hf:
+                for pdu_name, grp in hf.items():
+                    for calibration in grp.keys():
+                        print(f"    {calibration}: {pdu_name} ...", end="", flush=True)
+                        group_path = f"{pdu_name}/{calibration}/0"
+                        inject_ccv(p, group_path, report_to, client=client)
+                        print("done")
diff --git a/src/xfel_calibrate/nb_args.py b/src/xfel_calibrate/nb_args.py
index f63265ca7..2f4d6dd7c 100644
--- a/src/xfel_calibrate/nb_args.py
+++ b/src/xfel_calibrate/nb_args.py
@@ -79,6 +79,10 @@ def make_initial_parser(**kwargs):
     parser.add_argument('--vector-figs', action="store_true", default=False,
                         help="Use vector graphics for figures in the report.")
 
+    parser.add_argument('--db-output', action="store_true",
+                        help="Inject produced constants to CalCat after "
+                             "characterisation")
+
     parser.add_argument('--slurm-mincpus', type=int, default=1,
                         help='Requested minimum number of '
                              'logical cpus/processors per node')
-- 
GitLab