From b547800068309e3cb6f891abb09260a27b4d644d Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wdconinc@gmail.com>
Date: Wed, 1 Feb 2023 20:37:07 +0000
Subject: [PATCH] feat: DIS: replace gaudirun with eicrecon

---
 .gitlab-ci.yml                                |   3 +
 benchmarks/backgrounds/synchrotron.sh         |  24 +-
 benchmarks/dis/analysis-only.sh               |   1 +
 benchmarks/dis/analysis/rec_analysis_ecal.cxx |  65 --
 benchmarks/dis/analysis/rec_analysis_hcal.cxx |  65 --
 benchmarks/dis/analysis/rec_analysis_raw.cxx  | 628 ------------------
 .../dis/analysis/truth_reconstruction.py      |  44 +-
 benchmarks/dis/config.yml                     |   2 +-
 benchmarks/dis/dis.sh                         |  90 +--
 benchmarks/dis/env.sh                         |   1 +
 benchmarks/dis/gen.sh                         |   1 +
 benchmarks/dis/get.sh                         |   1 +
 benchmarks/dvcs/dvcs.sh                       |  21 +-
 benchmarks/dvmp/dvmp.sh                       |  21 +-
 benchmarks/dvmp/env.sh                        |   1 +
 benchmarks/dvmp/gen.sh                        |   1 +
 benchmarks/single/analyze.sh                  |   1 +
 benchmarks/single/common.sh                   |   6 +-
 benchmarks/single/reconstruct.sh              |  23 +-
 benchmarks/single/simulate.sh                 |   1 +
 benchmarks/tcs/tcs.sh                         |  28 +-
 benchmarks/u_omega/u_omega.sh                 |  20 +-
 options/extra/reconstruction.ecal.py          | 231 -------
 options/extra/reconstruction.hcal.py          | 212 ------
 options/extra/reconstruction.raw.py           | 384 -----------
 25 files changed, 146 insertions(+), 1729 deletions(-)
 delete mode 100644 benchmarks/dis/analysis/rec_analysis_ecal.cxx
 delete mode 100644 benchmarks/dis/analysis/rec_analysis_hcal.cxx
 delete mode 100644 benchmarks/dis/analysis/rec_analysis_raw.cxx
 delete mode 100644 options/extra/reconstruction.ecal.py
 delete mode 100644 options/extra/reconstruction.hcal.py
 delete mode 100644 options/extra/reconstruction.raw.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 75181da0..05168885 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,8 @@
 image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
 
+variables:
+  RECO: "eicrecon"
+
 default:
   before_script:
     - source .local/bin/env.sh
diff --git a/benchmarks/backgrounds/synchrotron.sh b/benchmarks/backgrounds/synchrotron.sh
index 01c7a862..bae4ec73 100644
--- a/benchmarks/backgrounds/synchrotron.sh
+++ b/benchmarks/backgrounds/synchrotron.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 function print_the_help {
   echo "USAGE: ${0} [--rec] [--sim] [--ana] [--all] "
@@ -114,18 +115,23 @@ if [[ -n "${DO_SIM}" || -n "${DO_ALL}" ]] ; then
   fi
 fi
 
-### Step 3. Run the reconstruction (juggler)
+### Step 3. Run the reconstruction (eicrecon)
 if [[ -n "${DO_REC}" || -n "${DO_ALL}" ]] ; then
-  for rec in options/*.py ; do
-    unset tag
-    [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-    JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-      gaudirun.py ${rec}
+  if [ ${RECO} == "eicrecon" ] ; then
+    eicrecon ${JUGGLER_SIM_FILE} -Ppodio:output_file=${JUGGLER_REC_FILE}
     if [[ "$?" -ne "0" ]] ; then
+      echo "ERROR running eicrecon"
+      exit 1
+    fi
+  fi
+
+  if [[ ${RECO} == "juggler" ]] ; then
+    gaudirun.py options/reconstruction.py
+    if [ "$?" -ne "0" ] ; then
       echo "ERROR running juggler"
       exit 1
     fi
-  done
+  fi
 
   root_filesize=$(stat --format=%s "${JUGGLER_REC_FILE}")
   if [[ "${JUGGLER_N_EVENTS}" -lt "500" ]] ; then 
@@ -145,13 +151,13 @@ if [[ -n "${DO_ANA}" || -n "${DO_ALL}" ]] ; then
   mkdir -p results/synchrotron
 
   # here you can add as many scripts as you want.
-  root -b -q "benchmarks/synchrotron/analysis/synchrotron_sim.cxx+(\"${JUGGLER_SIM_FILE}\")"
+  root -b -q "benchmarks/backgrounds/analysis/synchrotron_sim.cxx+(\"${JUGGLER_SIM_FILE}\")"
   if [[ "$?" -ne "0" ]] ; then
     echo "ERROR running root script"
     exit 1
   fi
 
-  root -b -q "benchmarks/synchrotron/analysis/synchrotron_raw.cxx+(\"${JUGGLER_REC_FILE/.root/.raw.root}\")"
+  root -b -q "benchmarks/backgrounds/analysis/synchrotron_raw.cxx+(\"${JUGGLER_REC_FILE/.root/.raw.root}\")"
   if [[ "$?" -ne "0" ]] ; then
     echo "ERROR running root script"
     exit 1
diff --git a/benchmarks/dis/analysis-only.sh b/benchmarks/dis/analysis-only.sh
index 8c712a07..14589ad1 100755
--- a/benchmarks/dis/analysis-only.sh
+++ b/benchmarks/dis/analysis-only.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Run the DIS benchmarks in 5 steps:
diff --git a/benchmarks/dis/analysis/rec_analysis_ecal.cxx b/benchmarks/dis/analysis/rec_analysis_ecal.cxx
deleted file mode 100644
index 747bb0ab..00000000
--- a/benchmarks/dis/analysis/rec_analysis_ecal.cxx
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "common_bench/benchmark.h"
-#include "common_bench/mt.h"
-#include "common_bench/util.h"
-#include "common_bench/plot.h"
-
-#include <cmath>
-#include <fstream>
-#include <iostream>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <utility>
-
-#include "ROOT/RDataFrame.hxx"
-#include <TH1D.h>
-#include <TFitResult.h>
-#include <TRandom3.h>
-#include <TCanvas.h>
-
-#include "fmt/color.h"
-#include "fmt/core.h"
-
-#include "nlohmann/json.hpp"
-#include "edm4eic/CalorimeterHitData.h"
-#include "edm4eic/ClusterData.h"
-
-int rec_analysis_ecal(const std::string& config_name)
-{
-  // read our configuration
-  std::ifstream  config_file{config_name};
-  nlohmann::json config;
-  config_file >> config;
-
-  const std::string rec_file      = config["rec_file"];
-  const std::string detector      = config["detector"];
-  const std::string output_prefix = config["output_prefix"];
-  const std::string test_tag      = config["test_tag"];
-  const int ebeam                 = config["ebeam"];
-  const int pbeam                 = config["pbeam"];
-
-  fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green),
-             "Running DIS electron analysis...\n");
-  fmt::print(" - Detector package: {}\n", detector);
-  fmt::print(" - input file: {}\n", rec_file);
-  fmt::print(" - output prefix: {}\n", output_prefix);
-  fmt::print(" - test tag: {}\n", test_tag);
-  fmt::print(" - ebeam: {}\n", ebeam);
-  fmt::print(" - pbeam: {}\n", pbeam);
-
-  // create our test definition
-  // test_tag
-  common_bench::Test dis_Q2_resolution{
-      {{"name", fmt::format("{}_Q2_resolution", test_tag)},
-       {"title", "DIS Q2 resolution"},
-       {"description",
-        fmt::format("DIS Q2 resolution with {}, estimated using a Gaussian fit.", detector)},
-       {"quantity", "resolution (in %)"},
-       {"target", "0.1"}}};
-
-  // Run this in multi-threaded mode if desired
-  ROOT::EnableImplicitMT(kNumThreads);
-  ROOT::RDataFrame d("events", rec_file);
-
-  return 0;
-}
diff --git a/benchmarks/dis/analysis/rec_analysis_hcal.cxx b/benchmarks/dis/analysis/rec_analysis_hcal.cxx
deleted file mode 100644
index c2bf3b5c..00000000
--- a/benchmarks/dis/analysis/rec_analysis_hcal.cxx
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "common_bench/benchmark.h"
-#include "common_bench/mt.h"
-#include "common_bench/util.h"
-#include "common_bench/plot.h"
-
-#include <cmath>
-#include <fstream>
-#include <iostream>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <utility>
-
-#include "ROOT/RDataFrame.hxx"
-#include <TH1D.h>
-#include <TFitResult.h>
-#include <TRandom3.h>
-#include <TCanvas.h>
-
-#include "fmt/color.h"
-#include "fmt/core.h"
-
-#include "nlohmann/json.hpp"
-#include "edm4eic/CalorimeterHitData.h"
-#include "edm4eic/ClusterData.h"
-
-int rec_analysis_hcal(const std::string& config_name)
-{
-  // read our configuration
-  std::ifstream  config_file{config_name};
-  nlohmann::json config;
-  config_file >> config;
-
-  const std::string rec_file      = config["rec_file"];
-  const std::string detector      = config["detector"];
-  const std::string output_prefix = config["output_prefix"];
-  const std::string test_tag      = config["test_tag"];
-  const int ebeam                 = config["ebeam"];
-  const int pbeam                 = config["pbeam"];
-
-  fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green),
-             "Running DIS electron analysis...\n");
-  fmt::print(" - Detector package: {}\n", detector);
-  fmt::print(" - input file: {}\n", rec_file);
-  fmt::print(" - output prefix: {}\n", output_prefix);
-  fmt::print(" - test tag: {}\n", test_tag);
-  fmt::print(" - ebeam: {}\n", ebeam);
-  fmt::print(" - pbeam: {}\n", pbeam);
-
-  // create our test definition
-  // test_tag
-  common_bench::Test dis_Q2_resolution{
-      {{"name", fmt::format("{}_Q2_resolution", test_tag)},
-       {"title", "DIS Q2 resolution"},
-       {"description",
-        fmt::format("DIS Q2 resolution with {}, estimated using a Gaussian fit.", detector)},
-       {"quantity", "resolution (in %)"},
-       {"target", "0.1"}}};
-
-  // Run this in multi-threaded mode if desired
-  ROOT::EnableImplicitMT(kNumThreads);
-  ROOT::RDataFrame d("events", rec_file);
-
-  return 0;
-}
diff --git a/benchmarks/dis/analysis/rec_analysis_raw.cxx b/benchmarks/dis/analysis/rec_analysis_raw.cxx
deleted file mode 100644
index decd143f..00000000
--- a/benchmarks/dis/analysis/rec_analysis_raw.cxx
+++ /dev/null
@@ -1,628 +0,0 @@
-#include "common_bench/benchmark.h"
-#include "common_bench/mt.h"
-#include "common_bench/util.h"
-#include "common_bench/plot.h"
-
-#include <cmath>
-#include <fstream>
-#include <iostream>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <utility>
-
-#include "ROOT/RDataFrame.hxx"
-#include <TH1D.h>
-#include <TFitResult.h>
-#include <TRandom3.h>
-#include <TCanvas.h>
-
-#include "fmt/color.h"
-#include "fmt/core.h"
-
-#include "nlohmann/json.hpp"
-#include "edm4eic/RawCalorimeterHitData.h"
-
-int rec_analysis_raw(const std::string& config_name)
-{
-  // read our configuration
-  std::ifstream  config_file{config_name};
-  nlohmann::json config;
-  config_file >> config;
-
-  const std::string rec_file      = config["rec_file"];
-  const std::string detector      = config["detector"];
-  const std::string output_prefix = config["output_prefix"];
-  const std::string test_tag      = config["test_tag"];
-  const int ebeam                 = config["ebeam"];
-  const int pbeam                 = config["pbeam"];
-
-  fmt::print(fmt::emphasis::bold | fg(fmt::color::forest_green),
-             "Running DIS electron analysis...\n");
-  fmt::print(" - Detector package: {}\n", detector);
-  fmt::print(" - input file: {}\n", rec_file);
-  fmt::print(" - output prefix: {}\n", output_prefix);
-  fmt::print(" - test tag: {}\n", test_tag);
-  fmt::print(" - ebeam: {}\n", ebeam);
-  fmt::print(" - pbeam: {}\n", pbeam);
-
-  // Run this in multi-threaded mode if desired
-  ROOT::EnableImplicitMT(kNumThreads);
-  ROOT::RDataFrame d("events", rec_file);
-
-  auto d0 = ROOT::RDF::RNode(d
-    .Define("n_EcalEndcapPRawHits",       "EcalEndcapPRawHits.size()")
-    .Define("n_EcalEndcapNRawHits",       "EcalEndcapNRawHits.size()")
-    .Define("n_HcalEndcapPRawHits",       "HcalEndcapPRawHits.size()")
-    .Define("n_HcalBarrelRawHits",        "HcalBarrelRawHits.size()")
-    .Define("n_HcalEndcapNRawHits",       "HcalEndcapNRawHits.size()")
-//    .Define("n_B0PreshowerRawHits",       "B0TrackerRawHits.size()")
-//    .Define("n_B0TrackerRawHits",         "B0TrackerRawHits.size()")
-    .Define("n_DRICHRawHits",             "DRICHRawHits.size()")
-//    .Define("n_ERICHRawHits",             "ERICHRawHits.size()")
-//    .Define("n_FakeDIRCRawHits",          "FakeDIRCRawHits.size()")
-//    .Define("n_ffi_ZDC_ECALRawHits",      "ffi_ZDC_ECALRawHits.size()")
-//    .Define("n_ffi_ZDC_HCALRawHits",      "ffi_ZDC_HCALRawHits.size()")
-//    .Define("n_ForwardOffMTracker_station_1RawHits", "ForwardOffMTracker_station_1RawHits.size()")
-//    .Define("n_ForwardOffMTracker_station_2RawHits", "ForwardOffMTracker_station_2RawHits.size()")
-//    .Define("n_ForwardOffMTracker_station_3RawHits", "ForwardOffMTracker_station_3RawHits.size()")
-//    .Define("n_ForwardOffMTracker_station_4RawHits", "ForwardOffMTracker_station_4RawHits.size()")
-//    .Define("n_ForwardRomanPot_Station_1RawHits", "ForwardRomanPot_Status_1RawHits.size()")
-//    .Define("n_ForwardRomanPot_Station_2RawHits", "ForwardRomanPot_Status_2RawHits.size()")
-//    .Define("n_GEMEndcapNRawHits", "GEMEndcapNRawHits.size()")
-//    .Define("n_GEMEndcapPRawHits", "GEMEndcapPRawHits.size()")
-//    .Define("n_InnerTrackerBarrelRawHits", "InnerTrackerBarrelRawHits.size()")
-//    .Define("n_InnerTrackerEndcapNRawHits", "InnerTrackerEndcapNRawHits.size()")
-//    .Define("n_InnerTrackerEndcapPRawHits", "InnerTrackerEndcapPRawHits.size()")
-//    .Define("n_MedialTrackerBarrelRawHits", "MedialTrackerBarrelRawHits.size()")
-//    .Define("n_MedialTrackerEndcapNRawHits", "MedialTrackerEndcapNRawHits.size()")
-//    .Define("n_MedialTrackerEndcapPRawHits", "MedialTrackerEndcapPRawHits.size()")
-//    .Define("n_OuterTrackerBarrelRawHits", "OuterTrackerBarrelRawHits.size()")
-//    .Define("n_OuterTrackerEndcapNRawHits", "OuterTrackerEndcapNRawHits.size()")
-//    .Define("n_OuterTrackerEndcapPRawHits", "OuterTrackerEndcapPRawHits.size()")
-    .Define("n_VertexBarrelRawHits", "VertexBarrelRawHits.size()")
-  );
-
-  if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-    d0 = d0.Define("n_EcalBarrelImagingRawHits", "EcalBarrelImagingRawHits.size()")
-           .Define("n_EcalBarrelScFiRawHits",    "EcalBarrelScFiRawHits.size()");
-  } else {
-    d0 = d0.Define("n_EcalBarrelSciGlassRawHits", "EcalBarrelSciGlassRawHits.size()");
-  }
-
-  // Ecal hits
-  auto h_n_EcalEndcapPRawHits = d0.Histo1D({"h_n_EcalEndcapPRawHits", "EcalEndcapP; hits; counts", 100, 0, 1000}, "n_EcalEndcapPRawHits");
-  ROOT::RDF::RResultPtr<TH1D> h_n_EcalBarrelImagingRawHits, h_n_EcalBarrelScFiRawHits, h_n_EcalBarrelSciGlassRawHits;
-  if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-    h_n_EcalBarrelImagingRawHits = d0.Histo1D({"h_n_EcalBarrelImagingRawHits", "EcalBarrelImaging; hits; counts", 100, 0, 1000}, "n_EcalBarrelImagingRawHits");
-    h_n_EcalBarrelScFiRawHits = d0.Histo1D({"h_n_EcalBarrelScFiRawHits", "EcalBarrelScFi; hits; counts", 100, 0, 10000}, "n_EcalBarrelScFiRawHits");
-  } else {
-    h_n_EcalBarrelSciGlassRawHits = d0.Histo1D({"h_n_EcalBarrelSciGlassRawHits", "EcalBarrelSciGlas; hits; counts", 100, 0, 1000}, "n_EcalBarrelSciGlassRawHits");
-  }
-  auto h_n_EcalEndcapNRawHits = d0.Histo1D({"h_n_EcalEndcapNRawHits", "EcalEndcapN; hits; counts", 100, 0, 1000}, "n_EcalEndcapNRawHits");
-  // Ecal stats
-  auto stats_n_EcalEndcapPRawHits = d0.Stats("n_EcalEndcapPRawHits");
-  ROOT::RDF::RResultPtr<TStatistic> stats_n_EcalBarrelImagingRawHits, stats_n_EcalBarrelScFiRawHits, stats_n_EcalBarrelSciGlassRawHits;
-  if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-    stats_n_EcalBarrelImagingRawHits = d0.Stats("n_EcalBarrelImagingRawHits");
-    stats_n_EcalBarrelScFiRawHits = d0.Stats("n_EcalBarrelScFiRawHits");
-  } else {
-    stats_n_EcalBarrelSciGlassRawHits = d0.Stats("n_EcalBarrelSciGlassRawHits");
-  }
-  auto stats_n_EcalEndcapNRawHits = d0.Stats("n_EcalEndcapNRawHits");
-  // Ecal adc
-  auto h_adc_EcalEndcapPRawHits = d0.Histo1D({"h_adc_EcalEndcapPRawHits", "EcalEndcapP; amplitude; counts", 1024, 0, 32768}, "EcalEndcapPRawHits.amplitude");
-  ROOT::RDF::RResultPtr<TH1D> h_adc_EcalBarrelImagingRawHits, h_adc_EcalBarrelScFiRawHits, h_adc_EcalBarrelSciGlassRawHits;
-  if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-    h_adc_EcalBarrelImagingRawHits = d0.Histo1D({"h_adc_EcalBarrelImagingRawHits", "EcalBarrelImaging; amplitude; counts", 1024, 0, 8192}, "EcalBarrelImagingRawHits.amplitude");
-    h_adc_EcalBarrelScFiRawHits = d0.Histo1D({"h_adc_EcalBarrelScFiRawHits", "EcalBarrelScFi; amplitude; counts", 1024, 0, 32768}, "EcalBarrelScFiRawHits.amplitude");
-  } else {
-    h_adc_EcalBarrelSciGlassRawHits = d0.Histo1D({"h_adc_EcalBarrelSciGlassRawHits", "EcalBarrel; amplitude; counts", 1024, 0, 32768}, "EcalBarrelSciGlassRawHits.amplitude");
-  }
-  auto h_adc_EcalEndcapNRawHits = d0.Histo1D({"h_adc_EcalEndcapNRawHits", "EcalEndcapN; amplitude; counts", 1024, 0, 32768}, "EcalEndcapNRawHits.amplitude");
-  // Ecal tdc
-  auto h_tdc_EcalEndcapPRawHits = d0.Histo1D({"h_tdc_EcalEndcapPRawHits", "EcalEndcapP; TDC channel; counts", 1024, 0, 32768}, "EcalEndcapPRawHits.timeStamp");
-  ROOT::RDF::RResultPtr<TH1D> h_tdc_EcalBarrelImagingRawHits, h_tdc_EcalBarrelScFiRawHits, h_tdc_EcalBarrelSciGlassRawHits;
-  if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-    h_tdc_EcalBarrelImagingRawHits = d0.Histo1D({"h_tdc_EcalBarrelImagingRawHits", "EcalBarrelImaging; TDC channel; counts", 1024, 0, 32768}, "EcalBarrelImagingRawHits.timeStamp");
-    h_tdc_EcalBarrelScFiRawHits = d0.Histo1D({"h_tdc_EcalBarrelScFiRawHits", "EcalBarrelScFi; TDC channel; counts", 1024, 0, 32768}, "EcalBarrelScFiRawHits.timeStamp");
-  } else {
-    h_tdc_EcalBarrelSciGlassRawHits = d0.Histo1D({"h_tdc_EcalBarrelSciGlassRawHits", "EcalBarrel; TDC channel; counts", 1024, 0, 32768}, "EcalBarrelSciGlassRawHits.timeStamp");
-  }
-  auto h_tdc_EcalEndcapNRawHits = d0.Histo1D({"h_tdc_EcalEndcapNRawHits", "EcalEndcapN; TDC channel; counts", 1024, 0, 32768}, "EcalEndcapNRawHits.timeStamp");
-  // Hcal hits
-  auto h_n_HcalEndcapPRawHits = d0.Histo1D({"h_n_HcalEndcapPRawHits", "HcalEndcapP; hits; counts", 100, 0, 1000}, "n_HcalEndcapPRawHits");
-  auto h_n_HcalBarrelRawHits  = d0.Histo1D({"h_n_HcalBarrelRawHits",  "HcalBarrel; hits; counts", 100, 0, 1000}, "n_HcalBarrelRawHits");
-  auto h_n_HcalEndcapNRawHits = d0.Histo1D({"h_n_HcalEndcapNRawHits", "HcalEndcapN; hits; counts", 100, 0, 1000}, "n_HcalEndcapNRawHits");
-  // Hcal stats
-  auto stats_n_HcalEndcapPRawHits = d0.Stats("n_HcalEndcapPRawHits");
-  auto stats_n_HcalBarrelRawHits  = d0.Stats("n_HcalBarrelRawHits");
-  auto stats_n_HcalEndcapNRawHits = d0.Stats("n_HcalEndcapNRawHits");
-  // Hcal adc
-  auto h_adc_HcalEndcapPRawHits = d0.Histo1D({"h_adc_HcalEndcapPRawHits", "HcalEndcapP; hits; counts", 1024, 0, 32768}, "HcalEndcapPRawHits.amplitude");
-  auto h_adc_HcalBarrelRawHits  = d0.Histo1D({"h_adc_HcalBarrelRawHits",  "HcalBarrel; hits; counts", 1024, 0, 32768}, "HcalBarrelRawHits.amplitude");
-  auto h_adc_HcalEndcapNRawHits = d0.Histo1D({"h_adc_HcalEndcapNRawHits", "HcalEndcapN; hits; counts", 1024, 0, 32768}, "HcalEndcapNRawHits.amplitude");
-  // Hcal tdc
-  auto h_tdc_HcalEndcapPRawHits = d0.Histo1D({"h_tdc_HcalEndcapPRawHits", "HcalEndcapP; TDC channel; counts", 1024, 0, 32768}, "HcalEndcapPRawHits.timeStamp");
-  auto h_tdc_HcalBarrelRawHits  = d0.Histo1D({"h_tdc_HcalBarrelRawHits",  "HcalBarrel; TDC channel; counts", 1024, 0, 32768}, "HcalBarrelRawHits.timeStamp");
-  auto h_tdc_HcalEndcapNRawHits = d0.Histo1D({"h_tdc_HcalEndcapNRawHits", "HcalEndcapN; TDC channel; counts", 1024, 0, 32768}, "HcalEndcapNRawHits.timeStamp");
-
-  // other detector stats
-  //auto stats_n_B0PreshowerRawHits = d0.Stats("n_B0PreshowerRawHits");
-  //auto stats_n_B0TrackerRawHits = d0.Stats("n_B0TrackerRawHits");
-  auto stats_n_DRICHRawHits = d0.Stats("n_DRICHRawHits");
- // auto stats_n_ERICHRawHits = d0.Stats("n_ERICHRawHits");
-  //auto stats_n_FakeDIRCRawHits = d0.Stats("n_FakeDIRCRawHits");
-  //auto stats_n_ffi_ZDC_ECALRawHits = d0.Stats("n_ffi_ZDC_ECALRawHits");
-  //auto stats_n_ffi_ZDC_HCALRawHits = d0.Stats("n_ffi_ZDC_HCALRawHits");
-  //auto stats_n_ForwardOffMTracker_station_1RawHits = d0.Stats("n_ForwardOffMTracker_station_1RawHits");
-  //auto stats_n_ForwardOffMTracker_station_2RawHits = d0.Stats("n_ForwardOffMTracker_station_2RawHits");
-  //auto stats_n_ForwardOffMTracker_station_3RawHits = d0.Stats("n_ForwardOffMTracker_station_3RawHits");
-  //auto stats_n_ForwardOffMTracker_station_4RawHits = d0.Stats("n_ForwardOffMTracker_station_4RawHits");
-  //auto stats_n_ForwardRomanPot_Station_1RawHits = d0.Stats("n_ForwardRomanPot_Station_1RawHits");
-  //auto stats_n_ForwardRomanPot_Station_2RawHits = d0.Stats("n_ForwardRomanPot_Station_2RawHits");
-  //auto stats_n_GEMEndcapNRawHits = d0.Stats("n_GEMEndcapNRawHits");
-  //auto stats_n_GEMEndcapPRawHits = d0.Stats("n_GEMEndcapPRawHits");
-  //auto stats_n_InnerTrackerBarrelRawHits = d0.Stats("n_InnerTrackerBarrelRawHits");
-  //auto stats_n_InnerTrackerEndcapNRawHits = d0.Stats("n_InnerTrackerEndcapNRawHits");
-  //auto stats_n_InnerTrackerEndcapPRawHits = d0.Stats("n_InnerTrackerEndcapPRawHits");
-  //auto stats_n_MedialTrackerBarrelRawHits = d0.Stats("n_MedialTrackerBarrelRawHits");
-  //auto stats_n_MedialTrackerEndcapNRawHits = d0.Stats("n_MedialTrackerEndcapNRawHits");
-  //auto stats_n_MedialTrackerEndcapPRawHits = d0.Stats("n_MedialTrackerEndcapPRawHits");
-  //auto stats_n_OuterTrackerBarrelRawHits = d0.Stats("n_OuterTrackerBarrelRawHits");
-  //auto stats_n_OuterTrackerEndcapNRawHits = d0.Stats("n_OuterTrackerEndcapNRawHits");
-  //auto stats_n_OuterTrackerEndcapPRawHits = d0.Stats("n_OuterTrackerEndcapPRawHits");
-  auto stats_n_VertexBarrelRawHits = d0.Stats("n_VertexBarrelRawHits");
-
-  fmt::print("EcalEndcapPRawHits:");
-  stats_n_EcalEndcapPRawHits->Print();
-  if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-    fmt::print("EcalBarrelImagingRawHits:");
-    stats_n_EcalBarrelImagingRawHits->Print();
-    fmt::print("EcalBarrelScFiRawHits:");
-    stats_n_EcalBarrelScFiRawHits->Print();
-  } else {
-    fmt::print("EcalBarrelSciGlassRawHits:");
-    stats_n_EcalBarrelSciGlassRawHits->Print();
-  }
-  fmt::print("EcalEndcapNRawHits:");
-  stats_n_EcalEndcapNRawHits->Print();
-  fmt::print("HcalEndcapPRawHits:");
-  stats_n_HcalEndcapPRawHits->Print();
-  fmt::print("HcalBarrelRawHits:");
-  stats_n_HcalBarrelRawHits->Print();
-  fmt::print("HcalEndcapNRawHits:");
-  stats_n_HcalEndcapNRawHits->Print();
-
-  // other detector stats
-  //fmt::print("B0PreshowerRawHits:");
-  //stats_n_B0PreshowerRawHits->Print();
-  //fmt::print("B0TrackerRawHits:");
-  //stats_n_B0TrackerRawHits->Print();
-  fmt::print("n_DRICHRawHits:");
-  stats_n_DRICHRawHits->Print();
-  //fmt::print("n_ERICHRawHits:");
- // stats_n_ERICHRawHits->Print();
-  //fmt::print("n_FakeDIRCRawHits:");
-  //stats_n_FakeDIRCRawHits->Print();
-  //fmt::print("n_ffi_ZDC_ECALRawHits:");
-  //stats_n_ffi_ZDC_ECALRawHits->Print();
-  //fmt::print("n_ffi_ZDC_HCALRawHits:");
-  //stats_n_ffi_ZDC_HCALRawHits->Print();
-  //fmt::print("n_ForwardOffMTracker_station_1RawHits:");
-  //stats_n_ForwardOffMTracker_station_1RawHits->Print();
-  //fmt::print("n_ForwardOffMTracker_station_2RawHits:");
-  //stats_n_ForwardOffMTracker_station_2RawHits->Print();
-  //fmt::print("n_ForwardOffMTracker_station_3RawHits:");
-  //stats_n_ForwardOffMTracker_station_3RawHits->Print();
-  //fmt::print("n_ForwardOffMTracker_station_4RawHits:");
-  //stats_n_ForwardOffMTracker_station_4RawHits->Print();
-  //fmt::print("n_ForwardOffMTracker_station_1RawHits:");
-  //stats_n_ForwardRomanPot_Station_1RawHits->Print();
-  //fmt::print("n_ForwardOffMTracker_station_2RawHits:");
-  //stats_n_ForwardRomanPot_Station_2RawHits->Print();
-  //fmt::print("n_GEMEndcapNRawHits:");
-  //stats_n_GEMEndcapNRawHits->Print();
-  //fmt::print("n_GEMEndcapPRawHits:");
-  //stats_n_GEMEndcapPRawHits->Print();
-  //fmt::print("n_InnerTrackerBarrelRawHits:");
-  //stats_n_InnerTrackerBarrelRawHits->Print();
-  //fmt::print("n_InnerTrackerEndcapNRawHits:");
-  //stats_n_InnerTrackerEndcapNRawHits->Print();
-  //fmt::print("n_InnerTrackerEndcapPRawHits:");
-  //stats_n_InnerTrackerEndcapPRawHits->Print();
-  //fmt::print("n_MedialTrackerBarrelRawHits:");
-  //stats_n_MedialTrackerBarrelRawHits->Print();
-  //fmt::print("n_MedialTrackerEndcapNRawHits:");
-  //stats_n_MedialTrackerEndcapNRawHits->Print(); 
-  //fmt::print("n_MedialTrackerEndcapPRawHits:");
-  //stats_n_MedialTrackerEndcapPRawHits->Print();
-  //fmt::print("n_OuterTrackerBarrelRawHits:");   
-  //stats_n_OuterTrackerBarrelRawHits->Print();
-  //fmt::print("n_OuterTrackerEndcapNRawHits:");
-  //stats_n_OuterTrackerEndcapNRawHits->Print(); 
-  //fmt::print("n_OuterTrackerEndcapPRawHits:");
-  //->Print();
-  fmt::print("n_VertexBarrelRawHits:");
-  stats_n_VertexBarrelRawHits->Print(); 
-  
-  gStyle->SetOptTitle(kTRUE);
-
-  // Ecal nhits
-  {
-    TCanvas c("c", "c", 1200, 1200);
-    c.Divide(2,2);
-
-    c.cd(1);
-    gPad->SetLogy(true);
-    auto& h1 = *h_n_EcalEndcapPRawHits;
-    // histogram style
-    h1.SetLineColor(common_bench::plot::kMpBlue);
-    h1.SetLineWidth(2);
-    // axes
-    h1.GetXaxis()->CenterTitle();
-    h1.GetYaxis()->CenterTitle();
-    // draw everything
-    h1.DrawClone("hist");
-
-    c.cd(2);
-    gPad->SetLogy(true);
-    auto& h2 = *h_n_EcalEndcapNRawHits;
-    // histogram style
-    h2.SetLineColor(common_bench::plot::kMpBlue);
-    h2.SetLineWidth(2);
-    // axes
-    h2.GetXaxis()->CenterTitle();
-    h2.GetYaxis()->CenterTitle();
-    // draw everything
-    h2.DrawClone("hist");
-    common_bench::plot::draw_label(ebeam, pbeam, detector);
-
-    if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-      c.cd(3);
-      gPad->SetLogy(true);
-      auto& h3 = *h_n_EcalBarrelImagingRawHits;
-      // histogram style
-      h3.SetLineColor(common_bench::plot::kMpBlue);
-      h3.SetLineWidth(2);
-      // axes
-      h3.GetXaxis()->CenterTitle();
-      h3.GetYaxis()->CenterTitle();
-      // draw everything
-      h3.DrawClone("hist");
-
-      c.cd(4);
-      gPad->SetLogy(true);
-      auto& h4 = *h_n_EcalBarrelScFiRawHits;
-      // histogram style
-      h4.SetLineColor(common_bench::plot::kMpBlue);
-      h4.SetLineWidth(2);
-      // axes
-      h4.GetXaxis()->CenterTitle();
-      h4.GetYaxis()->CenterTitle();
-      // draw everything
-      h4.DrawClone("hist");
-
-    } else {
-      c.cd(3);
-      gPad->SetLogy(true);
-      auto& h3 = *h_n_EcalBarrelSciGlassRawHits;
-      // histogram style
-      h3.SetLineColor(common_bench::plot::kMpBlue);
-      h3.SetLineWidth(2);
-      // axes
-      h3.GetXaxis()->CenterTitle();
-      h3.GetYaxis()->CenterTitle();
-      // draw everything
-      h3.DrawClone("hist");
-    }
-
-    c.Print(fmt::format("{}_EcalRawHits_n.png", output_prefix).c_str());
-  }
-
-  // Ecal adc
-  {
-    TCanvas c("c", "c", 1200, 1200);
-    c.Divide(2,2);
-
-    c.cd(1);
-    gPad->SetLogy(true);
-    auto& h1 = *h_adc_EcalEndcapPRawHits;
-    // histogram style
-    h1.SetLineColor(common_bench::plot::kMpBlue);
-    h1.SetLineWidth(2);
-    // axes
-    h1.GetXaxis()->CenterTitle();
-    h1.GetYaxis()->CenterTitle();
-    // draw everything
-    h1.DrawClone("hist");
-
-    c.cd(2);
-    gPad->SetLogy(true);
-    auto& h2 = *h_adc_EcalEndcapNRawHits;
-    // histogram style
-    h2.SetLineColor(common_bench::plot::kMpBlue);
-    h2.SetLineWidth(2);
-    // axes
-    h2.GetXaxis()->CenterTitle();
-    h2.GetYaxis()->CenterTitle();
-    // draw everything
-    h2.DrawClone("hist");
-    common_bench::plot::draw_label(ebeam, pbeam, detector);
-
-    if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-      c.cd(3);
-      gPad->SetLogy(true);
-      auto& h3 = *h_adc_EcalBarrelImagingRawHits;
-      // histogram style
-      h3.SetLineColor(common_bench::plot::kMpBlue);
-      h3.SetLineWidth(2);
-      // axes
-      h3.GetXaxis()->CenterTitle();
-      h3.GetYaxis()->CenterTitle();
-      // draw everything
-      h3.DrawClone("hist");
-
-      c.cd(4);
-      gPad->SetLogy(true);
-      auto& h4 = *h_adc_EcalBarrelScFiRawHits;
-      // histogram style
-      h4.SetLineColor(common_bench::plot::kMpBlue);
-      h4.SetLineWidth(2);
-      // axes
-      h4.GetXaxis()->CenterTitle();
-      h4.GetYaxis()->CenterTitle();
-      // draw everything
-      h4.DrawClone("hist");
-
-    } else {
-      c.cd(3);
-      gPad->SetLogy(true);
-      auto& h3 = *h_adc_EcalBarrelSciGlassRawHits;
-      // histogram style
-      h3.SetLineColor(common_bench::plot::kMpBlue);
-      h3.SetLineWidth(2);
-      // axes
-      h3.GetXaxis()->CenterTitle();
-      h3.GetYaxis()->CenterTitle();
-      // draw everything
-      h3.DrawClone("hist");
-    }
-
-    c.Print(fmt::format("{}_EcalRawHits_adc.png", output_prefix).c_str());
-  }
-
-
-  // Ecal tdc
-  {
-    TCanvas c("c", "c", 1200, 1200);
-    c.Divide(2,2);
-
-    c.cd(1);
-    gPad->SetLogy(true);
-    auto& h1 = *h_tdc_EcalEndcapPRawHits;
-    // histogram style
-    h1.SetLineColor(common_bench::plot::kMpBlue);
-    h1.SetLineWidth(2);
-    // axes
-    h1.GetXaxis()->CenterTitle();
-    h1.GetYaxis()->CenterTitle();
-    // draw everything
-    h1.DrawClone("hist");
-
-    c.cd(2);
-    gPad->SetLogy(true);
-    auto& h2 = *h_tdc_EcalEndcapNRawHits;
-    // histogram style
-    h2.SetLineColor(common_bench::plot::kMpBlue);
-    h2.SetLineWidth(2);
-    // axes
-    h2.GetXaxis()->CenterTitle();
-    h2.GetYaxis()->CenterTitle();
-    // draw everything
-    h2.DrawClone("hist");
-    common_bench::plot::draw_label(ebeam, pbeam, detector);
-
-    if (d0.HasColumn("EcalBarrelScFiRawHits")) {
-      c.cd(3);
-      gPad->SetLogy(true);
-      auto& h3 = *h_tdc_EcalBarrelImagingRawHits;
-      // histogram style
-      h3.SetLineColor(common_bench::plot::kMpBlue);
-      h3.SetLineWidth(2);
-      // axes
-      h3.GetXaxis()->CenterTitle();
-      h3.GetYaxis()->CenterTitle();
-      // draw everything
-      h3.DrawClone("hist");
-
-      c.cd(4);
-      gPad->SetLogy(true);
-      auto& h4 = *h_tdc_EcalBarrelScFiRawHits;
-      // histogram style
-      h4.SetLineColor(common_bench::plot::kMpBlue);
-      h4.SetLineWidth(2);
-      // axes
-      h4.GetXaxis()->CenterTitle();
-      h4.GetYaxis()->CenterTitle();
-      // draw everything
-      h4.DrawClone("hist");
-
-    } else {
-      c.cd(3);
-      gPad->SetLogy(true);
-      auto& h3 = *h_tdc_EcalBarrelSciGlassRawHits;
-      // histogram style
-      h3.SetLineColor(common_bench::plot::kMpBlue);
-      h3.SetLineWidth(2);
-      // axes
-      h3.GetXaxis()->CenterTitle();
-      h3.GetYaxis()->CenterTitle();
-      // draw everything
-      h3.DrawClone("hist");
-    }
-
-    c.Print(fmt::format("{}_EcalRawHits_tdc.png", output_prefix).c_str());
-  }
-
-  // Hcal nhits
-  {
-    TCanvas c("c", "c", 1200, 1200);
-    c.Divide(2,2);
-
-    c.cd(1);
-    gPad->SetLogy(true);
-    auto& h1 = *h_n_HcalEndcapPRawHits;
-    // histogram style
-    h1.SetLineColor(common_bench::plot::kMpBlue);
-    h1.SetLineWidth(2);
-    // axes
-    h1.GetXaxis()->CenterTitle();
-    h1.GetYaxis()->CenterTitle();
-    // draw everything
-    h1.DrawClone("hist");
-
-    c.cd(2);
-    gPad->SetLogy(true);
-    auto& h2 = *h_n_HcalEndcapNRawHits;
-    // histogram style
-    h2.SetLineColor(common_bench::plot::kMpBlue);
-    h2.SetLineWidth(2);
-    // axes
-    h2.GetXaxis()->CenterTitle();
-    h2.GetYaxis()->CenterTitle();
-    // draw everything
-    h2.DrawClone("hist");
-    common_bench::plot::draw_label(ebeam, pbeam, detector);
-
-    c.cd(3);
-    gPad->SetLogy(true);
-    auto& h3 = *h_n_HcalBarrelRawHits;
-    // histogram style
-    h3.SetLineColor(common_bench::plot::kMpBlue);
-    h3.SetLineWidth(2);
-    // axes
-    h3.GetXaxis()->CenterTitle();
-    h3.GetYaxis()->CenterTitle();
-    // draw everything
-    h3.DrawClone("hist");
-
-    c.Print(fmt::format("{}_HcalRawHits_n.png", output_prefix).c_str());
-  }
-
-  // Hcal adc
-  {
-    TCanvas c("c", "c", 1200, 1200);
-    c.Divide(2,2);
-
-    c.cd(1);
-    gPad->SetLogy(true);
-    auto& h1 = *h_adc_HcalEndcapPRawHits;
-    // histogram style
-    h1.SetLineColor(common_bench::plot::kMpBlue);
-    h1.SetLineWidth(2);
-    // axes
-    h1.GetXaxis()->CenterTitle();
-    h1.GetYaxis()->CenterTitle();
-    // draw everything
-    h1.DrawClone("hist");
-
-    c.cd(2);
-    gPad->SetLogy(true);
-    auto& h2 = *h_adc_HcalEndcapNRawHits;
-    // histogram style
-    h2.SetLineColor(common_bench::plot::kMpBlue);
-    h2.SetLineWidth(2);
-    // axes
-    h2.GetXaxis()->CenterTitle();
-    h2.GetYaxis()->CenterTitle();
-    // draw everything
-    h2.DrawClone("hist");
-    common_bench::plot::draw_label(ebeam, pbeam, detector);
-
-    c.cd(3);
-    gPad->SetLogy(true);
-    auto& h3 = *h_adc_HcalBarrelRawHits;
-    // histogram style
-    h3.SetLineColor(common_bench::plot::kMpBlue);
-    h3.SetLineWidth(2);
-    // axes
-    h3.GetXaxis()->CenterTitle();
-    h3.GetYaxis()->CenterTitle();
-    // draw everything
-    h3.DrawClone("hist");
-
-    c.Print(fmt::format("{}_HcalRawHits_adc.png", output_prefix).c_str());
-  }
-
-  // Hcal tdc
-  {
-    TCanvas c("c", "c", 1200, 1200);
-    c.Divide(2,2);
-
-    c.cd(1);
-    gPad->SetLogy(true);
-    auto& h1 = *h_tdc_HcalEndcapPRawHits;
-    // histogram style
-    h1.SetLineColor(common_bench::plot::kMpBlue);
-    h1.SetLineWidth(2);
-    // axes
-    h1.GetXaxis()->CenterTitle();
-    h1.GetYaxis()->CenterTitle();
-    // draw everything
-    h1.DrawClone("hist");
-
-    c.cd(2);
-    gPad->SetLogy(true);
-    auto& h2 = *h_tdc_HcalEndcapNRawHits;
-    // histogram style
-    h2.SetLineColor(common_bench::plot::kMpBlue);
-    h2.SetLineWidth(2);
-    // axes
-    h2.GetXaxis()->CenterTitle();
-    h2.GetYaxis()->CenterTitle();
-    // draw everything
-    h2.DrawClone("hist");
-    common_bench::plot::draw_label(ebeam, pbeam, detector);
-
-    c.cd(3);
-    gPad->SetLogy(true);
-    auto& h3 = *h_tdc_HcalBarrelRawHits;
-    // histogram style
-    h3.SetLineColor(common_bench::plot::kMpBlue);
-    h3.SetLineWidth(2);
-    // axes
-    h3.GetXaxis()->CenterTitle();
-    h3.GetYaxis()->CenterTitle();
-    // draw everything
-    h3.DrawClone("hist");
-
-    c.Print(fmt::format("{}_HcalRawHits_tdc.png", output_prefix).c_str());
-  }
-
-  if (
-    stats_n_EcalEndcapPRawHits->GetMean() < 0.1 ||
-    (
-      d0.HasColumn("EcalBarrelScFiRawHits") && 
-      (
-        stats_n_EcalBarrelImagingRawHits->GetMean() < 0.1 ||
-        stats_n_EcalBarrelScFiRawHits->GetMean() < 0.1
-      )
-    ) ||
-    (
-      ! d0.HasColumn("EcalBarrelScFiRawHits") && 
-      (
-        stats_n_EcalBarrelSciGlassRawHits->GetMean() < 0.1
-      )
-    ) ||
-    stats_n_EcalEndcapNRawHits->GetMean() < 0.1 ||
-    stats_n_HcalEndcapPRawHits->GetMean() < 0.1 ||
-    stats_n_HcalBarrelRawHits->GetMean() < 0.1 ||
-    stats_n_HcalEndcapNRawHits->GetMean() < 0.1
-   ) {
-    std::cout << "Error: too few raw hits per events " << std::endl;
-    return -1;
-  }
-
-  return 0;
-}
diff --git a/benchmarks/dis/analysis/truth_reconstruction.py b/benchmarks/dis/analysis/truth_reconstruction.py
index 808dde4b..5bb19de3 100644
--- a/benchmarks/dis/analysis/truth_reconstruction.py
+++ b/benchmarks/dis/analysis/truth_reconstruction.py
@@ -89,25 +89,26 @@ else:
 particle = config.split('-')[0].strip()
 particle_dict = {'e':[boolean_electron,'Electrons'],'pi':[boolean_pion,'Pions']}
 
+
 ####################################################################################################
     #Ratio 
 ####################################################################################################
 
 for i in range(len(MC_list)): #Repeat the following steps for each variable (momentum,theta,phi,eta)
-    X1 = MC_list[i] #MCParticles events to be plotted on x-axis
-    Y1 = RC_list[i] #ReconstructedParticles events
-    X_list = [ak.Array(X1),
-          ak.Array(X1[boolean_pion]),
-          ak.Array(X1[boolean_proton]),
-          ak.Array(X1[boolean_electron]),
-          ak.Array(X1[boolean_neutron]),
-          ak.Array(X1[boolean_photon])]
-    Y_list = [ak.Array(Y1),
-          ak.Array(Y1[boolean_pion]),
-          ak.Array(Y1[boolean_proton]),
-          ak.Array(Y1[boolean_electron]),
-          ak.Array(Y1[boolean_neutron]),
-          ak.Array(Y1[boolean_photon])]
+    MCparts = MC_list[i] #MCParticles events to be plotted on x-axis
+    RCparts = RC_list[i] #ReconstructedParticles events
+    X_list = [ak.Array(MCparts),
+          ak.Array(MCparts[boolean_pion]),
+          ak.Array(MCparts[boolean_proton]),
+          ak.Array(MCparts[boolean_electron]),
+          ak.Array(MCparts[boolean_neutron]),
+          ak.Array(MCparts[boolean_photon])]
+    Y_list = [ak.Array(RCparts),
+          ak.Array(RCparts[boolean_pion]),
+          ak.Array(RCparts[boolean_proton]),
+          ak.Array(RCparts[boolean_electron]),
+          ak.Array(RCparts[boolean_neutron]),
+          ak.Array(RCparts[boolean_photon])]
     X_plot = list(np.zeros(len(X_list)))
     Y_plot = list(np.zeros(len(X_list)))
 
@@ -177,6 +178,7 @@ for i in range(len(MC_list)): #Repeat the following steps for each variable (mom
     plt.savefig(os.path.join(r_path, '%s_%s_%s.png' %  (title_list[i],title,config)))
     plt.close()
 
+
 ###################################################################################################
      #Ratio vs momentum
 ###################################################################################################
@@ -219,19 +221,20 @@ for i in range(len(MC_list)): #Repeat the following steps for each variable (mom
         ax1.set_title('%s Difference Vs Momentum  %s  %s events\n DETECTOR_CONFIG: %s'%(title_list[i],config,Nevents,Dconfig))
         plt.savefig(os.path.join(r_path, '%s_difference_vs_momentum_%s.png' %  (title_list[i],config)))
 
+
 ###################################################################################################
      #Correlation
 ###################################################################################################
 
     #Repeat the following steps for each variable (momentum,theta,phi,eta)
-    X_len = ak.count(X1,axis=None)
-    Y_len = ak.count(Y1,axis=None)
+    X_len = ak.count(MCparts,axis=None)
+    Y_len = ak.count(RCparts,axis=None)
     if X_len > Y_len: 
-        F_boolean = np.ones_like(Y1) == 1
+        F_boolean = np.ones_like(RCparts) == 1
     else: 
-        F_boolean = np.ones_like(X1) == 1
-    X_s = np.array(ak.flatten(X1[F_boolean])) 
-    Y_s = np.array(ak.flatten(Y1[F_boolean])) 
+        F_boolean = np.ones_like(MCparts) == 1
+    X_s = np.array(ak.flatten(MCparts[F_boolean])) 
+    Y_s = np.array(ak.flatten(RCparts[F_boolean])) 
  
     #Histogram
     if i == 0 and particle in particle_dict.keys(): #Momentum in Single events
@@ -268,6 +271,7 @@ for i in range(len(MC_list)): #Repeat the following steps for each variable (mom
     fig.suptitle('%s  %s events\n DETECTOR_CONFIG: %s'%(config,Nevents,Dconfig))
     plt.savefig(os.path.join(r_path, '%s_correlation_%s.png' %  (title_list[i],config)))
 
+
 ###################################################################################################
      #Phi vs Theta plots
 ###################################################################################################
diff --git a/benchmarks/dis/config.yml b/benchmarks/dis/config.yml
index aef633ba..d69e1925 100644
--- a/benchmarks/dis/config.yml
+++ b/benchmarks/dis/config.yml
@@ -38,7 +38,7 @@ dis:simulate:
       - EBEAM: 18
         PBEAM: 275
         MINQ2: [1, 10, 100, 1000]
-  timeout: 2 hour
+  timeout: 96 hour
   script:
     - bash benchmarks/dis/dis.sh --config dis_${EBEAM}x${PBEAM}_minQ2=${MINQ2} --ebeam ${EBEAM} --pbeam ${PBEAM} --minq2 ${MINQ2}
   retry:
diff --git a/benchmarks/dis/dis.sh b/benchmarks/dis/dis.sh
index 7b5d952b..b3851707 100755
--- a/benchmarks/dis/dis.sh
+++ b/benchmarks/dis/dis.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Run the DIS benchmarks in 5 steps:
@@ -52,7 +53,7 @@ GEN_FILE=${INPUT_PATH}/gen-${CONFIG}_${JUGGLER_N_EVENTS}.hepmc
 SIM_FILE=${TMP_PATH}/sim-${CONFIG}.edm4hep.root
 SIM_LOG=${TMP_PATH}/sim-${CONFIG}.log
 
-
+# JUGGLER_REC_FILE_BASE= ${TMP_PATH}/rec-${CONFIG}
 REC_FILE=${TMP_PATH}/rec-${CONFIG}.root
 REC_LOG=${TMP_PATH}/sim-${CONFIG}.log
 
@@ -65,7 +66,7 @@ if [ ! -f ${SIM_FILE} ] ; then
 ddsim --runType batch \
       --part.minimalKineticEnergy 1000*GeV  \
       --filter.tracker edep0 \
-      -v INFO \
+      -v WARNING \
       --numberOfEvents ${JUGGLER_N_EVENTS} \
       --compactFile ${DETECTOR_PATH}/${DETECTOR_CONFIG}.xml \
       --inputFiles ${GEN_FILE} \
@@ -79,25 +80,24 @@ fi
 ## =============================================================================
 ## Step 3: Run digitization & reconstruction
 echo "Running the digitization and reconstruction"
-## FIXME Need to figure out how to pass file name to juggler from the commandline
-## the tracker_reconstruction.py options file uses the following environment
-## variables:
-## - JUGGLER_SIM_FILE:    input detector simulation
-## - JUGGLER_REC_FILE:    output reconstructed data
-## - JUGGLER_N_EVENTS:    number of events to process (part of global environment)
-## - DETECTOR:    detector package (part of global environment)
-export JUGGLER_SIM_FILE=${SIM_FILE}
-export JUGGLER_REC_FILE=${REC_FILE}
-for rec in options/*.py options/extra/*.py ; do
-  unset tag
-  [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-  JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-    gaudirun.py ${rec}
+if [ ${RECO} == "eicrecon" ] ; then
+  /usr/bin/time -v eicrecon ${SIM_FILE} -Ppodio:output_file=${REC_FILE}
+  if [ "$?" -ne "0" ] ; then
+    echo "ERROR running eicrecon"
+    exit 1
+  fi
+fi
+
+if [[ ${RECO} == "juggler" ]] ; then
+  export JUGGLER_SIM_FILE=${SIM_FILE}
+  export JUGGLER_REC_FILE=${REC_FILE}
+  gaudirun.py options/reconstruction.py
   if [ "$?" -ne "0" ] ; then
     echo "ERROR running juggler"
     exit 1
   fi
-done
+fi
+
 
 ## =============================================================================
 ## Step 4: Analysis
@@ -134,59 +134,6 @@ if [[ "$?" -ne "0" ]] ; then
   exit 1
 fi
 
-CONFIG="${TMP_PATH}/${PLOT_TAG}.raw.json"
-cat << EOF > ${CONFIG}
-{
-  "rec_file": "${REC_FILE/.root/.raw.root}",
-  "detector": "${DETECTOR}",
-  "output_prefix": "${RESULTS_PATH}/${PLOT_TAG}",
-  "ebeam": ${EBEAM},
-  "pbeam": ${PBEAM},
-  "minq2": ${MINQ2},
-  "test_tag": "${BEAM_TAG}"
-}
-EOF
-root -b -q "benchmarks/dis/analysis/rec_analysis_raw.cxx+(\"${CONFIG}\")"
-if [[ "$?" -ne "0" ]] ; then
-  echo "ERROR running rec_analysis_raw script"
-  exit 1
-fi
-
-CONFIG="${TMP_PATH}/${PLOT_TAG}.ecal.json"
-cat << EOF > ${CONFIG}
-{
-  "rec_file": "${REC_FILE/.root/.ecal.root}",
-  "detector": "${DETECTOR}",
-  "output_prefix": "${RESULTS_PATH}/${PLOT_TAG}",
-  "ebeam": ${EBEAM},
-  "pbeam": ${PBEAM},
-  "minq2": ${MINQ2},
-  "test_tag": "${BEAM_TAG}"
-}
-EOF
-root -b -q "benchmarks/dis/analysis/rec_analysis_ecal.cxx+(\"${CONFIG}\")"
-if [[ "$?" -ne "0" ]] ; then
-  echo "ERROR running rec_analysis_ecal script"
-  exit 1
-fi
-
-CONFIG="${TMP_PATH}/${PLOT_TAG}.hcal.json"
-cat << EOF > ${CONFIG}
-{
-  "rec_file": "${REC_FILE/.root/.hcal.root}",
-  "detector": "${DETECTOR}",
-  "output_prefix": "${RESULTS_PATH}/${PLOT_TAG}",
-  "ebeam": ${EBEAM},
-  "pbeam": ${PBEAM},
-  "minq2": ${MINQ2},
-  "test_tag": "${BEAM_TAG}"
-}
-EOF
-root -b -q "benchmarks/dis/analysis/rec_analysis_hcal.cxx+(\"${CONFIG}\")"
-if [[ "$?" -ne "0" ]] ; then
-  echo "ERROR running rec_analysis_hcal script"
-  exit 1
-fi
 
 ## =============================================================================
 ## Step 5: finalize
@@ -198,9 +145,6 @@ if [ "${JUGGLER_N_EVENTS}" -lt "500" ] ; then
   cp ${REC_FILE} ${RESULTS_PATH}
 fi
 
-## Always move over log files to the results path
-cp ${REC_LOG} ${RESULTS_PATH}
-
 ## =============================================================================
 ## All done!
 echo "DIS benchmarks complete"
diff --git a/benchmarks/dis/env.sh b/benchmarks/dis/env.sh
index cbd42351..1afe4f05 100644
--- a/benchmarks/dis/env.sh
+++ b/benchmarks/dis/env.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Local configuration variables for this particular benchmark 
diff --git a/benchmarks/dis/gen.sh b/benchmarks/dis/gen.sh
index 2714b1ab..4b27b95d 100755
--- a/benchmarks/dis/gen.sh
+++ b/benchmarks/dis/gen.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Standin for a proper pythia generation process, similar to how we
diff --git a/benchmarks/dis/get.sh b/benchmarks/dis/get.sh
index b9e3ccdb..ff7b8c13 100644
--- a/benchmarks/dis/get.sh
+++ b/benchmarks/dis/get.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Standin for a proper pythia generation process, similar to how we
diff --git a/benchmarks/dvcs/dvcs.sh b/benchmarks/dvcs/dvcs.sh
index 9abe3427..deb95f0b 100644
--- a/benchmarks/dvcs/dvcs.sh
+++ b/benchmarks/dvcs/dvcs.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 function print_the_help {
   echo "USAGE: ${0} [--rec] [--sim] [--analysis] [--all] "
@@ -114,19 +115,23 @@ if [[ -n "${DO_SIM}" || -n "${DO_ALL}" ]] ; then
   fi
 fi
 
-### Step 3. Run the reconstruction (juggler)
+### Step 3. Run the reconstruction (eicrecon)
 if [[ -n "${DO_REC}" || -n "${DO_ALL}" ]] ; then
-  for rec in options/*.py ; do
-    unset tag
-    [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-    JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-      gaudirun.py ${rec}
+  if [ ${RECO} == "eicrecon" ] ; then
+    eicrecon ${JUGGLER_SIM_FILE} -Ppodio:output_file=${JUGGLER_REC_FILE}
     if [[ "$?" -ne "0" ]] ; then
-      echo "ERROR running juggler"
+      echo "ERROR running eicrecon"
       exit 1
     fi
-  done
+  fi
 
+  if [[ ${RECO} == "juggler" ]] ; then
+    gaudirun.py options/reconstruction.py
+    if [ "$?" -ne "0" ] ; then
+      echo "ERROR running juggler"
+      exit 1
+    fi
+  fi
   root_filesize=$(stat --format=%s "${JUGGLER_REC_FILE}")
   if [[ "${JUGGLER_N_EVENTS}" -lt "500" ]] ; then 
     # file must be less than 10 MB to upload
diff --git a/benchmarks/dvmp/dvmp.sh b/benchmarks/dvmp/dvmp.sh
index 432f194f..96274fcb 100755
--- a/benchmarks/dvmp/dvmp.sh
+++ b/benchmarks/dvmp/dvmp.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Run the DVMP benchmarks in 5 steps:
@@ -85,17 +86,21 @@ echo "Running the digitization and reconstruction"
 ## - DETECTOR:    detector package (part of global environment)
 export JUGGLER_SIM_FILE=${SIM_FILE}
 export JUGGLER_REC_FILE=${REC_FILE}
-for rec in options/*.py ; do
-  unset tag
-  [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-  JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-    gaudirun.py ${rec}
-  if [ "$?" -ne "0" ] ; then
-    echo "ERROR running juggler, both attempts failed"
+if [ ${RECO} == "eicrecon" ] ; then
+  eicrecon ${JUGGLER_SIM_FILE} -Ppodio:output_file=${JUGGLER_REC_FILE}
+  if [[ "$?" -ne "0" ]] ; then
+    echo "ERROR running eicrecon"
     exit 1
   fi
-done
+fi
 
+if [[ ${RECO} == "juggler" ]] ; then
+  gaudirun.py options/reconstruction.py
+  if [ "$?" -ne "0" ] ; then
+    echo "ERROR running juggler"
+    exit 1
+  fi
+fi
 ## =============================================================================
 ## Step 4: Analysis
 
diff --git a/benchmarks/dvmp/env.sh b/benchmarks/dvmp/env.sh
index ac51b174..641b7ce6 100644
--- a/benchmarks/dvmp/env.sh
+++ b/benchmarks/dvmp/env.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Local configuration variables for this particular benchmark 
diff --git a/benchmarks/dvmp/gen.sh b/benchmarks/dvmp/gen.sh
index c3f9129a..22817845 100755
--- a/benchmarks/dvmp/gen.sh
+++ b/benchmarks/dvmp/gen.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 ## =============================================================================
 ## Run a single instance of the DVMP generator (lAger)
diff --git a/benchmarks/single/analyze.sh b/benchmarks/single/analyze.sh
index 681e32cc..eebf96b6 100644
--- a/benchmarks/single/analyze.sh
+++ b/benchmarks/single/analyze.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 source $(dirname $0)/common.sh $*
 
diff --git a/benchmarks/single/common.sh b/benchmarks/single/common.sh
index 2f8d58a2..82d3648b 100644
--- a/benchmarks/single/common.sh
+++ b/benchmarks/single/common.sh
@@ -1,3 +1,6 @@
+#!/bin/bash
+source strict-mode.sh
+
 if [[ ! -n  "${JUGGLER_N_EVENTS}" ]] ; then 
   export JUGGLER_N_EVENTS=100
 fi
@@ -5,7 +8,8 @@ fi
 export JUGGLER_FILE_NAME_TAG="${1:-e-_1GeV_45to135deg}"
 export JUGGLER_GEN_FILE="benchmarks/single/${JUGGLER_FILE_NAME_TAG}.steer"
 export JUGGLER_SIM_FILE="sim_output/sim_${JUGGLER_FILE_NAME_TAG}.edm4hep.root"
-export JUGGLER_REC_FILE="sim_output/rec_${JUGGLER_FILE_NAME_TAG}.root"
+export JUGGLER_REC_FILE_BASE="sim_output/rec_${JUGGLER_FILE_NAME_TAG}"
+export JUGGLER_REC_FILE="${JUGGLER_REC_FILE_BASE}.tree.edm4eic.root"
 
 export BENCHMARK_TAG="single"
 echo "Setting up the local environment for the ${BENCHMARK_TAG^^} benchmarks"
diff --git a/benchmarks/single/reconstruct.sh b/benchmarks/single/reconstruct.sh
index a6285d28..2e95c83c 100644
--- a/benchmarks/single/reconstruct.sh
+++ b/benchmarks/single/reconstruct.sh
@@ -1,16 +1,25 @@
 #!/bin/bash
+source strict-mode.sh
 
 source $(dirname $0)/common.sh $*
 
 # Reconstruct
-for rec in options/*.py ; do
-  unset tag
-  [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-  JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-    /usr/bin/time -v \
-    gaudirun.py ${JUGGLER_GAUDI_OPTIONS:-} ${rec}
+if [ ${RECO} == "eicrecon" ] ; then
+  eicrecon ${JUGGLER_SIM_FILE} -Ppodio:output_file=${JUGGLER_REC_FILE}
   if [[ "$?" -ne "0" ]] ; then
+    echo "ERROR running eicrecon"
+    exit 1
+  fi
+fi
+
+if [[ ${RECO} == "juggler" ]] ; then
+  gaudirun.py options/reconstruction.py
+  if [ "$?" -ne "0" ] ; then
     echo "ERROR running juggler"
     exit 1
   fi
-done
+fi
+
+if [ -f jana.dot ] ; then cp jana.dot ${JUGGLER_REC_FILE_BASE}.dot ; fi
+
+rootls -t ${JUGGLER_REC_FILE_BASE}.tree.edm4eic.root
diff --git a/benchmarks/single/simulate.sh b/benchmarks/single/simulate.sh
index 047e1e97..5ab79f6d 100644
--- a/benchmarks/single/simulate.sh
+++ b/benchmarks/single/simulate.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 source $(dirname $0)/common.sh $*
 
diff --git a/benchmarks/tcs/tcs.sh b/benchmarks/tcs/tcs.sh
index e8c64bec..4ceb8c67 100644
--- a/benchmarks/tcs/tcs.sh
+++ b/benchmarks/tcs/tcs.sh
@@ -1,7 +1,5 @@
 #!/bin/bash
-set -Eu
-trap 's=$?; echo "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR
-IFS=$'\n\t'
+source strict-mode.sh
 
 function print_the_help {
   echo "USAGE: ${0} [--rec] [--sim] [--analysis] [--all] "
@@ -111,6 +109,7 @@ echo "DETECTOR    = ${DETECTOR}"
 ## Step 1. Get the data
 if [[ -n "${DATA_INIT}" || -n "${DO_ALL}" ]] ; then
   mc -C . config host add S3 https://dtn01.sdcc.bnl.gov:9000 $S3_ACCESS_KEY $S3_SECRET_KEY
+  set +o pipefail
   mc -C . cat --insecure ${DATA_URL} | gunzip -c | head -n $((20+10*JUGGLER_N_EVENTS)) |  sanitize_hepmc3 > "${JUGGLER_MC_FILE}"
   if [[ "$?" -ne "0" ]] ; then
     echo "Failed to download hepmc file"
@@ -135,15 +134,24 @@ if [[ -n "${DO_SIM}" || -n "${DO_ALL}" ]] ; then
   fi
 fi
 
-### Step 3. Run the reconstruction (juggler)
+### Step 3. Run the reconstruction (eicrecon)
 export PBEAM
 if [[ -n "${DO_REC}" || -n "${DO_ALL}" ]] ; then
-  for rec in options/*.py ; do
-    unset tag
-    [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-    JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-      gaudirun.py ${rec} || [ $? -eq 4 ]
-  done
+  if [ ${RECO} == "eicrecon" ] ; then
+    eicrecon ${JUGGLER_SIM_FILE} -Ppodio:output_file=${JUGGLER_REC_FILE}
+    if [[ "$?" -ne "0" ]] ; then
+      echo "ERROR running eicrecon"
+      exit 1
+    fi
+  fi
+
+  if [[ ${RECO} == "juggler" ]] ; then
+    gaudirun.py options/reconstruction.py
+    if [ "$?" -ne "0" ] ; then
+      echo "ERROR running juggler"
+      exit 1
+    fi
+  fi
 
   root_filesize=$(stat --format=%s "${JUGGLER_REC_FILE}")
   if [[ "${JUGGLER_N_EVENTS}" -lt "500" ]] ; then 
diff --git a/benchmarks/u_omega/u_omega.sh b/benchmarks/u_omega/u_omega.sh
index ddd8557a..e29810c4 100644
--- a/benchmarks/u_omega/u_omega.sh
+++ b/benchmarks/u_omega/u_omega.sh
@@ -1,4 +1,5 @@
 #!/bin/bash
+source strict-mode.sh
 
 function print_the_help {
   echo "USAGE: ${0} [--rec] [--sim] [--analysis] [--all] "
@@ -113,18 +114,23 @@ if [[ -n "${DO_SIM}" || -n "${DO_ALL}" ]] ; then
   fi
 fi
 
-### Step 3. Run the reconstruction (juggler)
+### Step 3. Run the reconstruction (eicrecon)
 if [[ -n "${DO_REC}" || -n "${DO_ALL}" ]] ; then
-  for rec in options/*.py ; do
-    unset tag
-    [[ $(basename ${rec} .py) =~ (.*)\.(.*) ]] && tag=".${BASH_REMATCH[2]}"
-    JUGGLER_REC_FILE=${JUGGLER_REC_FILE/.root/${tag:-}.root} \
-      gaudirun.py ${rec}
+  if [ ${RECO} == "eicrecon" ] ; then
+    eicrecon ${JUGGLER_SIM_FILE} -Ppodio:output_file=${JUGGLER_REC_FILE}
     if [[ "$?" -ne "0" ]] ; then
+      echo "ERROR running eicrecon"
+      exit 1
+    fi
+  fi
+
+  if [[ ${RECO} == "juggler" ]] ; then
+    gaudirun.py options/reconstruction.py
+    if [ "$?" -ne "0" ] ; then
       echo "ERROR running juggler"
       exit 1
     fi
-  done
+  fi
 
   root_filesize=$(stat --format=%s "${JUGGLER_REC_FILE}")
   if [[ "${JUGGLER_N_EVENTS}" -lt "500" ]] ; then 
diff --git a/options/extra/reconstruction.ecal.py b/options/extra/reconstruction.ecal.py
deleted file mode 100644
index ee98e66a..00000000
--- a/options/extra/reconstruction.ecal.py
+++ /dev/null
@@ -1,231 +0,0 @@
-from Gaudi.Configuration import *
-
-from Configurables import ApplicationMgr, AuditorSvc, EICDataSvc, PodioOutput, GeoSvc
-
-from GaudiKernel.SystemOfUnits import eV, MeV, GeV, mm, cm, mrad
-
-import json
-
-detector_path = str(os.environ.get("DETECTOR_PATH", "."))
-detector_name = str(os.environ.get("DETECTOR_CONFIG", "epic"))
-detector_config = str(os.environ.get("DETECTOR_CONFIG", detector_name))
-detector_version = str(os.environ.get("DETECTOR_VERSION", "main"))
-
-# Detector features that affect reconstruction
-has_ecal_barrel_scfi = False
-has_pid_backward_pfrich = False
-if "epic" in detector_name and "imaging" in detector_config:
-    has_ecal_barrel_scfi = True
-    has_pid_backward_pfrich = True
-if "epic" in detector_name and "brycecanyon" in detector_config:
-    has_ecal_barrel_scfi = True
-    has_pid_backward_pfrich = True
-
-# CAL reconstruction
-# get sampling fractions from system environment variable
-ci_ecal_sf = float(os.environ.get("CI_ECAL_SAMP_FRAC", 0.253))
-
-# input calorimeter DAQ info
-calo_daq = {}
-with open(
-    "{}/calibrations/calo_digi_default.json".format(detector_path)
-) as f:
-    calo_config = json.load(f)
-    ## add proper ADC capacity based on bit depth
-    for sys in calo_config:
-        cfg = calo_config[sys]
-        calo_daq[sys] = {
-            "dynamicRangeADC": eval(cfg["dynamicRange"]),
-            "capacityADC": 2 ** int(cfg["capacityBitsADC"]),
-            "pedestalMean": int(cfg["pedestalMean"]),
-            "pedestalSigma": float(cfg["pedestalSigma"]),
-        }
-print(calo_daq)
-
-# input and output
-input_sims = [
-    f.strip() for f in str.split(os.environ["JUGGLER_SIM_FILE"], ",") if f.strip()
-]
-output_rec = str(os.environ["JUGGLER_REC_FILE"])
-n_events = int(os.environ["JUGGLER_N_EVENTS"])
-
-# services
-services = []
-# geometry service
-services.append(
-    GeoSvc(
-        "GeoSvc",
-        detectors=["{}/{}.xml".format(detector_path, detector_config)],
-        OutputLevel=WARNING,
-    )
-)
-# data service
-services.append(EICDataSvc("EventDataSvc", inputs=input_sims, OutputLevel=WARNING))
-
-# juggler components
-from Configurables import PodioInput
-from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi
-from Configurables import Jug__Reco__CalorimeterHitReco as CalHitReco
-from Configurables import Jug__Reco__CalorimeterHitsMerger as CalHitsMerger
-from Configurables import Jug__Reco__CalorimeterIslandCluster as IslandCluster
-from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG
-from Configurables import Jug__Fast__TruthClustering as TruthClustering
-
-# from Configurables import Jug__Fast__ClusterMerger as ClusterMerger
-
-# branches needed from simulation root file
-sim_coll = [
-    "MCParticles",
-    "EcalEndcapNHits",
-    "EcalEndcapNHitsContributions",
-    "EcalEndcapPHits",
-    "EcalEndcapPHitsContributions",
-]
-
-# list of algorithms
-algorithms = []
-
-# input
-podin = PodioInput("PodioReader", collections=sim_coll)
-algorithms.append(podin)
-
-# Crystal Endcap Ecal
-ce_ecal_daq = calo_daq["ecal_neg_endcap"]
-ce_ecal_digi = CalHitDigi(
-    "ce_ecal_digi",
-    inputHitCollection="EcalEndcapNHits",
-    outputHitCollection="EcalEndcapNRawHits",
-    energyResolutions=[0.0, 0.02, 0.0],
-    **ce_ecal_daq
-)
-algorithms.append(ce_ecal_digi)
-
-ce_ecal_reco = CalHitReco(
-    "ce_ecal_reco",
-    inputHitCollection=ce_ecal_digi.outputHitCollection,
-    outputHitCollection="EcalEndcapNRecHits",
-    thresholdFactor=4,  # 4 sigma cut on pedestal sigma
-    samplingFraction=0.998,  # this accounts for a small fraction of leakage
-    readoutClass="EcalEndcapNHits",
-    sectorField="sector",
-    **ce_ecal_daq
-)
-algorithms.append(ce_ecal_reco)
-
-ce_ecal_cl = TruthClustering(
-    "ce_ecal_cl",
-    inputHits=ce_ecal_reco.outputHitCollection,
-    mcHits="EcalEndcapNHits",
-    outputProtoClusters="EcalEndcapNProtoClusters",
-)
-# ce_ecal_cl = IslandCluster("ce_ecal_cl",
-#        inputHitCollection=ce_ecal_reco.outputHitCollection,
-#        outputProtoClusterCollection="EcalEndcapNProtoClusters",
-#        splitCluster=False,
-#        minClusterHitEdep=1.0*MeV,  # discard low energy hits
-#        minClusterCenterEdep=30*MeV,
-#        sectorDist=5.0*cm,
-#        dimScaledLocalDistXY=[1.8, 1.8]) # dimension scaled dist is good for hybrid sectors with different module size
-algorithms.append(ce_ecal_cl)
-
-ce_ecal_clreco = RecoCoG(
-    "ce_ecal_clreco",
-    inputProtoClusterCollection=ce_ecal_cl.outputProtoClusters,
-    outputClusterCollection="EcalEndcapNClusters",
-    logWeightBase=4.6,
-)
-algorithms.append(ce_ecal_clreco)
-
-# ce_ecal_clmerger = ClusterMerger("ce_ecal_clmerger",
-#        inputClusters = ce_ecal_clreco.outputClusterCollection,
-#        outputClusters = "EcalEndcapNMergedClusters",
-#        outputRelations = "EcalEndcapNMergedClusterRelations")
-# algorithms.append(ce_ecal_clmerger)
-
-# Endcap ScFi Ecal
-ci_ecal_daq = calo_daq["ecal_pos_endcap"]
-
-ci_ecal_digi = CalHitDigi(
-    "ci_ecal_digi",
-    inputHitCollection="EcalEndcapPHits",
-    outputHitCollection="EcalEndcapPRawHits",
-    scaleResponse=ci_ecal_sf,
-    energyResolutions=[0.1, 0.0015, 0.0],
-    **ci_ecal_daq
-)
-algorithms.append(ci_ecal_digi)
-
-ci_ecal_reco = CalHitReco(
-    "ci_ecal_reco",
-    inputHitCollection=ci_ecal_digi.outputHitCollection,
-    outputHitCollection="EcalEndcapPRecHits",
-    thresholdFactor=5.0,
-    samplingFraction=ci_ecal_sf,
-    **ci_ecal_daq
-)
-algorithms.append(ci_ecal_reco)
-
-# merge hits in different layer (projection to local x-y plane)
-ci_ecal_merger = CalHitsMerger(
-    "ci_ecal_merger",
-    inputHitCollection=ci_ecal_reco.outputHitCollection,
-    outputHitCollection="EcalEndcapPRecMergedHits",
-    fields=["fiber_x", "fiber_y"],
-    fieldRefNumbers=[1, 1],
-    # fields=["layer", "slice"],
-    # fieldRefNumbers=[1, 0],
-    readoutClass="EcalEndcapPHits",
-)
-algorithms.append(ci_ecal_merger)
-
-ci_ecal_cl = TruthClustering(
-    "ci_ecal_cl",
-    inputHits=ci_ecal_reco.outputHitCollection,
-    mcHits="EcalEndcapPHits",
-    outputProtoClusters="EcalEndcapPProtoClusters",
-)
-# ci_ecal_cl = IslandCluster("ci_ecal_cl",
-# inputHitCollection=ci_ecal_merger.outputHitCollection,
-# outputProtoClusterCollection="EcalEndcapPProtoClusters",
-# splitCluster=False,
-# minClusterCenterEdep=10.*MeV,
-# localDistXY=[10*mm, 10*mm])
-algorithms.append(ci_ecal_cl)
-
-ci_ecal_clreco = RecoCoG(
-    "ci_ecal_clreco",
-    inputProtoClusterCollection=ci_ecal_cl.outputProtoClusters,
-    outputClusterCollection="EcalEndcapPClusters",
-    enableEtaBounds=True,
-    logWeightBase=6.2,
-)
-algorithms.append(ci_ecal_clreco)
-
-# ci_ecal_clmerger = ClusterMerger("ci_ecal_clmerger",
-#        inputClusters = ci_ecal_clreco.outputClusterCollection,
-#        outputClusters = "EcalEndcapPMergedClusters",
-#        outputRelations = "EcalEndcapPMergedClusterRelations")
-# algorithms.append(ci_ecal_clmerger)
-
-# Output
-podout = PodioOutput("out", filename=output_rec)
-podout.outputCommands = [
-    "keep *",
-    "drop *Hits",
-    "keep *RecHits",
-    "keep *Layers",
-    "keep *Clusters",
-    "drop *ProtoClusters",
-    "drop outputParticles",
-    "drop InitTrackParams",
-] + ["drop " + c for c in sim_coll]
-algorithms.append(podout)
-
-ApplicationMgr(
-    TopAlg=algorithms,
-    EvtSel="NONE",
-    EvtMax=n_events,
-    ExtSvc=services,
-    OutputLevel=WARNING,
-    AuditAlgorithms=True,
-)
diff --git a/options/extra/reconstruction.hcal.py b/options/extra/reconstruction.hcal.py
deleted file mode 100644
index 2d7d06c0..00000000
--- a/options/extra/reconstruction.hcal.py
+++ /dev/null
@@ -1,212 +0,0 @@
-from Gaudi.Configuration import *
-
-from Configurables import ApplicationMgr, AuditorSvc, EICDataSvc, PodioOutput, GeoSvc
-
-from GaudiKernel.SystemOfUnits import eV, MeV, GeV, mm, cm, mrad
-
-import json
-
-detector_path = str(os.environ.get("DETECTOR_PATH", "."))
-detector_name = str(os.environ.get("DETECTOR_CONFIG", "epic"))
-detector_config = str(os.environ.get("DETECTOR_CONFIG", detector_name))
-detector_version = str(os.environ.get("DETECTOR_VERSION", "main"))
-
-# Detector features that affect reconstruction
-has_ecal_barrel_scfi = False
-has_pid_backward_pfrich = False
-if "epic" in detector_name and "imaging" in detector_config:
-    has_ecal_barrel_scfi = True
-    has_pid_backward_pfrich = True
-if "epic" in detector_name and "brycecanyon" in detector_config:
-    has_ecal_barrel_scfi = True
-    has_pid_backward_pfrich = True
-
-# CAL reconstruction
-# get sampling fractions from system environment variable
-cb_hcal_sf = float(os.environ.get("CB_HCAL_SAMP_FRAC", 0.038))
-ci_hcal_sf = float(os.environ.get("CI_HCAL_SAMP_FRAC", 0.025))
-ce_hcal_sf = float(os.environ.get("CE_HCAL_SAMP_FRAC", 0.025))
-
-# input calorimeter DAQ info
-calo_daq = {}
-with open(
-    "{}/calibrations/calo_digi_default.json".format(detector_path)
-) as f:
-    calo_config = json.load(f)
-    ## add proper ADC capacity based on bit depth
-    for sys in calo_config:
-        cfg = calo_config[sys]
-        calo_daq[sys] = {
-            "dynamicRangeADC": eval(cfg["dynamicRange"]),
-            "capacityADC": 2 ** int(cfg["capacityBitsADC"]),
-            "pedestalMean": int(cfg["pedestalMean"]),
-            "pedestalSigma": float(cfg["pedestalSigma"]),
-        }
-print(calo_daq)
-
-# input and output
-input_sims = [
-    f.strip() for f in str.split(os.environ["JUGGLER_SIM_FILE"], ",") if f.strip()
-]
-output_rec = str(os.environ["JUGGLER_REC_FILE"])
-n_events = int(os.environ["JUGGLER_N_EVENTS"])
-
-# services
-services = []
-# geometry service
-services.append(
-    GeoSvc(
-        "GeoSvc",
-        detectors=["{}/{}.xml".format(detector_path, detector_config)],
-        OutputLevel=WARNING,
-    )
-)
-# data service
-services.append(EICDataSvc("EventDataSvc", inputs=input_sims, OutputLevel=WARNING))
-
-# juggler components
-from Configurables import PodioInput
-from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi
-from Configurables import Jug__Reco__CalorimeterHitReco as CalHitReco
-from Configurables import Jug__Reco__CalorimeterHitsMerger as CalHitsMerger
-from Configurables import Jug__Reco__CalorimeterIslandCluster as IslandCluster
-from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG
-
-# branches needed from simulation root file
-sim_coll = [
-    "MCParticles",
-    "HcalBarrelHits",
-    "HcalBarrelHitsContributions",
-    "HcalEndcapPHits",
-    "HcalEndcapPHitsContributions",
-    "HcalEndcapNHits",
-    "HcalEndcapNHitsContributions",
-]
-
-# list of algorithms
-algorithms = []
-
-# input
-podin = PodioInput("PodioReader", collections=sim_coll)
-algorithms.append(podin)
-
-# Hcal Hadron Endcap
-ci_hcal_daq = calo_daq["hcal_pos_endcap"]
-
-ci_hcal_digi = CalHitDigi(
-    "ci_hcal_digi",
-    inputHitCollection="HcalEndcapPHits",
-    outputHitCollection="HcalEndcapPRawHits",
-    **ci_hcal_daq
-)
-algorithms.append(ci_hcal_digi)
-
-ci_hcal_reco = CalHitReco(
-    "ci_hcal_reco",
-    inputHitCollection=ci_hcal_digi.outputHitCollection,
-    outputHitCollection="HcalEndcapPRecHits",
-    thresholdFactor=5.0,
-    samplingFraction=ci_hcal_sf,
-    **ci_hcal_daq
-)
-algorithms.append(ci_hcal_reco)
-
-ci_hcal_merger = CalHitsMerger(
-    "ci_hcal_merger",
-    inputHitCollection=ci_hcal_reco.outputHitCollection,
-    outputHitCollection="HcalEndcapPMergedHits",
-    readoutClass="HcalEndcapPHits",
-    fields=["layer", "slice"],
-    fieldRefNumbers=[1, 0],
-)
-algorithms.append(ci_hcal_merger)
-
-ci_hcal_cl = IslandCluster(
-    "ci_hcal_cl",
-    inputHitCollection=ci_hcal_merger.outputHitCollection,
-    outputProtoClusterCollection="HcalEndcapPProtoClusters",
-    splitCluster=False,
-    minClusterCenterEdep=30.0 * MeV,
-    localDistXY=[15.0 * cm, 15.0 * cm],
-)
-algorithms.append(ci_hcal_cl)
-
-ci_hcal_clreco = RecoCoG(
-    "ci_hcal_clreco",
-    inputProtoClusterCollection=ci_hcal_cl.outputProtoClusterCollection,
-    outputClusterCollection="HcalEndcapPClusters",
-    logWeightBase=6.2,
-)
-algorithms.append(ci_hcal_clreco)
-
-# Hcal Electron Endcap
-ce_hcal_daq = calo_daq["hcal_neg_endcap"]
-
-ce_hcal_digi = CalHitDigi(
-    "ce_hcal_digi",
-    inputHitCollection="HcalEndcapNHits",
-    outputHitCollection="HcalEndcapNRawHits",
-    **ce_hcal_daq
-)
-algorithms.append(ce_hcal_digi)
-
-ce_hcal_reco = CalHitReco(
-    "ce_hcal_reco",
-    inputHitCollection=ce_hcal_digi.outputHitCollection,
-    outputHitCollection="HcalEndcapNRecHits",
-    thresholdFactor=5.0,
-    samplingFraction=ce_hcal_sf,
-    **ce_hcal_daq
-)
-algorithms.append(ce_hcal_reco)
-
-ce_hcal_merger = CalHitsMerger(
-    "ce_hcal_merger",
-    inputHitCollection=ce_hcal_reco.outputHitCollection,
-    outputHitCollection="HcalEndcapNMergedHits",
-    readoutClass="HcalEndcapNHits",
-    fields=["layer", "slice"],
-    fieldRefNumbers=[1, 0],
-)
-algorithms.append(ce_hcal_merger)
-
-ce_hcal_cl = IslandCluster(
-    "ce_hcal_cl",
-    inputHitCollection=ce_hcal_merger.outputHitCollection,
-    outputProtoClusterCollection="HcalEndcapNProtoClusters",
-    splitCluster=False,
-    minClusterCenterEdep=30.0 * MeV,
-    localDistXY=[15.0 * cm, 15.0 * cm],
-)
-algorithms.append(ce_hcal_cl)
-
-ce_hcal_clreco = RecoCoG(
-    "ce_hcal_clreco",
-    inputProtoClusterCollection=ce_hcal_cl.outputProtoClusterCollection,
-    outputClusterCollection="HcalEndcapNClusters",
-    logWeightBase=6.2,
-)
-algorithms.append(ce_hcal_clreco)
-
-# Output
-podout = PodioOutput("out", filename=output_rec)
-podout.outputCommands = [
-    "keep *",
-    "drop *Hits",
-    "keep *RecHits",
-    "keep *Layers",
-    "keep *Clusters",
-    "drop *ProtoClusters",
-    "drop outputParticles",
-    "drop InitTrackParams",
-] + ["drop " + c for c in sim_coll]
-algorithms.append(podout)
-
-ApplicationMgr(
-    TopAlg=algorithms,
-    EvtSel="NONE",
-    EvtMax=n_events,
-    ExtSvc=services,
-    OutputLevel=WARNING,
-    AuditAlgorithms=True,
-)
diff --git a/options/extra/reconstruction.raw.py b/options/extra/reconstruction.raw.py
deleted file mode 100644
index 8348dd58..00000000
--- a/options/extra/reconstruction.raw.py
+++ /dev/null
@@ -1,384 +0,0 @@
-from Gaudi.Configuration import *
-
-from Configurables import ApplicationMgr, AuditorSvc, EICDataSvc, PodioOutput, GeoSvc
-
-from GaudiKernel.SystemOfUnits import eV, MeV, GeV, mm, cm, mrad
-
-import json
-
-detector_path = str(os.environ.get("DETECTOR_PATH", "."))
-detector_name = str(os.environ.get("DETECTOR_CONFIG", "epic"))
-detector_config = str(os.environ.get("DETECTOR_CONFIG", detector_name))
-detector_version = str(os.environ.get("DETECTOR_VERSION", "main"))
-
-# Detector features that affect reconstruction
-has_ecal_barrel_imaging = False
-has_pid_backward_pfrich = False
-if "epic" in detector_name and "imaging" in detector_config:
-    has_ecal_barrel_imaging = True
-    has_pid_backward_pfrich = True
-if "epic" in detector_name and "brycecanyon" in detector_config:
-    has_ecal_barrel_imaging = True
-    has_pid_backward_pfrich = True
-
-# RICH reconstruction
-qe_data = [
-    (1.0, 0.25),
-    (7.5, 0.25),
-]
-
-# input calorimeter DAQ info
-calo_daq = {}
-with open(
-    "{}/calibrations/calo_digi_default.json".format(detector_path)
-) as f:
-    calo_config = json.load(f)
-    ## add proper ADC capacity based on bit depth
-    for sys in calo_config:
-        cfg = calo_config[sys]
-        calo_daq[sys] = {
-            "dynamicRangeADC": eval(cfg["dynamicRange"]),
-            "capacityADC": 2 ** int(cfg["capacityBitsADC"]),
-            "pedestalMean": int(cfg["pedestalMean"]),
-            "pedestalSigma": float(cfg["pedestalSigma"]),
-        }
-print(calo_daq)
-
-# input and output
-input_sims = [
-    f.strip() for f in str.split(os.environ["JUGGLER_SIM_FILE"], ",") if f.strip()
-]
-output_rec = str(os.environ["JUGGLER_REC_FILE"])
-n_events = int(os.environ["JUGGLER_N_EVENTS"])
-
-# services
-services = []
-# auditor service
-services.append(AuditorSvc("AuditorSvc", Auditors=["ChronoAuditor", "MemStatAuditor"]))
-# geometry service
-services.append(
-    GeoSvc(
-        "GeoSvc",
-        detectors=["{}/{}.xml".format(detector_path, detector_config)],
-        OutputLevel=WARNING,
-    )
-)
-# data service
-services.append(EICDataSvc("EventDataSvc", inputs=input_sims, OutputLevel=WARNING))
-
-# juggler components
-from Configurables import PodioInput
-
-from Configurables import Jug__Digi__SimTrackerHitsCollector as SimTrackerHitsCollector
-from Configurables import Jug__Digi__PhotoMultiplierDigi as PhotoMultiplierDigi
-from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi
-from Configurables import Jug__Digi__SiliconTrackerDigi as TrackerDigi
-
-# branches needed from simulation root file
-sim_coll = [
-    "MCParticles",
-    "B0TrackerHits",
-    "EcalEndcapNHits",
-    "EcalEndcapNHitsContributions",
-    "EcalEndcapPHits",
-    "EcalEndcapPHitsContributions",
-    "HcalBarrelHits",
-    "HcalBarrelHitsContributions",
-    "HcalEndcapPHits",
-    "HcalEndcapPHitsContributions",
-    "HcalEndcapNHits",
-    "HcalEndcapNHitsContributions",
-    "DRICHHits",
-]
-ecal_barrel_imaging_collections = [
-    "EcalBarrelImagingHits",
-    "EcalBarrelImagingHitsContributions",
-    "EcalBarrelScFiHits",
-    "EcalBarrelScFiHitsContributions",
-]
-ecal_barrel_sciglass_collections = [
-    "EcalBarrelSciGlassHits",
-    "EcalBarrelSciGlassHitsContributions",
-]
-if has_ecal_barrel_imaging:
-    sim_coll += ecal_barrel_imaging_collections
-else:
-    sim_coll += ecal_barrel_sciglass_collections
-
-forward_romanpot_collections = [
-    "ForwardRomanPotHits",
-]
-forward_offmtracker_collections = [
-    "ForwardOffMTrackerHits",
-]
-sim_coll += forward_romanpot_collections + forward_offmtracker_collections
-
-tracker_endcap_collections = [
-    "TrackerEndcapHits",
-]
-tracker_barrel_collections = [
-    "SiBarrelHits",
-]
-vertex_barrel_collections = [
-    "VertexBarrelHits",
-]
-mpgd_barrel_collections = [
-    "MPGDBarrelHits",
-]
-
-sim_coll += (
-    tracker_endcap_collections
-    + tracker_barrel_collections
-    + vertex_barrel_collections
-    + mpgd_barrel_collections
-)
-
-if has_pid_backward_pfrich:
-    sim_coll.append("PFRICHHits")
-else:
-    sim_coll.append("MRICHHits")
-
-# list of algorithms
-algorithms = []
-
-# input
-podin = PodioInput("PodioReader", collections=sim_coll)
-algorithms.append(podin)
-
-## Roman pots
-ffi_romanpot_coll = SimTrackerHitsCollector(
-    "ffi_romanpot_coll",
-    inputSimTrackerHits=forward_romanpot_collections,
-    outputSimTrackerHits="ForwardRomanPotAllHits",
-)
-algorithms.append(ffi_romanpot_coll)
-ffi_romanpot_digi = TrackerDigi(
-    "ffi_romanpot_digi",
-    inputHitCollection=ffi_romanpot_coll.outputSimTrackerHits,
-    outputHitCollection="ForwardRomanPotRawHits",
-    timeResolution=8,
-)
-algorithms.append(ffi_romanpot_digi)
-
-## Off momentum tracker
-ffi_offmtracker_coll = SimTrackerHitsCollector(
-    "ffi_offmtracker_coll",
-    inputSimTrackerHits=forward_offmtracker_collections,
-    outputSimTrackerHits="ForwardOffMTrackerAllHits",
-)
-algorithms.append(ffi_offmtracker_coll)
-ffi_offmtracker_digi = TrackerDigi(
-    "ffi_offmtracker_digi",
-    inputHitCollection=ffi_offmtracker_coll.outputSimTrackerHits,
-    outputHitCollection="ForwardOffMTrackerRawHits",
-    timeResolution=8,
-)
-algorithms.append(ffi_offmtracker_digi)
-
-## B0 tracker
-trk_b0_digi = TrackerDigi(
-    "trk_b0_digi",
-    inputHitCollection="B0TrackerHits",
-    outputHitCollection="B0TrackerRawHits",
-    timeResolution=8,
-)
-algorithms.append(trk_b0_digi)
-
-# Crystal Endcap Ecal
-ce_ecal_daq = calo_daq["ecal_neg_endcap"]
-
-ce_ecal_digi = CalHitDigi(
-    "ce_ecal_digi",
-    inputHitCollection="EcalEndcapNHits",
-    outputHitCollection="EcalEndcapNRawHits",
-    energyResolutions=[0.0, 0.02, 0.0],
-    **ce_ecal_daq
-)
-algorithms.append(ce_ecal_digi)
-
-# Endcap Sampling Ecal
-ci_ecal_daq = calo_daq["ecal_pos_endcap"]
-
-ci_ecal_digi = CalHitDigi(
-    "ci_ecal_digi",
-    inputHitCollection="EcalEndcapPHits",
-    outputHitCollection="EcalEndcapPRawHits",
-    **ci_ecal_daq
-)
-algorithms.append(ci_ecal_digi)
-
-# Central Barrel Ecal
-if has_ecal_barrel_imaging:
-    # Central ECAL Imaging Calorimeter
-    img_barrel_daq = calo_daq["ecal_barrel_imaging"]
-
-    img_barrel_digi = CalHitDigi(
-        "img_barrel_digi",
-        inputHitCollection="EcalBarrelImagingHits",
-        outputHitCollection="EcalBarrelImagingRawHits",
-        energyResolutions=[0.0, 0.02, 0.0],  # 2% flat resolution
-        **img_barrel_daq
-    )
-    algorithms.append(img_barrel_digi)
-
-    # Central ECAL SciFi
-    scfi_barrel_daq = calo_daq["ecal_barrel_scfi"]
-
-    scfi_barrel_digi = CalHitDigi(
-        "scfi_barrel_digi",
-        inputHitCollection="EcalBarrelScFiHits",
-        outputHitCollection="EcalBarrelScFiRawHits",
-        **scfi_barrel_daq
-    )
-    algorithms.append(scfi_barrel_digi)
-else:
-    # SciGlass calorimeter
-    sciglass_ecal_daq = calo_daq["ecal_barrel_sciglass"]
-
-    sciglass_ecal_digi = CalHitDigi(
-        "sciglass_ecal_digi",
-        inputHitCollection="EcalBarrelSciGlassHits",
-        outputHitCollection="EcalBarrelSciGlassRawHits",
-        energyResolutions=[0.0, 0.02, 0.0],  # 2% flat resolution
-        **sciglass_ecal_daq
-    )
-    algorithms.append(sciglass_ecal_digi)
-
-# Central Barrel Hcal
-cb_hcal_daq = calo_daq["hcal_barrel"]
-
-cb_hcal_digi = CalHitDigi(
-    "cb_hcal_digi",
-    inputHitCollection="HcalBarrelHits",
-    outputHitCollection="HcalBarrelRawHits",
-    **cb_hcal_daq
-)
-algorithms.append(cb_hcal_digi)
-
-# Hcal Hadron Endcap
-ci_hcal_daq = calo_daq["hcal_pos_endcap"]
-
-ci_hcal_digi = CalHitDigi(
-    "ci_hcal_digi",
-    inputHitCollection="HcalEndcapPHits",
-    outputHitCollection="HcalEndcapPRawHits",
-    **ci_hcal_daq
-)
-algorithms.append(ci_hcal_digi)
-
-# Hcal Electron Endcap
-ce_hcal_daq = calo_daq["hcal_neg_endcap"]
-
-ce_hcal_digi = CalHitDigi(
-    "ce_hcal_digi",
-    inputHitCollection="HcalEndcapNHits",
-    outputHitCollection="HcalEndcapNRawHits",
-    **ce_hcal_daq
-)
-algorithms.append(ce_hcal_digi)
-
-# Tracking
-trk_b_coll = SimTrackerHitsCollector(
-    "trk_b_coll",
-    inputSimTrackerHits=tracker_barrel_collections,
-    outputSimTrackerHits="TrackerBarrelAllHits",
-)
-algorithms.append(trk_b_coll)
-
-trk_b_digi = TrackerDigi(
-    "trk_b_digi",
-    inputHitCollection=trk_b_coll.outputSimTrackerHits,
-    outputHitCollection="TrackerBarrelRawHits",
-    timeResolution=8,
-)
-algorithms.append(trk_b_digi)
-
-trk_ec_coll = SimTrackerHitsCollector(
-    "trk_ec_coll",
-    inputSimTrackerHits=tracker_endcap_collections,
-    outputSimTrackerHits="TrackerEndcapAllHits",
-)
-algorithms.append(trk_ec_coll)
-
-trk_ec_digi = TrackerDigi(
-    "trk_ec_digi",
-    inputHitCollection=trk_ec_coll.outputSimTrackerHits,
-    outputHitCollection="TrackerEndcapRawHits",
-    timeResolution=8,
-)
-algorithms.append(trk_ec_digi)
-
-vtx_b_coll = SimTrackerHitsCollector(
-    "vtx_b_coll",
-    inputSimTrackerHits=vertex_barrel_collections,
-    outputSimTrackerHits="VertexBarrelAllHits",
-)
-algorithms.append(vtx_b_coll)
-
-vtx_b_digi = TrackerDigi(
-    "vtx_b_digi",
-    inputHitCollection=vtx_b_coll.outputSimTrackerHits,
-    outputHitCollection="VertexBarrelRawHits",
-    timeResolution=8,
-)
-algorithms.append(vtx_b_digi)
-
-mpgd_b_coll = SimTrackerHitsCollector(
-    "mpgd_b_coll",
-    inputSimTrackerHits=mpgd_barrel_collections,
-    outputSimTrackerHits="MPGDTrackerBarrelAllHits",
-)
-algorithms.append(mpgd_b_coll)
-
-mpgd_b_digi = TrackerDigi(
-    "mpgd_b_digi",
-    inputHitCollection=mpgd_b_coll.outputSimTrackerHits,
-    outputHitCollection="MPGDTrackerBarrelRawHits",
-    timeResolution=8,
-)
-algorithms.append(mpgd_b_digi)
-
-# DRICH
-drich_digi = PhotoMultiplierDigi(
-    "drich_digi",
-    inputHitCollection="DRICHHits",
-    outputHitCollection="DRICHRawHits",
-    quantumEfficiency=[(a * eV, b) for a, b in qe_data],
-)
-algorithms.append(drich_digi)
-
-# MRICH
-if "acadia" in detector_version:
-    mrich_digi = PhotoMultiplierDigi(
-        "mrich_digi",
-        inputHitCollection="MRICHHits",
-        outputHitCollection="MRICHRawHits",
-        quantumEfficiency=[(a * eV, b) for a, b in qe_data],
-    )
-    algorithms.append(mrich_digi)
-
-# Output
-podout = PodioOutput("out", filename=output_rec)
-podout.outputCommands = (
-    [
-        "keep *",
-        "drop *Hits",
-        "keep *Layers",
-        "keep *Clusters",
-        "drop *ProtoClusters",
-        "drop outputParticles",
-        "drop InitTrackParams",
-    ]
-    + ["drop " + c for c in sim_coll]
-    + ["keep *RawHits"]
-)
-algorithms.append(podout)
-
-ApplicationMgr(
-    TopAlg=algorithms,
-    EvtSel="NONE",
-    EvtMax=n_events,
-    ExtSvc=services,
-    OutputLevel=WARNING,
-    AuditAlgorithms=True,
-)
-- 
GitLab