![Logo](../../ATLAS-Logo-Square-Blue-RGB.png) |
ATLAS Offline Software
|
#include <RpcFastDigiTool.h>
|
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 |
|
void | addSDO (const TimedHit &hit, xAOD::MuonSimHitContainer *sdoContainer) const |
| Adds the timed simHit to the output SDO container. More...
|
|
const ActsGeometryContext & | getGeoCtx (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 double | hitTime (const TimedHit &hit) |
| Returns the global time of the hit which is the sum of eventTime & individual hit time. More...
|
|
|
bool | digitizeHit (const Identifier &gasGapId, const bool measuresPhi, const MuonGMR4::StripDesignPtr &designPtr, const double hitTime, const double locPos, const Muon::DigitEffiData *effiMap, RpcDigitCollection &outContainer, CLHEP::HepRandomEngine *rndEngine) const |
| Digitize the sim hit as Rpc strip 1D hit. More...
|
|
bool | digitizeHit (const Identifier &gasGapId, const MuonGMR4::StripDesignPtr &designPtr, const double hitTime, const Amg::Vector2D &locPos, const Muon::DigitEffiData *effiMap, RpcDigitCollection &outContainer, CLHEP::HepRandomEngine *rndEngine) const |
| Digitize the sim hit as Rpc strip 2D hit. More...
|
|
StatusCode | fillTimedHits (PileUpHits &&hitColl, TimedHits &timedHits) const |
| Translates the PileUpHits into the timed hits format. More...
|
|
|
static double | timeOverThreshold (CLHEP::HepRandomEngine *rndmEngine) |
| Roll the time over threshold for each signal digit. More...
|
|
|
int | m_stIdxBIL {-1} |
|
SG::WriteHandleKey< RpcDigitContainer > | m_writeKey {this, "OutputObjectName", "RPC_DIGITS"} |
|
SG::ReadCondHandleKey< Muon::DigitEffiData > | m_effiDataKey |
|
std::array< std::atomic< unsigned >, 2 > m_allHits | ATLAS_THREAD_SAFE {} |
|
std::array< std::atomic< unsigned >, 2 > m_acceptedHits | ATLAS_THREAD_SAFE {} |
|
Gaudi::Property< double > | m_propagationVelocity |
|
Gaudi::Property< double > | m_stripTimeResolution |
|
SG::ReadHandleKey< xAOD::MuonSimHitContainer > | m_simHitKey {this, "SimHitKey", ""} |
|
SG::ReadHandleKey< ActsGeometryContext > | m_geoCtxKey |
|
ServiceHandle< PileUpMergeSvc > | m_mergeSvc {this, "PileUpMergeSvc", "PileUpMergeSvc", ""} |
|
Gaudi::Property< std::string > | m_streamName {this, "StreamName", ""} |
|
ServiceHandle< IAthRNGSvc > | m_rndmSvc {this, "RndmSvc", "AthRNGSvc", ""} |
|
SG::WriteHandleKey< xAOD::MuonSimHitContainer > | m_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< SimHitLocalCopy > | m_simHits {} |
|
Definition at line 15 of file RpcFastDigiTool.h.
◆ DigiCache
◆ OutDigitCache_t
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 98 of file MuonDigitizationTool.h.
◆ PileUpHits
◆ SimHitLocalCopy
Create a local copy of the sim hits to ensure overlayed hits across the events remain valid.
Definition at line 152 of file MuonDigitizationTool.h.
◆ TimedHit
◆ TimedHits
◆ RpcFastDigiTool()
MuonR4::RpcFastDigiTool::RpcFastDigiTool |
( |
const std::string & |
type, |
|
|
const std::string & |
name, |
|
|
const IInterface * |
pIID |
|
) |
| |
◆ addSDO()
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.
163 acc_eventTime(*sdoHit) = hit.eventTime();
164 acc_eventID(*sdoHit) = hit.eventId();
165 acc_puType(*sdoHit) = hit.pileupType();
◆ digitize()
|
finaloverrideprotectedvirtual |
Digitize the time ordered hits and write them to the digit format specific for the detector technology.
A new MuonSimHitContainer pointer is parsed to also create the MuonSDO. If a new SDO should be added to the container plese use the addSDO() method as defined below.
Fetch the conditions for efficiency calculations
ignore radiation for now
Standard digitization path
Write everything at the end into the final digit container
Implements MuonR4::MuonDigitizationTool.
Definition at line 31 of file RpcFastDigiTool.cxx.
42 for (
const TimedHit& simHit : hitsToDigit) {
45 if (std::abs(simHit->pdgId()) != 13)
continue;
48 const Amg::Vector3D locPos{xAOD::toEigen(simHit->localPosition())};
54 efficiencyMap, *digiColl, rndEngine);
57 efficiencyMap, *digiColl, rndEngine);
59 addSDO(simHit, sdoContainer);
62 hitTime(simHit), locPos.block<2,1>(0,0),
63 efficiencyMap, *digiColl, rndEngine)) {
64 addSDO(simHit, sdoContainer);
69 return StatusCode::SUCCESS;
◆ digitizeHit() [1/2]
Digitize the sim hit as Rpc strip 1D hit.
- Parameters
-
gasGapId | Identifier of the associated gasGap |
measuresPhi | Process a phi or an eta strip |
designPtr | Pointer to the striplayout of the gasGap |
hitTime | Global time of the hit |
locPosOnStrip | Local position of the hit perpendicular to the strip plane |
effiMap | Pointer to an efficiency look-up table |
outContainer | DigitCollection to push the new digit into |
rndEngine | Random engine used for smearing |
There're Rpc chambers without phi strips (BI)
Final check whether the digit is actually efficient
Definition at line 71 of file RpcFastDigiTool.cxx.
84 ++(m_allHits[measuresPhi]);
87 const double uncert = design.stripPitch() / std::sqrt(12.);
88 const double smearedX = CLHEP::RandGaussZiggurat::shoot(rndEngine, locPosOnStrip, uncert);
89 const Amg::Vector2D locHitPos{smearedX * Amg::Vector2D::UnitX()};
91 if (!design.insideTrapezoid(locHitPos)) {
93 <<
m_idHelperSvc->toStringGasGap(gasGapId)<<
", measuresPhi: "<<(measuresPhi ?
"yay" :
"nay"));
96 const int strip = design.stripNumber(locHitPos);
99 <<
m_idHelperSvc->toStringGasGap(gasGapId) <<std::endl<<design<<
100 std::endl<<
", measuresPhi: "<<(measuresPhi ?
"yay" :
"nay"));
107 const Identifier digitId{id_helper.channelID(gasGapId,
108 id_helper.doubletZ(gasGapId),
109 id_helper.doubletPhi(gasGapId),
110 id_helper.gasGap(gasGapId),
115 <<
", eta strip "<<strip<<
" & hit "<<
Amg::toString(locHitPos,2 )
120 if (effiMap && effiMap->
getEfficiency(digitId) < CLHEP::RandFlat::shoot(rndEngine,0.,1.)) {
125 ++(m_acceptedHits[measuresPhi]);
◆ digitizeHit() [2/2]
Digitize the sim hit as Rpc strip 2D hit.
- Parameters
-
gasGapId | Identifier of the associated gasGap |
designPtr | Pointer to the striplayout of the gasGap |
hitTime | Global time of the hit |
locPos | Local position of the hit inside the strip plane |
effiMap | Pointer to an efficiency look-up table |
outContainer | DigitCollection to push the new digit into |
rndEngine | Random engine used for smearing |
Smeared x coordinate
Smear the Phi Coordinate
Smeared propagation time in nanoseconds along strip to y=-stripLength/2 (L) and y=stripLength/2 (R)
Check whether the digit is actually efficient
Definition at line 128 of file RpcFastDigiTool.cxx.
136 ++(m_allHits[
false]);
142 const double uncert = design.stripPitch() / std::sqrt(12.);
143 const double smearedX = CLHEP::RandGaussZiggurat::shoot(rndEngine, locPos.x(), uncert);
146 const double stripLength = design.stripLength(1);
149 const double stripLeft = -(stripLength / 2);
150 const double stripRight = (stripLength / 2);
151 const double distToL = std::abs(stripLeft - locPos.y());
152 const double distToR = std::abs(stripRight - locPos.y());
159 const double smearedTimeL = CLHEP::RandGaussZiggurat::shoot(rndEngine, propagationTimeL,
m_stripTimeResolution);
160 const double smearedTimeR = CLHEP::RandGaussZiggurat::shoot(rndEngine, propagationTimeR,
m_stripTimeResolution);
162 const double smearedDeltaT = smearedTimeR - smearedTimeL;
179 if (!design.insideTrapezoid(locHitPos)) {
185 const int strip = design.stripNumber(locHitPos);
188 <<
m_idHelperSvc->toStringGasGap(gasGapId) <<std::endl<<design);
194 const Identifier digitId{id_helper.channelID(gasGapId,
195 id_helper.doubletZ(gasGapId),
196 id_helper.doubletPhi(gasGapId),
197 id_helper.gasGap(gasGapId),
201 <<
", strip: "<<strip);
206 const bool effiSignal1 = !effiMap || effiMap->
getEfficiency(gasGapId) >= CLHEP::RandFlat::shoot(rndEngine,0.,1.);
207 const bool effiSignal2 = !effiMap || effiMap->
getEfficiency(gasGapId) >= CLHEP::RandFlat::shoot(rndEngine,0., 1.);
214 if (effiSignal1 || effiSignal2) {
215 ++(m_acceptedHits[
false]);
◆ fetchCollection()
template<class DigitColl >
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.
51 for (
const auto& [timeIndex, simHitColl] : hitColl) {
52 timedHits.reserve(timedHits.capacity() + simHitColl->size());
54 timedHits.emplace_back(timeIndex.time(), timeIndex.index(), simHit, timeIndex.type());
57 std::sort(timedHits.begin(), timedHits.end(),
59 if (a->identify() != b->identify()){
60 return a->identify() < b->identify();
62 if (
a.eventId() !=
b.eventId()) {
63 return a.eventId() < b.eventId();
65 return a.eventTime() <
b.eventTime();
67 return StatusCode::SUCCESS;
◆ filterPassed()
virtual bool PileUpToolBase::filterPassed |
( |
| ) |
const |
|
inlineoverridevirtualinherited |
◆ finalize()
StatusCode MuonR4::RpcFastDigiTool::finalize |
( |
| ) |
|
|
finaloverride |
Definition at line 25 of file RpcFastDigiTool.cxx.
26 ATH_MSG_INFO(
"Tried to convert "<<m_allHits[0]<<
"/"<<m_allHits[1]<<
" hits. In, "
27 <<percentage(m_acceptedHits[0], m_allHits[0]) <<
"/"
28 <<percentage(m_acceptedHits[1], m_allHits[1]) <<
"% of the cases, the conversion was successful");
29 return StatusCode::SUCCESS;
◆ getGeoCtx()
◆ getRandomEngine()
CLHEP::HepRandomEngine * MuonR4::MuonDigitizationTool::getRandomEngine |
( |
const EventContext & |
ctx | ) |
const |
|
protectedinherited |
◆ 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.
70 return hit.eventTime() + hit->globalTime();
◆ initialize()
StatusCode MuonR4::RpcFastDigiTool::initialize |
( |
| ) |
|
|
finaloverridevirtual |
◆ mergeEvent()
StatusCode MuonR4::MuonDigitizationTool::mergeEvent |
( |
const EventContext & |
ctx | ) |
|
|
finaloverrideinherited |
Definition at line 98 of file MuonDigitizationTool.cxx.
104 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
105 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
110 return StatusCode::SUCCESS;
◆ 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.
44 ATH_MSG_DEBUG(
"prepareEvent() called for " << nInputEvents <<
" input events");
47 return StatusCode::SUCCESS;
◆ 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.
92 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
93 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
96 return StatusCode::SUCCESS;
◆ processAllSubEvents() [2/3]
StatusCode MuonR4::MuonDigitizationTool::processAllSubEvents |
( |
const EventContext & |
ctx | ) |
|
|
finaloverridevirtualinherited |
◆ 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()
|
finaloverridevirtualinherited |
Reimplemented from PileUpToolBase.
Definition at line 114 of file MuonDigitizationTool.cxx.
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());
126 (*copyContainer->push_back(std::make_unique<xAOD::MuonSimHit>())) = (*copyMe);
128 hitListPermanent.emplace_back(hitPtr, copyContainer.get());
129 m_simHits.emplace_back(std::move(copyContainer), std::move(copyAuxContainer));
132 return StatusCode::SUCCESS;
◆ resetFilter()
virtual void PileUpToolBase::resetFilter |
( |
| ) |
|
|
inlineoverridevirtualinherited |
◆ retrieveConditions()
template<class Container >
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 >
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
◆ timeOverThreshold()
double MuonR4::RpcFastDigiTool::timeOverThreshold |
( |
CLHEP::HepRandomEngine * |
rndmEngine | ) |
|
|
staticprivate |
Roll the time over threshold for each signal digit.
Definition at line 220 of file RpcFastDigiTool.cxx.
223 constexpr
double tot_mean_narrow = 16.;
224 constexpr
double tot_sigma_narrow = 2.;
225 constexpr
double tot_mean_wide = 15.;
226 constexpr
double tot_sigma_wide = 4.5;
230 if (CLHEP::RandFlat::shoot(rndmEngine)<0.75) {
231 thetot = CLHEP::RandGaussZiggurat::shoot(rndmEngine, tot_mean_narrow, tot_sigma_narrow);
233 thetot = CLHEP::RandGaussZiggurat::shoot(rndmEngine, tot_mean_wide, tot_sigma_wide);
◆ toProcess()
virtual bool PileUpToolBase::toProcess |
( |
int |
bunchXing | ) |
const |
|
inlineoverridevirtualinherited |
◆ writeDigitContainer()
template<class DigitCont , class DigitColl >
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.
◆ ATLAS_THREAD_SAFE [1/2]
std::array<std::atomic<unsigned>, 2> m_allHits MuonR4::RpcFastDigiTool::ATLAS_THREAD_SAFE {} |
|
mutableprivate |
◆ ATLAS_THREAD_SAFE [2/2]
std::array<std::atomic<unsigned>, 2> m_acceptedHits MuonR4::RpcFastDigiTool::ATLAS_THREAD_SAFE {} |
|
mutableprivate |
◆ m_detMgr
◆ m_effiDataKey
Initial value:{this, "EffiDataKey", "RpcDigitEff",
"Efficiency constants of the individual Rpc gasGaps"}
Definition at line 72 of file RpcFastDigiTool.h.
◆ m_filterPassed
bool PileUpToolBase::m_filterPassed {true} |
|
protectedinherited |
◆ 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
Initial value:{this, "AlignmentKey", "ActsAlignment",
"Geometry context"}
Definition at line 132 of file MuonDigitizationTool.h.
◆ m_idHelperSvc
Initial value:{this, "MuonIdHelperSvc",
"Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
Definition at line 122 of file MuonDigitizationTool.h.
◆ m_includePileUpTruth
Gaudi::Property<bool> MuonR4::MuonDigitizationTool::m_includePileUpTruth {this, "IncludePileUpTruth", true, "Include pile-up truth info"} |
|
privateinherited |
◆ m_inputObjectName
std::string MuonR4::MuonDigitizationTool::m_inputObjectName {""} |
|
privateinherited |
◆ 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_mergeSvc
◆ 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 143 of file MuonDigitizationTool.h.
◆ m_propagationVelocity
Gaudi::Property<double> MuonR4::RpcFastDigiTool::m_propagationVelocity |
|
private |
Initial value:
"Propagation speed of the signal inside the strip"}
Definition at line 78 of file RpcFastDigiTool.h.
◆ m_rndmSvc
◆ m_sdoKey
◆ m_simHitKey
◆ m_simHits
◆ m_stIdxBIL
int MuonR4::RpcFastDigiTool::m_stIdxBIL {-1} |
|
private |
◆ m_streamName
Gaudi::Property<std::string> MuonR4::MuonDigitizationTool::m_streamName {this, "StreamName", ""} |
|
privateinherited |
◆ m_stripTimeResolution
Gaudi::Property<double> MuonR4::RpcFastDigiTool::m_stripTimeResolution |
|
private |
Initial value:
"Estimated time resolution of the strip readout"}
Definition at line 81 of file RpcFastDigiTool.h.
◆ m_timedHits
TimedHits MuonR4::MuonDigitizationTool::m_timedHits {} |
|
privateinherited |
◆ 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_writeKey
The documentation for this class was generated from the following files:
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
Eigen::Matrix< double, 2, 1 > Vector2D
#define ATH_MSG_VERBOSE(x)
#define THROW_EXCEPTION(MSG)
bool empty() const
Test if the key is blank.
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
const parameterBook & getParameters() const
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
double getEfficiency(const Identifier &channelId, bool isInnerQ1=false) const
Returns the signal generation efficiency of the sTgc channel.
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Include the GeoPrimitives which need to be put first.
A wrapper class for event-slot-local random engines.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
StatusCode initialize(bool used=true)
Eigen::Matrix< double, 3, 1 > Vector3D
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
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.
#define ATH_MSG_WARNING(x)
a struct encapsulating the identifier of a pile-up event