From e1570506f8b36da7dc5f3606c371641c0bc10d66 Mon Sep 17 00:00:00 2001 From: Andrea Sofia Triolo Date: Wed, 4 Nov 2026 22:15:57 +0100 Subject: [PATCH] [ALICE3] TRK/FT3 digitizer: noise rate set in hits/px/s instead of hits/px/ROF + uniform ToA within ROF for noise digits --- .../include/TRKFT3Simulation/ChipDigitsContainer.h | 9 +++++---- .../include/TRKFT3Simulation/DPLDigitizerParam.h | 4 ++-- .../simulation/include/TRKFT3Simulation/DigiParams.h | 2 +- .../ALICE3/TRKFT3/common/simulation/src/DigiParams.cxx | 2 +- .../ALICE3/TRKFT3/common/simulation/src/Digitizer.cxx | 4 ++-- Steer/DigitizerWorkflow/src/TRKDigitizerSpec.cxx | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/ChipDigitsContainer.h b/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/ChipDigitsContainer.h index 0fcbfd2591a0e..680e83410c205 100644 --- a/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/ChipDigitsContainer.h +++ b/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/ChipDigitsContainer.h @@ -46,7 +46,7 @@ class ChipDigitsContainer o2::trkft3::PreDigit* findDigit(ULong64_t key); void addDigit(ULong64_t key, UInt_t roframe, UShort_t row, UShort_t col, int charge, o2::MCCompLabel lbl, float toa = 0.f); template - void addNoise(UInt_t rofMin, UInt_t rofMax, const o2::trkft3::DigiParams* params, int subDetID, int layer); + void addNoise(UInt_t rofMin, UInt_t rofMax, const o2::trkft3::DigiParams* params, int subDetID, int layer, float rofLengthNS); /// Get global ordering key made of readout frame, column and row static ULong64_t getOrderingKey(UInt_t roframe, UShort_t row, UShort_t col) @@ -85,7 +85,7 @@ inline void ChipDigitsContainer::addDigit(ULong64_t key, UInt_t roframe, UShort_ } // namespace o2::trkft3 template -void o2::trkft3::ChipDigitsContainer::addNoise(UInt_t rofMin, UInt_t rofMax, const o2::trkft3::DigiParams* params, int subDetID, int layer) +void o2::trkft3::ChipDigitsContainer::addNoise(UInt_t rofMin, UInt_t rofMax, const o2::trkft3::DigiParams* params, int subDetID, int layer, float rofLengthNS) { UInt_t row = 0; UInt_t col = 0; @@ -102,7 +102,7 @@ void o2::trkft3::ChipDigitsContainer::addNoise(UInt_t rofMin, UInt_t rofMax, con maxRows = o2::trk::constants::moduleMLOT::chip::nRows; maxCols = o2::trk::constants::moduleMLOT::chip::nCols; } - mean = params->getNoisePerPixel() * maxRows * maxCols; + mean = params->getNoisePerPixel() * rofLengthNS * 1e-9 * maxRows * maxCols; // hits per ROF in the chip, calculated from the noise rate in hits/s nel = static_cast(params->getChargeThreshold() * 1.1); LOG(debug) << "Adding noise for chip " << mChipIndex << " with mean " << mean << " and charge " << nel; @@ -121,7 +121,8 @@ void o2::trkft3::ChipDigitsContainer::addNoise(UInt_t rofMin, UInt_t rofMax, con } auto key = getOrderingKey(rof, row, col); if (!findDigit(key)) { - addDigit(key, rof, row, col, nel, o2::MCCompLabel(true), 0.f); /// TODO: find a better ToA for noise + float toa = gRandom->Uniform(0.f, rofLengthNS); // noise fires uniformly in the ROF + addDigit(key, rof, row, col, nel, o2::MCCompLabel(true), toa); } } } diff --git a/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/DPLDigitizerParam.h b/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/DPLDigitizerParam.h index f4b37142b6019..3304b1c13a016 100644 --- a/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/DPLDigitizerParam.h +++ b/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/include/TRKFT3Simulation/DPLDigitizerParam.h @@ -31,7 +31,7 @@ struct DPLDigitizerParam : public o2::conf::ConfigurableParamHelper::print() const printf("Min N electrons to account : %d\n", mMinChargeToAccount); printf("Number of charge sharing steps : %d\n", mNSimSteps); printf("ELoss to N electrons factor : %e\n", mEnergyToNElectrons); - printf("Noise level per pixel : %e\n", mNoisePerPixel); + printf("Noise rate per pixel : %e/s\n", mNoisePerPixel); printf("Charge time-response:\n"); mSignalShape.print(); } diff --git a/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/src/Digitizer.cxx b/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/src/Digitizer.cxx index e27ee85d94ed7..43a09bb9d7604 100644 --- a/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/src/Digitizer.cxx +++ b/Detectors/Upgrades/ALICE3/TRKFT3/common/simulation/src/Digitizer.cxx @@ -153,7 +153,7 @@ void Digitizer::process(const std::vector* hits, int evID, int srcID template void Digitizer::setEventTime(const o2::InteractionTimeRecord& irt, int layer) { - LOG(info) << "Setting event time to " << irt.getTimeNS() << " ns after orbit 0 bc 0"; + LOG(debug) << "Setting event time to " << irt.getTimeNS() << " ns after orbit 0 bc 0"; // assign event time in ns mEventTime = irt; // RO frame corresponding to provided time @@ -213,7 +213,7 @@ void Digitizer::fillOutputContainer(uint32_t frameLast, int layer) if (chip.isDisabled() || (layer >= 0 && getROFLayer(chip.getChipIndex()) != layer)) { continue; } - chip.addNoise(mROFrameMin, mROFrameMin, &mParams, mGeometry->getSubDetID(chip.getChipIndex()), mGeometry->getLayer(chip.getChipIndex())); /// TODO: add noise + chip.addNoise(mROFrameMin, mROFrameMin, &mParams, mGeometry->getSubDetID(chip.getChipIndex()), mGeometry->getLayer(chip.getChipIndex()), mParams.getROFrameLength(getROFLayer(chip.getChipIndex()))); auto& buffer = chip.getPreDigits(); if (buffer.empty()) { continue; diff --git a/Steer/DigitizerWorkflow/src/TRKDigitizerSpec.cxx b/Steer/DigitizerWorkflow/src/TRKDigitizerSpec.cxx index 6a0efa0554edf..291c501323683 100644 --- a/Steer/DigitizerWorkflow/src/TRKDigitizerSpec.cxx +++ b/Steer/DigitizerWorkflow/src/TRKDigitizerSpec.cxx @@ -303,7 +303,7 @@ class TRKFT3DPLDigitizerTask : BaseDPLDigitizer // parameters of signal time response: flat-top duration, max rise time and q @ which rise time is 0 digipar.getSignalShape().setParameters(dopt.strobeFlatTop, dopt.strobeMaxRiseTime, dopt.strobeQRiseTime0); digipar.setChargeThreshold(dopt.chargeThreshold); // charge threshold in electrons - digipar.setNoisePerPixel(dopt.noisePerPixel); // noise level + digipar.setNoisePerPixel(dopt.noisePerPixel); // noise rate in hits/pixel/s digipar.setTimeOffset(dopt.timeOffset); digipar.setNSimSteps(dopt.nSimSteps);