diff --git a/DataFormats/simulation/include/SimulationDataFormat/DigitizationContext.h b/DataFormats/simulation/include/SimulationDataFormat/DigitizationContext.h index f531cf6e7f870..d80c2e1eb01c6 100644 --- a/DataFormats/simulation/include/SimulationDataFormat/DigitizationContext.h +++ b/DataFormats/simulation/include/SimulationDataFormat/DigitizationContext.h @@ -81,6 +81,9 @@ class DigitizationContext void setMuPerBC(float m) { mMuBC = m; } float getMuPerBC() const { return mMuBC; } + + /// returns the main (hadronic interaction rate) associated to this digitization context + float getCalculatedInteractionRate() const { return getMuPerBC() * getBunchFilling().getNBunches() * o2::constants::lhc::LHCRevFreq; } void printCollisionSummary(bool withQED = false, int truncateOutputTo = -1) const; @@ -150,6 +153,9 @@ class DigitizationContext } } + void setDigitizerInteractionRate(float intRate) { mDigitizerInteractionRate = intRate; } + float getDigitizerInteractionRate() const { return mDigitizerInteractionRate; } + std::vector const* getCTPDigits() const { return mCTPTrigger; } bool hasTriggerInput() const { return mHasTrigger; } @@ -184,7 +190,13 @@ class DigitizationContext mutable std::vector const* mCTPTrigger = nullptr; // CTP trigger info associated to this digitization context mutable bool mHasTrigger = false; // - ClassDefNV(DigitizationContext, 5); + // The global ALICE interaction hadronic interaction rate as applied in digitization. + // It should be consistent with mMuPerBC but it might be easier to handle. + // The value will be filled/inserted by the digitization workflow so that digiters can access it. + // There is no guarantee that the value is available elsewhere. + float mDigitizerInteractionRate{-1}; + + ClassDefNV(DigitizationContext, 6); }; /// function reading the hits from a chain (previously initialized with initSimChains diff --git a/Detectors/EMCAL/workflow/src/EMCALDigitizerSpec.cxx b/Detectors/EMCAL/workflow/src/EMCALDigitizerSpec.cxx index 3d83968b84670..06c42c146097b 100644 --- a/Detectors/EMCAL/workflow/src/EMCALDigitizerSpec.cxx +++ b/Detectors/EMCAL/workflow/src/EMCALDigitizerSpec.cxx @@ -82,6 +82,9 @@ void DigitizerSpec::run(framework::ProcessingContext& ctx) // read collision context from input auto context = ctx.inputs().get("collisioncontext"); + + // get interaction rate ... so that it can be used in digitization + auto intRate = context->getDigitizerInteractionRate(); context->initSimChains(o2::detectors::DetID::EMC, mSimChains); auto& timesview = context->getEventRecords(); LOG(debug) << "GOT " << timesview.size() << " COLLISSION TIMES"; diff --git a/Steer/DigitizerWorkflow/src/SimReaderSpec.cxx b/Steer/DigitizerWorkflow/src/SimReaderSpec.cxx index 6f8502f74a85b..6759f5f8022be 100644 --- a/Steer/DigitizerWorkflow/src/SimReaderSpec.cxx +++ b/Steer/DigitizerWorkflow/src/SimReaderSpec.cxx @@ -45,6 +45,7 @@ namespace steer { std::vector* ctptrigger = nullptr; +float gIntRate = -1.; DataProcessorSpec getSimReaderSpec(SubspecRange range, const std::vector& simprefixes, const std::vector& tpcsectors, bool withTrigger) { @@ -55,7 +56,7 @@ DataProcessorSpec getSimReaderSpec(SubspecRange range, const std::vector("interactionRate"); // is interaction rate requested? + if (gIntRate < 1.f) { + gIntRate = 1.f; + } // do we start from an existing context auto incontextstring = ctx.options().get("incontext"); LOG(info) << "INCONTEXTSTRING " << incontextstring; @@ -137,13 +145,8 @@ DataProcessorSpec getSimReaderSpec(SubspecRange range, const std::vector("interactionRate"); // is interaction rate requested? - if (intRate < 1.f) { - intRate = 1.f; - } - LOG(info) << "Imposing hadronic interaction rate " << intRate << "Hz"; - mgr.getInteractionSampler().setInteractionRate(intRate); + LOG(info) << "Imposing hadronic interaction rate " << gIntRate << "Hz"; + mgr.getInteractionSampler().setInteractionRate(gIntRate); o2::raw::HBFUtils::Instance().print(); o2::raw::HBFUtils::Instance().checkConsistency(); mgr.getInteractionSampler().setFirstIR({0, o2::raw::HBFUtils::Instance().orbitFirstSampled});