 |
ATLAS Offline Software
|
#include <TgcFastDigiTool.h>
|
bool | digitizeWireHit (const EventContext &ctx, const TimedHit &timedHit, const Muon::DigitEffiData *efficiencyMap, TgcDigitCollection &outColl, CLHEP::HepRandomEngine *rndEngine, DeadTimeMap &deadTimes) const |
| Digitize the wire hit by smearing the truth hit position according to the wire group pitch and then assigning the Identifier to it If an efficiency conditions object is scheduled, hits may additionally rejected based on simple random number drawing. More...
|
|
bool | digitizeStripHit (const EventContext &ctx, const TimedHit &timedHit, const Muon::DigitEffiData *efficiencyMap, TgcDigitCollection &outColl, CLHEP::HepRandomEngine *rndEngine, DeadTimeMap &deadTimes) const |
| Digitize the strip hit by smearing the truth hit position according to the wire group pitch and then assigning the Identifier to it. More...
|
|
int | associateBCIdTag (const EventContext &ctx, const TimedHit &timedHit) const |
| : Associates the global bcIdTag to the digit More...
|
|
StatusCode | fillTimedHits (PileUpHits &&hitColl, TimedHits &timedHits) const |
| Translates the PileUpHits into the timed hits format. More...
|
|
|
SG::WriteHandleKey< TgcDigitContainer > | m_writeKey {this, "OutputObjectName", "TGC_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_deadTime {this, "deadTime", 100.*Gaudi::Units::nanosecond} |
|
Gaudi::Property< bool > | m_digitizeMuonOnly |
|
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 13 of file TgcFastDigiTool.h.
◆ DeadTimeMap
◆ 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 89 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
◆ TgcFastDigiTool()
MuonR4::TgcFastDigiTool::TgcFastDigiTool |
( |
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 142 of file MuonDigitizationTool.cxx.
159 acc_eventTime(*sdoHit) = hit.eventTime();
160 acc_eventID(*sdoHit) = hit.eventId();
161 acc_puType(*sdoHit) = hit.pileupType();
◆ associateBCIdTag()
int MuonR4::TgcFastDigiTool::associateBCIdTag |
( |
const EventContext & |
ctx, |
|
|
const TimedHit & |
timedHit |
|
) |
| const |
|
private |
: Associates the global bcIdTag to the digit
- Parameters
-
ctx | EventContext |
timedHit | Hit to calculate the time from |
Definition at line 32 of file TgcFastDigiTool.cxx.
◆ 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
Write everything at the end into the final digit container
Implements MuonR4::MuonDigitizationTool.
Definition at line 202 of file TgcFastDigiTool.cxx.
218 for (
const TimedHit& simHit : viewer) {
225 const bool digitizedEta =
digitizeWireHit(ctx,simHit, efficiencyMap,*outColl, rndEngine, deadTimes);
226 const bool digitizedPhi =
digitizeStripHit(ctx, simHit, efficiencyMap,*outColl, rndEngine, deadTimes);
231 }
else if (digitizedPhi) {
237 re->localToGlobalTrans(
getGeoCtx(ctx),
re->layerHash(simHit->identify()))};
243 }
while(viewer.next());
246 return StatusCode::SUCCESS;
◆ digitizeStripHit()
Digitize the strip hit by smearing the truth hit position according to the wire group pitch and then assigning the Identifier to it.
If an efficiency conditions object is scheduled, hits may additionally rejected based on simple random number drawing.
- Parameters
-
ctx | Context of the current event to access the digitEffi store |
timedHit | Truth hit to digitize |
efficiencyMap | Pointer to the gasGap efficency look-up table |
outColl | Digit collection to push the final digit into |
rndEngine | Random engine used for smearing & efficiency evaluation |
deadTimes | Reference to the last digitized times in order to apply the dead time model |
Check efficiencies
Vector pointing perpendicular to the strips
From the local sim hit walk to the left & to the right strip edge. The sum of the two steps is the pitch at that position
Recalculate the strip number with the smeared hit -> Use the real Y to ensure that the hit remains within the active trapzoid
Definition at line 110 of file TgcFastDigiTool.cxx.
117 const Identifier hitId = timedHit->identify();
121 const unsigned int gasGap = idHelper.gasGap(hitId);
129 if (efficiencyMap && efficiencyMap->
getEfficiency(hitId) < CLHEP::RandFlat::shoot(rndEngine,0.,1.)){
130 ATH_MSG_VERBOSE(
"Simulated hit "<<xAOD::toEigen(timedHit->localPosition())
131 <<
m_idHelperSvc->toString(hitId) <<
" is rejected because of efficency modelling");
142 const Amg::Vector2D locSimHitPos{(toPhiRot*xAOD::toEigen(timedHit->localPosition())).block<2,1>(0,0)};
146 if (!design.insideTrapezoid(locSimHitPos)) {
148 <<
" is outside of the trapezoid "<<std::endl<<design);
151 int stripNum = design.stripNumber(locSimHitPos);
162 const double stripPitch = std::abs(*Amg::intersect<2>(design.stripLeftBottom(stripNum), design.stripLeftEdge(stripNum),
163 locSimHitPos, stripNorm)) +
164 std::abs(*Amg::intersect<2>(design.stripRightBottom(stripNum), design.stripRightEdge(stripNum),
165 locSimHitPos, stripNorm));
167 const double uncert = stripPitch / std::sqrt(12);
168 const double locX = CLHEP::RandGaussZiggurat::shoot(rndEngine, locSimHitPos.x(), uncert);
172 const int digitStripNum = design.stripNumber(smearedPos);
174 if (digitStripNum < 0) {
175 if (design.insideTrapezoid(smearedPos)) {
177 <<
Amg::toString(smearedPos)<<
" "<<uncert<<
" is outside of "<<design);
194 <<
Amg::toString(locSimHitPos, 2)<<
" phi strip number: "<<digitStripNum<<
", time: "<<
hitTime(timedHit)
199 ++(m_acceptedHits[
true]);
◆ digitizeWireHit()
Digitize the wire hit by smearing the truth hit position according to the wire group pitch and then assigning the Identifier to it If an efficiency conditions object is scheduled, hits may additionally rejected based on simple random number drawing.
- Parameters
-
ctx | Context of the current event to access the digitEffi store |
timedHit | Truth hit to digitize |
efficiencyMap | Pointer to the gasGap efficency look-up table |
outColl | Digit collection to push the final digit into |
rndEngine | Random engine used for smearing & efficiency evaluation |
deadTimes | Reference to the last digitized times in order to apply the dead time model |
Check efficiencies
Recalculate the strip number with the smeared hit -> Use the real Y to ensure that the hit remains within the active trapzoid
Definition at line 37 of file TgcFastDigiTool.cxx.
49 const unsigned int gasGap = idHelper.gasGap(hitId);
56 if (efficiencyMap && efficiencyMap->
getEfficiency(hitId) < CLHEP::RandFlat::shoot(rndEngine,0.,1.)){
57 ATH_MSG_VERBOSE(
"Simulated hit "<<xAOD::toEigen(timedHit->localPosition())
58 <<
m_idHelperSvc->toString(hitId) <<
" is rejected because of efficency modelling");
62 const Amg::Vector2D locSimHitPos{xAOD::toEigen(timedHit->localPosition()).block<2,1>(0,0)};
65 if (!design.insideTrapezoid(locSimHitPos)) {
67 <<
" is outside of the trapezoid "<<design);
70 const int wireGrpNum = design.stripNumber(locSimHitPos);
74 <<
" is not covered by any wire gang");
78 const double uncert = design.stripPitch() * design.numWiresInGroup(wireGrpNum) / std::sqrt(12);
79 const double locX = CLHEP::RandGaussZiggurat::shoot(rndEngine, locSimHitPos.x(), uncert);
83 const int prdWireNum = design.stripNumber(smearedPos);
86 if (design.insideTrapezoid(smearedPos)) {
88 <<
Amg::toString(smearedPos)<<
" "<<uncert<<
" is outside of "<<design);
104 <<
Amg::toString(locSimHitPos, 2)<<
" wire group number: "<<prdWireNum<<
", time: "<<
hitTime(timedHit)
107 ++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 44 of file MuonDigitizationTool.cxx.
45 for (
const auto& [timeIndex, simHitColl] : hitColl) {
46 timedHits.reserve(timedHits.capacity() + simHitColl->size());
48 timedHits.emplace_back(timeIndex.time(), timeIndex.index(), simHit, timeIndex.type());
53 if (a->identify() != b->identify()){
54 return a->identify() < b->identify();
56 if (
a.eventId() !=
b.eventId()) {
57 return a.eventId() < b.eventId();
59 return a.eventTime() <
b.eventTime();
61 return StatusCode::SUCCESS;
◆ filterPassed()
virtual bool PileUpToolBase::filterPassed |
( |
| ) |
const |
|
inlineoverridevirtualinherited |
◆ finalize()
StatusCode MuonR4::TgcFastDigiTool::finalize |
( |
| ) |
|
|
finaloverride |
Definition at line 25 of file TgcFastDigiTool.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 63 of file MuonDigitizationTool.cxx.
64 return hit.eventTime() + hit->globalTime();
◆ initialize()
StatusCode MuonR4::TgcFastDigiTool::initialize |
( |
| ) |
|
|
finaloverridevirtual |
◆ mergeEvent()
StatusCode MuonR4::MuonDigitizationTool::mergeEvent |
( |
const EventContext & |
ctx | ) |
|
|
finaloverrideinherited |
Definition at line 92 of file MuonDigitizationTool.cxx.
98 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
99 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
104 return StatusCode::SUCCESS;
◆ passDeadTime()
Returns whether the new digit is within the dead time window.
channelId: Identifier of the fired channel
hitTime: Current hit time
deadTimeWindow: Dead time to pass before the next hit may be accepted
deadTimeMap: Map storing the last hit times from each Identifier
Channel not seen before
Update dead time map & accept hit
Definition at line 164 of file MuonDigitizationTool.cxx.
170 if (insertItr.second) {
173 if (
hitTime - insertItr.first->second < deadTimeWindow) {
177 insertItr.first->second =
hitTime;
◆ PileUpToolBase()
PileUpToolBase::PileUpToolBase |
|
inherited |
◆ prepareEvent()
StatusCode MuonR4::MuonDigitizationTool::prepareEvent |
( |
const EventContext & |
ctx, |
|
|
const unsigned int |
nInputEvents |
|
) |
| |
|
finaloverrideinherited |
When being run from PileUpToolsAlgs, this method is called at the start of the subevts loop.
Not able to access SubEvents
Definition at line 35 of file MuonDigitizationTool.cxx.
38 ATH_MSG_DEBUG(
"prepareEvent() called for " << nInputEvents <<
" input events");
41 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 71 of file MuonDigitizationTool.cxx.
86 ATH_CHECK(sdoContainer.record(std::make_unique<xAOD::MuonSimHitContainer>(),
87 std::make_unique<xAOD::MuonSimHitAuxContainer>()));
90 return StatusCode::SUCCESS;
◆ 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 66 of file MuonDigitizationTool.cxx.
67 const MuonDigitizationTool* digiTool =
this;
68 return digiTool->processAllSubEvents(ctx);
◆ 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 108 of file MuonDigitizationTool.cxx.
115 for (
auto& [hitPtr, hitContainer] : hitList) {
116 auto copyContainer = std::make_unique<xAOD::MuonSimHitContainer>();
117 auto copyAuxContainer = std::make_unique<xAOD::MuonSimHitAuxContainer>();
118 copyContainer->setStore(copyAuxContainer.get());
120 (*copyContainer->push_back(std::make_unique<xAOD::MuonSimHit>())) = (*copyMe);
122 hitListPermanent.emplace_back(hitPtr, copyContainer.get());
123 m_simHits.emplace_back(std::move(copyContainer), std::move(copyAuxContainer));
126 return StatusCode::SUCCESS;
◆ resetFilter()
virtual void PileUpToolBase::resetFilter |
( |
| ) |
|
|
inlineoverridevirtualinherited |
◆ 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::TgcFastDigiTool::ATLAS_THREAD_SAFE {} |
|
mutableprivate |
◆ ATLAS_THREAD_SAFE [2/2]
std::array<std::atomic<unsigned>, 2> m_acceptedHits MuonR4::TgcFastDigiTool::ATLAS_THREAD_SAFE {} |
|
mutableprivate |
◆ m_deadTime
Gaudi::Property<double> MuonR4::TgcFastDigiTool::m_deadTime {this, "deadTime", 100.*Gaudi::Units::nanosecond} |
|
private |
◆ m_detMgr
◆ m_digitizeMuonOnly
Gaudi::Property<bool> MuonR4::TgcFastDigiTool::m_digitizeMuonOnly |
|
private |
Initial value:{this, "ProcessTrueMuonsOnly", false,
"If set to true hit with pdgId != 13 are skipped"}
Definition at line 79 of file TgcFastDigiTool.h.
◆ m_effiDataKey
Initial value:{this, "EffiDataKey", "TgcDigitEff",
"Efficiency constants of the individual Rpc gasGaps"}
Definition at line 71 of file TgcFastDigiTool.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_rndmSvc
◆ m_sdoKey
◆ m_simHitKey
◆ m_simHits
◆ m_streamName
Gaudi::Property<std::string> MuonR4::MuonDigitizationTool::m_streamName {this, "StreamName", ""} |
|
privateinherited |
◆ 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.
unsigned int numWireGangs(unsigned int gasGap) const
Returns the number of wire gangs for a given gasGap [1-3].
const WireGroupDesign & wireGangLayout(unsigned int gasGap) const
Returns access to the wire group design of the given gasGap [1-3] If the gap does not have a wires an...
void setIdentifier(const Identifier &id)
Sets the global ATLAS identifier.
Identifier identify() const
Returns the global ATLAS identifier of the SimHit.
Eigen::Matrix< double, 2, 1 > Vector2D
MeasVector< N > toStorage(const AmgVector(N)&amgVec)
Converts the double precision of the AmgVector into the floating point storage precision of the MeasV...
void setLocalPosition(MeasVector< 3 > vec)
Sets the local position of the traversing particle.
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &ctx) const
Transformations to translate between local <-> global coordinates.
#define ATH_MSG_VERBOSE(x)
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
bool empty() const
Test if the key is blank.
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
static IdentifierHash constructHash(unsigned int measCh, unsigned int gasGap, const bool isStrip)
Constructs the Hash out of the Identifier fields (channel, gasGap, isStrip)
void stable_sort(std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, std::reverse_iterator< DataModel_detail::iterator< DVL > > end, Compare comp)
Specialization of stable_sort for DataVector/List.
unsigned int numStrips(unsigned int gasGap) const
Returns the number of strips for a given gasGap [1-3].
const RadialStripDesign & stripLayout(unsigned int gasGap) const
Returns access to the strip design of the given gasGap [1-3] If the gap does not have strips an excep...
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
Eigen::Affine3d Transform3D
double getEfficiency(const Identifier &channelId, bool isInnerQ1=false) const
Returns the signal generation efficiency of the sTgc channel.
ConstVectorMap< 3 > localDirection() const
Returns the local direction of the traversing particle.
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.
void setLocalDirection(MeasVector< 3 > vec)
Sets the local direction of the traversing particle.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
StatusCode initialize(bool used=true)
#define THROW_EXCEPTION(MESSAGE)
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Identifier identify() const
#define ATH_MSG_WARNING(x)
const boost::regex re(r_e)
ConstVectorMap< 3 > localPosition() const
Returns the local postion of the traversing particle.
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
const T * at(size_type n) const
Access an element, as an rvalue.
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
a struct encapsulating the identifier of a pile-up event
size_type size() const noexcept
Returns the number of elements in the collection.