diff --git a/notebooks/Gotthard2/Characterize_Darks_Gotthard2_NBC.ipynb b/notebooks/Gotthard2/Characterize_Darks_Gotthard2_NBC.ipynb
index 70e0450aea363aba8ab16e96bff6ff626a80bd15..6548a50025758c5ca7aa186c2db0f6fc54dc7e89 100644
--- a/notebooks/Gotthard2/Characterize_Darks_Gotthard2_NBC.ipynb
+++ b/notebooks/Gotthard2/Characterize_Darks_Gotthard2_NBC.ipynb
@@ -24,6 +24,7 @@
    "source": [
     "in_folder = \"/gpfs/exfel/exp/FXE/202231/p900298/raw\"  # the folder to read data from, required\n",
     "out_folder =  \"/gpfs/exfel/data/scratch/ahmedk/test/gotthard2/darks\"  # the folder to output to, required\n",
+    "metadata_folder = ''  # Directory containing calibration_metadata.yml when run by xfel-calibrate\n",
     "run_high = 7  # run number for G0 dark run, required\n",
     "run_med = 8  # run number for G1 dark run, required\n",
     "run_low = 9  # run number for G2 dark run, required\n",
@@ -73,6 +74,7 @@
     "from extra_data import RunDirectory\n",
     "from pathlib import Path\n",
     "\n",
+    "import yaml\n",
     "from cal_tools.calcat_interface import CalCatApi\n",
     "from cal_tools.enums import BadPixels\n",
     "from cal_tools.gotthard2 import gotthard2algs, gotthard2lib\n",
@@ -81,7 +83,6 @@
     "from cal_tools.tools import (\n",
     "    calcat_creation_time,\n",
     "    get_constant_from_db_and_time,\n",
-    "    get_pdu_from_db,\n",
     "    get_report,\n",
     "    save_const_to_h5,\n",
     "    send_to_db,\n",
@@ -107,7 +108,7 @@
     "ctrl_src = ctrl_source_template.format(karabo_id_control, control_template)\n",
     "\n",
     "# Read report path to associate it later with injected constants.\n",
-    "report = get_report(out_folder)\n",
+    "report = get_report(metadata_folder)\n",
     "\n",
     "# Run's creation time:\n",
     "creation_time = calcat_creation_time(in_folder, run_high, creation_time)\n",
@@ -546,6 +547,26 @@
     ")\n",
     "step_timer.done_step(\"Injecting constants.\")"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "98ca9486",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# TODO: store old constants for comparison.\n",
+    "for mod, pdu in da_to_pdu.items():\n",
+    "    mod_file = mod.replace(\"/\", \"-\")\n",
+    "    with open(f\"{metadata_folder or out_folder}/module_metadata_{mod_file}.yml\", \"w\") as fd:\n",
+    "        yaml.safe_dump(\n",
+    "            {\n",
+    "                \"module\": mod,\n",
+    "                \"pdu\": pdu,\n",
+    "            },\n",
+    "            fd,\n",
+    "        )"
+   ]
   }
  ],
  "metadata": {
diff --git a/notebooks/Gotthard2/Summary_Darks_Gotthard2_NBC.ipynb b/notebooks/Gotthard2/Summary_Darks_Gotthard2_NBC.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..9bc054213abea01838eb5cf5f877d30b736a3a42
--- /dev/null
+++ b/notebooks/Gotthard2/Summary_Darks_Gotthard2_NBC.ipynb
@@ -0,0 +1,202 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Gotthard2 Dark Summary\n",
+    "\n",
+    "Author: European XFEL Detector Department, Version: 1.0\n",
+    "\n",
+    "Summary for process dark constants and a comparison with previously injected constants with the same conditions."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "in_folder = \"/gpfs/exfel/exp/DETLAB/202330/p900326/raw\"  # the folder to read data from, required\n",
+    "out_folder = \"/gpfs/exfel/data/scratch/ahmedk/test/gotthard2\"  # path to output to, required\n",
+    "metadata_folder = \"\"  # Directory containing calibration_metadata.yml when run by xfel-calibrate.\n",
+    "run_high = 20  # run number for G0 dark run, required\n",
+    "run_med = 21  # run number for G1 dark run, required\n",
+    "run_low = 22  # run number for G2 dark run, required\n",
+    "\n",
+    "# Parameters used to access raw data.\n",
+    "karabo_id = \"DETLAB_25UM_GH2\"  # detector identifier.\n",
+    "karabo_da = [\"DA01/1\", \"DA01/2\"]  # list of data aggregators, which corresponds to different JF modules. This is only needed for the detectors of one module.\n",
+    "control_template = \"CONTROL\"  # control template used to read CONTROL keys.\n",
+    "ctrl_source_template = '{}/DET/{}'  # template for control source name (filled with karabo_id_control)\n",
+    "karabo_id_control = \"\"  # Control karabo ID. Set to empty string to use the karabo-id\n",
+    "\n",
+    "# Parameters to be used for injecting dark calibration constants.\n",
+    "local_output = True  # Boolean indicating that local constants were stored in the out_folder\n",
+    "\n",
+    "# Skip the whole notebook if local_output is false in the preceding notebooks.\n",
+    "if not local_output:\n",
+    "    print('No local constants saved. Skipping summary plots')\n",
+    "    import sys\n",
+    "    sys.exit(0)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import warnings\n",
+    "from pathlib import Path\n",
+    "\n",
+    "warnings.filterwarnings('ignore')\n",
+    "\n",
+    "import h5py\n",
+    "import matplotlib\n",
+    "import matplotlib.pyplot as plt\n",
+    "import numpy as np\n",
+    "import yaml\n",
+    "from extra_data import RunDirectory\n",
+    "from IPython.display import Markdown, display\n",
+    "\n",
+    "from cal_tools.gotthard2 import gotthard2lib\n",
+    "\n",
+    "matplotlib.use(\"agg\")\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cal_tools.tools import CalibrationMetadata"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "out_folder = Path(out_folder)\n",
+    "metadata = CalibrationMetadata(metadata_folder or out_folder)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "if not karabo_id_control:\n",
+    "    karabo_id_control = karabo_id\n",
+    "g2ctrl = gotthard2lib.Gotthard2Ctrl(\n",
+    "    run_dc=RunDirectory(Path(in_folder) / f\"r{run_high:04d}\"),\n",
+    "    ctrl_src=ctrl_source_template.format(karabo_id_control, control_template))\n",
+    "gh2_detector = g2ctrl.get_det_type()\n",
+    "print(f\"Processing {gh2_detector} Gotthard2.\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mod_mapping = dict()\n",
+    "for fn in Path(metadata_folder or out_folder).glob(\"module_metadata_*.yml\"):\n",
+    "    with fn.open(\"r\") as fd:\n",
+    "        fdict = yaml.safe_load(fd)\n",
+    "        mod_mapping[fdict[\"module\"].replace(\"-\", \"/\")] = fdict[\"pdu\"]\n",
+    "\n",
+    "mod_mapping = dict(sorted(mod_mapping.items(), key=lambda item: item[0]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "plt_map = dict()\n",
+    "dark_constants = [\"BadPixelsDark\", \"Offset\", \"Noise\"]\n",
+    "if gh2_detector == \"25um\":\n",
+    "    for cname in dark_constants:\n",
+    "        plt_map[cname] = np.zeros(\n",
+    "            (1280 * 2, 2, 3),\n",
+    "            dtype=np.uint32 if cname == \"BadPixelsDark\" else np.float32\n",
+    "        )"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "for cname in dark_constants:\n",
+    "\n",
+    "    for i, (mod, pdu) in enumerate(mod_mapping.items()):\n",
+    "        module = mod.replace(\"-\", \"/\")\n",
+    "\n",
+    "        with h5py.File(out_folder / f\"const_{cname}_{pdu}.h5\", 'r') as f:\n",
+    "            if gh2_detector == \"25um\":\n",
+    "                plt_map[cname][i::2] = f[\"data\"][()]\n",
+    "            else:\n",
+    "                plt_map[cname] = f[\"data\"][()]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "if gh2_detector == \"50um\":\n",
+    "    title = (\n",
+    "        f\"{{}} data for \"\n",
+    "        f\"{[f'{mod}({pdu})' for mod, pdu in mod_mapping.items()]}\"\n",
+    "    )\n",
+    "else:\n",
+    "    title = (\n",
+    "        f\"Interleaved {{}} data for \"\n",
+    "        f\"{[f'{mod}({pdu})' for mod, pdu in mod_mapping.items()]}\"\n",
+    "    )\n",
+    "\n",
+    "for cname in dark_constants:\n",
+    "    display(Markdown(f\"### {cname}\"))\n",
+    "\n",
+    "    for cell in [0, 1]:\n",
+    "        fig, ax = plt.subplots(figsize=(10, 5))\n",
+    "        for g_idx in [0, 1, 2]:\n",
+    "            ax.plot(plt_map[cname][:, cell, g_idx], label=f\"G{g_idx} {cname} map\")\n",
+    "        ax.set_xticks(\n",
+    "            np.arange(0, plt_map[cname].shape[0]+1, plt_map[cname].shape[0]//16)\n",
+    "        )\n",
+    "        ax.set_xlabel(\"Stripes #\")\n",
+    "        ax.set_xlabel(cname)\n",
+    "        ax.set_title(title.format(f\"{cname} map - Cell {cell}\"))\n",
+    "        ax.legend()\n",
+    "        plt.show()"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": ".cal3_venv",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.11"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/xfel_calibrate/notebooks.py b/src/xfel_calibrate/notebooks.py
index 3d241b27e7f1d41050ce49b28be9823611d9040d..63231b4dff9c60cf7a62a808ef06b270da51e7a3 100644
--- a/src/xfel_calibrate/notebooks.py
+++ b/src/xfel_calibrate/notebooks.py
@@ -214,6 +214,8 @@ notebooks = {
         "DARK": {
             "notebook":
                 "notebooks/Gotthard2/Characterize_Darks_Gotthard2_NBC.ipynb",
+            "dep_notebooks": [
+                "notebooks/Gotthard2/Summary_Darks_Gotthard2_NBC.ipynb"],
             "concurrency": {"parameter": "karabo_da",
                             "default concurrency": list(range(2)),
                             "cluster cores": 4},