From 33f4a4c7e2095330966e823d5e6878cb124d79ca Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Thu, 2 Oct 2025 17:12:30 +0300 Subject: [PATCH 1/3] Fixes for modules at negative eta --- .../ECal/base/include/ECalBase/Geometry.h | 1 + .../ALICE3/ECal/base/src/Geometry.cxx | 14 +++- .../include/ECalReconstruction/Clusterizer.h | 42 +++++++----- .../ECal/reconstruction/src/Clusterizer.cxx | 67 ++++++++++++++----- 4 files changed, 86 insertions(+), 38 deletions(-) diff --git a/Detectors/Upgrades/ALICE3/ECal/base/include/ECalBase/Geometry.h b/Detectors/Upgrades/ALICE3/ECal/base/include/ECalBase/Geometry.h index ecfcb5b7cbad6..a780e36f45938 100644 --- a/Detectors/Upgrades/ALICE3/ECal/base/include/ECalBase/Geometry.h +++ b/Detectors/Upgrades/ALICE3/ECal/base/include/ECalBase/Geometry.h @@ -61,6 +61,7 @@ class Geometry double getSamplingAlpha() { return mSamplingAlpha; } double getCrystalDeltaPhi() { return 2 * std::atan(mCrystalModW / 2 / mRMin); } double getSamplingDeltaPhi() { return 2 * std::atan(mSamplingModW / 2 / mRMin); } + double getFrontFaceMaxEta(int i); double getCrystalPhiMin(); double getSamplingPhiMin(); int getNModulesZ() { return mNModulesZ; } diff --git a/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx b/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx index 9483b83f19f49..73c9b6f6c9fa5 100644 --- a/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx +++ b/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx @@ -73,6 +73,12 @@ double Geometry::getSamplingPhiMin() return (superModuleDeltaPhi - samplingDeltaPhi * mNSamplingModulesPhi) / 2.; } +double Geometry::getFrontFaceMaxEta(int i) +{ + double theta = std::atan(mRMin / getFrontFaceZatMinR(i)); + return -std::log(std::tan(theta / 2.)); +} + //============================================================================== void Geometry::fillFrontFaceCenterCoordinates() { @@ -153,7 +159,7 @@ int Geometry::getCellID(int moduleId, int sectorId, bool isCrystal) if (sectorId % 2 == 0) { // sampling at positive eta cellID = sectorId / 2 * mNModulesZ + moduleId + mNSamplingModulesZ + mNCrystalModulesZ * 2; } else { // sampling at negative eta - cellID = sectorId / 2 * mNModulesZ - moduleId + mNSamplingModulesZ; + cellID = sectorId / 2 * mNModulesZ - moduleId + mNSamplingModulesZ - 1; } } return cellID; @@ -206,13 +212,15 @@ void Geometry::detIdToGlobalPosition(int detId, double& x, double& y, double& z) { int chamber, sector, iphi, iz; detIdToRelIndex(detId, chamber, sector, iphi, iz); + double r = 0; if (iz < mNSamplingModulesZ + mNCrystalModulesZ) { z = -mFrontFaceCenterZ[mNSamplingModulesZ + mNCrystalModulesZ - iz - 1]; + r = mFrontFaceCenterR[mNSamplingModulesZ + mNCrystalModulesZ - iz - 1]; } else { - z = +mFrontFaceCenterZ[iz % (mNSamplingModulesZ + mNCrystalModulesZ)]; + z = mFrontFaceCenterZ[iz % (mNSamplingModulesZ + mNCrystalModulesZ)]; + r = mFrontFaceCenterR[iz % (mNSamplingModulesZ + mNCrystalModulesZ)]; } double phi = chamber == 1 ? mFrontFaceCenterCrystalPhi[iphi] : mFrontFaceCenterSamplingPhi[iphi]; - double r = mFrontFaceCenterR[iz % (mNSamplingModulesZ + mNCrystalModulesZ)]; x = r * std::cos(phi); y = r * std::sin(phi); } diff --git a/Detectors/Upgrades/ALICE3/ECal/reconstruction/include/ECalReconstruction/Clusterizer.h b/Detectors/Upgrades/ALICE3/ECal/reconstruction/include/ECalReconstruction/Clusterizer.h index 3bb7cab4b11e3..5e4d36f831360 100644 --- a/Detectors/Upgrades/ALICE3/ECal/reconstruction/include/ECalReconstruction/Clusterizer.h +++ b/Detectors/Upgrades/ALICE3/ECal/reconstruction/include/ECalReconstruction/Clusterizer.h @@ -48,25 +48,33 @@ class Clusterizer void setClusteringThreshold(double threshold) { mClusteringThreshold = threshold; } void setCrystalDigitThreshold(double threshold) { mCrystalDigitThreshold = threshold; } void setSamplingDigitThreshold(double threshold) { mSamplingDigitThreshold = threshold; } + void setCrystalEnergyCorrectionPars(std::vector pars) { mCrystalEnergyCorrectionPars = pars; } + void setSamplingEnergyCorrectionPars(std::vector pars) { mSamplingEnergyCorrectionPars = pars; } + void setCrystalZCorrectionPars(std::vector pars) { mCrystalZCorrectionPars = pars; } + void setSamplingZCorrectionPars(std::vector pars) { mSamplingZCorrectionPars = pars; } private: - std::vector> mDigitIndices; // 2D map of digit indices used for recursive cluster finding - bool mUnfoldClusters = true; // to perform cluster unfolding - double mCrystalDigitThreshold = 0.040; // minimal energy of crystal digit - double mSamplingDigitThreshold = 0.100; // minimal energy of sampling digit - double mClusteringThreshold = 0.050; // minimal energy of digit to start clustering (GeV) - double mClusteringTimeGate = 1e9; // maximal time difference between digits to be accepted to clusters (in ns) - int mNLMMax = 30; // maximal number of local maxima in unfolding - double mLogWeight = 4.; // cutoff used in log. weight calculation - double mUnfogingEAccuracy = 1.e-4; // accuracy of energy calculation in unfoding prosedure (GeV) - double mUnfogingXZAccuracy = 1.e-2; // accuracy of position calculation in unfolding procedure (cm) - int mNMaxIterations = 100; // maximal number of iterations in unfolding procedure - double mLocalMaximumCut = 0.015; // minimal height of local maximum over neighbours - bool mApplyCorrectionZ = 1; // z-correction - bool mApplyCorrectionE = 1; // energy-correction - TF1* fCrystalShowerShape; //! Crystal shower shape - TF1* fSamplingShowerShape; //! Sampling shower shape - TF1* fCrystalRMS; //! Crystal RMS + std::vector> mDigitIndices; // 2D map of digit indices used for recursive cluster finding + bool mUnfoldClusters = true; // to perform cluster unfolding + double mCrystalDigitThreshold = 0.040; // minimal energy of crystal digit + double mSamplingDigitThreshold = 0.100; // minimal energy of sampling digit + double mClusteringThreshold = 0.050; // minimal energy of digit to start clustering (GeV) + double mClusteringTimeGate = 1e9; // maximal time difference between digits to be accepted to clusters (in ns) + int mNLMMax = 30; // maximal number of local maxima in unfolding + double mLogWeight = 4.; // cutoff used in log. weight calculation + double mUnfogingEAccuracy = 1.e-4; // accuracy of energy calculation in unfoding prosedure (GeV) + double mUnfogingXZAccuracy = 1.e-2; // accuracy of position calculation in unfolding procedure (cm) + int mNMaxIterations = 100; // maximal number of iterations in unfolding procedure + double mLocalMaximumCut = 0.015; // minimal height of local maximum over neighbours + bool mApplyCorrectionZ = 1; // apply z-correction + bool mApplyCorrectionE = 1; // apply energy-correction + TF1* fCrystalShowerShape; //! Crystal shower shape + TF1* fSamplingShowerShape; //! Sampling shower shape + TF1* fCrystalRMS; //! Crystal RMS + std::vector mCrystalEnergyCorrectionPars; // crystal energy-correction parameters + std::vector mSamplingEnergyCorrectionPars; // sampling energy-correction parameters + std::vector mCrystalZCorrectionPars; // crystal z-correction parameters + std::vector mSamplingZCorrectionPars; // sampling z-correction parameters }; } // namespace ecal diff --git a/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx b/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx index c84f62b60ec38..6c581bc4b0283 100644 --- a/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx +++ b/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx @@ -31,6 +31,45 @@ Clusterizer::Clusterizer(bool applyCorrectionZ, bool applyCorrectionE) mDigitIndices.resize(geo.getNrows(), std::vector(geo.getNcols(), -1)); mApplyCorrectionZ = applyCorrectionZ; mApplyCorrectionE = applyCorrectionE; + + mCrystalEnergyCorrectionPars.reserve(6); + mCrystalEnergyCorrectionPars[0] = 0.00444; + mCrystalEnergyCorrectionPars[1] = -1.322; + mCrystalEnergyCorrectionPars[2] = 1.021; + mCrystalEnergyCorrectionPars[3] = 0.0018; + mCrystalEnergyCorrectionPars[4] = 0.; + mCrystalEnergyCorrectionPars[5] = 0.; + + mSamplingEnergyCorrectionPars.reserve(6); + mSamplingEnergyCorrectionPars[0] = 0.0033; + mSamplingEnergyCorrectionPars[1] = -2.09; + mSamplingEnergyCorrectionPars[2] = 1.007; + mSamplingEnergyCorrectionPars[3] = 0.0667; + mSamplingEnergyCorrectionPars[4] = -0.108; + mSamplingEnergyCorrectionPars[5] = 0.0566; + + mCrystalZCorrectionPars.reserve(9); + mCrystalZCorrectionPars[0] = -0.005187; + mCrystalZCorrectionPars[1] = 0.7301; + mCrystalZCorrectionPars[2] = -0.7382; + mCrystalZCorrectionPars[3] = 0.; + mCrystalZCorrectionPars[4] = 0.; + mCrystalZCorrectionPars[5] = 0.; + mCrystalZCorrectionPars[6] = 0.; + mCrystalZCorrectionPars[7] = 0.; + mCrystalZCorrectionPars[8] = 0.; + + mSamplingZCorrectionPars.reserve(9); + mSamplingZCorrectionPars[0] = -2.137; + mSamplingZCorrectionPars[1] = 6.400; + mSamplingZCorrectionPars[2] = -3.342; + mSamplingZCorrectionPars[3] = -0.1364; + mSamplingZCorrectionPars[4] = 0.4019; + mSamplingZCorrectionPars[5] = -0.1969; + mSamplingZCorrectionPars[6] = 0.008223; + mSamplingZCorrectionPars[7] = -0.02425; + mSamplingZCorrectionPars[8] = 0.01190; + fCrystalShowerShape = new TF1("fCrystal", "x<[1] ? [0]*exp([3]*x+[4]*x*x+[5]*x*x*x) : (x<[2] ? [0]*[6]*exp([7]*x+[8]*x*x) : [0]*[9]*exp([10]*x+[11]*x*x))", 0, 15); double pc[12]; pc[0] = 1. / 13.15; @@ -354,25 +393,17 @@ void Clusterizer::evalClusters(std::vector& clusters) // correct cluster energy and z position float eta = std::abs(cluster.getEta()); - float eCor = 1; - float zCor = 0; bool isCrystal = geo.isCrystal(cluster.getDigitTowerId(0)); - if (isCrystal) { - eCor = 0.00444 * std::pow(ee, -1.322) + (1.021 + 0.0018 * eta); - if (mApplyCorrectionE) - ee *= eCor; - if (mApplyCorrectionZ) - zCor = (-0.00518682 + 0.730052 * eta - 0.73817 * eta * eta); - } else { - eCor = 0.0033 * std::pow(ee, -2.09) + (1.007 + 0.0667 * eta - 0.108 * eta * eta + 0.0566 * eta * eta * eta); - if (mApplyCorrectionE) - ee *= eCor; - if (mApplyCorrectionZ) - zCor = (-2.13679 + 6.40009 * eta - 3.34233 * eta * eta) + (-0.136425 + 0.401887 * eta - 0.196851 * eta * eta) * ee + (0.00822276 - 0.0242512 * eta + 0.0118986 * eta * eta) * ee * ee; + if (mApplyCorrectionE) { + std::vector& pe = isCrystal ? mCrystalEnergyCorrectionPars : mSamplingEnergyCorrectionPars; + ee *= pe[0] * std::pow(ee, pe[1]) + pe[2] + pe[3] * eta + pe[4] * eta * eta + pe[5] * eta * eta * eta; + cluster.setE(ee); + } + if (mApplyCorrectionZ) { + std::vector& pz = isCrystal ? mCrystalZCorrectionPars : mSamplingZCorrectionPars; + float zCor = (pz[0] + pz[1] * eta + pz[2] * eta * eta) + (pz[3] + pz[4] * eta + pz[5] * eta * eta) * ee + (pz[6] + pz[7] * eta + pz[8] * eta * eta) * ee * ee; + cluster.setZ(z > 0 ? z - zCor : z + zCor); } - - cluster.setE(ee); - cluster.setZ(cluster.getZ() - zCor); // check if cluster is at the edge of detector module bool isEdge = 0; @@ -385,7 +416,7 @@ void Clusterizer::evalClusters(std::vector& clusters) } cluster.setEdgeFlag(isEdge); - LOGF(debug, "Cluster coordinates: (%6.2f,%6.2f,%6.2f), eCor=%6.2f zCor=%6.2f", cluster.getX(), cluster.getY(), cluster.getZ(), eCor, zCor); + LOGF(debug, "Cluster coordinates: (%6.2f,%6.2f,%6.2f)", cluster.getX(), cluster.getY(), cluster.getZ()); } } From 5189d08affc3758d4b5584b22770a7fbbe62a625 Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Thu, 2 Oct 2025 21:18:36 +0300 Subject: [PATCH 2/3] Add braces in if statements --- .../ALICE3/ECal/base/src/Geometry.cxx | 32 ++++++++++------- .../ECal/reconstruction/src/Clusterizer.cxx | 36 +++++++++++-------- .../ALICE3/ECal/simulation/src/Detector.cxx | 4 +-- .../ALICE3/ECal/simulation/src/Digitizer.cxx | 8 +++-- 4 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx b/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx index 73c9b6f6c9fa5..2d6bdf160f393 100644 --- a/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx +++ b/Detectors/Upgrades/ALICE3/ECal/base/src/Geometry.cxx @@ -82,8 +82,9 @@ double Geometry::getFrontFaceMaxEta(int i) //============================================================================== void Geometry::fillFrontFaceCenterCoordinates() { - if (mFrontFaceCenterR.size() > 0) + if (mFrontFaceCenterR.size() > 0) { return; + } mFrontFaceCenterTheta.resize(mNCrystalModulesZ + mNSamplingModulesZ); mFrontFaceZatMinR.resize(mNCrystalModulesZ + mNSamplingModulesZ); mFrontFaceCenterR.resize(mNCrystalModulesZ + mNSamplingModulesZ); @@ -232,10 +233,12 @@ int Geometry::areNeighboursVertex(int detId1, int detId2) const int ch2, sector2, iphi2, iz2; detIdToRelIndex(detId1, ch1, sector1, iphi1, iz1); detIdToRelIndex(detId2, ch2, sector2, iphi2, iz2); - if (sector1 != sector2 || ch1 != ch2) + if (sector1 != sector2 || ch1 != ch2) { return 0; - if (std::abs(iphi1 - iphi2) <= 1 && std::abs(iz1 - iz2) <= 1) + } + if (std::abs(iphi1 - iphi2) <= 1 && std::abs(iz1 - iz2) <= 1) { return 1; + } return 0; } @@ -243,29 +246,32 @@ int Geometry::areNeighboursVertex(int detId1, int detId2) const bool Geometry::isAtTheEdge(int cellId) { auto [row, col] = globalRowColFromIndex(cellId); - if (col == 0) + if (col == 0) { return 1; - if (col == mNSamplingModulesZ) + } else if (col == mNSamplingModulesZ) { return 1; - if (col == mNSamplingModulesZ - 1) + } else if (col == mNSamplingModulesZ - 1) { return 1; - if (col == mNSamplingModulesZ + 2 * mNCrystalModulesZ) + } else if (col == mNSamplingModulesZ + 2 * mNCrystalModulesZ) { return 1; - if (col == mNSamplingModulesZ + 2 * mNCrystalModulesZ - 1) + } else if (col == mNSamplingModulesZ + 2 * mNCrystalModulesZ - 1) { return 1; - if (col == mNModulesZ - 1) + } else if (col == mNModulesZ - 1) { return 1; + } for (int m = 0; m <= mNSuperModules; m++) { if (isCrystal(cellId)) { - if (row == m * mNCrystalModulesPhi) + if (row == m * mNCrystalModulesPhi) { return 1; - if (row == m * mNCrystalModulesPhi - 1) + } else if (row == m * mNCrystalModulesPhi - 1) { return 1; + } } else { - if (row == m * mNSamplingModulesPhi) + if (row == m * mNSamplingModulesPhi) { return 1; - if (row == m * mNSamplingModulesPhi - 1) + } else if (row == m * mNSamplingModulesPhi - 1) { return 1; + } } } return 0; diff --git a/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx b/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx index 6c581bc4b0283..28efa78059dc1 100644 --- a/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx +++ b/Detectors/Upgrades/ALICE3/ECal/reconstruction/src/Clusterizer.cxx @@ -133,13 +133,14 @@ void Clusterizer::findClusters(const gsl::span& digits, std::vector void Clusterizer::addDigitToCluster(Cluster& cluster, int row, int col, const gsl::span& digits) { auto& geo = Geometry::instance(); - if (row < 0 || row >= geo.getNrows() || col < 0 || col >= geo.getNcols()) + if (row < 0 || row >= geo.getNrows() || col < 0 || col >= geo.getNcols()) { return; + } int digitIndex = mDigitIndices[row][col]; LOGP(debug, " checking row={} and col={} digitIndex={}", row, col, digitIndex); - if (digitIndex < 0) + if (digitIndex < 0) { return; - + } const Digit& digit = digits[digitIndex]; if (cluster.getMultiplicity() > 0) { // check if new digit is in the same chamber and sector @@ -147,8 +148,9 @@ void Clusterizer::addDigitToCluster(Cluster& cluster, int row, int col, const gs auto [sector1, ch1] = geo.getSectorChamber(digit.getTower()); auto [sector2, ch2] = geo.getSectorChamber(digit2.getTower()); LOGP(debug, " checking if sector and chamber are the same: ({},{}) ({},{})", sector1, ch1, sector2, ch2); - if (sector1 != sector2 || ch1 != ch2) + if (sector1 != sector2 || ch1 != ch2) { return; + } } mDigitIndices[row][col] = -1; @@ -179,11 +181,13 @@ void Clusterizer::makeClusters(const gsl::span& digits, std::vector auto [row, col] = geo.globalRowColFromIndex(digit.getTower()); bool isCrystal = geo.isCrystal(digit.getTower()); if (isCrystal) { - if (digit.getEnergy() < mCrystalDigitThreshold) + if (digit.getEnergy() < mCrystalDigitThreshold) { continue; + } } else { - if (digit.getEnergy() < mSamplingDigitThreshold) + if (digit.getEnergy() < mSamplingDigitThreshold) { continue; + } } mDigitIndices[row][col] = i; } @@ -192,10 +196,12 @@ void Clusterizer::makeClusters(const gsl::span& digits, std::vector for (int i = 0; i < nDigits; i++) { const Digit& digitSeed = digits[i]; auto [row, col] = geo.globalRowColFromIndex(digitSeed.getTower()); - if (mDigitIndices[row][col] < 0) + if (mDigitIndices[row][col] < 0) { continue; // digit was already added in one of the clusters - if (digitSeed.getEnergy() < mClusteringThreshold) + } + if (digitSeed.getEnergy() < mClusteringThreshold) { continue; + } LOGP(debug, " starting new cluster at row={} and col={}", row, col); auto& cluster = clusters.emplace_back(); addDigitToCluster(cluster, row, col, digits); @@ -382,8 +388,9 @@ void Clusterizer::evalClusters(std::vector& clusters) double xi, yi, zi; geo.detIdToGlobalPosition(towerId, xi, yi, zi); double r = std::sqrt((x - xi) * (x - xi) + (y - yi) * (y - yi) + (z - zi) * (z - zi)); - if (r > 2.2) + if (r > 2.2) { continue; + } double frac = fCrystalShowerShape->Eval(r); double rms = fCrystalRMS->Eval(r); chi2 += std::pow((energy / ee - frac) / rms, 2.); @@ -409,10 +416,10 @@ void Clusterizer::evalClusters(std::vector& clusters) bool isEdge = 0; for (size_t i = 0; i < cluster.getMultiplicity(); i++) { int towerId = cluster.getDigitTowerId(i); - if (!geo.isAtTheEdge(towerId)) - continue; - isEdge = 1; - break; + if (geo.isAtTheEdge(towerId)) { + isEdge = 1; + break; + } } cluster.setEdgeFlag(isEdge); @@ -434,8 +441,9 @@ int Clusterizer::getNumberOfLocalMax(Cluster& clu, int* maxAt, float* maxAtEnerg for (int i = 0; i < n; i++) { isLocalMax[i] = false; float en1 = clu.getDigitEnergy(i); - if (en1 > mClusteringThreshold) + if (en1 > mClusteringThreshold) { isLocalMax[i] = true; + } } for (int i = 0; i < n; i++) { diff --git a/Detectors/Upgrades/ALICE3/ECal/simulation/src/Detector.cxx b/Detectors/Upgrades/ALICE3/ECal/simulation/src/Detector.cxx index 93089bb8ced14..f0de8aa4022a6 100644 --- a/Detectors/Upgrades/ALICE3/ECal/simulation/src/Detector.cxx +++ b/Detectors/Upgrades/ALICE3/ECal/simulation/src/Detector.cxx @@ -358,9 +358,9 @@ bool Detector::ProcessHits(FairVolume* vol) return false; } - if (isCrystal) + if (isCrystal) { LOGP(debug, "Processing crystal {}", volName.Data()); - else { + } else { eloss *= mSamplingFactorTransportModel; LOGP(debug, "Processing scintillator {}", volName.Data()); } diff --git a/Detectors/Upgrades/ALICE3/ECal/simulation/src/Digitizer.cxx b/Detectors/Upgrades/ALICE3/ECal/simulation/src/Digitizer.cxx index f213ba563d86d..42c1908a29d18 100644 --- a/Detectors/Upgrades/ALICE3/ECal/simulation/src/Digitizer.cxx +++ b/Detectors/Upgrades/ALICE3/ECal/simulation/src/Digitizer.cxx @@ -57,16 +57,18 @@ void Digitizer::processHits(const std::vector* hits, std::vector& di bool isCrystal = geo.isCrystal(cellID); if (isCrystal) { // crystal double elossSmearedNpe = gRandom->Poisson(eloss * mCrystalPePerGeV) / mCrystalPePerGeV; - if (mSmearCrystal) + if (mSmearCrystal) { elossSmeared = elossSmearedNpe * gRandom->Gaus(1, 0.007); // light attenuation in crystals - } else { // sampling + } + } else { // sampling elossSmeared *= mSamplingFraction; } Digit& digit = mArrayD[cellID]; digit.setAmplitude(digit.getAmplitude() + elossSmeared); - if (t < digit.getTimeStamp()) + if (t < digit.getTimeStamp()) { digit.setTimeStamp(t); // setting earliest time, TODO: add time smearing + } LOGF(debug, " crystal: %d cellID = %5d, eloss = %8.5f elossSmeared = %8.5f time = %8.5f", isCrystal, cellID, eloss, elossSmeared, t); // Adding MC info From 1ab8c4e8677ecc96662922ae5781f86049474c64 Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Fri, 3 Oct 2025 07:46:45 +0300 Subject: [PATCH 3/3] retrigger checks