ATLAS Offline Software
MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 #include "MdtDigitizationTool.h"
8 #include "CLHEP/Random/RandGaussZiggurat.h"
9 namespace{
10  constexpr double timeToTdcCnv = 1. / IMdtCalibrationTool::tdcBinSize;
11 }
12 
13 namespace MuonR4 {
14 
15  MdtDigitizationTool::MdtDigitizationTool(const std::string& type, const std::string& name, const IInterface* pIID):
17 
23  return StatusCode::SUCCESS;
24  }
25  StatusCode MdtDigitizationTool::digitize(const EventContext& ctx,
26  const TimedHits& hitsToDigit,
27  xAOD::MuonSimHitContainer* sdoContainer) const {
28 
29 
30  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
31  // Prepare the temporary cache
32  DigiCache digitCache{};
34  const MuonCalib::MdtCalibDataContainer* calibData{nullptr};
35  ATH_CHECK(retrieveConditions(ctx, m_calibDbKey, calibData));
36  const MdtCondDbData* badTubes{nullptr};
37  ATH_CHECK(retrieveConditions(ctx, m_badTubeKey, badTubes));
38 
39  CLHEP::HepRandomEngine* rndEngine = getRandomEngine(ctx);
40 
41  double deadTime{0.};
42  for (const TimedHitPtr<xAOD::MuonSimHit>& simHit : hitsToDigit) {
43  const Identifier hitId{simHit->identify()};
45  if (!badTubes->isGood(hitId)) {
46  ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitId)<<" is rejected due to masking in DB.");
47  continue;
48  }
49  const MuonGMR4::MdtReadoutElement* readOutEle = m_detMgr->getMdtReadoutElement(hitId);
50  const IdentifierHash measHash{readOutEle->measurementHash(hitId)};
51 
52 
53  const Amg::Vector3D locPos{xAOD::toEigen(simHit->localPosition())};
54 
55  const double distRO = std::abs(0.5*readOutEle->getParameters().readoutSide*readOutEle->activeTubeLength(measHash) - locPos.z());
56 
57 
58  const MdtDigiToolInput digiInput(std::abs(locPos.perp()), distRO, 0., 0., 0., 0., hitId);
59 
60  const MdtDigiToolOutput digiOutput(m_digiTool->digitize(ctx, digiInput, rndEngine));
61  if (!digiOutput.wasEfficient()) {
62  ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitId)<<" is rejected due to inefficiency modelling.");
63  continue;
64  }
65 
66  const MuonCalib::MdtFullCalibData* tubeConstants = calibData->getCalibData(hitId, msgStream());
67  const MuonCalib::MdtTubeCalibContainer::SingleTubeCalib& tubeCalib{*tubeConstants->tubeCalib->getCalib(hitId)};
68 
69  const double sigPropTime = tubeCalib.inversePropSpeed*distRO;
72  const double totalTdcTime = digiOutput.driftTime() + simHit->globalTime() + sigPropTime + tubeCalib.t0;
73 
74  MdtDigitCollection* outColl = fetchCollection(hitId, digitCache);
75  if (outColl->empty() || outColl->back()->identify() != hitId || totalTdcTime > deadTime) {
76  deadTime = totalTdcTime + m_deadTime;
77  } else if (totalTdcTime <= deadTime) {
78  ATH_MSG_VERBOSE("Hit "<<m_idHelperSvc->toString(hitId)<<" is within dead time "<<deadTime<<" totalTdcTime: "<<totalTdcTime);
79  continue;
80  }
81 
82  const bool hasHPTdc = m_idHelperSvc->hasHPTDC(hitId);
84  const uint16_t tdcCounts = timeToTdcCnv*(hasHPTdc ? 4 : 1)*CLHEP::RandGaussZiggurat::shoot(rndEngine, totalTdcTime, m_timeResTDC);
85  const uint16_t adcCounts = (hasHPTdc ? 4 : 1) *CLHEP::RandGaussZiggurat::shoot(rndEngine, digiOutput.adc(), m_timeResADC);
86 
87  auto digit = std::make_unique<MdtDigit>(hitId, tdcCounts, adcCounts);
88  outColl->push_back(std::move(digit));
89  addSDO(simHit, sdoContainer);
90  }
92  ATH_CHECK(writeDigitContainer(ctx, m_writeKey, std::move(digitCache), idHelper.module_hash_max()));
93  return StatusCode::SUCCESS;
94  }
95 }
MdtDigiToolInput
Definition: MdtDigiToolInput.h:26
MuonR4::MdtDigitizationTool::m_deadTime
Gaudi::Property< double > m_deadTime
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:39
COOLRates.deadTime
deadTime
Definition: COOLRates.py:1220
MuonR4::MdtDigitizationTool::m_badTubeKey
SG::ReadCondHandleKey< MdtCondDbData > m_badTubeKey
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:33
MuonGMR4::MdtReadoutElement::measurementHash
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
IMdtCalibrationTool.h
MuonGMR4::MdtReadoutElement::activeTubeLength
double activeTubeLength(const IdentifierHash &hash) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:179
MdtCondDbData
Definition: MdtCondDbData.h:21
MuonR4::MdtDigitizationTool::m_timeResTDC
Gaudi::Property< double > m_timeResTDC
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:37
TimedHitPtr< xAOD::MuonSimHit >
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
MuonCalib::MdtFullCalibData
class which holds the full set of calibration constants for a given tube
Definition: MdtFullCalibData.h:15
MuonR4::MuonDigitizationTool::retrieveConditions
StatusCode retrieveConditions(const EventContext &ctx, const SG::ReadCondHandleKey< Container > &key, const Container *&contPtr) const
Helper function to access the conditions data.
MdtDigiToolOutput
Definition: MdtDigiToolOutput.h:19
MuonR4::MdtDigitizationTool::m_timeResADC
Gaudi::Property< double > m_timeResADC
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:38
MuonGMR4::MdtReadoutElement::parameterBook::readoutSide
double readoutSide
Is the readout chip at positive or negative Z?
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:62
MuonR4::MdtDigitizationTool::m_calibDbKey
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainer > m_calibDbKey
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:29
MuonR4::MuonDigitizationTool::addSDO
void addSDO(const TimedHit &hit, xAOD::MuonSimHitContainer *sdoContainer) const
Adds the timed simHit to the output SDO container.
Definition: MuonDigitizationTool.cxx:148
WriteHandle.h
Handle class for recording to StoreGate.
MuonCalib::MdtFullCalibData::tubeCalib
TubeContainerPtr tubeCalib
Definition: MdtFullCalibData.h:22
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
MuonR4::MuonDigitizationTool::getRandomEngine
CLHEP::HepRandomEngine * getRandomEngine(const EventContext &ctx) const
Definition: MuonDigitizationTool.cxx:135
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
MdtIdHelper
Definition: MdtIdHelper.h:61
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonR4::MdtDigitizationTool::initialize
StatusCode initialize() override final
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.cxx:18
MdtDigiToolOutput::wasEfficient
double wasEfficient() const
Definition: MdtDigiToolOutput.h:29
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
DataVector::back
const T * back() const
Access the last element in the collection as an rvalue.
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
MuonR4::MdtDigitizationTool::DigiCache
OutDigitCache_t< MdtDigitCollection > DigiCache
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:41
MuonGMR4::MdtReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:19
MuonR4::MdtDigitizationTool::digitize
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 technolog...
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.cxx:25
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
MdtDigitCollection
Definition: MdtDigitCollection.h:18
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.
MdtDigiToolInput.h
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)
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MdtDigitizationTool.h
MuonR4
The CsvMuonSimHitDumper reads a Simulation Hit container for muons and dumps information to csv files...
Definition: MuonSpacePoint.h:11
MuonR4::MuonDigitizationTool::initialize
StatusCode initialize() override
Definition: MuonDigitizationTool.cxx:17
MuonDigit::identify
Identifier identify() const
Definition: MuonDigit.h:30
MuonR4::MuonDigitizationTool
Barebone implementation of the I/O infrastructure for all MuonDigitizationTools.
Definition: MuonDigitizationTool.h:30
MuonR4::MuonDigitizationTool::TimedHits
std::vector< TimedHitPtr< xAOD::MuonSimHit > > TimedHits
Definition: MuonDigitizationTool.h:60
MuonCalib::MdtCalibDataContainer
Definition: MdtCalibDataContainer.h:20
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MuonR4::MuonDigitizationTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonDigitizationTool.h:122
MdtDigiToolOutput::driftTime
double driftTime() const
Definition: MdtDigiToolOutput.h:27
MdtDigiToolOutput::adc
double adc() const
Definition: MdtDigiToolOutput.h:28
MuonR4::MdtDigitizationTool::MdtDigitizationTool
MdtDigitizationTool(const std::string &type, const std::string &name, const IInterface *pIID)
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.cxx:15
MuonR4::MuonDigitizationTool::m_detMgr
const MuonGMR4::MuonDetectorManager * m_detMgr
Definition: MuonDigitizationTool.h:120
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib
Definition: MdtTubeCalibContainer.h:18
MuonR4::MdtDigitizationTool::m_digiTool
ToolHandle< IMDT_DigitizationTool > m_digiTool
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:35
MuonGMR4::MdtReadoutElement::getParameters
const parameterBook & getParameters() const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:44
IdentifierHash
Definition: IdentifierHash.h:38
IMdtCalibrationTool::tdcBinSize
static constexpr double tdcBinSize
Conversion to go from tdc counts -> drift Time.
Definition: IMdtCalibrationTool.h:34
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 ...
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
MuonR4::MdtDigitizationTool::m_writeKey
SG::WriteHandleKey< MdtDigitContainer > m_writeKey
Definition: MuonPhaseII/MuonDigitization/MdtDigitizationR4/src/MdtDigitizationTool.h:27