From 77e433a95698657b20e9929de653f1790abc3501 Mon Sep 17 00:00:00 2001 From: wiechula Date: Wed, 14 Oct 2026 17:16:16 +0200 Subject: [PATCH] Add common mode per pad saturation The largest common mode per pad is given by the pedestal value. Saturate the CM signal in case it would be larger. --- .../TPC/base/include/TPCBase/ParameterElectronics.h | 1 + .../simulation/include/TPCSimulation/DigitGlobalPad.h | 4 ++-- .../TPC/simulation/include/TPCSimulation/DigitTime.h | 9 +++++++-- Detectors/TPC/simulation/src/DigitContainer.cxx | 3 ++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Detectors/TPC/base/include/TPCBase/ParameterElectronics.h b/Detectors/TPC/base/include/TPCBase/ParameterElectronics.h index 8ada729f36103..31be5103d4d39 100644 --- a/Detectors/TPC/base/include/TPCBase/ParameterElectronics.h +++ b/Detectors/TPC/base/include/TPCBase/ParameterElectronics.h @@ -48,6 +48,7 @@ struct ParameterElectronics : public o2::conf::ConfigurableParamHelper, false>&); /// Fold signal with previous pad signal add ion tail and ToT for sigmal saturation - void foldSignal(PrevDigitInfo& prevDigit, const int sector, const int pad, const TimeBin time, Streamer* debugStream = nullptr, const CalPad* padParams[3] = nullptr); + void foldSignal(PrevDigitInfo& prevDigit, const int sector, const int pad, const TimeBin time, Streamer* debugStream = nullptr, const CalPad* padParams[4] = nullptr); void setID(int id) { mID = id; } int getID() const { return mID; } @@ -131,7 +131,7 @@ inline void DigitGlobalPad::addDigit(const MCCompLabel& label, float signal, mChargePad += signal; } -inline void DigitGlobalPad::foldSignal(PrevDigitInfo& prevDigit, const int sector, const int pad, const TimeBin time, Streamer* debugStream, const CalPad* padParams[3]) +inline void DigitGlobalPad::foldSignal(PrevDigitInfo& prevDigit, const int sector, const int pad, const TimeBin time, Streamer* debugStream, const CalPad* padParams[4]) { const auto& eleParam = ParameterElectronics::Instance(); const auto& itSettings = IonTailSettings::Instance(); diff --git a/Detectors/TPC/simulation/include/TPCSimulation/DigitTime.h b/Detectors/TPC/simulation/include/TPCSimulation/DigitTime.h index 361b1fb8f6572..c766247759771 100644 --- a/Detectors/TPC/simulation/include/TPCSimulation/DigitTime.h +++ b/Detectors/TPC/simulation/include/TPCSimulation/DigitTime.h @@ -129,7 +129,7 @@ inline float DigitTime::getCommonMode(const GEMstack& gemstack) const template inline void DigitTime::fillOutputContainer(std::vector& output, dataformats::MCTruthContainer& mcTruth, std::vector& commonModeOutput, const Sector& sector, TimeBin timeBin, - PrevDigitInfoArray* prevTime, Streamer* debugStream, const CalPad* padParams[3], + PrevDigitInfoArray* prevTime, Streamer* debugStream, const CalPad* padParams[4], const CalDet* deadMap) { const auto& mapper = Mapper::instance(); @@ -148,7 +148,12 @@ inline void DigitTime::fillOutputContainer(std::vector& output, dataforma } const CRU cru = mapper.getCRU(sector, iPad); const float cmKValue = (padParams[2]) ? padParams[2]->getValue(sector.getSector(), iPad) : 1.f; - mCommonMode[cru.gemStack()] += digit.getChargePad() * eleParam.commonModeCoupling * cmKValue; // TODO: Add stack-by-stack variation? + float commonModeSignal = digit.getChargePad() * eleParam.commonModeCoupling * cmKValue; // TODO: Add stack-by-stack variation? + if (eleParam.doCommonModePerPadSaturation) { + const float pedestal = (padParams[3]) ? padParams[3]->getValue(sector.getSector(), iPad) : 77.f; + commonModeSignal = std::min(commonModeSignal, pedestal); + } + mCommonMode[cru.gemStack()] += commonModeSignal; } // fill common mode output container diff --git a/Detectors/TPC/simulation/src/DigitContainer.cxx b/Detectors/TPC/simulation/src/DigitContainer.cxx index dfff4b91d6451..99e541ddf9115 100644 --- a/Detectors/TPC/simulation/src/DigitContainer.cxx +++ b/Detectors/TPC/simulation/src/DigitContainer.cxx @@ -46,7 +46,7 @@ void DigitContainer::fillOutputContainer(std::vector& output, auto& cdb = CDBInterface::instance(); // ion tail per pad parameters - const CalPad* padParams[3] = {nullptr, nullptr, nullptr}; + const CalPad* padParams[4] = {nullptr, nullptr, nullptr, nullptr}; if (eleParam.doIonTailPerPad) { const auto& itSettings = IonTailSettings::Instance(); @@ -59,6 +59,7 @@ void DigitContainer::fillOutputContainer(std::vector& output, if (eleParam.doCommonModePerPad) { padParams[2] = &cdb.getCMkValues(); } + padParams[3] = &cdb.getPedestals(); const bool needsPrevDigArray = eleParam.doIonTail || eleParam.doIonTailPerPad || eleParam.doSaturationTail; const bool needsEmptyTimeBins = needsPrevDigArray || eleParam.doNoiseEmptyPads;