ATLAS Offline Software
Public Member Functions | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Private Attributes | List of all members
MuonR4::MM_DigitizationTool Class Referencefinal

#include <MM_DigitizationTool.h>

Inheritance diagram for MuonR4::MM_DigitizationTool:
Collaboration diagram for MuonR4::MM_DigitizationTool:

Public Member Functions

 MM_DigitizationTool (const std::string &type, const std::string &name, const IInterface *pIID)
 
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. More...
 
StatusCode processAllSubEvents (const EventContext &ctx) override final
 alternative interface which uses the PileUpMergeSvc to obtain all the required SubEvents. More...
 
StatusCode processAllSubEvents (const EventContext &ctx) const
 Reentrant version of the digitization tool. More...
 

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. More...
 
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. More...
 
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. More...
 
const ActsGeometryContextgetGeoCtx (const EventContext &ctx) const
 Returns the reference to the ActsGeometryContext needed to fetch global positions from the Readout geometry. More...
 
template<class Container >
StatusCode retrieveContainer (const EventContext &ctx, const SG::ReadHandleKey< Container > &key, const Container *&contPtr) const
 Helper function to retrieve a container from StoreGate. More...
 
template<class Container >
StatusCode retrieveConditions (const EventContext &ctx, const SG::ReadCondHandleKey< Container > &key, const Container *&contPtr) const
 Helper function to access the conditions data. More...
 
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. More...
 
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. More...
 

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

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 = 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. More...
 

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

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) More...
 
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< ActsGeometryContextm_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 StatusCode processAllSubEvents (const EventContext &ctx)=0
 dummy implementation to allow compilation while all Digitization packages are migrated to use this new interface. More...
 
virtual bool toProcess (int bunchXing) const override
 the method this base class helps implementing More...
 
virtual bool filterPassed () const override
 dummy implementation of passing filter More...
 
virtual void resetFilter () override
 dummy implementation of filter reset More...
 
Gaudi::Property< int > m_firstXing
 
Gaudi::Property< int > m_lastXing
 
Gaudi::Property< int > m_vetoPileUpTruthLinks
 
bool m_filterPassed {true}
 

Detailed Description

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

Member Typedef Documentation

◆ DeadTimeMap

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

Definition at line 129 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 109 of file MuonDigitizationTool.h.

◆ PileUpHits

Definition at line 145 of file MuonDigitizationTool.h.

◆ SimHitLocalCopy

using MuonR4::MuonDigitizationTool::SimHitLocalCopy = std::pair<std::unique_ptr<xAOD::MuonSimHitContainer>, std::unique_ptr<xAOD::MuonSimHitAuxContainer> >
privateinherited

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

Definition at line 172 of file MuonDigitizationTool.h.

◆ TimedHit

Definition at line 70 of file MuonDigitizationTool.h.

◆ TimedHits

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

Definition at line 71 of file MuonDigitizationTool.h.

Constructor & Destructor Documentation

◆ MM_DigitizationTool()

MM_DigitizationTool::MM_DigitizationTool ( const std::string &  type,
const std::string &  name,
const IInterface *  pIID 
)

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

149  {
150  if(!sdoContainer) {
151  ATH_MSG_VERBOSE("No SDO container setup of writing");
152  return nullptr;
153  }
154  if (!m_includePileUpTruth && HepMC::ignoreTruthLink(hit->genParticleLink(), m_vetoPileUpTruthLinks)) {
155  ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hit->identify())<<" is a pile-up truth link");
156  return nullptr;
157  }
158 
159  xAOD::MuonSimHit* sdoHit = sdoContainer->push_back(std::make_unique<xAOD::MuonSimHit>());
160  (*sdoHit) = (*hit);
161  static const SG::Accessor<float> acc_eventTime{"MuSim_evtTime"};
162  static const SG::Accessor<unsigned short> acc_eventID{"MuSim_evtID"};
163  static const SG::Accessor<unsigned short> acc_puType{"MuSim_puType"};
164  acc_eventTime(*sdoHit) = hit.eventTime();
165  acc_eventID(*sdoHit) = hit.eventId();
166  acc_puType(*sdoHit) = hit.pileupType();
167  return sdoHit;
168  }

◆ combinedStripResponseAllHits()

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

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

427  {
428  // set up pointer to conditions object
429 
430  const MmIdHelper &idHelper{m_idHelperSvc->mmIdHelper()};
431 
432  const NswCalibDbThresholdData *thresholdData{nullptr};
433  if (m_useCondThresholds && !retrieveConditions(ctx, m_condThrshldsKey, thresholdData).isSuccess()) {
434  THROW_EXCEPTION("Cannot find conditions data container for VMM thresholds!");
435  }
436 
437  std::vector<int> v_stripStripResponseAllHits{};
438  std::vector<std::vector<float>> v_timeStripResponseAllHits{}, v_qStripResponseAllHits{};
439  std::vector<float> v_stripThresholdResponseAllHits{};
440 
441  Identifier digitID = v_stripDigitOutput.at(0).digitID();
442  double max_kineticEnergy = 0.0;
443 
444  // Loop over strip digit output elements
445  for (const MM_ElectronicsToolInput &i_stripDigitOutput : v_stripDigitOutput) {
446  //--- Just to get Digit id with the largest kinetic energy, but the Digit id is no longer meaningful
447  if (i_stripDigitOutput.kineticEnergy() > max_kineticEnergy) {
448  digitID = i_stripDigitOutput.digitID();
449  max_kineticEnergy = i_stripDigitOutput.kineticEnergy();
450  }
451  //---
452  for (size_t i = 0; i < i_stripDigitOutput.NumberOfStripsPos().size(); ++i) {
453  int strip_id = i_stripDigitOutput.NumberOfStripsPos().at(i);
454  bool found = false;
455 
456  for (size_t ii = 0; ii < v_stripStripResponseAllHits.size(); ++ii) {
457  if (v_stripStripResponseAllHits.at(ii) == strip_id) {
458  v_timeStripResponseAllHits.at(ii).insert(v_timeStripResponseAllHits.at(ii).end(),
459  i_stripDigitOutput.chipTime().at(i).begin(), i_stripDigitOutput.chipTime().at(i).end());
460 
461  v_qStripResponseAllHits.at(ii).insert(v_qStripResponseAllHits.at(ii).end(),
462  i_stripDigitOutput.chipCharge().at(i).begin(), i_stripDigitOutput.chipCharge().at(i).end());
463  found = true;
464  }
465  }
466 
467  if (found) {
468  continue;
469  }
470 
471  v_stripStripResponseAllHits.push_back(strip_id);
472  v_timeStripResponseAllHits.push_back(i_stripDigitOutput.chipTime().at(i));
473  v_qStripResponseAllHits.push_back(i_stripDigitOutput.chipCharge().at(i));
474  if (m_useCondThresholds) {
475  const Identifier id = idHelper.channelID(digitID,
476  idHelper.multilayer(digitID),
477  idHelper.gasGap(digitID), strip_id);
478  float threshold = 0;
479  if (!thresholdData->getThreshold(id, threshold)) {
480  THROW_EXCEPTION("Cannot find retrieve VMM threshold from conditions data base!");
481  }
482  v_stripThresholdResponseAllHits.push_back(threshold);
483  } else if (m_useThresholdScaling) {
484  Identifier id = idHelper.channelID(digitID,
485  idHelper.multilayer(digitID),
486  idHelper.gasGap(digitID), strip_id);
487 
488  const MuonGMR4::MmReadoutElement *detectorReadoutElement = m_detMgr->getMmReadoutElement(id);
489  const MuonGMR4::StripDesign &design{detectorReadoutElement->stripLayer(id).design()};
490  double stripLength = design.stripLength(strip_id);
491  const int noise_id = m_idHelperSvc->stationName(digitID) * std::abs(m_idHelperSvc->stationEta(digitID));
492  const NoiseCalibConstants &noise = m_noiseParams.at(noise_id);
493  double threshold = (noise.slope * stripLength + noise.intercept) * m_thresholdScaleFactor;
494  v_stripThresholdResponseAllHits.push_back(threshold);
495  } else {
496  v_stripThresholdResponseAllHits.push_back(m_electronicsThreshold);
497  }
498  }
499  }
500  return MM_ElectronicsToolInput(std::move(v_stripStripResponseAllHits), std::move(v_qStripResponseAllHits),
501  std::move(v_timeStripResponseAllHits), std::move(v_stripThresholdResponseAllHits),
502  digitID, max_kineticEnergy);
503  }

◆ 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 ActsGeometryContext &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(retrieveConditions(ctx, m_effiDataKey, efficiencyMap));
210 
211  const NswErrorCalibData *errorCalibDB{nullptr};
212  ATH_CHECK(retrieveConditions(ctx, m_uncertCalibKey, errorCalibDB));
213 
214  MagField::AtlasFieldCache fieldCache;
215  const AtlasFieldCacheCondObj *fieldCondObj{nullptr};
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 : hitsToDigit) {
226  // ignore radiation if you want
227  if (m_digitizeMuonOnly && std::abs(simHit->pdgId()) != 13) {
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 && std::abs(simHit->pdgId()) == 11) {
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->localToGlobalTrans(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) << " 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 " << 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);
376  ++m_acceptedHits[hitGapInNsw];
377  } // end of loop over hits
378 
379  // Now at Detector Element Level (VMM)
380  for (std::vector<MM_ElectronicsToolInput> &elecHitsPerLayer : v_stripDigitOutput) {
381  if (elecHitsPerLayer.empty()) {
382  continue;
383  }
384  // VMM Simulation
385  // Combine all strips (for this VMM) into a single VMM-level object
386  MM_ElectronicsToolInput stripDigitOutputAllHits = combinedStripResponseAllHits(ctx, std::move(elecHitsPerLayer));
387 
388  // Create Electronics Output with peak or threshold finding setting
389  MM_DigitToolOutput electronicsOutputForReadout{m_vmmReadoutMode == "peak" ?
390  m_ElectronicsResponseSimulation->getPeakResponseFrom(std::move(stripDigitOutputAllHits)) :
391  m_ElectronicsResponseSimulation->getThresholdResponseFrom(std::move(stripDigitOutputAllHits))};
392  if (!electronicsOutputForReadout.isValid()) {
393  ATH_MSG_DEBUG(__func__ << "() : " << __LINE__
394  << " there is no electronics response (peak or threshold finding mode) even though there is a strip response.");
395  }
396 
397  for (unsigned int firedCh = 0; firedCh < electronicsOutputForReadout.stripPos().size(); ++firedCh) {
398 
399  const int channel = electronicsOutputForReadout.stripPos()[firedCh];
400  double time = electronicsOutputForReadout.stripTime()[firedCh];
401  double charge = electronicsOutputForReadout.stripCharge()[firedCh];
402  bool isValid{false};
403  const Identifier digitID = idHelper.channelID(stripDigitOutputAllHits.digitID(),
404  idHelper.multilayer(stripDigitOutputAllHits.digitID()),
405  idHelper.gasGap(stripDigitOutputAllHits.digitID()),
406  channel, isValid);
407 
408  if (!isValid) {
409  ATH_MSG_DEBUG("Ghost strip fired... Ghost busters... ");
410  continue;
411  }
412  ATH_MSG_VERBOSE(__func__ << "() " << __LINE__ <<": Final digitized strip: " << m_idHelperSvc->toString(digitID)
413  <<", time: "<<time<<", charge: "<<charge);
414  MmDigitCollection *outColl = fetchCollection(digitID, digitCache);
415  outColl->push_back(std::make_unique<MmDigit>(digitID, time, charge));
416  }
417  }
418  } while (viewer.next());
419  // Write everything at the end into the final digit container
420  ATH_CHECK(writeDigitContainer(ctx, m_writeKey, std::move(digitCache), idHelper.module_hash_max()));
421 
422  return StatusCode::SUCCESS;
423  }

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

50  {
51  for (const auto& [timeIndex, simHitColl] : hitColl) {
52  timedHits.reserve(timedHits.capacity() + simHitColl->size());
53  for (const xAOD::MuonSimHit* simHit : *simHitColl) {
54  timedHits.emplace_back(timeIndex.time(), timeIndex.index(), simHit, timeIndex.type());
55  }
56  }
57  std::sort(timedHits.begin(), timedHits.end(),
58  [](const TimedHit& a, const TimedHit& b){
59  if (a->identify() != b->identify()){
60  return a->identify() < b->identify();
61  }
62  if (a.eventId() != b.eventId()) {
63  return a.eventId() < b.eventId();
64  }
65  return a.eventTime() < b.eventTime();
66  });
67  return StatusCode::SUCCESS;
68  }

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

◆ getGeoCtx()

const ActsGeometryContext & MuonR4::MuonDigitizationTool::getGeoCtx ( const EventContext &  ctx) const
protectedinherited

Returns the reference to the ActsGeometryContext needed to fetch global positions from the Readout geometry.

Definition at line 141 of file MuonDigitizationTool.cxx.

141  {
142  const ActsGeometryContext* gctx{};
143  if (!retrieveContainer(ctx, m_geoCtxKey, gctx).isSuccess()) {
144  THROW_EXCEPTION("Failed to retrieve the geometry context "<<m_geoCtxKey.fullKey());
145  }
146  return *gctx;
147  }

◆ getRandomEngine()

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

Definition at line 135 of file MuonDigitizationTool.cxx.

135  {
136  ATHRNG::RNGWrapper* rngWrapper = m_rndmSvc->getEngine(this, m_streamName);
137  std::string rngName = m_streamName;
138  rngWrapper->setSeed(rngName, ctx);
139  return rngWrapper->getEngine(ctx);
140  }

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

69  {
70  return hit.eventTime() + hit->globalTime();
71  }

◆ 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 
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 
56  strip_cfg.NSWCalib::MicroMegaGas::operator=(prop);
58  strip_cfg.qThreshold = m_qThreshold;
59  strip_cfg.driftGapWidth = m_driftGapWidth;
60  strip_cfg.crossTalk1 = m_crossTalk1;
61  strip_cfg.crossTalk2 = m_crossTalk2;
62  strip_cfg.avalancheGain = m_avalancheGain;
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 
69  elec_sim_cfg.peakTime = peakTime;
70  elec_sim_cfg.timeWindowLowerOffset = m_timeWindowLowerOffset;
71  elec_sim_cfg.timeWindowUpperOffset = m_timeWindowUpperOffset;
72  elec_sim_cfg.vmmDeadtime = m_vmmDeadtime;
73  elec_sim_cfg.vmmUpperGrazeWindow = m_vmmUpperGrazeWindow;
74  elec_sim_cfg.stripDeadTime = m_stripdeadtime;
75  elec_sim_cfg.artDeadTime = m_ARTdeadtime;
76  elec_sim_cfg.useNeighborLogic = m_vmmNeighborLogic;
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::for_each(vmmReadoutMode.begin(), vmmReadoutMode.end(), [](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: "
91  << m_vmmReadoutMode);
92  return StatusCode::FAILURE;
93  }
94  std::string vmmARTMode = m_vmmARTMode;
95  // convert vmmARTMode to lower case
96  std::for_each(vmmARTMode.begin(), vmmARTMode.end(), [](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  }

◆ mergeEvent()

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

Definition at line 98 of file MuonDigitizationTool.cxx.

98  {
99  ATH_MSG_DEBUG("mergeEvent()");
100 
102  if (!m_sdoKey.empty()) {
104  ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
105  std::make_unique<xAOD::MuonSimHitAuxContainer>()));
106  }
107  ATH_CHECK(digitize(ctx, m_timedHits, !m_sdoKey.empty() ? sdoContainer.ptr() : nullptr));
108  m_timedHits.clear();
109  m_simHits.clear();
110  return StatusCode::SUCCESS;
111  }

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

172  {
173  auto insertItr = deadTimeMap.insert(std::make_pair(channelId,hitTime));
175  if (insertItr.second) {
176  return true;
177  }
178  if (hitTime - insertItr.first->second < deadTimeWindow) {
179  return false;
180  }
182  insertItr.first->second = hitTime;
183  return true;
184  }

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

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

◆ processAllSubEvents() [1/3]

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

77  {
78  PileUpHits hitCollList{};
79  TimedHits timedHits{};
81  if (!m_onlyUseContainerName) {
82  const xAOD::MuonSimHitContainer* hitCollection{nullptr};
83  ATH_CHECK(retrieveContainer(ctx, m_simHitKey, hitCollection));
84  hitCollList.emplace_back(PileUpTimeEventIndex(0), hitCollection);
85  } else {
86  ATH_CHECK(m_mergeSvc->retrieveSubEvtsData(m_inputObjectName, hitCollList));
87  }
88  ATH_CHECK(fillTimedHits(std::move(hitCollList), timedHits));
90  if (!m_sdoKey.empty()) {
92  ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
93  std::make_unique<xAOD::MuonSimHitAuxContainer>()));
94  }
95  ATH_CHECK(digitize(ctx, timedHits, !m_sdoKey.empty() ? sdoContainer.ptr() : nullptr));
96  return StatusCode::SUCCESS;
97  }

◆ processAllSubEvents() [2/3]

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

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

◆ processAllSubEvents() [3/3]

virtual StatusCode IPileUpTool::processAllSubEvents
inherited

dummy implementation to allow compilation while all Digitization packages are migrated to use this new interface.

◆ processBunchXing()

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

Reimplemented from PileUpToolBase.

Definition at line 114 of file MuonDigitizationTool.cxx.

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

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

◆ retrieveConditions()

template<class Container >
StatusCode MuonR4::MuonDigitizationTool::retrieveConditions ( const EventContext &  ctx,
const SG::ReadCondHandleKey< Container > &  key,
const Container *&  contPtr 
) const
protectedinherited

Helper function to access the conditions data.

If the key is empty, the conditions object is assigned to be a nullptr Otherwise, a failure is returned if the Conditions data are not available in the event.

◆ retrieveContainer()

template<class Container >
StatusCode MuonR4::MuonDigitizationTool::retrieveContainer ( const EventContext &  ctx,
const SG::ReadHandleKey< Container > &  key,
const Container *&  contPtr 
) const
protectedinherited

Helper function to retrieve a container from StoreGate.

If the readHandleKey is empty, the container is assigned to be a nullptr and the operation is marked as success. Otherwise, a failure is returned if the Container cannot be fetched from StoreGate

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

◆ 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

◆ m_avalancheGain

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

◆ m_calibrationTool

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

◆ m_checkMMSimHits

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

◆ 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 56 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ m_crossTalk1

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

◆ m_crossTalk2

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

◆ m_deadTime

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

◆ m_detMgr

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

Definition at line 140 of file MuonDigitizationTool.h.

◆ m_DiffMagSecondMuonHit

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

◆ m_digitizeMuonOnly

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

◆ 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 81 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ m_driftGapWidth

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

◆ m_effiDataKey

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

◆ 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 97 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ m_energyThreshold

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

◆ m_fieldCondObjInputKey

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

◆ m_filterPassed

bool PileUpToolBase::m_filterPassed {true}
protectedinherited

Definition at line 60 of file PileUpToolBase.h.

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

◆ m_geoCtxKey

SG::ReadHandleKey<ActsGeometryContext> MuonR4::MuonDigitizationTool::m_geoCtxKey
privateinherited
Initial value:
{this, "AlignmentKey", "ActsAlignment",
"Geometry context"}

Definition at line 152 of file MuonDigitizationTool.h.

◆ m_idHelperSvc

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

Definition at line 142 of file MuonDigitizationTool.h.

◆ m_includePileUpTruth

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

Definition at line 166 of file MuonDigitizationTool.h.

◆ m_inputObjectName

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

Definition at line 168 of file MuonDigitizationTool.h.

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

◆ m_maskMultiplet

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

◆ m_mergeSvc

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

Definition at line 155 of file MuonDigitizationTool.h.

◆ m_needsMcEventCollHelper

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

◆ 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 123 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ 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 163 of file MuonDigitizationTool.h.

◆ m_qThreshold

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

◆ m_rndmSvc

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

Definition at line 159 of file MuonDigitizationTool.h.

◆ m_sdoKey

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

Definition at line 161 of file MuonDigitizationTool.h.

◆ m_simHitKey

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

Definition at line 150 of file MuonDigitizationTool.h.

◆ m_simHits

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

Definition at line 174 of file MuonDigitizationTool.h.

◆ m_smearingTool

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

◆ m_streamName

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

Definition at line 157 of file MuonDigitizationTool.h.

◆ m_stripdeadtime

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

◆ 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 107 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ m_timedHits

TimedHits MuonR4::MuonDigitizationTool::m_timedHits {}
privateinherited

Definition at line 170 of file MuonDigitizationTool.h.

◆ 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 68 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ 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 70 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ m_uncertCalibKey

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

◆ 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 103 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ 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 105 of file MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h.

◆ m_useTimeWindow

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

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

◆ m_vmmARTMode

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

◆ 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

◆ m_vmmNeighborLogic

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

◆ m_vmmReadoutMode

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

◆ 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

◆ m_writeKey

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

◆ m_writeOutputFile

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

The documentation for this class was generated from the following files:
MmDigitCollection
Definition: MmDigitCollection.h:18
MuonR4::MM_DigitizationTool::m_electronicsThreshold
Gaudi::Property< float > m_electronicsThreshold
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:97
MuonR4::MuonDigitizationTool::m_inputObjectName
std::string m_inputObjectName
Definition: MuonDigitizationTool.h:168
NswErrorCalibData
Definition: NswErrorCalibData.h:19
MuonR4::MuonDigitizationTool::retrieveContainer
StatusCode retrieveContainer(const EventContext &ctx, const SG::ReadHandleKey< Container > &key, const Container *&contPtr) const
Helper function to retrieve a container from StoreGate.
ATHRNG::RNGWrapper::setSeed
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Definition: RNGWrapper.h:169
MuonR4::MuonDigitizationTool::m_geoCtxKey
SG::ReadHandleKey< ActsGeometryContext > m_geoCtxKey
Definition: MuonDigitizationTool.h:152
MuonR4::MuonDigitizationTool::passDeadTime
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.
Definition: MuonDigitizationTool.cxx:169
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
MuonGMR4::MmReadoutElement
Definition: MmReadoutElement.h:19
MuonGMR4::MmReadoutElement::stripLength
double stripLength(const IdentifierHash &measHash) const
Returns the strip length.
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
MuonR4::MuonDigitizationTool::m_simHitKey
SG::ReadHandleKey< xAOD::MuonSimHitContainer > m_simHitKey
Definition: MuonDigitizationTool.h:150
MuonGMR4::StripDesign
Definition: StripDesign.h:30
NswCalibDbThresholdData
Definition: NswCalibDbThresholdData.h:17
MuonR4::MM_DigitizationTool::m_effiDataKey
SG::ReadCondHandleKey< Muon::DigitEffiData > m_effiDataKey
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:53
MuonR4::MM_DigitizationTool::m_ElectronicsResponseSimulation
std::unique_ptr< MM_ElectronicsResponseSimulation > m_ElectronicsResponseSimulation
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:118
MuonR4::MuonDigitizationTool::fillTimedHits
StatusCode fillTimedHits(PileUpHits &&hitColl, TimedHits &timedHits) const
Translates the PileUpHits into the timed hits format.
Definition: MuonDigitizationTool.cxx:50
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
MuonR4::MuonDigitizationTool::m_streamName
Gaudi::Property< std::string > m_streamName
Definition: MuonDigitizationTool.h:157
MuonR4::MuonDigitizationTool::PileUpHits
PileUpMergeSvc::TimedList< xAOD::MuonSimHitContainer >::type PileUpHits
Definition: MuonDigitizationTool.h:145
PileUpToolBase::m_filterPassed
bool m_filterPassed
Definition: PileUpToolBase.h:60
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AtlasFieldCacheCondObj
Definition: AtlasFieldCacheCondObj.h:19
MuonR4::MM_DigitizationTool::m_StripsResponseSimulation
std::unique_ptr< MM_StripsResponseSimulation > m_StripsResponseSimulation
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:117
SG::Accessor< float >
MuonR4::MM_DigitizationTool::m_useTimeWindow
Gaudi::Property< bool > m_useTimeWindow
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:79
MuonR4::MM_DigitizationTool::m_vmmUpperGrazeWindow
Gaudi::Property< float > m_vmmUpperGrazeWindow
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:112
MuonGMR4::StripDesign::stripLength
virtual double stripLength(int stripNumb) const
Returns length of the strip.
MuonR4::MM_DigitizationTool::m_calibrationTool
ToolHandle< Muon::INSWCalibTool > m_calibrationTool
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:61
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
MM_StripToolOutput::NumberOfStripsPos
const std::vector< int > & NumberOfStripsPos() const
Definition: MM_StripToolOutput.h:17
MuonR4::MM_DigitizationTool::m_uncertCalibKey
SG::ReadCondHandleKey< NswErrorCalibData > m_uncertCalibKey
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:54
MuonR4::MuonDigitizationTool::m_onlyUseContainerName
Gaudi::Property< bool > m_onlyUseContainerName
Definition: MuonDigitizationTool.h:163
Amg::y
@ y
Definition: GeoPrimitives.h:35
MuonR4::MuonDigitizationTool::m_mergeSvc
ServiceHandle< PileUpMergeSvc > m_mergeSvc
Definition: MuonDigitizationTool.h:155
MM_StripToolOutput::chipCharge
const std::vector< std::vector< float > > & chipCharge() const
Definition: MM_StripToolOutput.h:18
MuonR4::MuonDigitizationTool::TimedHit
TimedHitPtr< xAOD::MuonSimHit > TimedHit
Definition: MuonDigitizationTool.h:70
MuonR4::MM_DigitizationTool::m_crossTalk2
Gaudi::Property< float > m_crossTalk2
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:92
MuonR4::MM_DigitizationTool::m_doSmearing
Gaudi::Property< bool > m_doSmearing
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:81
MuonR4::MuonDigitizationTool::m_sdoKey
SG::WriteHandleKey< xAOD::MuonSimHitContainer > m_sdoKey
Definition: MuonDigitizationTool.h:161
MuonR4::MM_DigitizationTool::m_timeWindowUpperOffset
Gaudi::Property< double > m_timeWindowUpperOffset
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:70
MuonR4::MM_DigitizationTool::m_writeOutputFile
Gaudi::Property< bool > m_writeOutputFile
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:76
MM_StripsResponseSimulation::ConfigModule
Definition: MM_StripsResponseSimulation.h:64
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
MuonR4::MM_DigitizationTool::m_crossTalk1
Gaudi::Property< float > m_crossTalk1
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:91
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:620
MuonR4::MM_DigitizationTool::m_vmmARTMode
Gaudi::Property< std::string > m_vmmARTMode
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:65
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
PileUpToolBase::m_lastXing
Gaudi::Property< int > m_lastXing
Definition: PileUpToolBase.h:56
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
HepMC::ignoreTruthLink
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
Definition: MagicNumbers.h:345
MM_DigitToolInput
Definition: MM_DigitToolInput.h:25
MuonR4::MM_DigitizationTool::m_smearingTool
ToolHandle< Muon::INSWCalibSmearingTool > m_smearingTool
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:60
MM_ElectronicsResponseSimulation::ConfigModule
Definition: MM_ElectronicsResponseSimulation.h:34
MuonR4::MM_DigitizationTool::m_useThresholdScaling
Gaudi::Property< bool > m_useThresholdScaling
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:105
MuonR4::MuonDigitizationTool::retrieveConditions
StatusCode retrieveConditions(const EventContext &ctx, const SG::ReadCondHandleKey< Container > &key, const Container *&contPtr) const
Helper function to access the conditions data.
PileUpToolBase::m_vetoPileUpTruthLinks
Gaudi::Property< int > m_vetoPileUpTruthLinks
Definition: PileUpToolBase.h:58
MuonR4::MM_DigitizationTool::m_digitizeMuonOnly
Gaudi::Property< bool > m_digitizeMuonOnly
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:63
MM_DigitToolOutput
Definition: MM_DigitToolOutput.h:25
MuonR4::MM_DigitizationTool::DigiCache
OutDigitCache_t< MmDigitCollection > DigiCache
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:128
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
xAOD::ChamberViewer
Definition: ChamberViewer.h:65
MuonR4::MM_DigitizationTool::m_vmmNeighborLogic
Gaudi::Property< bool > m_vmmNeighborLogic
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:80
MuonR4::MuonDigitizationTool::MuonDigitizationTool
MuonDigitizationTool(const std::string &type, const std::string &name, const IInterface *pIID)
Definition: MuonDigitizationTool.cxx:12
MuonR4::MM_DigitizationTool::m_ARTdeadtime
Gaudi::Property< float > m_ARTdeadtime
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:100
MM_ElectronicsToolInput
Definition: MM_ElectronicsToolInput.h:9
MuonR4::MuonDigitizationTool::m_timedHits
TimedHits m_timedHits
Definition: MuonDigitizationTool.h:170
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
MuonR4::MuonDigitizationTool::digitize
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...
MuonR4::MuonDigitizationTool::getRandomEngine
CLHEP::HepRandomEngine * getRandomEngine(const EventContext &ctx) const
Definition: MuonDigitizationTool.cxx:135
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
MuonR4::MM_DigitizationTool::m_vmmReadoutMode
Gaudi::Property< std::string > m_vmmReadoutMode
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:64
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
MuonR4::MM_DigitizationTool::m_deadTime
Gaudi::Property< double > m_deadTime
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:115
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonR4::MM_DigitizationTool::m_thresholdScaleFactor
Gaudi::Property< float > m_thresholdScaleFactor
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:107
MuonGMR4::MmReadoutElement::readoutSide
int readoutSide(const IdentifierHash &measHash) const
Returns the readout side.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
MuonGMR4::StripDesign::firstStripNumber
int firstStripNumber() const
Returns the number of the first strip.
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
MuonR4::MM_DigitizationTool::m_writeKey
SG::WriteHandleKey< MmDigitContainer > m_writeKey
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:51
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MuonGMR4::MmReadoutElement::stripLayer
const StripLayer & stripLayer(const Identifier &measId) const
Muon::DigitEffiData
Definition: DigitEffiData.h:23
MuonR4::MuonDigitizationTool::getGeoCtx
const ActsGeometryContext & getGeoCtx(const EventContext &ctx) const
Returns the reference to the ActsGeometryContext needed to fetch global positions from the Readout ge...
Definition: MuonDigitizationTool.cxx:141
MuonR4::MuonDigitizationTool::addSDO
xAOD::MuonSimHit * addSDO(const TimedHit &hit, xAOD::MuonSimHitContainer *sdoContainer) const
Adds the timed simHit to the output SDO container.
Definition: MuonDigitizationTool.cxx:148
MuonR4::MM_DigitizationTool::m_fieldCondObjInputKey
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:59
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ATHRNG::RNGWrapper
A wrapper class for event-slot-local random engines.
Definition: RNGWrapper.h:56
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
MuonR4::MuonDigitizationTool::writeDigitContainer
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.
threshold
Definition: chainparser.cxx:74
MuonR4::MM_DigitizationTool::NoiseCalibConstants
NswCalibDbTimeChargeData::CalibConstants NoiseCalibConstants
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:120
MM_StripToolOutput::chipTime
const std::vector< std::vector< float > > & chipTime() const
Definition: MM_StripToolOutput.h:19
charge
double charge(const T &p)
Definition: AtlasPID.h:756
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
MuonR4::MM_DigitizationTool::m_qThreshold
Gaudi::Property< float > m_qThreshold
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:89
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonR4::MM_DigitizationTool::m_stripdeadtime
Gaudi::Property< float > m_stripdeadtime
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:99
MuonR4::MM_DigitizationTool::m_noiseParams
std::map< int, NoiseCalibConstants > m_noiseParams
Define a map to cache the noise parameters individually Key: stationName * std::abs(stationEta)
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:123
python.copyTCTOutput.locDir
locDir
Definition: copyTCTOutput.py:113
ATHRNG::RNGWrapper::getEngine
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition: RNGWrapper.h:134
MM_StripToolOutput
Definition: MM_StripToolOutput.h:9
MuonGMR4::StripLayer::design
const StripDesign & design() const
Returns the underlying strip design.
MuonR4::MuonDigitizationTool::hitTime
static double hitTime(const TimedHit &hit)
Returns the global time of the hit which is the sum of eventTime & individual hit time.
Definition: MuonDigitizationTool.cxx:69
MuonR4::MuonDigitizationTool::initialize
StatusCode initialize() override
Definition: MuonDigitizationTool.cxx:17
MM_StripsResponseSimulation::ConfigModule::writeOutputFile
bool writeOutputFile
Definition: MM_StripsResponseSimulation.h:80
MuonR4::MuonDigitizationTool::m_includePileUpTruth
Gaudi::Property< bool > m_includePileUpTruth
Definition: MuonDigitizationTool.h:166
MuonR4::MuonDigitizationTool::m_simHits
std::vector< SimHitLocalCopy > m_simHits
Definition: MuonDigitizationTool.h:174
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
a
TList * a
Definition: liststreamerinfos.cxx:10
MM_ElectronicsToolInput::digitID
const Identifier & digitID() const
Definition: MM_ElectronicsToolInput.h:35
MuonR4::MM_DigitizationTool::m_timeWindowLowerOffset
Gaudi::Property< double > m_timeWindowLowerOffset
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:68
MmIdHelper
Definition: MmIdHelper.h:54
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
MuonGMR4::MmReadoutElement::measurementHash
IdentifierHash measurementHash(const Identifier &measId) const override final
Constructs the identifier hash from the full measurement Identifier.
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
MuonGMR4::MmReadoutElement::layerHash
IdentifierHash layerHash(const Identifier &measId) const override final
MuonR4::MuonDigitizationTool::TimedHits
std::vector< TimedHitPtr< xAOD::MuonSimHit > > TimedHits
Definition: MuonDigitizationTool.h:71
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MuonR4::MuonDigitizationTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonDigitizationTool.h:142
PileUpToolBase::m_firstXing
Gaudi::Property< int > m_firstXing
Definition: PileUpToolBase.h:54
MuonR4::MM_DigitizationTool::m_energyThreshold
Gaudi::Property< double > m_energyThreshold
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:67
MagField::AtlasFieldCache
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
Definition: AtlasFieldCache.h:43
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
MuonR4::MuonDigitizationTool::m_rndmSvc
ServiceHandle< IAthRNGSvc > m_rndmSvc
Definition: MuonDigitizationTool.h:159
MuonR4::MM_DigitizationTool::m_useCondThresholds
Gaudi::Property< bool > m_useCondThresholds
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:103
MuonGMR4::MuonReadoutElement::localToGlobalTrans
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MuonReadoutElement.cxx:81
MagField::AtlasFieldCache::getField
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,...
Definition: AtlasFieldCache.cxx:42
MuonR4::MM_DigitizationTool::combinedStripResponseAllHits
MM_ElectronicsToolInput combinedStripResponseAllHits(const EventContext &ctx, const std::vector< MM_ElectronicsToolInput > &v_stripDigitOutput) const
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.cxx:426
MuonR4::MuonDigitizationTool::m_detMgr
const MuonGMR4::MuonDetectorManager * m_detMgr
Definition: MuonDigitizationTool.h:140
MuonR4::MM_DigitizationTool::m_checkMMSimHits
Gaudi::Property< bool > m_checkMMSimHits
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:78
MuonR4::MM_DigitizationTool::m_vmmDeadtime
Gaudi::Property< float > m_vmmDeadtime
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:109
MuonR4::MuonDigitizationTool::DeadTimeMap
std::unordered_map< Identifier, double > DeadTimeMap
Definition: MuonDigitizationTool.h:129
MM_ElectronicsResponseSimulation::ConfigModule::peakTime
float peakTime
power of responce function
Definition: MM_ElectronicsResponseSimulation.h:36
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
MuonR4::MM_DigitizationTool::m_driftGapWidth
Gaudi::Property< float > m_driftGapWidth
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:90
MuonR4::MuonDigitizationTool::fetchCollection
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 ...
PileUpTimeEventIndex
a struct encapsulating the identifier of a pile-up event
Definition: PileUpTimeEventIndex.h:12
python.compressB64.c
def c
Definition: compressB64.py:93
MuonR4::MM_DigitizationTool::m_condThrshldsKey
SG::ReadCondHandleKey< NswCalibDbThresholdData > m_condThrshldsKey
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:56
NSWCalib::MicroMegaGas
Definition: INSWCalibTool.h:32
python.SystemOfUnits.degree
tuple degree
Definition: SystemOfUnits.py:106
WriteCellNoiseToCool.noise
noise
Definition: WriteCellNoiseToCool.py:380
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
MuonR4::MM_DigitizationTool::m_avalancheGain
Gaudi::Property< float > m_avalancheGain
Definition: MuonPhaseII/MuonDigitization/MmDigitizationR4/src/MM_DigitizationTool.h:94
Identifier
Definition: IdentifierFieldParser.cxx:14