diff --git a/benchmarks/clustering/config.yml b/benchmarks/clustering/config.yml
index 76aab71dd4441954b566c91de26fbc1ab3dfbdec..c6c3a30c332128d4fe32629dbb3a697927675259 100644
--- a/benchmarks/clustering/config.yml
+++ b/benchmarks/clustering/config.yml
@@ -3,7 +3,7 @@ clustering:process :
   stage: process
   timeout: 8 hour
   script:
-    - bash benchmarks/clustering/barrel_clusters.sh
+    - bash benchmarks/clustering/full_cal_clusters.sh
 
 clustering:results:
   extends: .rec_benchmark
diff --git a/benchmarks/clustering/barrel_clusters.sh b/benchmarks/clustering/full_cal_clusters.sh
similarity index 88%
rename from benchmarks/clustering/barrel_clusters.sh
rename to benchmarks/clustering/full_cal_clusters.sh
index 28f924155d05bc87a9f52410d5ce6e018662fcb5..5cdf14b604b39582ee680481779711df742b624f 100644
--- a/benchmarks/clustering/barrel_clusters.sh
+++ b/benchmarks/clustering/full_cal_clusters.sh
@@ -14,8 +14,8 @@ print_env.sh
 # deprecated
 export JUGGLER_DETECTOR_PATH=${DETECTOR_PATH}
 
-if [[ ! -n  "${JUGGLER_N_EVENTS}" ]] ; then 
-  export JUGGLER_N_EVENTS=1
+if [[ ! -n  "${JUGGLER_N_EVENTS}" ]] ; then
+  export JUGGLER_N_EVENTS=100
 fi
 
 if [[ ! -n "${CB_EMCAL_SAMP_FRAC}" ]] ; then
@@ -34,8 +34,10 @@ echo "JUGGLER_DETECTOR = ${JUGGLER_DETECTOR}"
 root -b -q "benchmarks/clustering/scripts/gen_central_pions.cxx(${JUGGLER_N_EVENTS}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")"
 
 ### run geant4 simulations
+# part.minimalKineticEnergy sets Ek limit for saving particles in mcparticles branch
+# 1*TeV means only saving particles from the event generator
 npsim --runType batch \
-      --part.minimalKineticEnergy 1000*GeV  \
+      --part.minimalKineticEnergy "1*TeV"  \
       -v WARNING \
       --numberOfEvents ${JUGGLER_N_EVENTS} \
       --compactFile ${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml \
diff --git a/benchmarks/clustering/options/full_cal_clustering.py b/benchmarks/clustering/options/full_cal_clustering.py
new file mode 100644
index 0000000000000000000000000000000000000000..39bb28eeb213122e307707205631a1a028149c15
--- /dev/null
+++ b/benchmarks/clustering/options/full_cal_clustering.py
@@ -0,0 +1,172 @@
+from Gaudi.Configuration import *
+import os
+import ROOT
+
+from GaudiKernel.DataObjectHandleBase import DataObjectHandleBase
+from Configurables import ApplicationMgr, EICDataSvc, PodioInput, PodioOutput, GeoSvc
+from GaudiKernel.SystemOfUnits import MeV, GeV, cm
+
+detector_name = str(os.environ.get("JUGGLER_DETECTOR", "athena"))
+detector_path = str(os.environ.get("DETECTOR_PATH", "."))
+compact_path = os.path.join(detector_path, detector_name)
+
+# get sampling fractions from system environment variable, 1.0 by default
+cb_ecal_sf = float(os.environ.get("CB_EMCAL_SAMP_FRAC", 1.0))
+cb_hcal_sf = float(os.environ.get("CB_HCAL_SAMP_FRAC", 1.0))
+
+# 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"])
+
+# geometry service
+geo_service = GeoSvc("GeoSvc", detectors=["{}.xml".format(detector_name)])
+# data service
+podioevent = EICDataSvc("EventDataSvc", inputs=[input_sims])
+
+
+# juggler components
+from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
+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__ImagingPixelReco as ImCalPixelReco
+from Configurables import Jug__Reco__ImagingTopoCluster as ImagingCluster
+
+from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG
+from Configurables import Jug__Reco__ImagingClusterReco as ImagingClusterReco
+
+# branches needed from simulation root file
+sim_coll = [
+    "mcparticles",
+    "CrystalEcalHits",
+    "EcalBarrelHits",
+    "HcalBarrelHits",
+]
+
+# input and output
+podin = PodioInput("PodioReader", collections=sim_coll)
+podout = PodioOutput("out", filename=output_rec_file)
+
+# copier needed to get around input --> output copy bug. So truth (mcparticles) can be saved in output file
+copier = MCCopier("MCCopier", inputCollection="mcparticles", outputCollection="mcparticles2")
+
+# Crystal Endcap Ecal
+ce_ecal_digi = CalHitDigi("ce_ecal_digi",
+        inputHitCollection="CrystalEcalHits",
+        outputHitCollection="CrystalEcalHitsDigi",
+        energyResolutions=[0., 0.02, 0.],
+        dynamicRangeADC=5.*GeV,     # digi settings must match with reco
+        capacityADC=32768,
+        pedestalMean=400,
+        pedestalSigma=3)
+
+ce_ecal_reco = CalHitReco("ce_ecal_reco",
+        inputHitCollection="CrystalEcalHitsDigi",
+        outputHitCollection="CrystalEcalHitsReco",
+        dynamicRangeADC=5.*GeV,
+        capacityADC=32768,
+        pedestalMean=400,
+        pedestalSigma=3,
+        thresholdFactor=4,          # 4 sigma
+        minimumHitEdep=1.0*MeV)     # discard low energy hits
+
+ce_ecal_cl = IslandCluster("ce_ecal_cl",
+        # OutputLevel=DEBUG,
+        inputHitCollection="CrystalEcalHitsReco",
+        outputClusterCollection="CrystalEcalClusters",
+        splitCluster=False,
+        minClusterCenterEdep=30*units.MeV,
+        groupRanges=[2.2*cm, 2.2*cm])
+
+ce_ecal_clreco = RecoCoG("ce_ecal_clreco",
+        clusterCollection="CrystalEcalClusters",
+        logWeightBase=4.6)
+
+
+# central barrel Ecal
+cb_ecal_digi = CalHitDigi("cb_ecal_digi",
+        inputHitCollection="EcalBarrelHits",
+        outputHitCollection="EcalBarrelHitsDigi",
+        energyResolutions=[0., 0.02, 0.],   # 2% flat resolution
+        dynamicRangeADC=3*MeV,
+        capacityADC=8192,
+        pedestalMean=400,
+        pedestalSigma=20)   # about 6 keV
+cb_ecal_reco = ImaCalPixelReco("cb_ecal_reco",
+        inputHitCollection="EcalBarrelHitsDigi",
+        outputHitCollection="EcalBarrelHitsReco",
+        dynamicRangeADC=3.*MeV,
+        capacityADC=8192,
+        pedestalMean=400,
+        pedestalSigma=20,
+        thresholdFactor=3,  # about 20 keV
+        readoutClass="EcalBarrelHits",  # readout class
+        layerField="layer",             # field to get layer id
+        sectorField="module")           # field to get sector id
+cb_ecal_cl = ImagingCluster("cb_ecal_cl",
+        inputHitCollection="EcalBarrelHitsReco",
+        outputClusterCollection="EcalBarrelClusters",
+        localRanges=[2.*units.mm, 2*units.mm],          # same layer
+        adjLayerRanges=[10*units.mrad, 10*units.mrad],  # adjacent layer
+        adjLayerDiff=2,                                 # id diff for adjacent layer
+        adjSectorDist=3.*units.cm)                      # different sector
+cb_ecal_clreco = ImagingClusterReco("cb_ecal_clreco",
+        inputClusterCollection="EcalBarrelClusters",
+        outputLayerCollection="EcalBarrelLayers")
+
+# central barrel hcal
+cb_hcal_digi = CalHitDigi("cb_hcal_digi",
+         inputHitCollection="HcalBarrelHits",
+         outputHitCollection="HcalBarrelHitsDigi",
+         dynamicRangeADC=50.*MeV,
+         capacityADC=32768,
+         pedestalMean=400,
+         pedestalSigma=10)
+
+cb_hcal_reco = CalHitReco("cb_hcal_reco",
+        inputHitCollection="HcalBarrelHitsDigi",
+        outputHitCollection="HcalBarrelHitsReco",
+        dynamicRangeADC=50.*MeV,
+        capacityADC=32768,
+        pedestalMean=400,
+        pedestalSigma=10,
+        thresholdFactor=5.0)
+
+# merge hits in different layer (projection to local x-y plane)
+cb_hcal_merger = CalHitsMerger("cb_hcal_merger",
+          fields=["layer", "slice"],
+          fieldRefNumbers=[1, 0],
+          inputHitCollection="HcalBarrelHitsReco",
+          outputHitCollection="HcalBarrelHitsRecoXY")
+
+cb_hcal_cl = IslandCluster("cb_hcal_cl",
+        inputHitCollection="HcalBarrelHitsRecoXY",
+        outputClusterCollection="HcalBarrelClusters",
+        splitCluster=False,
+        minClusterCenterEdep=30.*MeV,
+        groupRanges=[15.*cm, 15.*cm],
+        OutputLevel=DEBUG)
+
+cb_hcal_clreco = RecoCoG("cb_hcal_clreco",
+        clusterCollection="HcalBarrelClusters",
+        logWeightBase=6.2,
+        samplingFraction=cb_hcal_sf,
+        OutputLevel=DEBUG)
+
+out.outputCommands = ["keep *"]
+
+ApplicationMgr(
+    TopAlg = [podioinput, copier,
+              ce_ecal_digi, ce_ecal_reco, ce_ecal_cl, ce_ecal_clreco,
+              cb_ecal_digi, cb_ecal_reco, cb_ecal_cl, cb_ecal_clreco,
+              cb_hcal_digi, cb_hcal_reco, cb_hcal_cl, cb_hcal_clreco,
+              out],
+    EvtSel = 'NONE',
+    EvtMax   = n_events,
+    ExtSvc = [podioevent],
+    OutputLevel=DEBUG
+)
+
diff --git a/benchmarks/clustering/options/fullcalo_clustering.py b/benchmarks/clustering/options/fullcalo_clustering.py
deleted file mode 100644
index d2aa4e689f1676aad6972e6fa8a7dde87cf5b446..0000000000000000000000000000000000000000
--- a/benchmarks/clustering/options/fullcalo_clustering.py
+++ /dev/null
@@ -1,135 +0,0 @@
-from Gaudi.Configuration import *
-import os
-  
-from GaudiKernel.DataObjectHandleBase import DataObjectHandleBase
-from Configurables import ApplicationMgr, EICDataSvc, PodioOutput, GeoSvc
-from GaudiKernel import SystemOfUnits as units
-
-detector_name = "topside"
-if "JUGGLER_DETECTOR" in os.environ :
-  detector_name = str(os.environ["JUGGLER_DETECTOR"])
-
-if "JUGGLER_DETECTOR_PATH" in os.environ :
-  detector_name = str(os.environ["JUGGLER_DETECTOR_PATH"]) + "/" + detector_name
-
-# get sampling fraction from system environment variable, 1.0 by default
-sf = 1.0
-if "CB_EMCAL_SAMP_FRAC" in os.environ :
-  sf = str(os.environ["CB_EMCAL_SAMP_FRAC"])
-
-# todo add checks
-input_sim_file  = str(os.environ["JUGGLER_SIM_FILE"])
-output_rec_file = str(os.environ["JUGGLER_REC_FILE"])
-n_events = str(os.environ["JUGGLER_N_EVENTS"])
-
-geo_service  = GeoSvc("GeoSvc", detectors=["{}.xml".format(detector_name)])
-podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file])
-
-from Configurables import PodioInput
-from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
-from Configurables import Jug__Base__InputCopier_dd4pod__CalorimeterHitCollection_dd4pod__CalorimeterHitCollection_ as CalCopier
-
-from Configurables import Jug__Digi__HadronicCalDigi as HadCalorimeterDigi
-from Configurables import Jug__Digi__EMCalorimeterDigi as EMCalorimeterDigi
-from Configurables import Jug__Digi__CrystalEndcapsDigi as CrystalEndcapsDigi
-
-from Configurables import Jug__Reco__CrystalEndcapsReco as CrystalEndcapsReco
-from Configurables import Jug__Reco__EMCalReconstruction as EMCalReconstruction
-from Configurables import Jug__Reco__HCalReconstruction as HCalReconstruction
-
-from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
-from Configurables import Jug__Reco__CalorimeterIslandCluster as IslandCluster
-from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG
-
-podioinput = PodioInput("PodioReader", collections=["mcparticles","CrystalEcalHits","EcalBarrelHits","HcalBarrelHits"], OutputLevel=DEBUG)
-
-## copiers to get around input --> output copy bug. Note the "2" appended to the output collection.
-copier = MCCopier("MCCopier", 
-        inputCollection="mcparticles", 
-        outputCollection="mcparticles2") 
-calcopier = CalCopier("CalCopier", 
-        inputCollection="CrystalEcalHits", 
-        outputCollection="CrystalEcalHits2") 
-
-
-##raw hits
-emcaldigi = CrystalEndcapsDigi("ecal_digi",
-        inputHitCollection="CrystalEcalHits", 
-        outputHitCollection="RawDigiEcalHits")
-ecdigi = EMCalorimeterDigi("ec_barrel_digi", 
-        inputHitCollection="EcalBarrelHits", 
-        outputHitCollection="RawEcalBarrelHits")
-
-hcaldigi = HadCalorimeterDigi("hcal_barrel_digi",
-         inputHitCollection="HcalBarrelHits",
-         outputHitCollection="RawHcalBarrelHits")
-
-
-
-#digitized hits
-crystal_ec_reco = CrystalEndcapsReco("crystal_ec_reco", 
-        inputHitCollection="RawDigiEcalHits", 
-        outputHitCollection="RecoEcalHits",
-        minModuleEdep=1.0*units.MeV)
-
-ecal_reco = EMCalReconstruction("ecal_reco", 
-        inputHitCollection="RawEcalBarrelHits", 
-        outputHitCollection="RecEcalBarrelHits",
-        samplingFraction=0.25,
-        minModuleEdep=0.0*units.MeV)
-
-hcal_reco = HCalReconstruction("hcal_reco",
-        inputHitCollection="RawHcalBarrelHits",
-        outputHitCollection="RecHcalBarrelHits",
-        samplingFraction=0.25,
-        minModuleEdep=0.0*units.MeV)
-#clusters
-ec_barrel_cluster = IslandCluster("ec_barrel_cluster", 
-        inputHitCollection="RecEcalBarrelHits", 
-        outputClusterCollection="EcalBarrelClusters",
-        splitHitCollection="splitEcalBarrelHitCollection",
-        minClusterCenterEdep=1*units.MeV, 
-        groupRange=2.0,
-        OutputLevel=DEBUG)
-
-crystal_ec_cluster = IslandCluster("crystal_ec_cluster", 
-        inputHitCollection="RecoEcalHits", 
-        outputClusterCollection="EcalClusters",
-        minClusterCenterEdep=30*units.MeV, 
-        groupRange=2.0,
-        OutputLevel=DEBUG)
-
-simple_cluster = SimpleClustering("simple_cluster", 
-        inputHitCollection="RecEcalBarrelHits", 
-        outputClusters="SimpleClusters",
-        OutputLevel=DEBUG)
-
-# finalizing clustering (center-of-gravity step)
-ec_barrel_clusterreco = RecoCoG("ec_barrel_clusterreco",
-        clusterCollection="EcalBarrelClusters", 
-        logWeightBase=6.2,
-        samplingFraction=sf) 
-
-clusterreco = RecoCoG("cluster_reco", 
-        clusterCollection="EcalClusters", 
-        logWeightBase=4.2, 
-        moduleDimZName="CrystalBox_z_length",
-        samplingFraction=sf, 
-        OutputLevel=DEBUG)
-
-out = PodioOutput("out", filename=output_rec_file)
-
-out.outputCommands = ["keep *"]
-
-ApplicationMgr(
-    TopAlg = [podioinput, copier, calcopier,
-              ecdigi, emcaldigi,hcaldigi,
-              crystal_ec_reco, ecal_reco, hcal_reco,  
-              #ec_barrel_cluster, crystal_ec_cluster, ec_barrel_clusterreco, clusterreco,
-              #simple_cluster,
-              out],
-    EvtSel = 'NONE',
-    EvtMax   = n_events,
-    ExtSvc = [podioevent],
-    OutputLevel=DEBUG
- )