ATLAS Offline Software
MDTFastDigiTester.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "MDTFastDigiTester.h"
6 
7 
8 namespace MuonValR4 {
10  ISvcLocator* pSvcLocator)
11  : AthHistogramAlgorithm(name, pSvcLocator) {}
12 
13 
15  ATH_CHECK(m_inSimHitKey.initialize());
16  ATH_CHECK(m_tree.init(this));
17  ATH_CHECK(m_inDriftCircleKey.initialize());
18  ATH_CHECK(m_idHelperSvc.retrieve());
19  ATH_MSG_DEBUG("Succesfully initialised");
20  return StatusCode::SUCCESS;
21  }
22 
25  return StatusCode::SUCCESS;
26  }
27 
29 
30  // retrieve the two input collections
31  const EventContext & context = Gaudi::Hive::currentContext();
33  context);
35  m_inDriftCircleKey, context);
36  if (!readSimHits.isValid()){
37  ATH_MSG_FATAL("Failed to read MDT sim hits");
38  return StatusCode::FAILURE;
39  }
40  if (!readDriftCircles.isValid()){
41  ATH_MSG_FATAL("Failed to read MDT drift circles");
42  return StatusCode::FAILURE;
43  }
44  ATH_MSG_DEBUG("Succesfully retrieved input collections");
45 
46  // map the drift circles to identifiers.
47  // The fast digi should only generate one circle per tube.
48  std::map<Identifier, const xAOD::MdtDriftCircle*> driftCircleMap{};
49 
50  for (const xAOD::MdtDriftCircle* driftCircle : *readDriftCircles) {
51  // need a small type conversion, as the UncalibratedMeasurement::identifier
52  // returns a 32-bit unsigned long, while the Identifier::value_type is 64-bit
53  Identifier driftCircleID{(Identifier::value_type)driftCircle->identifier()};
54  auto empl_res = driftCircleMap.emplace(driftCircleID,driftCircle);
55  // report any found duplication
56  if (!empl_res.second) {
57  ATH_MSG_WARNING("Duplicate drift circle found for identifier "<<m_idHelperSvc->toString(driftCircleID));
58  ATH_MSG_WARNING(" This instance is at r = "<<driftCircle->driftRadius());
59  ATH_MSG_WARNING(" The conflicting instance is at r = "<<empl_res.first->second->driftRadius());
60  }
61  }
62  // also track duplicate sim hits for early validation
63  std::map<Identifier, const xAOD::MuonSimHit*> simHitIDsSeen;
64 
65  for (const xAOD::MuonSimHit* simHit : *readSimHits) {
66  // The sim hit collection contains non-muon hits, while the fast digi only writes out muon
67  // deposits. Here remove sim hits that are not expected to be accounted for in the digi.
68  if (std::abs(simHit->pdgId()) != 13) continue;
69  Identifier ID = simHit->identify();
70  // check for duplicates
71  auto empl_res = simHitIDsSeen.emplace(ID,simHit);
72  // report any found duplication
73  if (!empl_res.second) {
74  const xAOD::MuonSimHit* exist{empl_res.first->second};
75  ATH_MSG_WARNING("Duplicate sim hit found for identifier "<<m_idHelperSvc->toString(ID));
76  ATH_MSG_WARNING(" This instance is at r,z, time "
77  <<simHit->localPosition().perp()
78  <<", "<<simHit->localPosition().z()
79  <<", "<<simHit->globalTime()
80  <<" from a "<<simHit->pdgId()
81  <<" with BC "<<simHit->genParticleLink().barcode());
82  ATH_MSG_WARNING(" The conflicting instance is at r,z, time "
83  <<exist->localPosition().perp()
84  <<", "<<exist->localPosition().z()
85  <<", "<<exist->globalTime()
86  <<" from a "<<exist->pdgId()
87  <<" with BC "<<exist->genParticleLink().barcode());
88  }
89  const MdtIdHelper& mdtHelper{m_idHelperSvc->mdtIdHelper()};
90  // populate initial output
91  m_out_stationName = m_idHelperSvc->stationName(ID);
92  m_out_stationEta = m_idHelperSvc->stationEta(ID);
93  m_out_stationPhi = m_idHelperSvc->stationPhi(ID);
94  m_out_multilayer = mdtHelper.multilayer(ID);
95  m_out_tubeLayer = mdtHelper.tubeLayer(ID);
96  m_out_tube = mdtHelper.tube(ID);
97  m_out_simDriftRadius = simHit->localPosition().perp();
98  m_out_barcode = simHit->genParticleLink().barcode();
99  // find the corresponding drift circle
100  auto foundDriftCircle = driftCircleMap.find(ID);
101  if(foundDriftCircle != driftCircleMap.end()){
102  const xAOD::MdtDriftCircle* dt = foundDriftCircle->second;
103  m_out_digiDriftRadius = dt->driftRadius();
104  m_out_digiDriftRadiusCov = dt->driftRadiusCov();
105  m_out_hasDigi = true;
106  }
107  // fill the tree
108  ATH_CHECK(m_tree.fill(context));
109  }
110  return StatusCode::SUCCESS;
111  }
112 
113 } // namespace MuonValR4
MuonValR4::MDTFastDigiTester::m_out_tube
MuonVal::ScalarBranch< int > & m_out_tube
Definition: MDTFastDigiTester.h:54
Identifier::value_type
IDENTIFIER_TYPE value_type
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:39
xAOD::MuonSimHit_v1
Definition: MuonSimHit_v1.h:18
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
MuonVal::MuonTesterTree::init
StatusCode init(OWNER *instance)
Initialize method.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
MuonValR4::MDTFastDigiTester::m_out_hasDigi
MuonVal::ScalarBranch< bool > & m_out_hasDigi
Definition: MDTFastDigiTester.h:57
MDTFastDigiTester.h
MuonValR4::MDTFastDigiTester::m_out_stationEta
MuonVal::ScalarBranch< int > & m_out_stationEta
Definition: MDTFastDigiTester.h:50
MuonValR4::MDTFastDigiTester::m_out_stationPhi
MuonVal::ScalarBranch< int > & m_out_stationPhi
Definition: MDTFastDigiTester.h:51
WriteCellNoiseToCool.exist
exist
Definition: WriteCellNoiseToCool.py:543
MuonValR4::MDTFastDigiTester::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MDTFastDigiTester.h:44
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
MuonValR4::MDTFastDigiTester::m_out_multilayer
MuonVal::ScalarBranch< int > & m_out_multilayer
Definition: MDTFastDigiTester.h:52
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
CaloNoise_fillDB.dt
dt
Definition: CaloNoise_fillDB.py:58
MdtIdHelper
Definition: MdtIdHelper.h:61
MuonValR4::MDTFastDigiTester::m_out_stationName
MuonVal::ScalarBranch< int > & m_out_stationName
Definition: MDTFastDigiTester.h:49
MuonValR4::MDTFastDigiTester::m_out_digiDriftRadius
MuonVal::ScalarBranch< float > & m_out_digiDriftRadius
Definition: MDTFastDigiTester.h:58
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonValR4::MDTFastDigiTester::m_out_tubeLayer
MuonVal::ScalarBranch< int > & m_out_tubeLayer
Definition: MDTFastDigiTester.h:53
AthHistogramAlgorithm
Definition: AthHistogramAlgorithm.h:32
MuonValR4::MDTFastDigiTester::m_out_barcode
MuonVal::ScalarBranch< float > & m_out_barcode
Definition: MDTFastDigiTester.h:55
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
MuonValR4
Lightweight algorithm to read xAOD MDT sim hits and (fast-digitised) drift circles from SG and fill a...
Definition: MDTFastDigiTester.cxx:8
MuonValR4::MDTFastDigiTester::initialize
virtual StatusCode initialize() override
Definition: MDTFastDigiTester.cxx:14
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
MuonValR4::MDTFastDigiTester::execute
virtual StatusCode execute() override
Definition: MDTFastDigiTester.cxx:28
MuonValR4::MDTFastDigiTester::m_out_digiDriftRadiusCov
MuonVal::ScalarBranch< float > & m_out_digiDriftRadiusCov
Definition: MDTFastDigiTester.h:59
MuonValR4::MDTFastDigiTester::MDTFastDigiTester
MDTFastDigiTester(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MDTFastDigiTester.cxx:9
MuonValR4::MDTFastDigiTester::m_inDriftCircleKey
SG::ReadHandleKey< xAOD::MdtDriftCircleContainer > m_inDriftCircleKey
Definition: MDTFastDigiTester.h:41
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MuonValR4::MDTFastDigiTester::m_out_simDriftRadius
MuonVal::ScalarBranch< float > & m_out_simDriftRadius
Definition: MDTFastDigiTester.h:56
MuonVal::MuonTesterTree::fill
bool fill(const EventContext &ctx)
Fills the tree per call.
Definition: MuonTesterTree.cxx:89
MuonVal::MuonTesterTree::write
StatusCode write()
Finally write the TTree objects.
Definition: MuonTesterTree.cxx:178
MuonValR4::MDTFastDigiTester::finalize
virtual StatusCode finalize() override
Definition: MDTFastDigiTester.cxx:23
xAOD::MdtDriftCircle_v1
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
Definition: MdtDriftCircle_v1.h:18
Trk::driftCircle
@ driftCircle
Definition: MeasurementType.h:25
MuonValR4::MDTFastDigiTester::m_inSimHitKey
SG::ReadHandleKey< xAOD::MuonSimHitContainer > m_inSimHitKey
Definition: MDTFastDigiTester.h:38
MuonValR4::MDTFastDigiTester::m_tree
MuonVal::MuonTesterTree m_tree
Definition: MDTFastDigiTester.h:48