diff --git a/notebooks/LPD/LPDChar_Darks_NBC.ipynb b/notebooks/LPD/LPDChar_Darks_NBC.ipynb
index de76f651d6b3f713b3e96102a8dd793eb850a3d9..513ab120c02bf376878168d98380c0c4cae2293d 100644
--- a/notebooks/LPD/LPDChar_Darks_NBC.ipynb
+++ b/notebooks/LPD/LPDChar_Darks_NBC.ipynb
@@ -33,6 +33,7 @@
     "karabo_id = \"FXE_DET_LPD1M-1\" # karabo karabo_id\n",
     "karabo_da = ['-1']  # a list of data aggregators names, Default [-1] for selecting all data aggregators\n",
     "source_name = \"{}/DET/{}CH0:xtdf\"  # Source name for raw detector data - filled with karabo_id & module number\n",
+    "ctrl_src_template =  \"{}/COMP/FEM_MDL_COMP\"  # Control device source name template.\n",
     "\n",
     "use_dir_creation_date = True # use the creation date of the directory for database time derivation\n",
     "cal_db_interface = \"tcp://max-exfl-cal001:8015#8025\" # the database interface to use\n",
@@ -97,7 +98,10 @@
     "from extra_data import RunDirectory\n",
     "\n",
     "from cal_tools.enums import BadPixels\n",
-    "from cal_tools.lpdlib import make_cell_order_condition\n",
+    "from cal_tools.lpdlib import (\n",
+    "    make_cell_order_condition,\n",
+    "    sort_dark_runs_by_gain,\n",
+    ")\n",
     "from cal_tools.plotting import (\n",
     "    create_constant_overview,\n",
     "    plot_badpix_3d,\n",
@@ -131,7 +135,12 @@
     "max_cells = mem_cells\n",
     "cells = np.arange(max_cells)\n",
     "gain_names = ['High', 'Medium', 'Low']\n",
-    "    \n",
+    "# Check dark runs order and sort if needed.\n",
+    "run_nums = sort_dark_runs_by_gain(\n",
+    "    raw_folder=in_folder,\n",
+    "    runs=[run_high, run_med, run_low],\n",
+    "    ctrl_src=ctrl_src_template.format(karabo_id),\n",
+    ")\n",
     "if karabo_da[0] == '-1':\n",
     "    if modules[0] == -1:\n",
     "        modules = list(range(16))\n",
@@ -143,7 +152,7 @@
     "\n",
     "creation_time = None\n",
     "if use_dir_creation_date:\n",
-    "    creation_time = get_dir_creation_date(in_folder, run_high)\n",
+    "    creation_time = get_dir_creation_date(in_folder, run_nums[0])\n",
     "    print(\"Using {} as creation time\".format(creation_time))\n",
     "\n",
     "if inject_cell_order not in {'auto', 'always', 'never'}:\n",
@@ -157,7 +166,7 @@
     "print('CalDB Interface {}'.format(cal_db_interface))\n",
     "print(\"Proposal: {}\".format(prop))\n",
     "print(\"Memory cells: {}/{}\".format(mem_cells, max_cells))\n",
-    "print(\"Runs: {}, {}, {}\".format(run_high, run_med, run_low))\n",
+    "print(\"Runs: {}\".format(run_nums))\n",
     "print(\"Using DB: {}\".format(db_output))\n",
     "print(\"Input: {}\".format(in_folder))\n",
     "print(\"Output: {}\".format(out_folder))\n",
@@ -334,7 +343,7 @@
    "source": [
     "# Read report path and create file location tuple to add with the injection\n",
     "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
-    "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)\n",
+    "file_loc = 'proposal:{} runs:{}'.format(proposal, run_nums.split(\" \")) \n",
     "\n",
     "report = get_report(metadata_folder)"
    ]
diff --git a/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb b/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb
index a875f52a4c458590bbaae4c4fe3d08035628eab1..bb199451e4a785fb09b5062d487dcd25ca6b4196 100644
--- a/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb
+++ b/notebooks/LPDMini/LPD_Mini_Char_Darks_NBC.ipynb
@@ -88,7 +88,10 @@
     "\n",
     "from cal_tools.calcat_interface import CalCatApi\n",
     "from cal_tools.enums import BadPixels\n",
-    "from cal_tools.lpdlib import make_cell_order_condition\n",
+    "from cal_tools.lpdlib import (\n",
+    "    make_cell_order_condition,\n",
+    "    sort_dark_runs_by_gain,\n",
+    ")\n",
     "from cal_tools.plotting import plot_badpix_3d\n",
     "from cal_tools.restful_config import calibration_client\n",
     "from cal_tools.tools import (\n",
@@ -110,28 +113,35 @@
     "mem_cells = 512\n",
     "gain_names = ['High', 'Medium', 'Low']\n",
     "const_shape = (mem_cells, 32, 256, 3)  # cells, slow_scan, fast_scan, gain\n",
-    "    \n",
+    "\n",
+    "source_name = source_name.format(karabo_id)\n",
+    "control_source_name = control_source_name.format(karabo_id)\n",
+    "\n",
+    "# Check dark runs order and sort if needed.\n",
+    "run_nums = sort_dark_runs_by_gain(\n",
+    "    raw_folder=in_folder,\n",
+    "    runs=[run_high, run_med, run_low],\n",
+    "    ctrl_src=control_source_name.format(karabo_id),\n",
+    ")\n",
+    "\n",
     "gain_runs = {}\n",
     "if capacitor_setting == 5:\n",
-    "    gain_runs[\"high_5pf\"] = run_high\n",
-    "    gain_runs[\"med_5pf\"] =  run_med\n",
-    "    gain_runs[\"low_5pf\"] =  run_low\n",
+    "    gain_runs[\"high_5pf\"] = run_nums[0]\n",
+    "    gain_runs[\"med_5pf\"] =  run_nums[1]\n",
+    "    gain_runs[\"low_5pf\"] =  run_nums[2]\n",
     "elif capacitor_setting == 50:\n",
-    "    gain_runs[\"high_50pf\"] = run_high\n",
-    "    gain_runs[\"med_50pf\"] =  run_med\n",
-    "    gain_runs[\"low_50pf\"] =  run_low\n",
+    "    gain_runs[\"high_50pf\"] = run_nums[0]\n",
+    "    gain_runs[\"med_50pf\"] =  run_nums[1]\n",
+    "    gain_runs[\"low_50pf\"] =  run_nums[2]\n",
     "\n",
     "capacitor_settings = [capacitor_setting]\n",
     "capacitor_settings = ['{}pf'.format(c) for c in capacitor_settings]\n",
     "\n",
-    "creation_time = calcat_creation_time(in_folder, run_high, creation_time)\n",
+    "creation_time = calcat_creation_time(in_folder, run_nums[0], creation_time)\n",
     "print(f\"Using {creation_time} as creation time\")\n",
     "\n",
-    "source_name = source_name.format(karabo_id)\n",
-    "control_source_name = control_source_name.format(karabo_id)\n",
-    "\n",
     "if -1 in {bias_voltage_0, bias_voltage_1}:\n",
-    "    run_data = RunDirectory(os.path.join(in_folder, f\"r{run_high:04d}\"))\n",
+    "    run_data = RunDirectory(os.path.join(in_folder, f\"r{run_nums[0]:04d}\"))\n",
     "    if bias_voltage_0 == -1:\n",
     "        bias_voltage_0 = run_data[control_source_name, 'sensorBiasVoltage0'].as_single_value(atol=5.)\n",
     "    if bias_voltage_1 == -1:\n",
@@ -143,7 +153,7 @@
     "print(f'CalDB Interface {cal_db_interface}')\n",
     "print(f\"Proposal: {prop}\")\n",
     "print(f\"Memory cells: {mem_cells}\")\n",
-    "print(f\"Runs: {run_high}, {run_med}, {run_low}\")\n",
+    "print(f\"Runs: {run_nums}\")\n",
     "print(f\"Using DB: {db_output}\")\n",
     "print(f\"Input: {in_folder}\")\n",
     "print(f\"Output: {out_folder}\")\n",
@@ -331,7 +341,7 @@
    "source": [
     "# Read report path and create file location tuple to add with the injection\n",
     "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
-    "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)\n",
+    "file_loc = 'proposal:{} runs:{}'.format(proposal, run_nums.split(\" \"))\n",
     "\n",
     "report = get_report(metadata_folder)"
    ]
diff --git a/src/cal_tools/lpdlib.py b/src/cal_tools/lpdlib.py
index b61652b33005bf31e1838103c9d5fb59c2f889c9..9d6b19fe4643b542480fd998ffa65f0041c67fca 100644
--- a/src/cal_tools/lpdlib.py
+++ b/src/cal_tools/lpdlib.py
@@ -1,9 +1,12 @@
 import copy
+from logging import warning
+from pathlib import Path
 from typing import List, Optional, Tuple
 from warnings import warn
 
 import h5py
 import numpy as np
+from extra_data import RunDirectory
 from iCalibrationDB import Conditions, Constants, Detectors
 
 from cal_tools.enums import BadPixels
@@ -807,3 +810,41 @@ def make_cell_order_condition(use_param, cellid_pattern) -> Optional[str]:
         use = (use_param == 'always')
 
     return (",".join([str(c) for c in cellid_pattern]) + ",") if use else None
+
+
+def sort_sort_dark_runs_by_gain(raw_folder, runs, ctrl_src):
+    """Check gain factors [100, 10, 1] to decide,
+    if provided dark runs are in the correct order.
+    
+    Args:
+        raw_folder (Union[str, Path]): The raw data path.
+        runs (list): A list of 3 runs.
+        ctrl_src (str): The CTRL source to check `RUN/.../femAsicGain`.
+    Return:
+        (list): Sorted dark runs.
+    """
+    run_to_gain = dict()
+    expected_gain_factors = [100, 10, 1]
+    assert len(set(runs)) == 3, f"A list of {len(runs)} runs is provided, three different dark runs are expected." # noqa
+
+    for r in runs:
+        run_to_gain[r] = RunDirectory(
+            Path(raw_folder) / f"r{r:04d}").get_run_value(
+                ctrl_src, "femAsicGain")
+
+    if len(set(run_to_gain.values())) < 3:
+        raise ValueError(
+            f"Incorrect gain factors for the provided dark runs: {run_to_gain}."
+            f" The expected gain factors for these runs are {expected_gain_factors}.")
+
+    sorted_run_to_gain = dict(sorted(
+        run_to_gain.items(),
+        key=lambda x: expected_gain_factors.index(x[1])))
+
+    sorted_runs = list(sorted_run_to_gain.keys())
+    if list(run_to_gain.values()) != expected_gain_factors:
+        warning(
+            "Dark runs were incorrectly sorted and "
+            f"have now been corrected to: {sorted_runs}.")
+
+    return sorted_runs