ATLAS Offline Software
Loading...
Searching...
No Matches
MuonR4::RpcDigiTool Class Referencefinal

#include <RpcDigiTool.h>

Inheritance diagram for MuonR4::RpcDigiTool:
Collaboration diagram for MuonR4::RpcDigiTool:

Public Member Functions

StatusCode initialize () override final
StatusCode finalize () override final
StatusCode processBunchXing (int bunchXing, SubEventIterator bSubEvents, SubEventIterator eSubEvents) override final
StatusCode mergeEvent (const EventContext &ctx) override final
StatusCode prepareEvent (const EventContext &ctx, const unsigned int) override final
 When being run from PileUpToolsAlgs, this method is called at the start of the subevts loop.
StatusCode processAllSubEvents (const EventContext &ctx) override final
 alternative interface which uses the PileUpMergeSvc to obtain all the required SubEvents.
StatusCode processAllSubEvents (const EventContext &ctx) const
 Reentrant version of the digitization tool.
 PileUpToolBase (const std::string &type, const std::string &name, const IInterface *parent)

Protected Types

using TimedHit = TimedHitPtr<xAOD::MuonSimHit>
using TimedHits = std::vector<TimedHitPtr<xAOD::MuonSimHit>>
template<class DetType>
using OutDigitCache_t = std::vector<std::unique_ptr<DetType>>
 DigitContainers are sorted by DigitCollections which are the ensemble of all hits in a given MuonChamber.
using DeadTimeMap = std::unordered_map<Identifier, double>

Protected Member Functions

StatusCode digitize (const EventContext &ctx, const TimedHits &hitsToDigit, xAOD::MuonSimHitContainer *sdoContainer) const override final
 Digitize the time ordered hits and write them to the digit format specific for the detector technology.
CLHEP::HepRandomEngine * getRandomEngine (const EventContext &ctx) const
xAOD::MuonSimHitaddSDO (const TimedHit &hit, xAOD::MuonSimHitContainer *sdoContainer) const
 Adds the timed simHit to the output SDO container.
const ActsTrk::GeometryContextgetGeoCtx (const EventContext &ctx) const
 Returns the reference to the ActsTrk::GeometryContext needed to fetch global positions from the Readout geometry.
template<class DigitColl>
DigitColl * fetchCollection (const Identifier &hitId, OutDigitCache_t< DigitColl > &digitCache) const
 Helper function that provides fetches the proper DigitCollection from the DigitCache for a given hit identifier If the Collection is fetched for the first time, it's inserted into the cache first.
template<class DigitCont, class DigitColl>
StatusCode writeDigitContainer (const EventContext &ctx, const SG::WriteHandleKey< DigitCont > &key, OutDigitCache_t< DigitColl > &&digitCache, unsigned int hashMax) const
 Helper function to move the collected digits into the final DigitContainer.

Static Protected Member Functions

static double hitTime (const TimedHit &hit)
 Returns the global time of the hit which is the sum of eventTime & individual hit time.
static bool passDeadTime (const Identifier &channelId, const double hitTime, const double deadTimeWindow, DeadTimeMap &deadTimeMap)
 Returns whether the new digit is within the dead time window.

Protected Attributes

const MuonGMR4::MuonDetectorManagerm_detMgr {nullptr}
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc

Private Types

using EdgeSide = MuonGMR4::RpcReadoutElement::EdgeSide
using DigiCache = OutDigitCache_t<RpcDigitCollection>
using PileUpHits = PileUpMergeSvc::TimedList<xAOD::MuonSimHitContainer>::type
using SimHitLocalCopy
 Create a local copy of the sim hits to ensure overlayed hits across the events remain valid.

Private Member Functions

bool digitizeHit (const TimedHit &simHit, const bool measuresPhi, const Muon::DigitEffiData *effiMap, RpcDigitCollection &outContainer, CLHEP::HepRandomEngine *rndEngine, DeadTimeMap &deadTimes) const
 Digitize the sim hit as Rpc strip 1D hit.
bool digitizeHitBI (const TimedHit &simHit, const Muon::DigitEffiData *effiMap, RpcDigitCollection &outContainer, CLHEP::HepRandomEngine *rndEngine, DeadTimeMap &deadTimes) const
 Digitize the sim hit as Rpc strip 2D hit.
int determineClusterSizeBI (const Identifier &id, CLHEP::HepRandomEngine *rndmEngine) const
 Returns BI cluster strip molteplicity.
double calculateChargeOnStrip (const TimedHit &simHit, CLHEP::HepRandomEngine *rndmEngine, const double gasGapSize) const
 Returns the charge (fC) after the amplification in gas.
std::vector< double > divideChargeOnStrips (double totalCharge, int n_strips, CLHEP::HepRandomEngine *rndmEngine) const
 Returns a vector with chages (fC) divided on strips.
double getTOT (const double aCharge) const
 Returns Time Over Threshold (ns) for a signal on a strip.
double getTOA (const double aCharge, const double aDistance) const
 Returns Time Of Arrival (ns) for a signal on a strip.
StatusCode fillTimedHits (PileUpHits &&hitColl, TimedHits &timedHits) const
 Translates the PileUpHits into the timed hits format.

Static Private Member Functions

static double timeOverThreshold (CLHEP::HepRandomEngine *rndmEngine)
 Roll the time over threshold for each signal digit.

Private Attributes

SG::WriteHandleKey< RpcDigitContainerm_writeKey
SG::ReadCondHandleKey< Muon::DigitEffiDatam_effiDataKey
std::array< std::atomic< unsigned >, 2 > m_allHits ATLAS_THREAD_SAFE {}
std::array< std::atomic< unsigned >, 2 > m_acceptedHits ATLAS_THREAD_SAFE {}
Gaudi::Property< double > m_propagationVelocity
Gaudi::Property< double > m_stripTimeResolution
Gaudi::Property< double > m_deadTime
Gaudi::Property< bool > m_digitizeMuonOnly
SG::ReadHandleKey< xAOD::MuonSimHitContainerm_simHitKey {this, "SimHitKey", ""}
ActsTrk::GeoContextReadKey_t m_geoCtxKey
ServiceHandle< PileUpMergeSvcm_mergeSvc {this, "PileUpMergeSvc", "PileUpMergeSvc", ""}
Gaudi::Property< std::string > m_streamName {this, "StreamName", ""}
ServiceHandle< IAthRNGSvcm_rndmSvc {this, "RndmSvc", "AthRNGSvc", ""}
SG::WriteHandleKey< xAOD::MuonSimHitContainerm_sdoKey {this, "OutputSDOName", ""}
Gaudi::Property< bool > m_onlyUseContainerName
Gaudi::Property< bool > m_includePileUpTruth {this, "IncludePileUpTruth", true, "Include pile-up truth info"}
std::string m_inputObjectName {""}
TimedHits m_timedHits {}
std::vector< SimHitLocalCopym_simHits {}

structors and AlgTool implementation

virtual bool toProcess (int bunchXing) const override
 the method this base class helps implementing
virtual bool filterPassed () const override
 dummy implementation of passing filter
virtual void resetFilter () override
 dummy implementation of filter reset
Gaudi::Property< int > m_firstXing
Gaudi::Property< int > m_lastXing
Gaudi::Property< int > m_vetoPileUpTruthLinks
bool m_filterPassed {true}

Detailed Description

Definition at line 17 of file RpcDigiTool.h.

Member Typedef Documentation

◆ DeadTimeMap

using MuonR4::MuonDigitizationTool::DeadTimeMap = std::unordered_map<Identifier, double>
protectedinherited

Definition at line 100 of file MuonDigitizationTool.h.

◆ DigiCache

◆ EdgeSide

◆ OutDigitCache_t

template<class DetType>
using MuonR4::MuonDigitizationTool::OutDigitCache_t = std::vector<std::unique_ptr<DetType>>
protectedinherited

DigitContainers are sorted by DigitCollections which are the ensemble of all hits in a given MuonChamber.

To fill the final DigitContainer thread-safely, the DigitCollections shall be cached pre cached in a OutDigitCache_t vector which is later moved to the final DigitContainer

Definition at line 80 of file MuonDigitizationTool.h.

◆ PileUpHits

◆ SimHitLocalCopy

Initial value:
std::pair<std::unique_ptr<xAOD::MuonSimHitContainer>,
std::unique_ptr<xAOD::MuonSimHitAuxContainer>>

Create a local copy of the sim hits to ensure overlayed hits across the events remain valid.

Definition at line 143 of file MuonDigitizationTool.h.

◆ TimedHit

Definition at line 57 of file MuonDigitizationTool.h.

◆ TimedHits

using MuonR4::MuonDigitizationTool::TimedHits = std::vector<TimedHitPtr<xAOD::MuonSimHit>>
protectedinherited

Definition at line 58 of file MuonDigitizationTool.h.

Member Function Documentation

◆ addSDO()

xAOD::MuonSimHit * MuonR4::MuonDigitizationTool::addSDO ( const TimedHit & hit,
xAOD::MuonSimHitContainer * sdoContainer ) const
protectedinherited

Adds the timed simHit to the output SDO container.

The hit may be rejected if it's originating from pile-up and the pile-up truth skimming strategy is applied

Definition at line 138 of file MuonDigitizationTool.cxx.

139 {
140 if(!sdoContainer) {
141 ATH_MSG_VERBOSE("No SDO container setup of writing");
142 return nullptr;
143 }
144 if (!m_includePileUpTruth && HepMC::ignoreTruthLink(hit->genParticleLink(), m_vetoPileUpTruthLinks)) {
145 ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hit->identify())<<" is a pile-up truth link");
146 return nullptr;
147 }
148 ATH_MSG_VERBOSE(m_idHelperSvc->toString(hit->identify())<<", pdgID: "<<hit->pdgId()<< " genParticleLink :"<<hit->genParticleLink());
149 ATH_MSG_VERBOSE("Genparticle: "<<hit->genParticleLink());
150 xAOD::MuonSimHit* sdoHit = sdoContainer->push_back(std::make_unique<xAOD::MuonSimHit>());
151 (*sdoHit) = (*hit);
152 static const SG::Accessor<float> acc_eventTime{"MuSim_evtTime"};
153 static const SG::Accessor<unsigned short> acc_eventID{"MuSim_evtID"};
154 static const SG::Accessor<unsigned short> acc_puType{"MuSim_puType"};
155 acc_eventTime(*sdoHit) = hit.eventTime();
156 acc_eventID(*sdoHit) = hit.eventId();
157 acc_puType(*sdoHit) = hit.pileupType();
158 return sdoHit;
159 }
#define ATH_MSG_VERBOSE(x)
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< bool > m_includePileUpTruth
Gaudi::Property< int > m_vetoPileUpTruthLinks
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
MuonSimHit_v1 MuonSimHit
Defined the version of the MuonSimHit.
Definition MuonSimHit.h:12

◆ calculateChargeOnStrip()

double MuonR4::RpcDigiTool::calculateChargeOnStrip ( const TimedHit & simHit,
CLHEP::HepRandomEngine * rndmEngine,
const double gasGapSize ) const
private

Returns the charge (fC) after the amplification in gas.

Parameters
simHitReference to the sim hit to digitize
rndmEngineA random engine

Definition at line 405 of file RpcDigiTool.cxx.

407 {
408
409 // Average energy to create an electron-ion pair inside RPC gas
410 constexpr double W_VALUE_EV = 30.0; // Unit: [eV/pair]
411
412 // RPC BI gas gap thickness
413 const double GAP_THICKNESS_M = gasGapSize; // Unit: [m] (2 mm for Phase-II BI RPCs))
414
415 // Townsend coefficient for gas mixture and operational voltage
416 constexpr double ALPHA_PER_M = 5500.0 / Gaudi::Units::m; // Unit: [1/m]
417
418 // Energy deposited by Geant4
419 const double energy_deposit_ev = simHit->energyDeposit() / Gaudi::Units::eV;
420
421 // Number of electron-ion pairs created
422 const double N0 = energy_deposit_ev / W_VALUE_EV;
423
424 // Primary ionization poistion inside gas gap
425 const double z_hit_m =
426 CLHEP::RandFlat::shoot(rndmEngine, 0.0, GAP_THICKNESS_M); // Unit: [m]
427
428 // Distance to anode
429 const double z_drift_m = std::abs(GAP_THICKNESS_M - z_hit_m); // Unit: [m]
430
431 // Avalanche gain
432 const double gas_gain = std::exp(ALPHA_PER_M * z_drift_m);
433
434 // Total charge
435 const double total_charge_c = N0 * gas_gain * Gaudi::Units::e_SI; // Unit: [C]
436
437 ATH_MSG_DEBUG(__func__<<"() - "<<__LINE__<<" GAP_THICKNESS_M: "<<GAP_THICKNESS_M<<
438 ", "<<energy_deposit_ev<<", z_hit_m: "<<z_hit_m<<", N0: "<<N0<<", z_drift_m: "<<z_drift_m
439 <<", gas_gain: "<<gas_gain<< "---> Charge on strip (fC): " << total_charge_c * 1e15);
440
441 return total_charge_c * 1e15; // charge in fC
442}
#define ATH_MSG_DEBUG(x)

◆ determineClusterSizeBI()

int MuonR4::RpcDigiTool::determineClusterSizeBI ( const Identifier & id,
CLHEP::HepRandomEngine * rndmEngine ) const
private

Returns BI cluster strip molteplicity.

Parameters
idReference to the chamber identifier
rndmEnginRandom engine used for probabilities

Definition at line 444 of file RpcDigiTool.cxx.

445 {
446
447 const RpcIdHelper &id_helper{m_idHelperSvc->rpcIdHelper()};
448
449 ATH_MSG_DEBUG("RpcDigitizationTool::in determineClusterSize");
450
451 ATH_MSG_DEBUG("Digit Id = " << id_helper.show_to_string(idGasGap));
452
453 // These cluster size probabilities were taken from preliminary
454 // results from the BI RPC Upgrade work in 2025 at BB5.
455 // They could be updated if new results for BI RPCs become available.
456 static constexpr std::array<double, 4> ClusterSizeProbabilities{0.642, 0.316,
457 0.032, 0.010};
458 // Compile-time calculation of the cumulative array
459 // Used empty capture list [] since variables are static constexpr
460 static constexpr std::array<double, 4> cumulative = []() {
461 std::array<double, 4> acumulative{};
462 acumulative[0] = ClusterSizeProbabilities[0];
463 for (size_t i = 1; i < ClusterSizeProbabilities.size(); ++i) {
464 acumulative[i] = acumulative[i - 1] + ClusterSizeProbabilities[i];
465 }
466 return acumulative;
467 }();
468
469 float rndmCS = CLHEP::RandFlat::shoot(rndmEngine, 1.);
470
471 unsigned ClusterSize{0};
472 while (ClusterSize < ClusterSizeProbabilities.size() &&
473 rndmCS > cumulative[ClusterSize])
474 ++ClusterSize;
475
476 if (ClusterSize >= ClusterSizeProbabilities.size())
477 ClusterSize = ClusterSizeProbabilities.size() - 1;
478 return ClusterSize + 1;
479}
std::string show_to_string(Identifier id, const IdContext *context=0, char sep='.') const
or provide the printout in string form

◆ digitize()

StatusCode MuonR4::RpcDigiTool::digitize ( const EventContext & ctx,
const TimedHits & hitsToDigit,
xAOD::MuonSimHitContainer * sdoContainer ) const
finaloverrideprotectedvirtual

Digitize the time ordered hits and write them to the digit format specific for the detector technology.

A new MuonSimHitContainer pointer is parsed to also create the MuonSDO. If a new SDO should be added to the container plese use the addSDO() method as defined below.

Fetch the conditions for efficiency calculations

Standard digitization path

Write everything at the end into the final digit container

Implements MuonR4::MuonDigitizationTool.

Definition at line 61 of file RpcDigiTool.cxx.

62 {
63 const RpcIdHelper &idHelper{m_idHelperSvc->rpcIdHelper()};
64 // Prepare the temporary cache
65 DigiCache digitCache{};
67 const Muon::DigitEffiData *efficiencyMap{nullptr};
68 ATH_CHECK(SG::get(efficiencyMap, m_effiDataKey, ctx));
69
70 CLHEP::HepRandomEngine *rndEngine = getRandomEngine(ctx);
71 xAOD::ChamberViewer viewer{hitsToDigit, m_idHelperSvc.get()};
72 do {
73 DeadTimeMap deadTimes{};
74 for (const TimedHit &simHit : viewer) {
75 if (m_digitizeMuonOnly && !MC::isMuon(simHit)) {
76 continue;
77 }
78 const Identifier hitId{simHit->identify()};
79 RpcDigitCollection *digiColl = fetchCollection(hitId, digitCache);
80 const std::size_t beforeDigiSize = digiColl->size();
81 xAOD::MuonSimHit* sdo{nullptr};
82 if (m_detMgr->getRpcReadoutElement(hitId)->nPhiStrips() > 0) {
84
85 const bool digitizedPhi = digitizeHit(simHit, true, efficiencyMap,
86 *digiColl, rndEngine, deadTimes);
87 const bool digitizedEta = digitizeHit(simHit, false, efficiencyMap,
88 *digiColl, rndEngine, deadTimes);
89 if (digitizedEta || digitizedPhi) {
90 sdo = addSDO(simHit, sdoContainer);
91 }
92 } else if (digitizeHitBI(simHit, efficiencyMap, *digiColl, rndEngine,
93 deadTimes)) {
94 sdo = addSDO(simHit, sdoContainer);
95 }
96 if (sdo) {
97 sdo->setIdentifier(digiColl->back()->identify());
98 dec_etaChannel(*sdo).clear();
99 dec_phiChannel(*sdo).clear();
100 for (std::size_t newDigit = beforeDigiSize; newDigit< digiColl->size(); ++newDigit) {
101 const Identifier id = digiColl->at(newDigit)->identify();
102 ChVec_t& ch{idHelper.measuresPhi(id)? dec_phiChannel(*sdo) : dec_etaChannel(*sdo)};
103 ch.push_back(idHelper.channel(id));
104 }
105 }
106 }
107 } while (viewer.next());
109 ATH_CHECK(writeDigitContainer(ctx, m_writeKey, std::move(digitCache),
110 idHelper.module_hash_max()));
111 return StatusCode::SUCCESS;
112}
#define ATH_CHECK
Evaluate an expression and check for errors.
const T * back() const
Access the last element in the collection as an rvalue.
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
Identifier identify() const
Definition MuonDigit.h:30
size_type module_hash_max() const
the maximum hash value
xAOD::MuonSimHit * addSDO(const TimedHit &hit, xAOD::MuonSimHitContainer *sdoContainer) const
Adds the timed simHit to the output SDO container.
CLHEP::HepRandomEngine * getRandomEngine(const EventContext &ctx) const
TimedHitPtr< xAOD::MuonSimHit > TimedHit
DigitColl * fetchCollection(const Identifier &hitId, OutDigitCache_t< DigitColl > &digitCache) const
Helper function that provides fetches the proper DigitCollection from the DigitCache for a given hit ...
const MuonGMR4::MuonDetectorManager * m_detMgr
StatusCode writeDigitContainer(const EventContext &ctx, const SG::WriteHandleKey< DigitCont > &key, OutDigitCache_t< DigitColl > &&digitCache, unsigned int hashMax) const
Helper function to move the collected digits into the final DigitContainer.
std::unordered_map< Identifier, double > DeadTimeMap
bool digitizeHit(const TimedHit &simHit, const bool measuresPhi, const Muon::DigitEffiData *effiMap, RpcDigitCollection &outContainer, CLHEP::HepRandomEngine *rndEngine, DeadTimeMap &deadTimes) const
Digitize the sim hit as Rpc strip 1D hit.
Gaudi::Property< bool > m_digitizeMuonOnly
Definition RpcDigiTool.h:84
SG::ReadCondHandleKey< Muon::DigitEffiData > m_effiDataKey
Definition RpcDigiTool.h:65
SG::WriteHandleKey< RpcDigitContainer > m_writeKey
Definition RpcDigiTool.h:62
OutDigitCache_t< RpcDigitCollection > DigiCache
Definition RpcDigiTool.h:61
bool digitizeHitBI(const TimedHit &simHit, const Muon::DigitEffiData *effiMap, RpcDigitCollection &outContainer, CLHEP::HepRandomEngine *rndEngine, DeadTimeMap &deadTimes) const
Digitize the sim hit as Rpc strip 2D hit.
int channel(const Identifier &id) const override
bool measuresPhi(const Identifier &id) const override
void setIdentifier(const Identifier &id)
Sets the global ATLAS identifier.
bool isMuon(const T &p)
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.

◆ digitizeHit()

bool MuonR4::RpcDigiTool::digitizeHit ( const TimedHit & simHit,
const bool measuresPhi,
const Muon::DigitEffiData * effiMap,
RpcDigitCollection & outContainer,
CLHEP::HepRandomEngine * rndEngine,
DeadTimeMap & deadTimes ) const
private

Digitize the sim hit as Rpc strip 1D hit.

Parameters
simHitReference to the sim hit to digitize
measuresPhiProcess an eta or a phi strip
effiMapPointer to an efficiency look-up table
outContainerDigitCollection to push the new digit into
rndEngineRandom engine used for smearing
deadTimesReference to the last digitized times in order to apply the dead time model

Final check whether the digit is actually efficient

Correct for the signal propagation time

Definition at line 113 of file RpcDigiTool.cxx.

117 {
118
119 ++(m_allHits[measuresPhi]);
120
121 const Identifier gasGapId = hit->identify();
122 const MuonGMR4::RpcReadoutElement *reEle =
123 m_detMgr->getRpcReadoutElement(gasGapId);
124
125 const RpcIdHelper &idHelper{m_idHelperSvc->rpcIdHelper()};
126
127 bool isValid{false};
128 const Identifier layerId = idHelper.channelID(
129 gasGapId, idHelper.doubletZ(gasGapId), idHelper.doubletPhi(gasGapId),
130 idHelper.gasGap(gasGapId), measuresPhi, 1, isValid);
131
132 const MuonGMR4::StripLayerPtr &layerDesign =
133 reEle->sensorLayout(reEle->layerHash(layerId));
134
135 const MuonGMR4::StripDesign &design{layerDesign->design(measuresPhi)};
136
137 const double uncert = design.stripPitch() / std::sqrt(12.);
138 Amg::Vector3D locHitPos{xAOD::toEigen(hit->localPosition())};
139 locHitPos[measuresPhi] = CLHEP::RandGaussZiggurat::shoot(
140 rndEngine, locHitPos[measuresPhi], uncert);
141
142 const Amg::Vector2D locPos2D = layerDesign->to2D(locHitPos, measuresPhi);
143 if (!design.insideTrapezoid(locPos2D)) {
144 ATH_MSG_VERBOSE("The hit " << Amg::toString(locHitPos) << " / "
145 << Amg::toString(locPos2D)
146 << " is outside of the trapezoid bounds for "
147 << m_idHelperSvc->toString(layerId));
148 return false;
149 }
150 const int strip = design.stripNumber(locPos2D);
151 if (strip < 0) {
152 ATH_MSG_VERBOSE("Hit " << Amg::toString(locHitPos) << " / "
153 << Amg::toString(locPos2D)
154 << " cannot trigger any signal in a strip for "
155 << m_idHelperSvc->toString(layerId) << std::endl
156 << design);
157 return false;
158 }
159
160 const Identifier digitId{idHelper.channelID(
161 gasGapId, idHelper.doubletZ(gasGapId), idHelper.doubletPhi(gasGapId),
162 idHelper.gasGap(gasGapId), measuresPhi, strip, isValid)};
163
164 if (!isValid) {
165 ATH_MSG_WARNING("Invalid hit identifier obtained for "
166 << m_idHelperSvc->toStringGasGap(gasGapId)
167 << ", eta strip " << strip << " & hit "
168 << Amg::toString(locHitPos, 2) << " /// " << design);
169 return false;
170 }
172 if (effiMap && effiMap->getEfficiency(digitId) <
173 CLHEP::RandFlat::shoot(rndEngine, 0., 1.)) {
174 ATH_MSG_VERBOSE("Hit is marked as inefficient");
175 return false;
176 }
177 if (!passDeadTime(digitId, hitTime(hit), m_deadTime, deadTimes)) {
178 ATH_MSG_VERBOSE("Reject hit due to dead map constraint");
179 return false;
180 }
182 const double signalTime =
183 hitTime(hit) + reEle->distanceToEdge(reEle->measurementHash(digitId),
184 locHitPos, EdgeSide::readOut) /
186 const double digitTime = CLHEP::RandGaussZiggurat::shoot(
187 rndEngine, signalTime, m_stripTimeResolution);
188 ATH_MSG_VERBOSE("Created new digit " << m_idHelperSvc->toString(digitId)
189 << ", @ " << Amg::toString(locPos2D)
190 << ", recorded time: " << digitTime);
191 outContainer.push_back(std::make_unique<RpcDigit>(
192 digitId, digitTime, timeOverThreshold(rndEngine)));
193 ++(m_acceptedHits[measuresPhi]);
194 return true;
195}
#define ATH_MSG_WARNING(x)
IdentifierHash measurementHash(const Identifier &measId) const override final
Constructs the identifier hash from the full measurement Identifier.
double distanceToEdge(const IdentifierHash &measHash, const Amg::Vector3D &posInStripPlane, const EdgeSide side) const
Returns the disance to the readout.
IdentifierHash layerHash(const Identifier &measId) const override final
The layer hash removes the bits from the IdentifierHash corresponding to the measurement's channel nu...
const StripLayerPtr & sensorLayout(const IdentifierHash &measHash) const
Access to the StripLayer associated to a given measurement Hash.
double stripPitch() const
Distance between two adjacent strips.
bool insideTrapezoid(const Amg::Vector2D &extPos) const
Checks whether an external point is inside the trapezoidal area.
virtual int stripNumber(const Amg::Vector2D &pos) const
Calculates the number of the strip whose center is closest to the given point.
static bool passDeadTime(const Identifier &channelId, const double hitTime, const double deadTimeWindow, DeadTimeMap &deadTimeMap)
Returns whether the new digit is within the dead time window.
static double hitTime(const TimedHit &hit)
Returns the global time of the hit which is the sum of eventTime & individual hit time.
Gaudi::Property< double > m_stripTimeResolution
Definition RpcDigiTool.h:77
Gaudi::Property< double > m_deadTime
Definition RpcDigiTool.h:81
Gaudi::Property< double > m_propagationVelocity
Definition RpcDigiTool.h:73
static double timeOverThreshold(CLHEP::HepRandomEngine *rndmEngine)
Roll the time over threshold for each signal digit.
double getEfficiency(const Identifier &channelId, bool isInnerQ1=false) const
Returns the signal generation efficiency of the sTgc channel.
Identifier channelID(int stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
int gasGap(const Identifier &id) const override
get the hashes
int doubletPhi(const Identifier &id) const
int doubletZ(const Identifier &id) const
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
GeoModel::TransientConstSharedPtr< StripLayer > StripLayerPtr
Definition StripLayer.h:100

◆ digitizeHitBI()

bool MuonR4::RpcDigiTool::digitizeHitBI ( const TimedHit & simHit,
const Muon::DigitEffiData * effiMap,
RpcDigitCollection & outContainer,
CLHEP::HepRandomEngine * rndEngine,
DeadTimeMap & deadTimes ) const
private

Digitize the sim hit as Rpc strip 2D hit.

Parameters
simHitReference to the sim hit to digitize
effiMapPointer to an efficiency look-up table
outContainerDigitCollection to push the new digit into
rndEngineRandom engine used for smearing
deadTimesReference to the last digitized times in order to apply the dead time model

Definition at line 197 of file RpcDigiTool.cxx.

201 {
202
203 ++(m_allHits[false]);
204 const Identifier gasGapId = simHit->identify();
205 const MuonGMR4::RpcReadoutElement *reEle =
206 m_detMgr->getRpcReadoutElement(gasGapId);
207 const Amg::Vector3D locPos = xAOD::toEigen(simHit->localPosition());
208 const MuonGMR4::StripDesign &design{*reEle->getParameters().etaDesign};
209 const RpcIdHelper &idHelper{m_idHelperSvc->rpcIdHelper()};
210
211 /* with RpcReadoutElement reEle you can access infor about the readout like */
212 ATH_MSG_VERBOSE("RpcDigiTool::digitizeHitBI reEle->nGasGaps "<< reEle->nGasGaps());
213 /* with StripDesign you can access the strip information of the readout
214 * element for instance: */
215 ATH_MSG_VERBOSE("RpcDigiTool::digitizeHitBI design: "<< design);
216
217 // Check the correctness of the local hit position
218 const Amg::Vector2D locHitPosition{locPos.x(), locPos.y()};
219 if (!design.insideTrapezoid(locHitPosition)) {
220 ATH_MSG_VERBOSE("The hit " << Amg::toString(locHitPosition)
221 << " is outside of the trapezoid bounds for "
222 << m_idHelperSvc->toStringGasGap(gasGapId));
223 return false;
224 }
225
226 // Calculate distance to strip edges (mm)
227 const IdentifierHash layHash = reEle->layerHash(gasGapId);
228 const double DistanceToReadOut =
229 reEle->distanceToEdge(layHash, locPos, EdgeSide::readOut); // mm
230 const double DistanceToHV =
231 reEle->distanceToEdge(layHash, locPos, EdgeSide::highVoltage); // mm
232
233 // Calculate charge deposited
234 const double TotalChargeOnStrip =
235 calculateChargeOnStrip(simHit, rndEngine, reEle->gasGapPitch());
236 ATH_MSG_VERBOSE(" total charge (fC): " << TotalChargeOnStrip);
237
238 // Calculate cluster size (number of strips)
239 int clusterSize = determineClusterSizeBI(gasGapId, rndEngine);
240 ATH_MSG_VERBOSE(" cluster size: " << clusterSize);
241
242 // Get corresponding strip number and apply checks
243 const int strip = design.stripNumber(locHitPosition);
244 if (strip < 0) {
245 ATH_MSG_VERBOSE("Hit " << Amg::toString(locHitPosition)
246 << " cannot trigger any signal in a strip for "
247 << m_idHelperSvc->toStringGasGap(gasGapId)
248 << std::endl
249 << design);
250 return false;
251 }
252
253 // Get min and max strips
254 int minStrip{strip}, maxStrip{strip}; // case strip number is 1
255 if (clusterSize > 1) {
256 int halfCluster = clusterSize / 2; // half cluster size (int)
257 minStrip = strip - halfCluster; // min strip number
258 if (clusterSize % 2 == 0) { // if clusterSize is even, we have to randomly
259 // assign one strip on left or right side
260 int side = Acts::copySign(1,CLHEP::RandFlat::shoot(rndEngine, 0., 1.) + 0.5);
261 minStrip += side; // if side==1 move the min strip to right
262 }
263 maxStrip = minStrip + clusterSize - 1;
264 // Check design strip boundaries
265 minStrip = std::max(minStrip, design.firstStripNumber());
266 maxStrip = std::min(design.firstStripNumber() + design.numStrips() - 1, maxStrip);
267 }
268
269 // Recalculate cluster size with minStrip and maxStrip
270 clusterSize = (maxStrip - minStrip) + 1;
271
272 // Divide charge on N strips
273 const std::vector<double> StripCharges =
274 divideChargeOnStrips(TotalChargeOnStrip, clusterSize, rndEngine);
275
276 // Digitize each strip
277 for (int aStrip = minStrip; aStrip <= maxStrip; aStrip++) {
278 bool isValid{false};
279 const Identifier digitId{idHelper.channelID(
280 gasGapId, idHelper.doubletZ(gasGapId), idHelper.doubletPhi(gasGapId),
281 idHelper.gasGap(gasGapId), false, aStrip, isValid)};
282
283 // Check digitID is valid
284 if (!isValid) {
285 ATH_MSG_WARNING("Failed to create a valid strip "
286 << m_idHelperSvc->toStringGasGap(gasGapId)
287 << ", strip: " << aStrip);
288 return false;
289 }
290 // Check is not dead time
291 if (!passDeadTime(digitId, hitTime(simHit), m_deadTime, deadTimes)) {
292 ATH_MSG_VERBOSE("Reject hit due to dead map constraint");
293 return false;
294 }
295 // Check whether the digit is actually efficient
296 const bool effiSignal1 =
297 !effiMap || effiMap->getEfficiency(gasGapId) >=
298 CLHEP::RandFlat::shoot(rndEngine, 0., 1.);
299 const bool effiSignal2 =
300 !effiMap || effiMap->getEfficiency(gasGapId) >=
301 CLHEP::RandFlat::shoot(rndEngine, 0., 1.);
302 if (effiSignal1) {
303 outContainer.push_back(std::make_unique<RpcDigit>(
304 digitId,
305 hitTime(simHit) + getTOA(StripCharges[aStrip], DistanceToHV / 1000.),
306 getTOT(StripCharges[aStrip])));
307 }
308 if (effiSignal2) {
309 outContainer.push_back(std::make_unique<RpcDigit>(
310 digitId,
311 hitTime(simHit) +
312 getTOA(StripCharges[aStrip], DistanceToReadOut / 1000.),
313 getTOT(StripCharges[aStrip]), true));
314 }
315 if (effiSignal1 || effiSignal2) {
316 ATH_MSG_VERBOSE("Digitize hit "
317 << m_idHelperSvc->toString(digitId)
318 << " located at: " << Amg::toString(locPos)
319 << ", SDO: " << Amg::toString(locHitPosition));
320 ++(m_acceptedHits[false]);
321 return true;
322 }
323 }
324
325 return false;
326}
unsigned nGasGaps() const
Returns the number of gasgaps described by this ReadOutElement (usally 2 or 3).
double gasGapPitch() const
Returns the thickness of a RPC gasgap.
int firstStripNumber() const
Returns the number of the first strip.
virtual int numStrips() const
Number of strips on the panel.
double getTOT(const double aCharge) const
Returns Time Over Threshold (ns) for a signal on a strip.
double getTOA(const double aCharge, const double aDistance) const
Returns Time Of Arrival (ns) for a signal on a strip.
std::vector< double > divideChargeOnStrips(double totalCharge, int n_strips, CLHEP::HepRandomEngine *rndmEngine) const
Returns a vector with chages (fC) divided on strips.
int determineClusterSizeBI(const Identifier &id, CLHEP::HepRandomEngine *rndmEngine) const
Returns BI cluster strip molteplicity.
double calculateChargeOnStrip(const TimedHit &simHit, CLHEP::HepRandomEngine *rndmEngine, const double gasGapSize) const
Returns the charge (fC) after the amplification in gas.

◆ divideChargeOnStrips()

std::vector< double > MuonR4::RpcDigiTool::divideChargeOnStrips ( double totalCharge,
int n_strips,
CLHEP::HepRandomEngine * rndmEngine ) const
private

Returns a vector with chages (fC) divided on strips.

Parameters
totalChargetotal charge from a single spike (fC)
n_stripsnumber of strips to divide the charge over
rndmEngineA random engine

Definition at line 351 of file RpcDigiTool.cxx.

352 {
353
354 std::vector<double> charges;
355
356 switch (n_strips) {
357 case 1: {
358 // Trivial case, all charge on a single strip
359 charges.push_back(totalCharge);
360 break;
361 }
362 case 2: {
363 // We use a Gaussian distribution centered over 0.5 to simulate
364 // a charge sharing that is on average 50/50 but includes fluctuations
365 double f = CLHEP::RandGaussZiggurat::shoot(rndmEngine, 0.5, 0.15);
366
367 // Make sure fraction is bounded between 0 and 1
368 f = std::clamp(f, 0., 1.);
369
370 charges.push_back(f * totalCharge);
371 charges.push_back((1.0 - f) * totalCharge);
372 break;
373 }
374 case 3: {
375 // These fractions are guesses on a reasonable charge
376 // sharing when three strips are activated.
377 // These fractions must be updated once the final
378 // distributions of TOT from Phase-II BI RPCs
379 // are available.
380 charges.push_back(0.20 * totalCharge); // left strip
381 charges.push_back(0.60 * totalCharge); // center strip
382 charges.push_back(0.20 * totalCharge); // right strip
383 break;
384 }
385 case 4: {
386 // These fractions are guesses on a reasonable charge
387 // sharing when four strips are activated.
388 // These fractions must be updated once the final
389 // distributions of TOT from Phase-II BI RPCs
390 // are available.
391 charges.push_back(0.15 * totalCharge); // left external strip
392 charges.push_back(0.35 * totalCharge); // left internal strip
393 charges.push_back(0.35 * totalCharge); // right internal strip
394 charges.push_back(0.15 * totalCharge); // right external strip
395 break;
396 }
397 default: {
398 // return empy vector
399 break;
400 }
401 }
402 return charges;
403}

◆ fetchCollection()

template<class DigitColl>
DigitColl * MuonR4::MuonDigitizationTool::fetchCollection ( const Identifier & hitId,
OutDigitCache_t< DigitColl > & digitCache ) const
protectedinherited

Helper function that provides fetches the proper DigitCollection from the DigitCache for a given hit identifier If the Collection is fetched for the first time, it's inserted into the cache first.

◆ fillTimedHits()

StatusCode MuonR4::MuonDigitizationTool::fillTimedHits ( PileUpHits && hitColl,
TimedHits & timedHits ) const
privateinherited

Translates the PileUpHits into the timed hits format.

Definition at line 48 of file MuonDigitizationTool.cxx.

48 {
49 for (const auto& [timeIndex, simHitColl] : hitColl) {
50 timedHits.reserve(timedHits.capacity() + simHitColl->size());
51 for (const xAOD::MuonSimHit* simHit : *simHitColl) {
52 timedHits.emplace_back(timeIndex.time(), timeIndex.index(), simHit, timeIndex.type());
53 }
54 }
55 std::stable_sort(timedHits.begin(), timedHits.end(),
56 [](const TimedHit& a, const TimedHit& b){
57 if (a->identify() != b->identify()){
58 return a->identify() < b->identify();
59 }
60 if (a.eventId() != b.eventId()) {
61 return a.eventId() < b.eventId();
62 }
63 return a.eventTime() < b.eventTime();
64 });
65 return StatusCode::SUCCESS;
66 }
static Double_t a
if(pathvar)
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.

◆ filterPassed()

virtual bool PileUpToolBase::filterPassed ( ) const
inlineoverridevirtualinherited

dummy implementation of passing filter

Definition at line 49 of file PileUpToolBase.h.

49{ return m_filterPassed; }

◆ finalize()

StatusCode MuonR4::RpcDigiTool::finalize ( )
finaloverride

Definition at line 31 of file RpcDigiTool.cxx.

31 {
32 ATH_MSG_INFO("Tried to convert "
33 << m_allHits[0] << "/" << m_allHits[1] << " hits. In, "
34 << percentage(m_acceptedHits[0], m_allHits[0]) << "/"
35 << percentage(m_acceptedHits[1], m_allHits[1])
36 << "% of the cases, the conversion was successful");
37 return StatusCode::SUCCESS;
38}
#define ATH_MSG_INFO(x)

◆ getGeoCtx()

const ActsTrk::GeometryContext & MuonR4::MuonDigitizationTool::getGeoCtx ( const EventContext & ctx) const
protectedinherited

Returns the reference to the ActsTrk::GeometryContext needed to fetch global positions from the Readout geometry.

Definition at line 131 of file MuonDigitizationTool.cxx.

131 {
132 const ActsTrk::GeometryContext* gctx{};
133 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
134 THROW_EXCEPTION("Failed to retrieve the geometry context "<<m_geoCtxKey.fullKey());
135 }
136 return *gctx;
137 }
ActsTrk::GeoContextReadKey_t m_geoCtxKey
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ getRandomEngine()

CLHEP::HepRandomEngine * MuonR4::MuonDigitizationTool::getRandomEngine ( const EventContext & ctx) const
protectedinherited

Definition at line 125 of file MuonDigitizationTool.cxx.

125 {
126 ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this, m_streamName);
127 std::string rngName = m_streamName;
128 rngWrapper->setSeed(rngName, ctx);
129 return rngWrapper->getEngine(ctx);
130 }
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition RNGWrapper.h:154
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition RNGWrapper.h:108
ServiceHandle< IAthRNGSvc > m_rndmSvc
Gaudi::Property< std::string > m_streamName

◆ getTOA()

double MuonR4::RpcDigiTool::getTOA ( const double aCharge,
const double aDistance ) const
private

Returns Time Of Arrival (ns) for a signal on a strip.

Parameters
aChargeelectric charge deposited on the strip (fC)
aDistancedistance from hit to strip edge (m)

Definition at line 49 of file RpcDigiTool.cxx.

49 {
50 // This is a parameterization of BIRPC TOA (ns) values corresponding to
51 // a charge (fC) and a distance (m), it was obtained from a
52 // detailed model for RPC signal emulation.
53 constexpr std::array<double, 3> distCoeffs{0., 5.00311, 0.00006};
54 constexpr std::array<double, 3> chargeCoeffs{2.02843, -0.00641, 0.00001};
55 using namespace Acts::detail;
56 return polynomialSum(aDistance, distCoeffs) +
57 polynomialSum(aCharge, chargeCoeffs);
58 }

◆ getTOT()

double MuonR4::RpcDigiTool::getTOT ( const double aCharge) const
private

Returns Time Over Threshold (ns) for a signal on a strip.

Parameters
aChargeelectric charge deposited on the strip (fC)

Definition at line 41 of file RpcDigiTool.cxx.

41 {
42 // This is a parameterization of BIRPC TOT (ns) values corresponding to
43 // a charge (fC), it was obtained from a detailed model for
44 // RPC signal emulation.
45 constexpr std::array<double, 3> coeffs{19.9587, 0.10081, -0.00017};
46 using namespace Acts::detail;
47 return polynomialSum(aCharge, coeffs);
48 }

◆ hitTime()

double MuonR4::MuonDigitizationTool::hitTime ( const TimedHit & hit)
staticprotectedinherited

Returns the global time of the hit which is the sum of eventTime & individual hit time.

Definition at line 67 of file MuonDigitizationTool.cxx.

67 {
68 return hit.eventTime() + hit->globalTime();
69 }

◆ initialize()

StatusCode MuonR4::RpcDigiTool::initialize ( )
finaloverridevirtual

Reimplemented from MuonR4::MuonDigitizationTool.

Definition at line 24 of file RpcDigiTool.cxx.

24 {
26 ATH_CHECK(m_writeKey.initialize());
27 ATH_CHECK(m_effiDataKey.initialize(!m_effiDataKey.empty()));
28 return StatusCode::SUCCESS;
29}

◆ mergeEvent()

StatusCode MuonR4::MuonDigitizationTool::mergeEvent ( const EventContext & ctx)
finaloverrideinherited

Definition at line 92 of file MuonDigitizationTool.cxx.

92 {
93 ATH_MSG_DEBUG("mergeEvent()");
94
95 SDOFiller_t sdoContainer{};
96 ATH_CHECK(digitize(ctx, m_timedHits, !m_sdoKey.empty() ? sdoContainer.get() : nullptr));
97 ATH_CHECK(sdoContainer.record(m_sdoKey, ctx));
98 m_timedHits.clear();
99 m_simHits.clear();
100 return StatusCode::SUCCESS;
101 }
xAOD::FillContainer< xAOD::MuonSimHitContainer, xAOD::MuonSimHitAuxContainer > SDOFiller_t
std::vector< SimHitLocalCopy > m_simHits
virtual StatusCode digitize(const EventContext &ctx, const TimedHits &hitsToDigit, xAOD::MuonSimHitContainer *sdoContainer) const =0
Digitize the time ordered hits and write them to the digit format specific for the detector technolog...
SG::WriteHandleKey< xAOD::MuonSimHitContainer > m_sdoKey
StatusCode record(const SG::WriteHandleKey< Cont_t > &key, const EventContext &ctx)
Record the container to store gate using the passed write handle key.
Cont_t * get() const
get operator

◆ passDeadTime()

bool MuonR4::MuonDigitizationTool::passDeadTime ( const Identifier & channelId,
const double hitTime,
const double deadTimeWindow,
DeadTimeMap & deadTimeMap )
staticprotectedinherited

Returns whether the new digit is within the dead time window.

channelId: Identifier of the fired channel

hitTime: Current hit time

deadTimeWindow: Dead time to pass before the next hit may be accepted

deadTimeMap: Map storing the last hit times from each Identifier

Channel not seen before

Update dead time map & accept hit

Definition at line 160 of file MuonDigitizationTool.cxx.

163 {
164 auto insertItr = deadTimeMap.insert(std::make_pair(channelId,hitTime));
166 if (insertItr.second) {
167 return true;
168 }
169 if (hitTime - insertItr.first->second < deadTimeWindow) {
170 return false;
171 }
173 insertItr.first->second = hitTime;
174 return true;
175 }

◆ PileUpToolBase()

PileUpToolBase::PileUpToolBase ( const std::string & type,
const std::string & name,
const IInterface * parent )
inherited

Definition at line 22 of file PileUpToolBase.cxx.

10 : base_class(type, name, parent)
11{
12}

◆ prepareEvent()

StatusCode MuonR4::MuonDigitizationTool::prepareEvent ( const EventContext & ctx,
const unsigned int nInputEvents )
finaloverrideinherited

When being run from PileUpToolsAlgs, this method is called at the start of the subevts loop.

Not able to access SubEvents

Definition at line 39 of file MuonDigitizationTool.cxx.

40 {
41
42 ATH_MSG_DEBUG("prepareEvent() called for " << nInputEvents << " input events");
43 m_timedHits.clear();
44 m_simHits.clear();
45 return StatusCode::SUCCESS;
46 }

◆ processAllSubEvents() [1/2]

StatusCode MuonR4::MuonDigitizationTool::processAllSubEvents ( const EventContext & ctx) const
inherited

Reentrant version of the digitization tool.

In case of single hits container just load the collection using read handles

Definition at line 75 of file MuonDigitizationTool.cxx.

75 {
76 PileUpHits hitCollList{};
77 TimedHits timedHits{};
80 const xAOD::MuonSimHitContainer* hitCollection{nullptr};
81 ATH_CHECK(SG::get(hitCollection, m_simHitKey, ctx));
82 hitCollList.emplace_back(PileUpTimeEventIndex(0), hitCollection);
83 } else {
84 ATH_CHECK(m_mergeSvc->retrieveSubEvtsData(m_inputObjectName, hitCollList));
85 }
86 ATH_CHECK(fillTimedHits(std::move(hitCollList), timedHits));
87 SDOFiller_t sdoContainer{};
88 ATH_CHECK(digitize(ctx, timedHits, !m_sdoKey.empty() ? sdoContainer.get() : nullptr));
89 ATH_CHECK(sdoContainer.record(m_sdoKey, ctx));
90 return StatusCode::SUCCESS;
91 }
ServiceHandle< PileUpMergeSvc > m_mergeSvc
std::vector< TimedHitPtr< xAOD::MuonSimHit > > TimedHits
Gaudi::Property< bool > m_onlyUseContainerName
SG::ReadHandleKey< xAOD::MuonSimHitContainer > m_simHitKey
StatusCode fillTimedHits(PileUpHits &&hitColl, TimedHits &timedHits) const
Translates the PileUpHits into the timed hits format.
PileUpMergeSvc::TimedList< xAOD::MuonSimHitContainer >::type PileUpHits
MuonSimHitContainer_v1 MuonSimHitContainer
Define the version of the pixel cluster container.

◆ processAllSubEvents() [2/2]

StatusCode MuonR4::MuonDigitizationTool::processAllSubEvents ( const EventContext & ctx)
finaloverridevirtualinherited

alternative interface which uses the PileUpMergeSvc to obtain all the required SubEvents.

Reimplemented from PileUpToolBase.

Definition at line 70 of file MuonDigitizationTool.cxx.

70 {
71 const MuonDigitizationTool* digiTool = this;
72 return digiTool->processAllSubEvents(ctx);
73 }

◆ processBunchXing()

StatusCode MuonR4::MuonDigitizationTool::processBunchXing ( int bunchXing,
SubEventIterator bSubEvents,
SubEventIterator eSubEvents )
finaloverridevirtualinherited

Reimplemented from PileUpToolBase.

Definition at line 104 of file MuonDigitizationTool.cxx.

106 {
107 ATH_MSG_DEBUG("processBunchXing()" << bunchXing);
108 PileUpHits hitList{}, hitListPermanent{};
109 ATH_CHECK(m_mergeSvc->retrieveSubSetEvtData(m_inputObjectName, hitList, bunchXing, bSubEvents, eSubEvents));
110 ATH_MSG_VERBOSE(hitList.size() << " hits in xAODMuonSimHitContainer " << m_inputObjectName << " found");
111 for (auto& [hitPtr, hitContainer] : hitList) {
112 auto copyContainer = std::make_unique<xAOD::MuonSimHitContainer>();
113 auto copyAuxContainer = std::make_unique<xAOD::MuonSimHitAuxContainer>();
114 copyContainer->setStore(copyAuxContainer.get());
115 for (const xAOD::MuonSimHit* copyMe : *hitContainer) {
116 (*copyContainer->push_back(std::make_unique<xAOD::MuonSimHit>())) = (*copyMe);
117 }
118 hitListPermanent.emplace_back(hitPtr, copyContainer.get());
119 m_simHits.emplace_back(std::move(copyContainer), std::move(copyAuxContainer));
120 }
121 ATH_CHECK(fillTimedHits(std::move(hitListPermanent), m_timedHits));
122 return StatusCode::SUCCESS;
123 }

◆ resetFilter()

virtual void PileUpToolBase::resetFilter ( )
inlineoverridevirtualinherited

dummy implementation of filter reset

Reimplemented in MergeTruthJetsTool.

Definition at line 51 of file PileUpToolBase.h.

51{ m_filterPassed=true; }

◆ timeOverThreshold()

double MuonR4::RpcDigiTool::timeOverThreshold ( CLHEP::HepRandomEngine * rndmEngine)
staticprivate

Roll the time over threshold for each signal digit.

Definition at line 328 of file RpcDigiTool.cxx.

328 {
329 // mn Time-over-threshold modeled as a narrow and a wide gaussian
330 // mn based on the fit documented in
331 // https://its.cern.ch/jira/browse/ATLASRECTS-7820
332 constexpr double tot_mean_narrow = 16.;
333 constexpr double tot_sigma_narrow = 2.;
334 constexpr double tot_mean_wide = 15.;
335 constexpr double tot_sigma_wide = 4.5;
336
337 double thetot = 0.;
338
339 if (CLHEP::RandFlat::shoot(rndmEngine) < 0.75) {
340 thetot = CLHEP::RandGaussZiggurat::shoot(rndmEngine, tot_mean_narrow,
341 tot_sigma_narrow);
342 } else {
343 thetot = CLHEP::RandGaussZiggurat::shoot(rndmEngine, tot_mean_wide,
344 tot_sigma_wide);
345 }
346
347 return std::max(thetot, 0.);
348}

◆ toProcess()

virtual bool PileUpToolBase::toProcess ( int bunchXing) const
inlineoverridevirtualinherited

the method this base class helps implementing

Reimplemented in MergeHijingParsTool, and MergeTrackRecordCollTool.

Definition at line 32 of file PileUpToolBase.h.

32 {
33 //closed interval [m_firstXing,m_lastXing]
34 return !((m_firstXing > bunchXing) || (bunchXing > m_lastXing));
35 }
Gaudi::Property< int > m_firstXing
Gaudi::Property< int > m_lastXing

◆ writeDigitContainer()

template<class DigitCont, class DigitColl>
StatusCode MuonR4::MuonDigitizationTool::writeDigitContainer ( const EventContext & ctx,
const SG::WriteHandleKey< DigitCont > & key,
OutDigitCache_t< DigitColl > && digitCache,
unsigned int hashMax ) const
protectedinherited

Helper function to move the collected digits into the final DigitContainer.

The function needs the maximal size of the container in advance which is provided by calling the module_hash_max() function of the corresponding MuonIdHelper.

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

std::array<std::atomic<unsigned>, 2> m_acceptedHits MuonR4::RpcDigiTool::ATLAS_THREAD_SAFE {}
mutableprivate

Definition at line 71 of file RpcDigiTool.h.

71{};

◆ ATLAS_THREAD_SAFE [2/2]

std::array<std::atomic<unsigned>, 2> m_allHits MuonR4::RpcDigiTool::ATLAS_THREAD_SAFE {}
mutableprivate

Definition at line 69 of file RpcDigiTool.h.

69{};

◆ m_deadTime

Gaudi::Property<double> MuonR4::RpcDigiTool::m_deadTime
private
Initial value:
{this, "deadTime",
100. * Gaudi::Units::nanosecond}

Definition at line 81 of file RpcDigiTool.h.

81 {this, "deadTime",
82 100. * Gaudi::Units::nanosecond};

◆ m_detMgr

const MuonGMR4::MuonDetectorManager* MuonR4::MuonDigitizationTool::m_detMgr {nullptr}
protectedinherited

Definition at line 111 of file MuonDigitizationTool.h.

111{nullptr};

◆ m_digitizeMuonOnly

Gaudi::Property<bool> MuonR4::RpcDigiTool::m_digitizeMuonOnly
private
Initial value:
{
this, "ProcessTrueMuonsOnly", false,
"If set to true hit with pdgId != 13 are skipped"}

Definition at line 84 of file RpcDigiTool.h.

84 {
85 this, "ProcessTrueMuonsOnly", false,
86 "If set to true hit with pdgId != 13 are skipped"};

◆ m_effiDataKey

SG::ReadCondHandleKey<Muon::DigitEffiData> MuonR4::RpcDigiTool::m_effiDataKey
private
Initial value:
{
this, "EffiDataKey", "RpcDigitEff",
"Efficiency constants of the individual Rpc gasGaps"}

Definition at line 65 of file RpcDigiTool.h.

65 {
66 this, "EffiDataKey", "RpcDigitEff",
67 "Efficiency constants of the individual Rpc gasGaps"};

◆ m_filterPassed

bool PileUpToolBase::m_filterPassed {true}
protectedinherited

Definition at line 60 of file PileUpToolBase.h.

60{true};

◆ m_firstXing

Gaudi::Property<int> PileUpToolBase::m_firstXing
protectedinherited
Initial value:
{this, "FirstXing", -999,
"First bunch-crossing in which det is live"}

Definition at line 54 of file PileUpToolBase.h.

54 {this, "FirstXing", -999,
55 "First bunch-crossing in which det is live"};

◆ m_geoCtxKey

ActsTrk::GeoContextReadKey_t MuonR4::MuonDigitizationTool::m_geoCtxKey
privateinherited
Initial value:
{this, "AlignmentKey", "ActsAlignment",
"Geometry context"}

Definition at line 123 of file MuonDigitizationTool.h.

123 {this, "AlignmentKey", "ActsAlignment",
124 "Geometry context"};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonR4::MuonDigitizationTool::m_idHelperSvc
protectedinherited
Initial value:
{this, "MuonIdHelperSvc",
"Muon::MuonIdHelperSvc/MuonIdHelperSvc"}

Definition at line 113 of file MuonDigitizationTool.h.

113 {this, "MuonIdHelperSvc",
114 "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_includePileUpTruth

Gaudi::Property<bool> MuonR4::MuonDigitizationTool::m_includePileUpTruth {this, "IncludePileUpTruth", true, "Include pile-up truth info"}
privateinherited

Definition at line 137 of file MuonDigitizationTool.h.

137{this, "IncludePileUpTruth", true, "Include pile-up truth info"};

◆ m_inputObjectName

std::string MuonR4::MuonDigitizationTool::m_inputObjectName {""}
privateinherited

Definition at line 139 of file MuonDigitizationTool.h.

139{""};

◆ m_lastXing

Gaudi::Property<int> PileUpToolBase::m_lastXing
protectedinherited
Initial value:
{this, "LastXing", 999,
"Last bunch-crossing in which det is live"}

Definition at line 56 of file PileUpToolBase.h.

56 {this, "LastXing", 999,
57 "Last bunch-crossing in which det is live"};

◆ m_mergeSvc

ServiceHandle<PileUpMergeSvc> MuonR4::MuonDigitizationTool::m_mergeSvc {this, "PileUpMergeSvc", "PileUpMergeSvc", ""}
privateinherited

Definition at line 126 of file MuonDigitizationTool.h.

126{this, "PileUpMergeSvc", "PileUpMergeSvc", ""};

◆ m_onlyUseContainerName

Gaudi::Property<bool> MuonR4::MuonDigitizationTool::m_onlyUseContainerName
privateinherited
Initial value:
{this, "OnlyUseContainerName", false,
"Don't use the ReadHandleKey directly. Just extract the container name from it."}

Definition at line 134 of file MuonDigitizationTool.h.

134 {this, "OnlyUseContainerName", false,
135 "Don't use the ReadHandleKey directly. Just extract the container name from it."};

◆ m_propagationVelocity

Gaudi::Property<double> MuonR4::RpcDigiTool::m_propagationVelocity
private
Initial value:
{
this, "propSpeed", 0.5 * Gaudi::Units::c_light,
"Propagation speed of the signal inside the strip"}

Definition at line 73 of file RpcDigiTool.h.

73 {
74 this, "propSpeed", 0.5 * Gaudi::Units::c_light,
75 "Propagation speed of the signal inside the strip"}; // in mm/ns

◆ m_rndmSvc

ServiceHandle<IAthRNGSvc> MuonR4::MuonDigitizationTool::m_rndmSvc {this, "RndmSvc", "AthRNGSvc", ""}
privateinherited

Definition at line 130 of file MuonDigitizationTool.h.

130{this, "RndmSvc", "AthRNGSvc", ""}; // Random number service

◆ m_sdoKey

SG::WriteHandleKey<xAOD::MuonSimHitContainer> MuonR4::MuonDigitizationTool::m_sdoKey {this, "OutputSDOName", ""}
privateinherited

Definition at line 132 of file MuonDigitizationTool.h.

132{this, "OutputSDOName", ""};

◆ m_simHitKey

SG::ReadHandleKey<xAOD::MuonSimHitContainer> MuonR4::MuonDigitizationTool::m_simHitKey {this, "SimHitKey", ""}
privateinherited

Definition at line 121 of file MuonDigitizationTool.h.

121{this, "SimHitKey", ""};

◆ m_simHits

std::vector<SimHitLocalCopy> MuonR4::MuonDigitizationTool::m_simHits {}
privateinherited

Definition at line 145 of file MuonDigitizationTool.h.

145{};

◆ m_streamName

Gaudi::Property<std::string> MuonR4::MuonDigitizationTool::m_streamName {this, "StreamName", ""}
privateinherited

Definition at line 128 of file MuonDigitizationTool.h.

128{this, "StreamName", ""};

◆ m_stripTimeResolution

Gaudi::Property<double> MuonR4::RpcDigiTool::m_stripTimeResolution
private
Initial value:
{
this, "timeResolution", 0.6 * Gaudi::Units::nanosecond,
"Estimated time resolution of the strip readout"}

Definition at line 77 of file RpcDigiTool.h.

77 {
78 this, "timeResolution", 0.6 * Gaudi::Units::nanosecond,
79 "Estimated time resolution of the strip readout"};

◆ m_timedHits

TimedHits MuonR4::MuonDigitizationTool::m_timedHits {}
privateinherited

Definition at line 141 of file MuonDigitizationTool.h.

141{};

◆ m_vetoPileUpTruthLinks

Gaudi::Property<int> PileUpToolBase::m_vetoPileUpTruthLinks
protectedinherited
Initial value:
{this, "VetoPileUpTruthLinks", true,
"Ignore links to suppressed pile-up truth"}

Definition at line 58 of file PileUpToolBase.h.

58 {this, "VetoPileUpTruthLinks", true,
59 "Ignore links to suppressed pile-up truth"};

◆ m_writeKey

SG::WriteHandleKey<RpcDigitContainer> MuonR4::RpcDigiTool::m_writeKey
private
Initial value:
{this, "OutputObjectName",
"RPC_DIGITS"}

Definition at line 62 of file RpcDigiTool.h.

62 {this, "OutputObjectName",
63 "RPC_DIGITS"};

The documentation for this class was generated from the following files: