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

#include <MM_DigitizationTool.h>

Inheritance diagram for MuonR4::MM_DigitizationTool:

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 NoiseCalibConstants = NswCalibDbTimeChargeData::CalibConstants
using DigiCache = OutDigitCache_t<MmDigitCollection>
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

MM_ElectronicsToolInput combinedStripResponseAllHits (const EventContext &ctx, const std::vector< MM_ElectronicsToolInput > &v_stripDigitOutput) const
StatusCode fillTimedHits (PileUpHits &&hitColl, TimedHits &timedHits) const
 Translates the PileUpHits into the timed hits format.

Private Attributes

SG::WriteHandleKey< MmDigitContainerm_writeKey {this, "OutputObjectName", "MM_DIGITS"}
SG::ReadCondHandleKey< Muon::DigitEffiDatam_effiDataKey {this, "EffiDataKey", "MmDigitEff", "Efficiency constants of the individual MM gasGaps"}
SG::ReadCondHandleKey< NswErrorCalibDatam_uncertCalibKey {this, "ErrorCalibKey", "NswUncertData", "Key of the parametrized NSW uncertainties"}
SG::ReadCondHandleKey< NswCalibDbThresholdDatam_condThrshldsKey
SG::ReadCondHandleKey< AtlasFieldCacheCondObjm_fieldCondObjInputKey {this, "AtlasFieldCacheCondObj", "fieldCondObj"}
ToolHandle< Muon::INSWCalibSmearingToolm_smearingTool {this, "SmearingTool", "Muon::NSWCalibSmearingTool/MMCalibSmearingTool"}
ToolHandle< Muon::INSWCalibToolm_calibrationTool {this, "CalibrationTool", "Muon::NSWCalibTool/NSWCalibTool"}
Gaudi::Property< bool > m_digitizeMuonOnly {this, "ProcessTrueMuonsOnly", true, "If set to true hit with pdgId != 13 are skipped"}
Gaudi::Property< std::string > m_vmmReadoutMode {this, "vmmReadoutMode", "peak", "For readout (DAQ) path. Can be peak or threshold"}
Gaudi::Property< std::string > m_vmmARTMode {this, "vmmARTMode", "threshold", "For ART (trigger) path. Can be peak or threshold"}
Gaudi::Property< double > m_energyThreshold {this, "EnergyThreshold", 50, "Minimal energy to process an electron sim hit"}
Gaudi::Property< double > m_timeWindowLowerOffset
Gaudi::Property< double > m_timeWindowUpperOffset
Gaudi::Property< double > m_DiffMagSecondMuonHit {this, "DiffMagSecondMuonHit", 0.1}
Gaudi::Property< int > m_maskMultiplet {this, "MaskMultiplet", 0, "0: all, 1: first, 2: second, 3: both"}
Gaudi::Property< bool > m_writeOutputFile {this, "SaveInternalHistos", false}
Gaudi::Property< bool > m_needsMcEventCollHelper {this, "UseMcEventCollectionHelper", false}
Gaudi::Property< bool > m_checkMMSimHits {this, "CheckSimHits", true, "Control on the hit validity"}
Gaudi::Property< bool > m_useTimeWindow {this, "UseTimeWindow", true}
Gaudi::Property< bool > m_vmmNeighborLogic {this, "VMMNeighborLogic", false}
Gaudi::Property< bool > m_doSmearing
Gaudi::Property< float > m_qThreshold {this, "qThreshold", 0.001, "Charge Threshold"}
Gaudi::Property< float > m_driftGapWidth {this, "DriftGapWidth", 5.04, "Drift Gap Width of 5.04 mm"}
Gaudi::Property< float > m_crossTalk1 {this, "crossTalk1", 0.3, "Strip Cross Talk with Nearest Neighbor"}
Gaudi::Property< float > m_crossTalk2 {this, "crossTalk2", 0.09, "Strip Cross Talk with 2nd Nearest Neighbor"}
Gaudi::Property< float > m_avalancheGain {this, "AvalancheGain", 6.0e3, "avalanche Gain for rach gas mixture"}
Gaudi::Property< float > m_electronicsThreshold
Gaudi::Property< float > m_stripdeadtime {this, "StripDeadTime", 200, "dead-time for strip, default value 200 ns = 8 BCs"}
Gaudi::Property< float > m_ARTdeadtime {this, "ARTDeadTime", 200, "dead-time for ART, default value 200 ns = 8 BCs"}
Gaudi::Property< bool > m_useCondThresholds
Gaudi::Property< bool > m_useThresholdScaling
Gaudi::Property< float > m_thresholdScaleFactor
Gaudi::Property< float > m_vmmDeadtime {this, "vmmDeadtime", 200, "Specifies how much before the lower time limit the VMM simulation should start evaluating the signal"}
Gaudi::Property< float > m_vmmUpperGrazeWindow {this, "vmmUpperGrazeWindow", 150, "Specifies how much above the upper time window boundary the VMM sim evaluates the signal."}
Gaudi::Property< double > m_deadTime {this, "deadTime", 300. * Gaudi::Units::ns}
std::unique_ptr< MM_StripsResponseSimulationm_StripsResponseSimulation {}
std::unique_ptr< MM_ElectronicsResponseSimulationm_ElectronicsResponseSimulation {}
std::map< int, NoiseCalibConstantsm_noiseParams {}
 Define a map to cache the noise parameters individually Key: stationName * std::abs(stationEta)
std::array< std::atomic< unsigned >, 8 > m_allHits ATLAS_THREAD_SAFE {}
std::array< std::atomic< unsigned >, 8 > m_acceptedHits ATLAS_THREAD_SAFE {}
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 {}

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

◆ NoiseCalibConstants

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

◆ combinedStripResponseAllHits()

MM_ElectronicsToolInput MM_DigitizationTool::combinedStripResponseAllHits ( const EventContext & ctx,
const std::vector< MM_ElectronicsToolInput > & v_stripDigitOutput ) const
private

Definition at line 433 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.cxx.

434 {
435 // set up pointer to conditions object
436
437 const MmIdHelper &idHelper{m_idHelperSvc->mmIdHelper()};
438
439 const NswCalibDbThresholdData *thresholdData{nullptr};
440 if (!SG::get(thresholdData, m_condThrshldsKey, ctx).isSuccess()) {
441 THROW_EXCEPTION("Cannot find conditions data container for VMM thresholds!");
442 }
443
444 std::vector<int> v_stripStripResponseAllHits{};
445 std::vector<std::vector<float>> v_timeStripResponseAllHits{}, v_qStripResponseAllHits{};
446 std::vector<float> v_stripThresholdResponseAllHits{};
447
448 Identifier digitID = v_stripDigitOutput.at(0).digitID();
449 double max_kineticEnergy = 0.0;
450
451 // Loop over strip digit output elements
452 for (const MM_ElectronicsToolInput &i_stripDigitOutput : v_stripDigitOutput) {
453 //--- Just to get Digit id with the largest kinetic energy, but the Digit id is no longer meaningful
454 if (i_stripDigitOutput.kineticEnergy() > max_kineticEnergy) {
455 digitID = i_stripDigitOutput.digitID();
456 max_kineticEnergy = i_stripDigitOutput.kineticEnergy();
457 }
458 //---
459 for (size_t i = 0; i < i_stripDigitOutput.NumberOfStripsPos().size(); ++i) {
460 int strip_id = i_stripDigitOutput.NumberOfStripsPos().at(i);
461 bool found = false;
462
463 for (size_t ii = 0; ii < v_stripStripResponseAllHits.size(); ++ii) {
464 if (v_stripStripResponseAllHits.at(ii) == strip_id) {
465 v_timeStripResponseAllHits.at(ii).insert(v_timeStripResponseAllHits.at(ii).end(),
466 i_stripDigitOutput.chipTime().at(i).begin(), i_stripDigitOutput.chipTime().at(i).end());
467
468 v_qStripResponseAllHits.at(ii).insert(v_qStripResponseAllHits.at(ii).end(),
469 i_stripDigitOutput.chipCharge().at(i).begin(), i_stripDigitOutput.chipCharge().at(i).end());
470 found = true;
471 }
472 }
473
474 if (found) {
475 continue;
476 }
477
478 v_stripStripResponseAllHits.push_back(strip_id);
479 v_timeStripResponseAllHits.push_back(i_stripDigitOutput.chipTime().at(i));
480 v_qStripResponseAllHits.push_back(i_stripDigitOutput.chipCharge().at(i));
482 const Identifier id = idHelper.channelID(digitID,
483 idHelper.multilayer(digitID),
484 idHelper.gasGap(digitID), strip_id);
485 std::optional<float> threshold = thresholdData->getThreshold(id);
486 if (!threshold) {
487 THROW_EXCEPTION("Cannot find retrieve VMM threshold from conditions data base!");
488 }
489 v_stripThresholdResponseAllHits.push_back(*threshold);
490 } else if (m_useThresholdScaling) {
491 Identifier id = idHelper.channelID(digitID,
492 idHelper.multilayer(digitID),
493 idHelper.gasGap(digitID), strip_id);
494
495 const MuonGMR4::MmReadoutElement *detectorReadoutElement = m_detMgr->getMmReadoutElement(id);
496 const MuonGMR4::StripDesign &design{detectorReadoutElement->stripLayer(id).design()};
497 double stripLength = design.stripLength(strip_id);
498 const int noise_id = m_idHelperSvc->stationName(digitID) * std::abs(m_idHelperSvc->stationEta(digitID));
499 const NoiseCalibConstants &noise = m_noiseParams.at(noise_id);
500 double threshold = (noise.slope * stripLength + noise.intercept) * m_thresholdScaleFactor;
501 v_stripThresholdResponseAllHits.push_back(threshold);
502 } else {
503 v_stripThresholdResponseAllHits.push_back(m_electronicsThreshold);
504 }
505 }
506 }
507 return MM_ElectronicsToolInput(std::move(v_stripStripResponseAllHits), std::move(v_qStripResponseAllHits),
508 std::move(v_timeStripResponseAllHits), std::move(v_stripThresholdResponseAllHits),
509 digitID, max_kineticEnergy);
510 }
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
int gasGap(const Identifier &id) const override
get the hashes
int multilayer(const Identifier &id) const
const StripLayer & stripLayer(const Identifier &measId) const
virtual double stripLength(int stripNumb) const
Returns length of the strip.
const StripDesign & design(bool phiView=false) const
Returns the underlying strip design.
std::map< int, NoiseCalibConstants > m_noiseParams
Define a map to cache the noise parameters individually Key: stationName * std::abs(stationEta)
const MuonGMR4::MuonDetectorManager * m_detMgr
std::optional< float > getThreshold(const Identifier &channelId) const
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ digitize()

StatusCode MM_DigitizationTool::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.

Reject hit within the dead time interval

Implements MuonR4::MuonDigitizationTool.

Definition at line 196 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.cxx.

198 {
199
200 const MmIdHelper &idHelper{m_idHelperSvc->mmIdHelper()};
201 CLHEP::HepRandomEngine *rndEngine = getRandomEngine(ctx);
202 const ActsTrk::GeometryContext &gctx{getGeoCtx(ctx)};
203
204 // Prepare the temporary cache
205 DigiCache digitCache{};
206
207 // Fetch the conditions for efficiency calculations
208 const Muon::DigitEffiData *efficiencyMap{nullptr};
209 ATH_CHECK(SG::get(efficiencyMap , m_effiDataKey, ctx));
210
211 const NswErrorCalibData *errorCalibDB{nullptr};
212 ATH_CHECK(SG::get(errorCalibDB, m_uncertCalibKey, ctx));
213
214 MagField::AtlasFieldCache fieldCache;
215 const AtlasFieldCacheCondObj *fieldCondObj{nullptr};
216 ATH_CHECK(SG::get(fieldCondObj, m_fieldCondObjInputKey, ctx));
217 fieldCondObj->getInitializedCache(fieldCache);
218
219 xAOD::ChamberViewer viewer{hitsToDigit, m_idHelperSvc.get()};
220 do {
221
222 std::array<std::vector<MM_ElectronicsToolInput>, 8> v_stripDigitOutput{};
223 DeadTimeMap deadTimes{};
224
225 for (const TimedHit &simHit : viewer) {
226 // ignore radiation if you want
227 if (m_digitizeMuonOnly && !MC::isMuon(simHit)) {
228 ATH_MSG_VERBOSE("Hit is not from a muon - skipping ");
229 continue;
230 }
231
232 const Identifier hitId{simHit->identify()};
233
234 const double hitKineticEnergy = simHit->kineticEnergy();
235 // Don't consider electron hits below m_energyThreshold.
236 // Electrons aren't consider for now in any case due to the cut above.
237 // But this may change.
238 if (hitKineticEnergy < m_energyThreshold && MC::isElectron(simHit)) {
239 continue;
240 }
241 const MuonGMR4::MmReadoutElement *readOutEle = m_detMgr->getMmReadoutElement(hitId);
242 const MuonGMR4::StripDesign &design{readOutEle->stripLayer(hitId).design()};
243
244 const Amg::Vector3D locPos{xAOD::toEigen(simHit->localPosition())};
245 const Amg::Vector3D locDir{xAOD::toEigen(simHit->localDirection())};
246
247 const Amg::Transform3D &locToGlobal{readOutEle->localToGlobalTransform(gctx, readOutEle->layerHash(hitId))};
248 const Amg::Vector3D globalHitPosition{locToGlobal * locPos};
249
250 // We could use the MuonDigitizationTool::hitTime which returns the global time
251 // of the hit which is the sum of eventTime & individual hit time,
252 // but we want to have access on both contributions.
253 const double globalHitTime = simHit->globalTime();
254 const double tofCorrection = globalHitPosition.mag() / CLHEP::c_light;
255 const double eventTime = simHit.eventTime();
256 const double bunchTime = globalHitTime - tofCorrection + eventTime;
257
258 const HepMcParticleLink particleLink = simHit->genParticleLink();
259 // Print some information about the MicroMegas hit
260 ATH_MSG_VERBOSE("hitID " << m_idHelperSvc->toString(hitId) <<" ("<< simHit.get()<< ") Hit bunch time " << bunchTime << " tof/G4 hit time " << globalHitTime
261 << " globalHitPosition " << Amg::toString(globalHitPosition) << " hit: r " << globalHitPosition.perp() << " z " << globalHitPosition.z()
262 << " mclink " << particleLink << "Kinetic energy " << hitKineticEnergy);
263
264 // Angles, Geometry, and Coordinates.
265 // This is not an incident angle yet. It's atan(z/x),
266 // ... so it's the complement of the angle w.r.t. a vector normal to the detector surface
267 double inAngleCompliment_XZ = std::atan2(locDir.z(), locDir.x()) / CLHEP::degree;
268 double inAngleCompliment_YZ = std::atan2(locDir.z(), locDir.y()) / CLHEP::degree;
269
270 // This is basically to handle the atan ambiguity
271 if (inAngleCompliment_XZ < 0.0)
272 inAngleCompliment_XZ += 180;
273 if (inAngleCompliment_YZ < 0.0)
274 inAngleCompliment_YZ += 180;
275
276 // This gets the actual incidence angle from its complement.
277 double inAngle_XZ = 90. - inAngleCompliment_XZ;
278 double inAngle_YZ = 90. - inAngleCompliment_YZ;
279
280 const IdentifierHash measHash{readOutEle->measurementHash(hitId)};
281 int readoutSide = readOutEle->readoutSide(measHash);
282 if (readoutSide == 1) {
283 inAngle_XZ = (-inAngle_XZ);
284 }
285
286 // Move the hit position to the readout plane
287 int gasGap = idHelper.gasGap(hitId);
288 // TO DO: THERE IS NO DESING THICKNESS, BUT HOW TO GET DIFFERENT THICKNESSES LIKE BEFORE?
289 // double shift = 0.5 * design.thickness();
290 double shift = 0.5 * m_driftGapWidth;
291 std::optional<double> lambda{std::nullopt};
292 if (gasGap == 1 || gasGap == 3) {
293 lambda = Amg::intersect<3>(locPos, locDir, Amg::Vector3D::UnitZ(), -shift);
294 } else if (gasGap == 2 || gasGap == 4) {
295 lambda = Amg::intersect<3>(locPos, locDir, Amg::Vector3D::UnitZ(), shift);
296 }
297
298 const Amg::Vector3D hitOnSurface = locPos + lambda.value_or(0.) * locDir;
299 const Amg::Vector2D positionOnSurface{hitOnSurface.x(), hitOnSurface.y()};
300
301 // Account For Time Offset
302 const double shiftTimeOffset = (globalHitTime - tofCorrection) * m_StripsResponseSimulation->getDriftVelocity();
303 const Amg::Vector3D hitAfterTimeShift(hitOnSurface.x(), hitOnSurface.y(), shiftTimeOffset);
304 lambda = Amg::intersect<3>(hitAfterTimeShift, locDir, Amg::Vector3D::UnitZ(), -shiftTimeOffset);
305 const Amg::Vector3D hitAfterTimeShiftOnSurface = hitAfterTimeShift + lambda.value_or(0.) * locDir;
306
307 if (std::abs(hitAfterTimeShiftOnSurface.z()) > 0.1) {
308 ATH_MSG_WARNING("Bad propagation to surface after time shift " << Amg::toString(hitAfterTimeShiftOnSurface));
309 }
310
311 // Calculate the index for the global hit counter
312 const unsigned int hitGapInNsw = (idHelper.multilayer(hitId) - 1) * 4 + idHelper.gasGap(hitId) - 1;
313 ++m_allHits[hitGapInNsw];
314
315 bool isValid{false};
316
317 int channelNumber = design.stripNumber(positionOnSurface);
318 // Checks if the hit is outside of the panel
319 if (channelNumber < 0) {
320 // Checks if the point is inside the trapezoid where the strips are mounted.
321 if (!design.insideTrapezoid(positionOnSurface)) {
322 ATH_MSG_WARNING("Hit " << m_idHelperSvc->toString(hitId) << " " << Amg::toString(positionOnSurface)
323 << " is outside bounds " << std::endl
324 << design << " rejecting it");
325 }
326 continue;
327 }
328 const Identifier clusId = idHelper.channelID(hitId, idHelper.multilayer(hitId),
329 idHelper.gasGap(hitId), channelNumber, isValid);
330
331 if (!isValid) {
332 ATH_MSG_WARNING("Invalid strip identifier for layer " << m_idHelperSvc->toStringGasGap(hitId)<< " channel " << channelNumber
333 << " positionOnSurface " << Amg::toString(positionOnSurface));
334 continue;
335 }
336
337 if (efficiencyMap && efficiencyMap->getEfficiency(clusId) < CLHEP::RandFlat::shoot(rndEngine, 0., 1.)) {
338 ATH_MSG_VERBOSE("Simulated hit " <<Amg::toString(locPos) << " hitting strip " << m_idHelperSvc->toString(clusId)
339 << " is rejected because of effiency modelling");
340 continue;
341 }
342 if (!passDeadTime(clusId, hitTime(simHit), m_deadTime, deadTimes)) {
344 continue;
345 }
346
347 double distToStrip = design.distanceToStrip(positionOnSurface, channelNumber);
348
349 // Obtain Magnetic Field At Detector Surface
350 Amg::Vector3D hitOnSurfaceGlobal{locToGlobal * hitOnSurface};
351 Amg::Vector3D magneticField{Amg::Vector3D::Zero()};
352 fieldCache.getField(hitOnSurfaceGlobal.data(), magneticField.data());
353
354 // B-field in local cordinate, X ~ #strip, increasing to outer R, Z ~ global Z but positive to IP
355 Amg::Vector3D localMagneticField{locToGlobal.linear().inverse() * magneticField};
356 if (readoutSide == -1) {
357 localMagneticField[Amg::y] = -localMagneticField[Amg::y];
358 }
359
360 // Strip Response Simulation For This Hit
361 const MM_DigitToolInput stripDigitInput(channelNumber, distToStrip, inAngle_XZ, inAngle_YZ, localMagneticField,
362 design.firstStripNumber(),
363 design.numStrips() + design.firstStripNumber() - 1,
364 idHelper.gasGap(hitId), eventTime + globalHitTime);
365 constexpr double gainFraction = 1.0;
366
367 MM_StripToolOutput tmpStripOutput = m_StripsResponseSimulation->GetResponseFrom(stripDigitInput, gainFraction, design.stripPitch(), rndEngine);
368
369 MM_ElectronicsToolInput stripDigitOutput(tmpStripOutput.NumberOfStripsPos(), tmpStripOutput.chipCharge(),
370 tmpStripOutput.chipTime(), clusId, hitKineticEnergy);
371
372 ATH_MSG_VERBOSE(__func__ << "() : " << __LINE__ << " Prepared strip for digitization: " << m_idHelperSvc->toString(clusId));
373 v_stripDigitOutput[hitGapInNsw].push_back(std::move(stripDigitOutput));
374
375 addSDO(simHit, sdoContainer)->setIdentifier(clusId);
376 // lets decorate all the channels that could potentially be fired by this hit. This does not take into account the electronics simulation, e..g the charge merging on strips from different hits, and the electronics threshold.
377 ChVec_t& etaChannels = dec_etaChannel(*sdoContainer->back());
378 etaChannels.clear();
379 for (int stripNum : tmpStripOutput.NumberOfStripsPos()) {
380 etaChannels.push_back(stripNum);
381 }
382
383 ++m_acceptedHits[hitGapInNsw];
384 } // end of loop over hits
385
386 // Now at Detector Element Level (VMM)
387 for (std::vector<MM_ElectronicsToolInput> &elecHitsPerLayer : v_stripDigitOutput) {
388 if (elecHitsPerLayer.empty()) {
389 continue;
390 }
391 // VMM Simulation
392 // Combine all strips (for this VMM) into a single VMM-level object
393 MM_ElectronicsToolInput stripDigitOutputAllHits = combinedStripResponseAllHits(ctx, std::move(elecHitsPerLayer));
394
395 // Create Electronics Output with peak or threshold finding setting
396 MM_DigitToolOutput electronicsOutputForReadout{m_vmmReadoutMode == "peak" ?
397 m_ElectronicsResponseSimulation->getPeakResponseFrom(std::move(stripDigitOutputAllHits)) :
398 m_ElectronicsResponseSimulation->getThresholdResponseFrom(std::move(stripDigitOutputAllHits))};
399 if (!electronicsOutputForReadout.isValid()) {
400 ATH_MSG_DEBUG(__func__ << "() : " << __LINE__
401 << " there is no electronics response (peak or threshold finding mode) even though there is a strip response.");
402 }
403
404 for (unsigned int firedCh = 0; firedCh < electronicsOutputForReadout.stripPos().size(); ++firedCh) {
405
406 const int channel = electronicsOutputForReadout.stripPos()[firedCh];
407 double time = electronicsOutputForReadout.stripTime()[firedCh];
408 double charge = electronicsOutputForReadout.stripCharge()[firedCh];
409 bool isValid{false};
410 const Identifier digitID = idHelper.channelID(stripDigitOutputAllHits.digitID(),
411 idHelper.multilayer(stripDigitOutputAllHits.digitID()),
412 idHelper.gasGap(stripDigitOutputAllHits.digitID()),
413 channel, isValid);
414
415 if (!isValid) {
416 ATH_MSG_DEBUG("Ghost strip fired... Ghost busters... ");
417 continue;
418 }
419 ATH_MSG_VERBOSE(__func__ << "() " << __LINE__ <<": Final digitized strip: " << m_idHelperSvc->toString(digitID)
420 <<", time: "<<time<<", charge: "<<charge);
421 MmDigitCollection *outColl = fetchCollection(digitID, digitCache);
422 outColl->push_back(std::make_unique<MmDigit>(digitID, time, charge));
423 }
424 }
425 } while (viewer.next());
426 // Write everything at the end into the final digit container
427 ATH_CHECK(writeDigitContainer(ctx, m_writeKey, std::move(digitCache), idHelper.module_hash_max()));
428
429 return StatusCode::SUCCESS;
430 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
const T * back() const
Access the last element in the collection as an rvalue.
const std::vector< float > & stripCharge() const
const std::vector< float > & stripTime() const
const std::vector< int > & stripPos() const
const Identifier & digitID() const
const std::vector< std::vector< float > > & chipCharge() const
const std::vector< int > & NumberOfStripsPos() const
const std::vector< std::vector< float > > & chipTime() const
void getField(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field value at given position xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given,...
IdentifierHash measurementHash(const Identifier &measId) const override final
Constructs the identifier hash from the full measurement Identifier.
IdentifierHash layerHash(const Identifier &measId) const override final
The layer hash removes the bits from the IdentifierHash corresponding to the measurement's channel nu...
int readoutSide(const IdentifierHash &measHash) const
Returns the readout side.
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...
int firstStripNumber() const
Returns the number of the first strip.
double distanceToStrip(const Amg::Vector2D &pos, int strip) const
Returns the distance to the strip center along x.
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.
virtual int numStrips() const
Number of strips on the panel.
size_type module_hash_max() const
the maximum hash value
std::unique_ptr< MM_ElectronicsResponseSimulation > m_ElectronicsResponseSimulation
MM_ElectronicsToolInput combinedStripResponseAllHits(const EventContext &ctx, const std::vector< MM_ElectronicsToolInput > &v_stripDigitOutput) const
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
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.
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 ...
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...
static double hitTime(const TimedHit &hit)
Returns the global time of the hit which is the sum of eventTime & individual hit time.
std::unordered_map< Identifier, double > DeadTimeMap
double getEfficiency(const Identifier &channelId, bool isInnerQ1=false) const
Returns the signal generation efficiency of the sTgc channel.
void setIdentifier(const Identifier &id)
Sets the global ATLAS identifier.
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
time(flags, cells_name, *args, **kw)
bool isElectron(const T &p)
bool isMuon(const T &p)

◆ 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 }
static Double_t a
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; }

◆ finalize()

StatusCode MM_DigitizationTool::finalize ( )
finaloverride

Definition at line 179 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.cxx.

179 {
180
181 std::stringstream statstr{};
182 unsigned allHits{0};
183 for (unsigned int g = 0; g < m_allHits.size(); ++g) {
184 allHits += m_allHits[g];
185 statstr << " *** Layer " << (g + 1) << " " << percentage(m_acceptedHits[g], m_allHits[g])
186 << "% of " << m_allHits[g] << std::endl;
187 }
188 if (!allHits) {
189 return StatusCode::SUCCESS;
190 }
191 ATH_MSG_INFO("Tried to convert " << allHits << " hits. Successes rate per layer " << std::endl
192 << statstr.str());
193 return StatusCode::SUCCESS;
194 }
#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 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 MM_DigitizationTool::initialize ( )
finaloverridevirtual

Reimplemented from PileUpToolBase.

Definition at line 38 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.cxx.

38 {
39 ATH_MSG_DEBUG("MM_DigitizationTool:: in initialize()");
40
42
43 ATH_CHECK(m_writeKey.initialize());
44 ATH_CHECK(m_uncertCalibKey.initialize());
47 ATH_CHECK(m_effiDataKey.initialize(!m_effiDataKey.empty()));
48 ATH_CHECK(m_calibrationTool.retrieve());
49 ATH_CHECK(m_smearingTool.retrieve());
50
51 // get gas properties from calibration tool
52 const NSWCalib::MicroMegaGas prop = m_calibrationTool->mmGasProperties();
53 const double peakTime = m_calibrationTool->mmPeakTime();
54
55 MM_StripsResponseSimulation::ConfigModule strip_cfg{};
56 strip_cfg.NSWCalib::MicroMegaGas::operator=(prop);
58 strip_cfg.qThreshold = m_qThreshold;
60 strip_cfg.crossTalk1 = m_crossTalk1;
61 strip_cfg.crossTalk2 = m_crossTalk2;
63 m_StripsResponseSimulation = std::make_unique<MM_StripsResponseSimulation>(std::move(strip_cfg));
64
65 m_timeWindowLowerOffset += peakTime; // account for peak time in time window
66 m_timeWindowUpperOffset += peakTime; // account for peak time in time window
67
68 MM_ElectronicsResponseSimulation::ConfigModule elec_sim_cfg{};
69 elec_sim_cfg.peakTime = peakTime;
72 elec_sim_cfg.vmmDeadtime = m_vmmDeadtime;
74 elec_sim_cfg.stripDeadTime = m_stripdeadtime;
75 elec_sim_cfg.artDeadTime = m_ARTdeadtime;
77 // ElectronicsResponseSimulation Creation
78 m_ElectronicsResponseSimulation = std::make_unique<MM_ElectronicsResponseSimulation>(std::move(elec_sim_cfg));
79
80 // Configuring various VMM modes of signal readout
81 //
82 std::string vmmReadoutMode = m_vmmReadoutMode;
83 // convert vmmReadoutMode to lower case
84 std::ranges::for_each(vmmReadoutMode, [](char &c){ c = ::tolower(c); });
85 if (vmmReadoutMode.find("peak") != std::string::npos) {
86 m_vmmReadoutMode = "peak";
87 } else if (vmmReadoutMode.find("threshold") != std::string::npos){
88 m_vmmReadoutMode = "threshold";
89 } else {
90 ATH_MSG_ERROR("MM_DigitizationTool can't interperet vmmReadoutMode option! (Should be 'peak' or 'threshold'.) Contains: "
92 return StatusCode::FAILURE;
93 }
94 std::string vmmARTMode = m_vmmARTMode;
95 // convert vmmARTMode to lower case
96 std::ranges::for_each(vmmARTMode, [](char &c){ c = ::tolower(c); });
97 if (vmmARTMode.find("peak") != std::string::npos) {
98 m_vmmARTMode = "peak";
99 }
100 else if (vmmARTMode.find("threshold") != std::string::npos) {
101 m_vmmARTMode = "threshold";
102 }
103 else {
104 ATH_MSG_ERROR("MM_DigitizationTool can't interperet vmmARTMode option! (Should be 'peak' or 'threshold'.) Contains: " << m_vmmARTMode);
105 return StatusCode::FAILURE;
106 }
107
108 if (m_doSmearing) {
109 ATH_MSG_INFO("Running in smeared mode!");
110 }
111
112 // get shortest and longest strip length for threshold scaling
113 Identifier tmpId{0}; // temporary identifier to work with ReadoutElement
114 int stripNumberShortestStrip{-1}, stripNumberLongestStrip{-1};
115 Identifier tmpIdShortestStrip{0}, tmpIdLongestStrip{0};
116 double shortestStripLength{FLT_MAX}, longestStripLength{0};
117 IdentifierHash tmpIdHashShortestStrip{0}, tmpIdHashLongestStrip{0};
118 NoiseCalibConstants noise_smallEta1{}, noise_smallEta2{}, noise_largeEta1{}, noise_largeEta2{};
119 //
120 for (std::string sectorType : {"MML", "MMS"}) {
121 for (int etaStation : {1, 2}) {
122 // identifier for first gas gap in a MM sector, layer is eta layer
123 tmpId = m_idHelperSvc->mmIdHelper().channelID(sectorType, etaStation, 1, 1, 1, 1);
124 const MuonGMR4::MmReadoutElement *detectorReadoutElement = m_detMgr->getMmReadoutElement(tmpId);
125 const MuonGMR4::StripDesign &design{detectorReadoutElement->stripLayer(tmpId).design()};
126 stripNumberShortestStrip = design.firstStripNumber();
127 tmpIdShortestStrip = m_idHelperSvc->mmIdHelper().channelID(sectorType, etaStation, 1, 1, 1, stripNumberShortestStrip); // identifier for the shortest strip
128 tmpIdHashShortestStrip = detectorReadoutElement->measurementHash(tmpIdShortestStrip);
129 shortestStripLength = detectorReadoutElement->stripLength(tmpIdHashShortestStrip);
130 stripNumberLongestStrip = design.numStrips() + stripNumberShortestStrip - 1;
131 tmpIdLongestStrip = m_idHelperSvc->mmIdHelper().channelID(sectorType, etaStation, 1, 1, 1, stripNumberLongestStrip); // identifier for the longest strip
132 tmpIdHashLongestStrip = detectorReadoutElement->measurementHash(tmpIdLongestStrip);
133 longestStripLength = design.stripLength(tmpIdHashLongestStrip);
134
135 // now get the slope and intercept for the threshold scaling
136 // function is m_noiseSlope * stripLength + m_noiseIntercept
137 if (sectorType == "MMS") {
138 if (etaStation == 1) {
139 noise_smallEta1 = m_noiseParams[m_idHelperSvc->stationName(tmpId)];
140 noise_smallEta1.slope = (maxNoiseSmall_eta1 - minNoiseSmall_eta1) / (longestStripLength - shortestStripLength);
141 noise_smallEta1.intercept = minNoiseSmall_eta1 - noise_smallEta1.slope * shortestStripLength;
142 }
143 else if (etaStation == 2) {
144 noise_smallEta2 = m_noiseParams[m_idHelperSvc->stationName(tmpId) * 2];
145 noise_smallEta2.slope = (maxNoiseSmall_eta2 - minNoiseSmall_eta2) / (longestStripLength - shortestStripLength);
146 noise_smallEta2.intercept = minNoiseSmall_eta2 - noise_smallEta2.slope * shortestStripLength;
147 }
148 } else if (sectorType == "MML") {
149 if (etaStation == 1) {
150 noise_largeEta1 = m_noiseParams[m_idHelperSvc->stationName(tmpId)];
151 noise_largeEta1.slope = (maxNoiseLarge_eta1 - minNoiseLarge_eta1) / (longestStripLength - shortestStripLength);
152 noise_largeEta1.intercept = minNoiseLarge_eta1 - noise_largeEta1.slope * shortestStripLength;
153 } else if (etaStation == 2) {
154 noise_largeEta2 = m_noiseParams[m_idHelperSvc->stationName(tmpId) * 2];
155 noise_largeEta2.slope = (maxNoiseLarge_eta2 - minNoiseLarge_eta2) / (longestStripLength - shortestStripLength);
156 noise_largeEta2.intercept = minNoiseLarge_eta2 - noise_largeEta2.slope * shortestStripLength;
157 }
158 } // end of if over sector types
159 } // end of loop over eta stations
160 } // end of loop over sector types
161
162 ATH_MSG_DEBUG("Configuration MM_DigitizationTool ");
163 ATH_MSG_DEBUG("OutputObjectName " << m_writeKey.key());
164 ATH_MSG_DEBUG("UseTimeWindow " << m_useTimeWindow);
165 ATH_MSG_DEBUG("CheckSimHits " << m_checkMMSimHits);
166 ATH_MSG_DEBUG("Threshold " << m_qThreshold);
167 ATH_MSG_DEBUG("TransverseDiffusSigma " << m_StripsResponseSimulation->getTransversDiffusionSigma());
168 ATH_MSG_DEBUG("LogitundinalDiffusSigma" << m_StripsResponseSimulation->getLongitudinalDiffusionSigma());
169 ATH_MSG_DEBUG("Interaction density mean: " << m_StripsResponseSimulation->getInteractionDensityMean());
170 ATH_MSG_DEBUG("Interaction density sigma: " << m_StripsResponseSimulation->getInteractionDensitySigma());
171 ATH_MSG_DEBUG("DriftVelocity stripResponse: " << m_StripsResponseSimulation->getDriftVelocity());
172 ATH_MSG_DEBUG("crossTalk1 " << m_crossTalk1);
173 ATH_MSG_DEBUG("crossTalk2 " << m_crossTalk2);
174 ATH_MSG_DEBUG("EnergyThreshold " << m_energyThreshold);
175
176 return StatusCode::SUCCESS;
177 }
#define ATH_MSG_ERROR(x)
void tolower(std::string &s)
double stripLength(const IdentifierHash &measHash) const
Returns the strip length.
float crossTalk2
// crosstalk of second neighbor strips, it's 6%
float qThreshold
qThreshold=2e, we accept a good strip if the charge is >=2e
float crossTalk1
crosstalk of neighbor strips, it's 15%

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

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

◆ 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

◆ ATLAS_THREAD_SAFE [1/2]

std::array<std::atomic<unsigned>, 8> m_allHits MuonR4::MM_DigitizationTool::ATLAS_THREAD_SAFE {}
mutableprivate

◆ ATLAS_THREAD_SAFE [2/2]

std::array<std::atomic<unsigned>, 8> m_acceptedHits MuonR4::MM_DigitizationTool::ATLAS_THREAD_SAFE {}
mutableprivate

◆ m_ARTdeadtime

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_ARTdeadtime {this, "ARTDeadTime", 200, "dead-time for ART, default value 200 ns = 8 BCs"}
private

Definition at line 99 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

99{this, "ARTDeadTime", 200, "dead-time for ART, default value 200 ns = 8 BCs"};

◆ m_avalancheGain

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_avalancheGain {this, "AvalancheGain", 6.0e3, "avalanche Gain for rach gas mixture"}
private

Definition at line 93 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

93{this, "AvalancheGain", 6.0e3, "avalanche Gain for rach gas mixture"};

◆ m_calibrationTool

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

Definition at line 60 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

60{this, "CalibrationTool", "Muon::NSWCalibTool/NSWCalibTool"};

◆ m_checkMMSimHits

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_checkMMSimHits {this, "CheckSimHits", true, "Control on the hit validity"}
private

Definition at line 77 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

77{this, "CheckSimHits", true, "Control on the hit validity"};

◆ m_condThrshldsKey

SG::ReadCondHandleKey<NswCalibDbThresholdData> MuonR4::MM_DigitizationTool::m_condThrshldsKey
private
Initial value:
{ this, "CondThrshldsKey", "NswCalibDbThresholdData",
"Key of NswCalibDbThresholdData object containing calibration data (VMM thresholds)"}

Definition at line 55 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

55 { this, "CondThrshldsKey", "NswCalibDbThresholdData",
56 "Key of NswCalibDbThresholdData object containing calibration data (VMM thresholds)"};

◆ m_crossTalk1

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_crossTalk1 {this, "crossTalk1", 0.3, "Strip Cross Talk with Nearest Neighbor"}
private

Definition at line 90 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

90{this, "crossTalk1", 0.3, "Strip Cross Talk with Nearest Neighbor"};

◆ m_crossTalk2

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_crossTalk2 {this, "crossTalk2", 0.09, "Strip Cross Talk with 2nd Nearest Neighbor"}
private

Definition at line 91 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

91{this, "crossTalk2", 0.09, "Strip Cross Talk with 2nd Nearest Neighbor"};

◆ m_deadTime

Gaudi::Property<double> MuonR4::MM_DigitizationTool::m_deadTime {this, "deadTime", 300. * Gaudi::Units::ns}
private

Definition at line 114 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

114{this, "deadTime", 300. * Gaudi::Units::ns};

◆ m_detMgr

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

Definition at line 111 of file MuonDigitizationTool.h.

111{nullptr};

◆ m_DiffMagSecondMuonHit

Gaudi::Property<double> MuonR4::MM_DigitizationTool::m_DiffMagSecondMuonHit {this, "DiffMagSecondMuonHit", 0.1}
private

Definition at line 71 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

71{this, "DiffMagSecondMuonHit", 0.1};

◆ m_digitizeMuonOnly

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

Definition at line 62 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

62{this, "ProcessTrueMuonsOnly", true, "If set to true hit with pdgId != 13 are skipped"};

◆ m_doSmearing

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_doSmearing
private
Initial value:
{this, "doSmearing", true,
"set the usage or not of the smearing tool for realistic detector performance"}

Definition at line 80 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

80 {this, "doSmearing", true,
81 "set the usage or not of the smearing tool for realistic detector performance"};

◆ m_driftGapWidth

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_driftGapWidth {this, "DriftGapWidth", 5.04, "Drift Gap Width of 5.04 mm"}
private

Definition at line 89 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

89{this, "DriftGapWidth", 5.04, "Drift Gap Width of 5.04 mm"};

◆ m_effiDataKey

SG::ReadCondHandleKey<Muon::DigitEffiData> MuonR4::MM_DigitizationTool::m_effiDataKey {this, "EffiDataKey", "MmDigitEff", "Efficiency constants of the individual MM gasGaps"}
private

Definition at line 52 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

52{this, "EffiDataKey", "MmDigitEff", "Efficiency constants of the individual MM gasGaps"};

◆ m_ElectronicsResponseSimulation

std::unique_ptr<MM_ElectronicsResponseSimulation> MuonR4::MM_DigitizationTool::m_ElectronicsResponseSimulation {}
private

◆ m_electronicsThreshold

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_electronicsThreshold
private
Initial value:
{this, "electronicsThreshold", 15000,
"threshold Voltage for histoBNL, 2*(Intrinsic noise ~3k e)"}

Definition at line 96 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

96 {this, "electronicsThreshold", 15000,
97 "threshold Voltage for histoBNL, 2*(Intrinsic noise ~3k e)"};

◆ m_energyThreshold

Gaudi::Property<double> MuonR4::MM_DigitizationTool::m_energyThreshold {this, "EnergyThreshold", 50, "Minimal energy to process an electron sim hit"}
private

Definition at line 66 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

66{this, "EnergyThreshold", 50, "Minimal energy to process an electron sim hit"};

◆ m_fieldCondObjInputKey

SG::ReadCondHandleKey<AtlasFieldCacheCondObj> MuonR4::MM_DigitizationTool::m_fieldCondObjInputKey {this, "AtlasFieldCacheCondObj", "fieldCondObj"}
private

Definition at line 58 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

58{this, "AtlasFieldCacheCondObj", "fieldCondObj"};

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

Gaudi::Property<int> MuonR4::MM_DigitizationTool::m_maskMultiplet {this, "MaskMultiplet", 0, "0: all, 1: first, 2: second, 3: both"}
private

Definition at line 73 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

73{this, "MaskMultiplet", 0, "0: all, 1: first, 2: second, 3: both"};

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

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_needsMcEventCollHelper {this, "UseMcEventCollectionHelper", false}
private

Definition at line 76 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

76{this, "UseMcEventCollectionHelper", false};

◆ m_noiseParams

std::map<int, NoiseCalibConstants> MuonR4::MM_DigitizationTool::m_noiseParams {}
private

Define a map to cache the noise parameters individually Key: stationName * std::abs(stationEta)

Definition at line 122 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

122{};

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

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_qThreshold {this, "qThreshold", 0.001, "Charge Threshold"}
private

Definition at line 88 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

88{this, "qThreshold", 0.001, "Charge Threshold"};

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

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

Definition at line 59 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

59{this, "SmearingTool", "Muon::NSWCalibSmearingTool/MMCalibSmearingTool"};

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

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_stripdeadtime {this, "StripDeadTime", 200, "dead-time for strip, default value 200 ns = 8 BCs"}
private

Definition at line 98 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

98{this, "StripDeadTime", 200, "dead-time for strip, default value 200 ns = 8 BCs"};

◆ m_StripsResponseSimulation

std::unique_ptr<MM_StripsResponseSimulation> MuonR4::MM_DigitizationTool::m_StripsResponseSimulation {}
private

◆ m_thresholdScaleFactor

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_thresholdScaleFactor
private
Initial value:
{this, "thresholdScaleFactor", 7.0,
"Use x times the strip length dependent noise as MM threshold"}

Definition at line 106 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

106 {this, "thresholdScaleFactor", 7.0,
107 "Use x times the strip length dependent noise as MM threshold"};

◆ m_timedHits

TimedHits MuonR4::MuonDigitizationTool::m_timedHits {}
privateinherited

Definition at line 141 of file MuonDigitizationTool.h.

141{};

◆ m_timeWindowLowerOffset

Gaudi::Property<double> MuonR4::MM_DigitizationTool::m_timeWindowLowerOffset
private
Initial value:
{this, "WindowLowerOffset", -12.5,
"lower boundary of the time window in which digits are accepted"}

Definition at line 67 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

67 {this, "WindowLowerOffset", -12.5,
68 "lower boundary of the time window in which digits are accepted"};

◆ m_timeWindowUpperOffset

Gaudi::Property<double> MuonR4::MM_DigitizationTool::m_timeWindowUpperOffset
private
Initial value:
{this, "WindowUpperOffset", 187.5,
"upper boundary of the time window in which digits are accepted"}

Definition at line 69 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

69 {this, "WindowUpperOffset", 187.5,
70 "upper boundary of the time window in which digits are accepted"};

◆ m_uncertCalibKey

SG::ReadCondHandleKey<NswErrorCalibData> MuonR4::MM_DigitizationTool::m_uncertCalibKey {this, "ErrorCalibKey", "NswUncertData", "Key of the parametrized NSW uncertainties"}
private

Definition at line 53 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

53{this, "ErrorCalibKey", "NswUncertData", "Key of the parametrized NSW uncertainties"};

◆ m_useCondThresholds

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_useCondThresholds
private
Initial value:
{this, "useCondThresholds", false,
"Use conditions data to get thresholds, overrules useThresholdScaling"}

Definition at line 102 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

102 {this, "useCondThresholds", false,
103 "Use conditions data to get thresholds, overrules useThresholdScaling"};

◆ m_useThresholdScaling

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_useThresholdScaling
private
Initial value:
{this, "useThresholdScaling", true,
"Use a strip length dependent threshold in MM digitiation"}

Definition at line 104 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

104 {this, "useThresholdScaling", true,
105 "Use a strip length dependent threshold in MM digitiation"};

◆ m_useTimeWindow

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

Definition at line 78 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

78{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_vmmARTMode

Gaudi::Property<std::string> MuonR4::MM_DigitizationTool::m_vmmARTMode {this, "vmmARTMode", "threshold", "For ART (trigger) path. Can be peak or threshold"}
private

Definition at line 64 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

64{this, "vmmARTMode", "threshold", "For ART (trigger) path. Can be peak or threshold"};

◆ m_vmmDeadtime

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_vmmDeadtime {this, "vmmDeadtime", 200, "Specifies how much before the lower time limit the VMM simulation should start evaluating the signal"}
private

Definition at line 108 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

108{this, "vmmDeadtime", 200, "Specifies how much before the lower time limit the VMM simulation should start evaluating the signal"};

◆ m_vmmNeighborLogic

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_vmmNeighborLogic {this, "VMMNeighborLogic", false}
private

Definition at line 79 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

79{this, "VMMNeighborLogic", false};

◆ m_vmmReadoutMode

Gaudi::Property<std::string> MuonR4::MM_DigitizationTool::m_vmmReadoutMode {this, "vmmReadoutMode", "peak", "For readout (DAQ) path. Can be peak or threshold"}
private

Definition at line 63 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

63{this, "vmmReadoutMode", "peak", "For readout (DAQ) path. Can be peak or threshold"};

◆ m_vmmUpperGrazeWindow

Gaudi::Property<float> MuonR4::MM_DigitizationTool::m_vmmUpperGrazeWindow {this, "vmmUpperGrazeWindow", 150, "Specifies how much above the upper time window boundary the VMM sim evaluates the signal."}
private

Definition at line 111 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

111{this, "vmmUpperGrazeWindow", 150, "Specifies how much above the upper time window boundary the VMM sim evaluates the signal."};

◆ m_writeKey

SG::WriteHandleKey<MmDigitContainer> MuonR4::MM_DigitizationTool::m_writeKey {this, "OutputObjectName", "MM_DIGITS"}
private

Definition at line 50 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

50{this, "OutputObjectName", "MM_DIGITS"};

◆ m_writeOutputFile

Gaudi::Property<bool> MuonR4::MM_DigitizationTool::m_writeOutputFile {this, "SaveInternalHistos", false}
private

Definition at line 75 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

75{this, "SaveInternalHistos", false};

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