Loading [MathJax]/extensions/tex2jax.js
 |
ATLAS Offline Software
|
#include <MdtDigitizationTool.h>
|
SG::WriteHandleKey< MdtDigitContainer > | m_writeKey {this, "OutputObjectName", "MDT_Digits"} |
|
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainer > | m_calibDbKey |
|
SG::ReadCondHandleKey< MdtCondDbData > | m_badTubeKey {this, "BadTubeKey", "MdtCondDbData", "Key of MdtCondDbData"} |
|
SG::ReadCondHandleKey< Muon::TwinTubeMap > | m_twinTubeKey {this, "TwinTubeKey", "MdtTwinTubeMap"} |
|
ToolHandle< IMDT_DigitizationTool > | m_digiTool {this, "DigitizationTool", ""} |
|
Gaudi::Property< double > | m_timeResTDC {this, "ResolutionTDC", 0.5 * Gaudi::Units::ns, "TDC time resolution"} |
|
Gaudi::Property< double > | m_timeResADC {this, "ResolutionADC", 0.5 * Gaudi::Units::ns, "ADC time resolution"} |
|
Gaudi::Property< double > | m_deadTime {this, "DeadTime", 700., "MDT drift tube dead time"} |
|
Gaudi::Property< bool > | m_digitizeMuonOnly {this, "ProcessTrueMuonsOnly", false, "If set to true hit with pdgId != 13 are skipped"} |
|
Gaudi::Property< bool > | m_useTwinTube {this, "useTwinTubes", false} |
| Properties to model the Twin tube signals. More...
|
|
Gaudi::Property< double > | m_resTwin {this, "ResolutionTwinTube", 1.05 * Gaudi::Units::ns, "Twin Tube resolution"} |
|
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 {} |
|
◆ 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
◆ MdtDigitizationTool()
MdtDigitizationTool::MdtDigitizationTool |
( |
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();
◆ 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 needed conditions
Hit is masked in the database for whatever reason
Total tdc time is the sum of the drift time, the time of flight of the muon, the propgation along the wire and finally the constant t0 tube offset
Question: What happens if there're 2 digits such close by that their adc needs to be merged?
The HPTdc has 4 times higher clock frequency. Smear both
Put also in the twin tube digit
The signal for the twin tube needs to travel to the HV side & then through the complete twin tube
Total tdc time is the sum of the drift time, the time of flight of the muon, the propgation along the wire and finally the constant t0 tube offset
The digitization might have produced digits which are overlapping in time, in particular if twin tubes are hit. Filter tube digits which are produced within the dead time interval
Find the next digit which is either another tube or beyond the dead time
Write everything at the end into the final digit container
Implements MuonR4::MuonDigitizationTool.
Definition at line 28 of file MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.cxx.
36 using DigitSDOPair = std::pair<std::unique_ptr<MdtDigit>,
TimedHit>;
52 std::vector<DigitSDOPair> digitsInChamber{};
57 if (!badTubes->isGood(hitId)) {
63 <<
", time: "<<simHit->globalTime()<<
", energy: "<<simHit->kineticEnergy() /
Gaudi::Units::GeV
64 <<
" [GeV], mass: "<<simHit->mass()<<
", deposited energy: "<<simHit->energyDeposit() /
Gaudi::Units::eV
65 <<
" [eV], genLink: "<<simHit->genParticleLink());
73 const Amg::Vector3D locPos{xAOD::toEigen(simHit->localPosition())};
76 const MdtDigiToolInput digiInput(std::abs(locPos.perp()), distRO, 0., 0., 0., 0., hitId);
78 if (!digiOutput.wasEfficient()) {
82 const double arrivalTime{simHit->globalTime()};
85 assert(tubeConstants !=
nullptr);
87 assert(tubeConstants->
tubeCalib->getCalib(hitId) !=
nullptr);
91 const double sigPropTime = calibData->inversePropSpeed()*distRO;
95 const double totalTdcTime = digiOutput.driftTime() + arrivalTime + tubeCalib.t0 + sigPropTime;
96 if (lastTube != hitId ||
deadTime < totalTdcTime) {
107 const uint16_t tdcCounts = timeToTdcCnv*(hasHPTdc ? 4 : 1)*CLHEP::RandGaussZiggurat::shoot(rndEngine, totalTdcTime,
m_timeResTDC);
108 const uint16_t adcCounts = (hasHPTdc ? 4 : 1) *CLHEP::RandGaussZiggurat::shoot(rndEngine, digiOutput.adc(),
m_timeResADC);
110 auto digit = std::make_unique<MdtDigit>(hitId, tdcCounts, adcCounts,
false);
112 digitsInChamber.push_back(std::make_pair(std::move(
digit), simHit));
114 if (!twinTubes || !twinTubes->isTwinTubeLayer(hitId)) {
117 const Identifier twinId{twinTubes->twinId(hitId)};
118 if (twinId == hitId) {
123 if (!readOutEle->
isValid(twinHash)) {
132 <<
", tube length: "<<readOutEle->
activeTubeLength(measHash)<<
", distRO: "<<distRO
134 <<
", twin distance: "<<twinDist);
137 const double twinPropTime = calibData->inversePropSpeed()*twinDist;
140 const double twinTdcTime = digiOutput.driftTime() + arrivalTime + twinPropTime
141 + twinCalib.t0 + twinTubes->hvDelayTime(twinId);
143 const uint16_t twinTdcCounts = timeToTdcCnv*(hasHPTdc ? 4 : 1)*CLHEP::RandGaussZiggurat::shoot(rndEngine, twinTdcTime,
m_resTwin);
144 const uint16_t twinAdcCoutns = (hasHPTdc ? 4 : 1) *CLHEP::RandGaussZiggurat::shoot(rndEngine, digiOutput.adc(),
m_timeResADC);
145 digit = std::make_unique<MdtDigit>(twinId, twinTdcCounts, twinAdcCoutns,
false);
147 <<
", adc: "<<
digit->adc()<<
", local z: "<<simHit->localPosition().z());
148 digitsInChamber.push_back(std::make_pair(std::move(
digit), simHit));
152 std::ranges::sort(digitsInChamber,[](
const DigitSDOPair&
a,
const DigitSDOPair&
b){
153 if (
a.first->identify() !=
b.first->identify()) {
154 return a.first->identify() < b.first->identify();
156 return a.first->tdc() <
b.first->tdc();
160 addSDO(saveMe->second, sdoContainer);
161 const MdtDigit* saved =
fetchCollection(saveMe->first->identify(), digitCache)->push_back(std::move(saveMe->first));
164 saveMe = std::find_if(saveMe +1, digitsInChamber.end(),
165 [deadInterval, saved](
const DigitSDOPair& digitized) {
166 return saved->identify() != digitized.first->identify() || deadInterval < digitized.first->tdc();
169 }
while (viewer.next());
172 return StatusCode::SUCCESS;
◆ 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 |
◆ 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 MdtDigitizationTool::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.
◆ m_badTubeKey
◆ m_calibDbKey
◆ m_deadTime
Gaudi::Property<double> MuonR4::MdtDigitizationTool::m_deadTime {this, "DeadTime", 700., "MDT drift tube dead time"} |
|
private |
◆ m_detMgr
◆ m_digitizeMuonOnly
Gaudi::Property<bool> MuonR4::MdtDigitizationTool::m_digitizeMuonOnly {this, "ProcessTrueMuonsOnly", false, "If set to true hit with pdgId != 13 are skipped"} |
|
private |
◆ m_digiTool
◆ 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_resTwin
Gaudi::Property<double> MuonR4::MdtDigitizationTool::m_resTwin {this, "ResolutionTwinTube", 1.05 * Gaudi::Units::ns, "Twin Tube resolution"} |
|
private |
◆ 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_timeResADC
Gaudi::Property<double> MuonR4::MdtDigitizationTool::m_timeResADC {this, "ResolutionADC", 0.5 * Gaudi::Units::ns, "ADC time resolution"} |
|
private |
◆ m_timeResTDC
Gaudi::Property<double> MuonR4::MdtDigitizationTool::m_timeResTDC {this, "ResolutionTDC", 0.5 * Gaudi::Units::ns, "TDC time resolution"} |
|
private |
◆ m_twinTubeKey
◆ m_useTwinTube
Gaudi::Property<bool> MuonR4::MdtDigitizationTool::m_useTwinTube {this, "useTwinTubes", false} |
|
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_writeKey
The documentation for this class was generated from the following files:
JetConstituentVector::iterator iterator
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
double activeTubeLength(const IdentifierHash &hash) const
#define ATH_MSG_VERBOSE(x)
bool ignoreTruthLink(const T &p, bool vetoPileUp)
Helper function for SDO creation in PileUpTools.
class which holds the full set of calibration constants for a given tube
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.
TubeContainerPtr tubeCalib
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.
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.
Obj * get()
Get (non-const) access to the underlying object.
A wrapper class for event-slot-local random engines.
double distanceToReadout(const ActsGeometryContext &ctx, const Identifier &measId, const Amg::Vector3D &globPoint) const
Returns the distance along the wire from the readout card The distance is given as the delta z of the...
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
#define THROW_EXCEPTION(MESSAGE)
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Identifier identify() const
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
bool isValid(const IdentifierHash &measHash) const