Skip to content

Commit cbc41d9

Browse files
sawenzelclaude
andcommitted
Pass per-digitizer workspaces down the TPC digitization output path
This replaces two shared static workspaces of the TPC digitizer by members, in preparation for a multithreaded digitizer. - The shaped-signal buffer of Digitizer::process and the label sorting buffer of DigitGlobalPad::fillOutputContainer are now members. - The SAMPAProcessing used for the output is passed down from DigitContainer, which uses the singleton unless one is set. https://its.cern.ch/jira/browse/O2-7309 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent b8dd0a3 commit cbc41d9

6 files changed

Lines changed: 26 additions & 15 deletions

File tree

‎Detectors/TPC/simulation/include/TPCSimulation/DigitContainer.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "TPCBase/CRU.h"
2222
#include "DataFormatsTPC/Defs.h"
2323
#include "TPCSimulation/DigitTime.h"
24+
#include "TPCSimulation/SAMPAProcessing.h"
2425
#include "TPCBase/CalDet.h"
2526
#include "CommonUtils/DebugStreamer.h"
2627
#include "TPCBase/ParameterDetector.h"
@@ -87,6 +88,9 @@ class DigitContainer
8788
/// Get the size of the container for one event
8889
size_t size() const { return mTimeBins.size(); }
8990

91+
/// Use this SAMPAProcessing instead of the singleton when filling the output
92+
void setSAMPAProcessing(SAMPAProcessing* sampaProcessing) { mSAMPAProcessing = sampaProcessing; }
93+
9094
/// Fetch the calibration objects used by fillOutputContainer from the CDBInterface
9195
/// Must be called after the CDBInterface is configured; fillOutputContainer calls it lazily otherwise
9296
void updateCalibrations();
@@ -103,6 +107,8 @@ class DigitContainer
103107
const CalDet<bool>* mDeadMap = nullptr; //!< Dead channel map
104108
bool mCMCEnabled = false; //!< Common mode correction enabled in the FEE config (DigiMode Auto)
105109
bool mCalibrationsUpdated = false; //!< Whether updateCalibrations was called
110+
SAMPAProcessing* mSAMPAProcessing = nullptr; //!< SAMPAProcessing used for the output, the singleton if not set
111+
std::vector<std::pair<MCCompLabel, int>> mLabelCollector; //!< Workspace to sort the MC labels of a digit
106112

107113
void reportSettings();
108114
};

‎Detectors/TPC/simulation/include/TPCSimulation/DigitGlobalPad.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class DigitGlobalPad
9797
const CRU& cru, TimeBin timeBin,
9898
GlobalPadNumber globalPad,
9999
o2::dataformats::LabelContainer<std::pair<MCCompLabel, int>, false>& labelContainer,
100+
SAMPAProcessing& sampaProcessing, std::vector<std::pair<MCCompLabel, int>>& labelCollector,
100101
float commonMode = 0.f, const PrevDigitInfo& prevDigit = PrevDigitInfo(), Streamer* debugStream = nullptr, const CalDet<bool>* deadMap = nullptr);
101102

102103
private:
@@ -210,12 +211,11 @@ inline void DigitGlobalPad::fillOutputContainer(std::vector<Digit>& output,
210211
const CRU& cru, TimeBin timeBin,
211212
GlobalPadNumber globalPad,
212213
o2::dataformats::LabelContainer<std::pair<MCCompLabel, int>, false>& labels,
214+
SAMPAProcessing& sampaProcessing, std::vector<std::pair<MCCompLabel, int>>& labelCollector,
213215
float commonMode, const PrevDigitInfo& prevDigit, Streamer* debugStream, const CalDet<bool>* deadMap)
214216
{
215217
const Mapper& mapper = Mapper::instance();
216-
SAMPAProcessing& sampaProcessing = SAMPAProcessing::instance();
217218
const PadPos pad = mapper.padPos(globalPad);
218-
static std::vector<std::pair<MCCompLabel, int>> labelCollector; // static workspace container for sorting
219219

220220
/// The charge accumulated on that pad is converted into ADC counts, saturation of the SAMPA is applied and a Digit
221221
/// is created in written out

‎Detectors/TPC/simulation/include/TPCSimulation/DigitTime.h‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class DigitTime
7878
template <DigitzationMode MODE>
7979
void fillOutputContainer(std::vector<Digit>& output, dataformats::MCTruthContainer<MCCompLabel>& mcTruth,
8080
std::vector<CommonMode>& commonModeOutput, const Sector& sector, TimeBin timeBin,
81+
SAMPAProcessing& sampaProcessing, std::vector<std::pair<MCCompLabel, int>>& labelCollector,
8182
PrevDigitInfoArray* prevTime = nullptr, Streamer* debugStream = nullptr,
8283
const CalPad* padParams[3] = nullptr, const CalDet<bool>* deadMap = nullptr);
8384

@@ -129,6 +130,7 @@ inline float DigitTime::getCommonMode(const GEMstack& gemstack) const
129130
template <DigitzationMode MODE>
130131
inline void DigitTime::fillOutputContainer(std::vector<Digit>& output, dataformats::MCTruthContainer<MCCompLabel>& mcTruth,
131132
std::vector<CommonMode>& commonModeOutput, const Sector& sector, TimeBin timeBin,
133+
SAMPAProcessing& sampaProcessing, std::vector<std::pair<MCCompLabel, int>>& labelCollector,
132134
PrevDigitInfoArray* prevTime, Streamer* debugStream, const CalPad* padParams[3],
133135
const CalDet<bool>* deadMap)
134136
{
@@ -167,7 +169,7 @@ inline void DigitTime::fillOutputContainer(std::vector<Digit>& output, dataforma
167169
prevDigit = (*prevTime)[iPad];
168170
}
169171
const CRU cru = mapper.getCRU(sector, iPad);
170-
digit.fillOutputContainer<MODE>(output, mcTruth, cru, timeBin, iPad, mLabels, getCommonMode(cru), prevDigit, debugStream, deadMap);
172+
digit.fillOutputContainer<MODE>(output, mcTruth, cru, timeBin, iPad, mLabels, sampaProcessing, labelCollector, getCommonMode(cru), prevDigit, debugStream, deadMap);
171173
}
172174
}
173175
}

‎Detectors/TPC/simulation/include/TPCSimulation/Digitizer.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ class Digitizer
143143

144144
private:
145145
DigitContainer mDigitContainer; ///< Container for the Digits
146+
std::vector<float> mSignalArray; //!< Workspace for the shaped signal of one electron
146147
std::unique_ptr<SC> mSpaceChargeOwned; //!< Distortions created by the digitizer itself
147148
SC* mSpaceCharge = nullptr; //!< Handler of full distortions (static + IR dependant), owned by mSpaceChargeOwned or by the caller
148149
SC* mSpaceChargeDer = nullptr; //!< Handler of reference static distortions, owned by the caller

‎Detectors/TPC/simulation/src/DigitContainer.cxx‎

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
4848
updateCalibrations();
4949
}
5050

51+
// after updateCalibrations, which may reload the FEE parameters that SAMPAProcessing picks up
52+
auto& sampaProcessing = mSAMPAProcessing ? *mSAMPAProcessing : SAMPAProcessing::instance();
53+
5154
const bool needsPrevDigArray = eleParam.doIonTail || eleParam.doIonTailPerPad || eleParam.doSaturationTail;
5255
const bool needsEmptyTimeBins = needsPrevDigArray || eleParam.doNoiseEmptyPads;
5356

@@ -91,34 +94,34 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
9194
if (time) {
9295
switch (digitizationMode) {
9396
case DigitzationMode::FullMode: {
94-
time->fillOutputContainer<DigitzationMode::FullMode>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
97+
time->fillOutputContainer<DigitzationMode::FullMode>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
9598
break;
9699
}
97100
case DigitzationMode::ZeroSuppression: {
98-
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
101+
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
99102
break;
100103
}
101104
case DigitzationMode::ZeroSuppressionCMCorr: {
102-
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
105+
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
103106
break;
104107
}
105108
case DigitzationMode::SubtractPedestal: {
106-
time->fillOutputContainer<DigitzationMode::SubtractPedestal>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
109+
time->fillOutputContainer<DigitzationMode::SubtractPedestal>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
107110
break;
108111
}
109112
case DigitzationMode::NoSaturation: {
110-
time->fillOutputContainer<DigitzationMode::NoSaturation>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
113+
time->fillOutputContainer<DigitzationMode::NoSaturation>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
111114
break;
112115
}
113116
case DigitzationMode::PropagateADC: {
114-
time->fillOutputContainer<DigitzationMode::PropagateADC>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
117+
time->fillOutputContainer<DigitzationMode::PropagateADC>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
115118
break;
116119
}
117120
case DigitzationMode::Auto: {
118121
if (mCMCEnabled) {
119-
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
122+
time->fillOutputContainer<DigitzationMode::ZeroSuppressionCMCorr>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
120123
} else {
121-
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
124+
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin, sampaProcessing, mLabelCollector, mPrevDigArr.get(), debugStream, mPadParams, mDeadMap);
122125
}
123126
break;
124127
}

‎Detectors/TPC/simulation/src/Digitizer.cxx‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ void Digitizer::process(const std::vector<o2::tpc::HitGroup>& hits,
6565

6666
const int nShapedPoints = eleParam.NShapedPoints;
6767
const auto amplificationMode = gemParam.AmplMode;
68-
static std::vector<float> signalArray;
69-
signalArray.resize(nShapedPoints);
68+
mSignalArray.resize(nShapedPoints);
7069

7170
/// Reserve space in the digit container for the current event
7271
mDigitContainer.reserve(sampaProcessing.getTimeBinFromTime(mEventTime - mOutputDigitTimeOffset));
@@ -154,11 +153,11 @@ void Digitizer::process(const std::vector<o2::tpc::HitGroup>& hits,
154153
const GlobalPadNumber globalPad = mapper.globalPadNumber(digiPadPos.getGlobalPadPos());
155154
const float ADCsignal = sampaProcessing.getADCvalue(static_cast<float>(nElectronsGEM));
156155
const MCCompLabel label(MCTrackID, eventID, sourceID, false);
157-
sampaProcessing.getShapedSignal(ADCsignal, absoluteTime, signalArray);
156+
sampaProcessing.getShapedSignal(ADCsignal, absoluteTime, mSignalArray);
158157
for (float i = 0; i < nShapedPoints; ++i) {
159158
const float time = absoluteTime + i * eleParam.ZbinWidth;
160159
mDigitContainer.addDigit(label, digiPadPos.getCRU(), sampaProcessing.getTimeBinFromTime(time), globalPad,
161-
signalArray[i]);
160+
mSignalArray[i]);
162161
}
163162
/// TODO: add ion backflow to space-charge density
164163
}

0 commit comments

Comments
 (0)