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

#include <sTgcDigitizationTool.h>

Inheritance diagram for MuonR4::sTgcDigitizationTool:
Collaboration diagram for MuonR4::sTgcDigitizationTool:

Classes

struct  SimHitSorter
 Data type to deduplicate the SDOs && associate them with the digit produced by them. More...
class  sTgcSimDigitHit

Public Types

using ReadoutChannelType = sTgcIdHelper::sTgcChannelTypes
 ReadoutChannelType to distinguish the available readout channels Pad - pad readout channel Strip - eta strip readout channel Wire - phi wire group readout channel.
using DigiConditions = sTgcDigitMaker::DigiConditions
using sTgcDigitVec = sTgcDigitMaker::sTgcDigitVec
using DigiCache = OutDigitCache_t<sTgcDigitCollection>
using sTgcSimDigitVec = std::vector<sTgcSimDigitHit>

Public Member Functions

StatusCode initialize () override final
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.
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

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 SdoIdMap_t = std::map<const TimedHit, std::vector<Identifier>, SimHitSorter>
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

StatusCode processDigitsWithVMM (const EventContext &ctx, const DigiConditions &digiCond, sTgcSimDigitVec &&digitsInChamber, const double vmmDeadTime, const bool isNeighbourOn, sTgcDigitCollection &outColl, SdoIdMap_t &sdoIdMap) const
sTgcSimDigitVec mergeDigitsVMM (const EventContext &ctx, const DigiConditions &digiCond, const double vmmDeadTime, const bool isNeighbourOn, sTgcSimDigitVec &&unmergedDigits) const
uint16_t bcTagging (const double digitTime) const
double getChannelThreshold (const EventContext &ctx, const Identifier &channelID, const NswCalibDbThresholdData &thresholdData) const
StatusCode fillTimedHits (PileUpHits &&hitColl, TimedHits &timedHits) const
 Translates the PileUpHits into the timed hits format.

Private Attributes

SG::WriteHandleKey< sTgcDigitContainerm_writeKey {this, "OutputObjectName", "STGC_DIGITS"}
SG::ReadCondHandleKey< Muon::DigitEffiDatam_effiDataKey {this, "EffiDataKey", "sTgcDigitEff", "Efficiency constants"}
SG::ReadCondHandleKey< NswCalibDbThresholdDatam_condThrshldsKey {this, "CondThrshldsKey", "NswCalibDbThresholdData", "Calibration data"}
ToolHandle< Muon::INSWCalibSmearingToolm_smearingTool {this, "SmearingTool", "Muon::NSWCalibSmearingTool/STGCCalibSmearingTool"}
ToolHandle< Muon::INSWCalibToolm_calibrationTool {this, "CalibrationTool", "Muon::NSWCalibTool/STGCCalibTool"}
Gaudi::Property< bool > m_digitizeMuonOnly {this, "ProcessTrueMuonsOnly", false}
Gaudi::Property< bool > m_useTimeWindow {this, "UseTimeWindow", true}
Gaudi::Property< bool > m_doSmearing {this, "doSmearing", false}
Gaudi::Property< bool > m_doToFCorrection {this,"doToFCorrection", true}
Gaudi::Property< int > m_digitMode {this, "digitMode", 3}
Gaudi::Property< bool > m_doPadSharing {this,"padChargeSharing", false}
Gaudi::Property< double > m_deadtimeStrip {this,"deadtimeStrip", 250}
Gaudi::Property< double > m_deadtimePad {this,"deadtimePad" , 250}
Gaudi::Property< double > m_deadtimeWire {this,"deadtimeWire" , 250}
Gaudi::Property< bool > m_doNeighborOn {this,"neighborOn", true}
Gaudi::Property< double > m_runVoltage {this,"operatingHVinkV" , 2.8}
Gaudi::Property< bool > m_useCondThresholds
Gaudi::Property< double > m_energyDepositThreshold {this,"energyDepositThreshold",300.0*CLHEP::eV}
Gaudi::Property< double > m_limitElectronKineticEnergy {this,"limitElectronKineticEnergy",5.0*CLHEP::MeV}
Gaudi::Property< double > m_chargeThreshold {this,"chargeThreshold", 0.030}
std::unique_ptr< sTgcDigitMakerm_digitizer {}
SG::ReadHandleKey< xAOD::MuonSimHitContainerm_simHitKey {this, "SimHitKey", ""}
SG::ReadHandleKey< ActsTrk::GeometryContextm_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 {}

Static Private Attributes

static constexpr double m_timeJitterElectronicsStrip {2.f}
static constexpr double m_timeJitterElectronicsPad {2.f}
static constexpr double m_hitTimeMergeThreshold {30.f}

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

Member Typedef Documentation

◆ DeadTimeMap

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

Definition at line 100 of file MuonDigitizationTool.h.

◆ DigiCache

◆ DigiConditions

◆ 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

◆ ReadoutChannelType

ReadoutChannelType to distinguish the available readout channels Pad - pad readout channel Strip - eta strip readout channel Wire - phi wire group readout channel.

Definition at line 39 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

◆ SdoIdMap_t

◆ 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.

◆ sTgcDigitVec

◆ sTgcSimDigitVec

◆ 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 142 of file MuonDigitizationTool.cxx.

143 {
144 if(!sdoContainer) {
145 ATH_MSG_VERBOSE("No SDO container setup of writing");
146 return nullptr;
147 }
148 if (!m_includePileUpTruth && HepMC::ignoreTruthLink(hit->genParticleLink(), m_vetoPileUpTruthLinks)) {
149 ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hit->identify())<<" is a pile-up truth link");
150 return nullptr;
151 }
152 ATH_MSG_VERBOSE(m_idHelperSvc->toString(hit->identify())<<", pdgID: "<<hit->pdgId()<< " genParticleLink :"<<hit->genParticleLink());
153 ATH_MSG_VERBOSE("Genparticle: "<<hit->genParticleLink());
154 xAOD::MuonSimHit* sdoHit = sdoContainer->push_back(std::make_unique<xAOD::MuonSimHit>());
155 (*sdoHit) = (*hit);
156 static const SG::Accessor<float> acc_eventTime{"MuSim_evtTime"};
157 static const SG::Accessor<unsigned short> acc_eventID{"MuSim_evtID"};
158 static const SG::Accessor<unsigned short> acc_puType{"MuSim_puType"};
159 acc_eventTime(*sdoHit) = hit.eventTime();
160 acc_eventID(*sdoHit) = hit.eventId();
161 acc_puType(*sdoHit) = hit.pileupType();
162 return sdoHit;
163 }
#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.
MuonSimHit_v1 MuonSimHit
Defined the version of the MuonSimHit.
Definition MuonSimHit.h:12

◆ bcTagging()

uint16_t sTgcDigitizationTool::bcTagging ( const double digitTime) const
private

Definition at line 47 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/src/sTgcDigitizationTool.cxx.

47 {
48 uint16_t bctag = 0;
49 int bunchInteger = (digitTime > 0) ? static_cast<int>(std::abs(digitTime / 25.0))
50 : static_cast<int>(std::abs(digitTime / 25.0)) + 1;
51 bctag = (bctag | bunchInteger);
52 if (digitTime < 0) bctag = ~bctag;
53 return bctag;
54 }
setWord1 uint16_t

◆ digitize()

StatusCode sTgcDigitizationTool::digitize ( const EventContext & ctx,
const TimedHits & hitsToDigit,
xAOD::MuonSimHitContainer * sdoContainer ) const
finaloverridevirtual

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.

Storing hit position and direction in local frame

apply the smearing tool to decide if the hit has to be digitized or not based on layer efficiency

Add the only the hits and digits that pass VMM simulation to sdo container

Digits are sorted by

Implements MuonR4::MuonDigitizationTool.

Definition at line 72 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/src/sTgcDigitizationTool.cxx.

74 {
75 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
76 CLHEP::HepRandomEngine* rndEngine = getRandomEngine(ctx);
77 const ActsTrk::GeometryContext &gctx{getGeoCtx(ctx)};
78
79 const Muon::DigitEffiData* efficiencyMap{nullptr};
80 ATH_CHECK(SG::get(efficiencyMap, m_effiDataKey, ctx));
81 const NswCalibDbThresholdData* thresholdData{nullptr};
82 ATH_CHECK(SG::get(thresholdData, m_condThrshldsKey, ctx));
83
84 DigiConditions digiCond{efficiencyMap, thresholdData, rndEngine};
85 DigiCache digitCache{};
86
87 double earliestEventTime = std::numeric_limits<double>::max();
88 xAOD::ChamberViewer viewer{hitsToDigit, m_idHelperSvc.get()};
89 const double angular_tolerance = 1e-3; // ~0.057 degrees
90
91 do {
92 if (viewer.size() == 0) {
93 ATH_MSG_VERBOSE("No hits to digitize — skipping sTGC digitization.");
94 continue;
95 }
96 std::array<sTgcSimDigitVec , 3> simDigitsByChType{};
97 for (const TimedHit& hit : viewer) {
98
99 if (m_digitizeMuonOnly && !MC::isMuon(hit)) {
100 ATH_MSG_VERBOSE("Hit is not from a muon - skipping ");
101 continue;
102 }
103 ATH_MSG_VERBOSE("Hit Particle ID : " << hit->pdgId() );
104 double eventTime = hit.eventTime();
105 earliestEventTime = std::min(earliestEventTime, eventTime);
106 if (hit->energyDeposit() < m_energyDepositThreshold){
107 ATH_MSG_VERBOSE("Hit with Energy Deposit of " << hit->energyDeposit()
108 << " less than " << m_energyDepositThreshold << ". Skip this hit." );
109 continue;
110 }
111
113 const Amg::Vector3D locHitPos = xAOD::toEigen(hit->localPosition());
114 const Amg::Vector3D locHitDir = xAOD::toEigen(hit->localDirection());
115
116 const double hitKineticEnergy = hit->kineticEnergy();
117 if (hitKineticEnergy < m_limitElectronKineticEnergy && MC::isElectron(hit)) {
118 ATH_MSG_DEBUG("Skip electron hit with kinetic energy " << hitKineticEnergy
119 << ", which is less than the lower limit of " << m_limitElectronKineticEnergy);
120 continue;
121 }
122
123 // No support for particles with direction perpendicular to the beam line, since such particles
124 // can deposit energy on a lot of strips and pads of the gas gap.
125 const double theta = std::acos(locHitDir.z()); // polar angle from Z axis
126 const double ninetyDegrees = std::numbers::pi / 2;
127 // Reject hits that are too close to 90 degrees (i.e., perpendicular to Z)
128 if (std::abs(theta - ninetyDegrees) < angular_tolerance) {
129 ATH_MSG_VERBOSE("Skipping hit nearly perpendicular to Z-axis (angle: " << theta << ")");
130 continue;
131 }
132 if (std::abs(locHitDir.z()) < 0.00001) {
133 ATH_MSG_VERBOSE("Skipping hit nearly perpendicular to Z-axis.");
134 continue;
135 }
136 if(eventTime != 0){
137 ATH_MSG_DEBUG("Updated hit global time to include off set of " << eventTime << " ns from OOT bunch.");
138 }
139 else {
140 ATH_MSG_DEBUG("This hit came from the in time bunch.");
141 }
142
143 const Identifier hitId = hit->identify();
146 if (m_doSmearing) {
147 bool acceptHit = true;
148 ATH_CHECK(m_smearingTool->isAccepted(hitId, acceptHit, rndEngine));
149 if ( !acceptHit ) {
150 ATH_MSG_DEBUG("Dropping the hit - smearing tool");
151 continue;
152 }
153 }
154 const MuonGMR4::sTgcReadoutElement* readoutElement = m_detMgr->getsTgcReadoutElement(hitId);
155 const Amg::Vector3D globalHitPos = readoutElement->localToGlobalTransform(gctx, hitId) * locHitPos;
156 double globalHitTime = hit->globalTime() + eventTime;
157 double tofCorrection = globalHitPos.mag() / Gaudi::Units::c_light;
158 double bunchTime = globalHitTime - tofCorrection;
159
160 const HepMcParticleLink particleLink = hit->genParticleLink();
161 // Print some information about the sTGC hit
162 ATH_MSG_VERBOSE("hitID " << m_idHelperSvc->toString(hitId) << " Hit bunch time " << bunchTime << " tof/G4 hit time " << globalHitTime
163 << " globalHitPosition " << Amg::toString(globalHitPos) << " hit: r " << globalHitPos.perp() << " z " << globalHitPos.z()
164 << " mclink " << particleLink << "Kinetic energy " << hitKineticEnergy);
165 ATH_MSG_VERBOSE("Total hits passed to digitize: " << hitsToDigit.size());
166 sTgcDigitVec digitizedHits = m_digitizer->executeDigi(digiCond, hit);
167 if(digitizedHits.empty()) {
168 continue;
169 }
170 ATH_MSG_VERBOSE("Hit produced " << digitizedHits.size() << " digits." );
171
172 for (std::unique_ptr<sTgcDigit>& digit : digitizedHits) {
173 /*
174 NOTE:
175 -----
176 Since not every hit might end up resulting in a
177 digit, this construction might take place after the hit loop
178 in a loop of its own!
179 */
180 // make new sTgcDigit
181 const Identifier digitId = digit->identify();
182 double digitTime = digit->time();
183 int digitChType = idHelper.channelType(digitId);
184
185 if(digitChType == ReadoutChannelType::Strip) {
186 digitTime += CLHEP::RandGaussZiggurat::shoot(rndEngine, 0, m_timeJitterElectronicsStrip);
187 }
188 else {
189 digitTime += CLHEP::RandGaussZiggurat::shoot(rndEngine, 0, m_timeJitterElectronicsPad);
190 }
191
192 uint16_t digitBCTag = bcTagging(digitTime + bunchTime);
193 digitTime += m_doToFCorrection ? bunchTime : globalHitTime;
194
195 double digitCharge = digit->charge();
196 // Create a new digit with updated time and BCTag
197 int eventId = hit.eventId();
198 bool isDead{false}, isPileup{eventId != 0};
199 ATH_MSG_VERBOSE("Hit is from the main signal subevent if eventId is zero, eventId = "
200 << eventId << " newDigit time: " << digitTime);
201 auto newDigitPtr = std::make_unique<sTgcDigit>(digitId, digitBCTag, digitTime, digitCharge, isDead, isPileup);
202 if (digitChType == ReadoutChannelType::Strip) {
203 ATH_MSG_VERBOSE("Finalizing Digit "<<m_idHelperSvc->toString(digitId)
204 <<" BC tag = " << newDigitPtr->bcTag()
205 <<" digitTime = " << newDigitPtr->time()
206 <<" charge = " << newDigitPtr->charge());
207 }
208 simDigitsByChType[digitChType].emplace_back(hit, std::move(newDigitPtr));
209 }
210 }
211 SdoIdMap_t sdoIdMap{};
212 sTgcDigitCollection* outColl = fetchCollection(viewer.at(0)->identify(), digitCache);
213
214 ATH_CHECK(processDigitsWithVMM(ctx, digiCond, std::move(simDigitsByChType[ReadoutChannelType::Strip]),
215 m_deadtimeStrip, m_doNeighborOn, *outColl, sdoIdMap));
216 ATH_CHECK(processDigitsWithVMM(ctx, digiCond, std::move(simDigitsByChType[ReadoutChannelType::Pad]),
217 m_deadtimePad, false, *outColl, sdoIdMap));
218 ATH_CHECK(processDigitsWithVMM(ctx, digiCond, std::move(simDigitsByChType[ReadoutChannelType::Wire]),
219 m_deadtimeWire, false, *outColl, sdoIdMap));
220 for (auto& [simHit, assocIds]: sdoIdMap) {
222 xAOD::MuonSimHit* sdoHit = addSDO(simHit, sdoContainer);
223 if (!sdoHit) {
224 continue;
225 }
226 std::ranges::sort(assocIds, [&](const Identifier& a, const Identifier& b){
227 const int typeA = idHelper.channelType(a);
228 const int typeB = idHelper.channelType(b);
229 if (typeA != typeB) {
231 return true;
232 } else if (typeB == sTgcIdHelper::sTgcChannelTypes::Strip) {
233 return false;
234 }
235 return typeA > typeB;
236 }
237 return idHelper.channel(a) < idHelper.channel(b);
238 });
239 const double globalHitTime = sdoHit->globalTime() + simHit.eventTime();
240 sdoHit->setGlobalTime(globalHitTime);
241
242 sdoHit->setIdentifier(assocIds.front());
243 assocIds.erase(assocIds.begin());
244
245 using ChVec_t = std::vector<std::uint16_t>;
246 static const SG::Decorator<ChVec_t> dec_stripCh{"sTgc_stripChannels"};
247 static const SG::Decorator<ChVec_t> dec_wireCh{"sTgc_wireChannels"};
248 static const SG::Decorator<ChVec_t> dec_padCh{"sTgc_padChannels"};
249 ChVec_t& stripCh{dec_stripCh(*sdoHit)}, wireCh{dec_wireCh(*sdoHit)}, padCh{dec_padCh(*sdoHit)};
250
251 std::ranges::for_each(assocIds,[&](const Identifier& secId){
252 const int ch = idHelper.channel(secId);
253 switch(idHelper.channelType(secId)){
255 case Strip: {
256 stripCh.push_back(ch);
257 break;
258 }case Wire: {
259 wireCh.push_back(ch);
260 break;
261 }case Pad: {
262 padCh.push_back(ch);
263 break;
264 }
265 }
266 });
267
268
269 }
270 } while (viewer.next());
272 ATH_CHECK(writeDigitContainer(ctx, m_writeKey, std::move(digitCache), idHelper.module_hash_max()));
273
274 return StatusCode::SUCCESS;
275 }
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
static Double_t a
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &ctx) const
Returns the transformation from the local coordinate system of the readout element into the global AT...
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.
const ActsTrk::GeometryContext & getGeoCtx(const EventContext &ctx) const
Returns the reference to the ActsTrk::GeometryContext needed to fetch global positions from the Reado...
StatusCode processDigitsWithVMM(const EventContext &ctx, const DigiConditions &digiCond, sTgcSimDigitVec &&digitsInChamber, const double vmmDeadTime, const bool isNeighbourOn, sTgcDigitCollection &outColl, SdoIdMap_t &sdoIdMap) const
std::map< const TimedHit, std::vector< Identifier >, SimHitSorter > SdoIdMap_t
int channelType(const Identifier &id) const
int channel(const Identifier &id) const override
std::size_t size() const noexcept
Returns how many hits are in the current chamber.
void setGlobalTime(const float time)
Sets the time of the traversing particle.
void setIdentifier(const Identifier &id)
Sets the global ATLAS identifier.
float globalTime() const
Returns the time ellapsed since the collision of the traversing particle.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, 3, 1 > Vector3D
bool isPileup(int origin)
from pileup
bool isElectron(const T &p)
bool isMuon(const T &p)
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.

◆ 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 44 of file MuonDigitizationTool.cxx.

44 {
45 for (const auto& [timeIndex, simHitColl] : hitColl) {
46 timedHits.reserve(timedHits.capacity() + simHitColl->size());
47 for (const xAOD::MuonSimHit* simHit : *simHitColl) {
48 timedHits.emplace_back(timeIndex.time(), timeIndex.index(), simHit, timeIndex.type());
49 }
50 }
51 std::stable_sort(timedHits.begin(), timedHits.end(),
52 [](const TimedHit& a, const TimedHit& b){
53 if (a->identify() != b->identify()){
54 return a->identify() < b->identify();
55 }
56 if (a.eventId() != b.eventId()) {
57 return a.eventId() < b.eventId();
58 }
59 return a.eventTime() < b.eventTime();
60 });
61 return StatusCode::SUCCESS;
62 }
if(febId1==febId2)
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; }

◆ getChannelThreshold()

double sTgcDigitizationTool::getChannelThreshold ( const EventContext & ctx,
const Identifier & channelID,
const NswCalibDbThresholdData & thresholdData ) const
private

Definition at line 56 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/src/sTgcDigitizationTool.cxx.

58 {
60 std::optional<float> elecThreshold = thresholdData.getThreshold(channelID);
61 if (!elecThreshold) {
62 THROW_EXCEPTION("Cannot retrieve VMM threshold from conditions database!");
63 }
64
65 if (!m_calibrationTool->pdoToCharge(ctx, true, *elecThreshold, channelID, threshold)) {
66 THROW_EXCEPTION("Cannot convert VMM charge threshold via conditions data!");
67 }
68
69 return threshold;
70 }
std::optional< float > getThreshold(const Identifier &channelId) const
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ 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 135 of file MuonDigitizationTool.cxx.

135 {
136 const ActsTrk::GeometryContext* gctx{};
137 if (!SG::get(gctx, m_geoCtxKey, ctx).isSuccess()) {
138 THROW_EXCEPTION("Failed to retrieve the geometry context "<<m_geoCtxKey.fullKey());
139 }
140 return *gctx;
141 }
SG::ReadHandleKey< ActsTrk::GeometryContext > m_geoCtxKey

◆ getRandomEngine()

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

Definition at line 129 of file MuonDigitizationTool.cxx.

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

◆ 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 63 of file MuonDigitizationTool.cxx.

63 {
64 return hit.eventTime() + hit->globalTime();
65 }

◆ initialize()

StatusCode sTgcDigitizationTool::initialize ( )
finaloverridevirtual

meanGasGain is the mean value of the polya gas gain function describing the avalanche of electrons caused by the electric field Parameterization is obtained from ATL-MUON-PUB-2014-001 and the corrected fit to data to parameterize gain vs HV in kV

Reimplemented from MuonR4::MuonDigitizationTool.

Definition at line 11 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/src/sTgcDigitizationTool.cxx.

11 {
12 ATH_MSG_DEBUG("sTgcDigitizationTool::initialize()");
13 ATH_MSG_DEBUG ( "Configuration sTgcDigitizationTool" );
14 ATH_MSG_DEBUG ( "doSmearing "<< m_doSmearing);
15 ATH_MSG_DEBUG("OutputObjectName " << m_writeKey.key());
16 ATH_MSG_DEBUG ( "HV " << m_runVoltage);
17 ATH_MSG_DEBUG ( "threshold " << m_chargeThreshold);
18 ATH_MSG_DEBUG ( "useCondThresholds " << m_useCondThresholds);
19
21 ATH_CHECK(m_writeKey.initialize());
22 ATH_CHECK(m_effiDataKey.initialize(!m_effiDataKey.empty()));
24 ATH_CHECK(m_smearingTool.retrieve());
25 ATH_CHECK(m_calibrationTool.retrieve());
26
27 if (m_doSmearing) {
28 ATH_MSG_INFO("Running in smeared mode!");
29 }
30
36 ATH_MSG_WARNING("STGC run voltage must be within fit domain of 2.3 kV to 3.2 kV");
37 return StatusCode::FAILURE;
38 }
39 double meanGasGain = 2.15 * 1E-4 * std::exp(6.88*m_runVoltage);
41 m_digitizer = std::make_unique<sTgcDigitMaker>(m_detMgr, mode, meanGasGain, m_doPadSharing);
42 ATH_CHECK(m_digitizer->initialize());
43
44 return StatusCode::SUCCESS;
45 }
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)

◆ mergeDigitsVMM()

sTgcDigitizationTool::sTgcSimDigitVec sTgcDigitizationTool::mergeDigitsVMM ( const EventContext & ctx,
const DigiConditions & digiCond,
const double vmmDeadTime,
const bool isNeighbourOn,
sTgcSimDigitVec && unmergedDigits ) const
private

Sort Digits in the unmergedDigits vector by gasgap -> channelType -> time

Catch the cases where the channel is 1 or maxChannel

merge digits in time. Do weighted average to find time of digits originally below threshold. Follows what we expect from real VMM.

We reached another digit. No need to merge

Definition at line 335 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/src/sTgcDigitizationTool.cxx.

339 {
340
341 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
343 std::ranges::stable_sort(unmergedDigits,
344 [&idHelper](const sTgcSimDigitHit& a, const sTgcSimDigitHit& b) {
345 const int layA = idHelper.gasGap(a.identify());
346 const int layB = idHelper.gasGap(b.identify());
347 if (layA != layB) {
348 return layA < layB;
349 }
350 const int chA = idHelper.channel(a.identify());
351 const int chB = idHelper.channel(b.identify());
352 if (chA != chB) {
353 return chA < chB;
354 }
355 return a.time() < b.time();
356 }
357 );
358 sTgcSimDigitVec savedDigits{}, premerged{};
359
360 premerged.reserve(unmergedDigits.size());
361 savedDigits.reserve(premerged.capacity());
362
363 auto passNeigbourLogic = [&](const sTgcSimDigitHit& candidate) {
364 if (!isNeighbourOn || savedDigits.empty()) {
365 return false;
366 }
367 if (savedDigits.back().identify() == candidate.identify() &&
368 std::abs(savedDigits.back().time() - candidate.time()) < vmmDeadTime) {
369 ATH_MSG_VERBOSE("Digits are too close in time ");
370 return false;
371 }
372 const Identifier digitId = candidate.identify();
373 const int channel = idHelper.channel(digitId);
374 const MuonGMR4::sTgcReadoutElement* reEle = m_detMgr->getsTgcReadoutElement(digitId);
375 const IdentifierHash hitHash = reEle->measurementHash(digitId);
376 const int maxChannel = reEle->numChannels(hitHash);
377 for (int neighbour : {std::max(1, channel -1), std::min(maxChannel, channel+1)}) {
379 if (neighbour == channel) {
380 continue;
381 }
382 const Identifier neighbourId = idHelper.channelID(digitId,
383 reEle->multilayer(),
384 idHelper.gasGap(digitId),
385 idHelper.channelType(digitId), neighbour);
386 const double threshold = m_useCondThresholds ? getChannelThreshold(ctx, neighbourId, *digiCond.thresholdData)
388 if (std::ranges::any_of(savedDigits, [&](const sTgcSimDigitHit& known){
389 return known.identify() == neighbourId &&
390 known.getDigit().charge() > threshold &&
391 std::abs(known.time() - candidate.time()) < m_hitTimeMergeThreshold;
392 })) {
393 return true;
394 }
395 }
396 return false;
397 };
398 // Sort digits on every channel by earliest to latest time
399 // Also do hit merging to help with neighborOn logic
401 for (sTgcSimDigitVec::iterator merge_me = unmergedDigits.begin(); merge_me!= unmergedDigits.end(); ++merge_me) {
403 threshold = getChannelThreshold(ctx, (*merge_me).identify(), *digiCond.thresholdData);
404 }
407 sTgcDigit& digit1{(*merge_me).getDigit()};
408 double totalCharge = digit1.charge();
409 double weightedTime = digit1.time();
410
411 sTgcSimDigitVec::iterator merge_with = merge_me + 1;
412 for ( ; merge_with!= unmergedDigits.end(); ++merge_with) {
414 if ((*merge_with).identify() != (*merge_me).identify()) {
415 break;
416 }
417 const sTgcDigit& mergeDigit{(*merge_with).getDigit()};
418 // If future digits are within window, digit1 absorbs its charge
419 if (mergeDigit.time() - digit1.time() > m_hitTimeMergeThreshold) break;
420 // If digit1 is not above threshold prior to merging, the new time is
421 // a weighted average. Do it for every merging pair.
422 if (totalCharge < threshold) {
423 weightedTime = (weightedTime * totalCharge + mergeDigit.time() * mergeDigit.charge())
424 / (totalCharge + mergeDigit.charge());
425 }
426 totalCharge += mergeDigit.charge();
427 }
428 digit1.set_charge(totalCharge);
429 digit1.set_time(weightedTime);
430 sTgcSimDigitHit& mergedHit{*merge_me};
431 if (!savedDigits.empty() &&
432 savedDigits.back().identify() == digit1.identify() &&
433 std::abs(savedDigits.back().time() - digit1.time()) <= vmmDeadTime) continue;
434 if (digit1.charge() > threshold || passNeigbourLogic(mergedHit)){
435 savedDigits.emplace_back(std::move(mergedHit));
436 } else if (isNeighbourOn) {
437 premerged.emplace_back(std::move(mergedHit));
438 }
439 } // end of time-ordering and hit merging loop
440 std::copy_if(std::make_move_iterator(premerged.begin()),
441 std::make_move_iterator(premerged.end()),
442 std::back_inserter(savedDigits), passNeigbourLogic);
443 return savedDigits;
444 }
Identifier identify() const
Definition MuonDigit.h:30
unsigned numChannels(const IdentifierHash &measHash) const
Returns the number of strips / wires / pads in a given gasGap.
IdentifierHash measurementHash(const Identifier &measId) const override final
Constructs the identifier hash from the full measurement Identifier.
int multilayer() const
Returns the multilayer of the sTgcReadoutElement.
double getChannelThreshold(const EventContext &ctx, const Identifier &channelID, const NswCalibDbThresholdData &thresholdData) const
void set_time(float newTime)
Definition sTgcDigit.cxx:76
float time() const
Definition sTgcDigit.cxx:61
float charge() const
Definition sTgcDigit.cxx:46
void set_charge(float newCharge)
Definition sTgcDigit.cxx:71
int gasGap(const Identifier &id) const override
get the hashes
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const

◆ 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 SG::WriteHandle<xAOD::MuonSimHitContainer> sdoContainer{};
96 if (!m_sdoKey.empty()) {
97 sdoContainer = SG::WriteHandle<xAOD::MuonSimHitContainer>{m_sdoKey, ctx};
98 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
99 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
100 }
101 ATH_CHECK(digitize(ctx, m_timedHits, !m_sdoKey.empty() ? sdoContainer.ptr() : nullptr));
102 m_timedHits.clear();
103 m_simHits.clear();
104 return StatusCode::SUCCESS;
105 }
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(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.

◆ 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 164 of file MuonDigitizationTool.cxx.

167 {
168 auto insertItr = deadTimeMap.insert(std::make_pair(channelId,hitTime));
170 if (insertItr.second) {
171 return true;
172 }
173 if (hitTime - insertItr.first->second < deadTimeWindow) {
174 return false;
175 }
177 insertItr.first->second = hitTime;
178 return true;
179 }
static double hitTime(const TimedHit &hit)
Returns the global time of the hit which is the sum of eventTime & individual hit time.

◆ 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 35 of file MuonDigitizationTool.cxx.

36 {
37
38 ATH_MSG_DEBUG("prepareEvent() called for " << nInputEvents << " input events");
39 m_timedHits.clear();
40 m_simHits.clear();
41 return StatusCode::SUCCESS;
42 }

◆ 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 71 of file MuonDigitizationTool.cxx.

71 {
72 PileUpHits hitCollList{};
73 TimedHits timedHits{};
76 const xAOD::MuonSimHitContainer* hitCollection{nullptr};
77 ATH_CHECK(SG::get(hitCollection, m_simHitKey, ctx));
78 hitCollList.emplace_back(PileUpTimeEventIndex(0), hitCollection);
79 } else {
80 ATH_CHECK(m_mergeSvc->retrieveSubEvtsData(m_inputObjectName, hitCollList));
81 }
82 ATH_CHECK(fillTimedHits(std::move(hitCollList), timedHits));
83 SG::WriteHandle<xAOD::MuonSimHitContainer> sdoContainer{};
84 if (!m_sdoKey.empty()) {
85 sdoContainer = SG::WriteHandle<xAOD::MuonSimHitContainer>{m_sdoKey, ctx};
86 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
87 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
88 }
89 ATH_CHECK(digitize(ctx, timedHits, !m_sdoKey.empty() ? sdoContainer.ptr() : nullptr));
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 66 of file MuonDigitizationTool.cxx.

66 {
67 const MuonDigitizationTool* digiTool = this;
68 return digiTool->processAllSubEvents(ctx);
69 }

◆ processBunchXing()

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

Reimplemented from PileUpToolBase.

Definition at line 108 of file MuonDigitizationTool.cxx.

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

◆ processDigitsWithVMM()

StatusCode sTgcDigitizationTool::processDigitsWithVMM ( const EventContext & ctx,
const DigiConditions & digiCond,
sTgcSimDigitVec && digitsInChamber,
const double vmmDeadTime,
const bool isNeighbourOn,
sTgcDigitCollection & outColl,
SdoIdMap_t & sdoIdMap ) const
private

Sort all digits from the same chamber according to layer->channelType->time

Update the container iterator to go to the next chamber

apply the smearing before adding the digit

Select strips with charge > 0.001 pC to avoid having zero ADC count when converting charge [pC] to PDO [ADC count]

Add the only the hits and digits that pass VMM simulation to sdo container

Add the VMM processed digit to cache

Definition at line 277 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/src/sTgcDigitizationTool.cxx.

283 {
284
285 if (digitsInChamber.empty()) {
286 ATH_MSG_DEBUG("Empty hits from VMM Simulation" );
287 return StatusCode::SUCCESS;
288 }
289 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
290
292 sTgcSimDigitVec mergedDigits = mergeDigitsVMM(ctx, digiCond, vmmDeadTime,
293 isNeighbourOn, std::move(digitsInChamber));
295 if (mergedDigits.empty()) {
296 return StatusCode::SUCCESS;
297 }
298
299 for (sTgcSimDigitHit& merged : mergedDigits) {
300
302 bool acceptDigit{true};
303 float chargeAfterSmearing = merged.getDigit().charge();
304 if (m_doSmearing) {
305 ATH_CHECK(m_smearingTool->smearCharge(merged.identify(), chargeAfterSmearing, acceptDigit,
306 digiCond.rndEngine));
307 }
308 if (!acceptDigit) {
309 continue;
310 }
313 if (idHelper.channelType(merged.identify()) == ReadoutChannelType::Strip &&
314 chargeAfterSmearing < 0.001) {
315 continue;
316 }
317 auto finalDigit = merged.releaseDigit();
318 if (m_doSmearing) {
319 finalDigit->set_charge(chargeAfterSmearing);
320 }
321 ATH_MSG_VERBOSE("Final Digit "<<m_idHelperSvc->toString(finalDigit->identify())<<
322 " BC tag = " << finalDigit->bcTag()<<
323 " digitTime = " << finalDigit->time() <<
324 " charge = " << finalDigit->charge());
325
327 sdoIdMap[merged.getSimHit()].push_back(finalDigit->identify());
329 outColl.push_back(std::move(finalDigit));
330 }
331 return StatusCode::SUCCESS;
332 }
sTgcSimDigitVec mergeDigitsVMM(const EventContext &ctx, const DigiConditions &digiCond, const double vmmDeadTime, const bool isNeighbourOn, sTgcSimDigitVec &&unmergedDigits) const

◆ 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; }

◆ 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

◆ m_calibrationTool

ToolHandle<Muon::INSWCalibTool> MuonR4::sTgcDigitizationTool::m_calibrationTool {this, "CalibrationTool", "Muon::NSWCalibTool/STGCCalibTool"}
private

Definition at line 77 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

77{this, "CalibrationTool", "Muon::NSWCalibTool/STGCCalibTool"};

◆ m_chargeThreshold

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_chargeThreshold {this,"chargeThreshold", 0.030}
private

Definition at line 97 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

97{this,"chargeThreshold", 0.030};

◆ m_condThrshldsKey

SG::ReadCondHandleKey<NswCalibDbThresholdData> MuonR4::sTgcDigitizationTool::m_condThrshldsKey {this, "CondThrshldsKey", "NswCalibDbThresholdData", "Calibration data"}
private

Definition at line 74 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

74{this, "CondThrshldsKey", "NswCalibDbThresholdData", "Calibration data"};

◆ m_deadtimePad

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_deadtimePad {this,"deadtimePad" , 250}
private

Definition at line 87 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

87{this,"deadtimePad" , 250};

◆ m_deadtimeStrip

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_deadtimeStrip {this,"deadtimeStrip", 250}
private

Definition at line 86 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

86{this,"deadtimeStrip", 250};

◆ m_deadtimeWire

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_deadtimeWire {this,"deadtimeWire" , 250}
private

Definition at line 88 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

88{this,"deadtimeWire" , 250};

◆ 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::sTgcDigitizationTool::m_digitizeMuonOnly {this, "ProcessTrueMuonsOnly", false}
private

Definition at line 79 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

79{this, "ProcessTrueMuonsOnly", false};

◆ m_digitizer

std::unique_ptr<sTgcDigitMaker> MuonR4::sTgcDigitizationTool::m_digitizer {}
private

◆ m_digitMode

Gaudi::Property<int> MuonR4::sTgcDigitizationTool::m_digitMode {this, "digitMode", 3}
private

◆ m_doNeighborOn

Gaudi::Property<bool> MuonR4::sTgcDigitizationTool::m_doNeighborOn {this,"neighborOn", true}
private

◆ m_doPadSharing

Gaudi::Property<bool> MuonR4::sTgcDigitizationTool::m_doPadSharing {this,"padChargeSharing", false}
private

Definition at line 85 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

85{this,"padChargeSharing", false};

◆ m_doSmearing

Gaudi::Property<bool> MuonR4::sTgcDigitizationTool::m_doSmearing {this, "doSmearing", false}
private

Definition at line 81 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

81{this, "doSmearing", false};

◆ m_doToFCorrection

Gaudi::Property<bool> MuonR4::sTgcDigitizationTool::m_doToFCorrection {this,"doToFCorrection", true}
private

Definition at line 82 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

82{this,"doToFCorrection", true};

◆ m_effiDataKey

SG::ReadCondHandleKey<Muon::DigitEffiData> MuonR4::sTgcDigitizationTool::m_effiDataKey {this, "EffiDataKey", "sTgcDigitEff", "Efficiency constants"}
private

Definition at line 73 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

73{this, "EffiDataKey", "sTgcDigitEff", "Efficiency constants"};

◆ m_energyDepositThreshold

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_energyDepositThreshold {this,"energyDepositThreshold",300.0*CLHEP::eV}
private

Definition at line 94 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

94{this,"energyDepositThreshold",300.0*CLHEP::eV};

◆ 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

SG::ReadHandleKey<ActsTrk::GeometryContext> 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_hitTimeMergeThreshold

double MuonR4::sTgcDigitizationTool::m_hitTimeMergeThreshold {30.f}
staticconstexprprivate

◆ 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_limitElectronKineticEnergy

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_limitElectronKineticEnergy {this,"limitElectronKineticEnergy",5.0*CLHEP::MeV}
private

Definition at line 95 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

95{this,"limitElectronKineticEnergy",5.0*CLHEP::MeV};

◆ 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_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_runVoltage

Gaudi::Property<double> MuonR4::sTgcDigitizationTool::m_runVoltage {this,"operatingHVinkV" , 2.8}
private

Definition at line 90 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

90{this,"operatingHVinkV" , 2.8};

◆ 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_smearingTool

ToolHandle<Muon::INSWCalibSmearingTool> MuonR4::sTgcDigitizationTool::m_smearingTool {this, "SmearingTool", "Muon::NSWCalibSmearingTool/STGCCalibSmearingTool"}
private

Definition at line 76 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

76{this, "SmearingTool", "Muon::NSWCalibSmearingTool/STGCCalibSmearingTool"};

◆ 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_timedHits

TimedHits MuonR4::MuonDigitizationTool::m_timedHits {}
privateinherited

Definition at line 141 of file MuonDigitizationTool.h.

141{};

◆ m_timeJitterElectronicsPad

double MuonR4::sTgcDigitizationTool::m_timeJitterElectronicsPad {2.f}
staticconstexprprivate

◆ m_timeJitterElectronicsStrip

double MuonR4::sTgcDigitizationTool::m_timeJitterElectronicsStrip {2.f}
staticconstexprprivate

◆ m_useCondThresholds

Gaudi::Property<bool> MuonR4::sTgcDigitizationTool::m_useCondThresholds
private
Initial value:
{this, "useCondThresholds", false,
"Use conditions data to get VMM charge threshold values"}

Definition at line 91 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

91 {this, "useCondThresholds", false,
92 "Use conditions data to get VMM charge threshold values"};

◆ m_useTimeWindow

Gaudi::Property<bool> MuonR4::sTgcDigitizationTool::m_useTimeWindow {this, "UseTimeWindow", true}
private

Definition at line 80 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

80{this, "UseTimeWindow", true};

◆ 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<sTgcDigitContainer> MuonR4::sTgcDigitizationTool::m_writeKey {this, "OutputObjectName", "STGC_DIGITS"}
private

Definition at line 71 of file MuonPhaseII/MuonDigitization/sTgcDigitizationR4/sTgcDigitizationR4/sTgcDigitizationTool.h.

71{this, "OutputObjectName", "STGC_DIGITS"};

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