ATLAS Offline Software
Loading...
Searching...
No Matches
MuonPRD_MultiTruthMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Algorithm producing truth info for PrepRawData, keeping all MC particles contributed to a PRD.
6
8
11
12//================================================================
14 ATH_MSG_DEBUG("MuonPRD_MultiTruthMaker::initialize()");
15 ATH_CHECK(m_idHelperSvc.retrieve());
16 ATH_CHECK(m_MdtPrdKey.initialize(!m_MdtPrdKey.empty()));
17 ATH_CHECK(m_CscPrdKey.initialize(!m_CscPrdKey.empty()));
18 ATH_CHECK(m_RpcPrdKey.initialize(!m_RpcPrdKey.empty()));
19 ATH_CHECK(m_TgcPrdKey.initialize(!m_TgcPrdKey.empty()));
20 ATH_CHECK(m_sTgcPrdKey.initialize(!m_sTgcPrdKey.empty()));
21 ATH_CHECK(m_MmPrdKey.initialize(!m_MmPrdKey.empty()));
22
23 ATH_CHECK(m_MdtSDOKey.initialize(!m_MdtPrdKey.empty()));
24 ATH_CHECK(m_CscSDOKey.initialize(!m_CscPrdKey.empty()));
25 ATH_CHECK(m_RpcSDOKey.initialize(!m_RpcPrdKey.empty()));
26 ATH_CHECK(m_TgcSDOKey.initialize(!m_TgcPrdKey.empty()));
27 ATH_CHECK(m_sTgcSDOKey.initialize(!m_sTgcPrdKey.empty()));
28 ATH_CHECK(m_MmSDOKey.initialize(!m_MmPrdKey.empty()));
29
30 ATH_CHECK(m_MdtTruthMapKey.initialize(!m_MdtPrdKey.empty()));
31 ATH_CHECK(m_CscTruthMapKey.initialize(!m_CscPrdKey.empty()));
32 ATH_CHECK(m_RpcTruthMapKey.initialize(!m_RpcPrdKey.empty()));
33 ATH_CHECK(m_TgcTruthMapKey.initialize(!m_TgcPrdKey.empty()));
34 ATH_CHECK(m_sTgcTruthMapKey.initialize(!m_sTgcPrdKey.empty()));
35 ATH_CHECK(m_MmTruthMapKey.initialize(!m_MmPrdKey.empty()));
36 return StatusCode::SUCCESS;
37}
38
39//================================================================
50
51//================================================================
52template <class PrdType, class SimCollection>
53StatusCode MuonPRD_MultiTruthMaker::buildPRD_Truth(const EventContext& ctx,
57
58 if (prdKey.empty()) {
59 ATH_MSG_DEBUG("No key has been defined for "<<typeid(PrdType).name()<<". Bail out silently");
60 return StatusCode::SUCCESS;
61 }
62 SG::ReadHandle prdContainer{prdKey, ctx};
63 if (!prdContainer.isPresent()) {
64 ATH_MSG_ERROR("Could not read " << prdKey.key());
65 return StatusCode::FAILURE;
66 }
67
68 SG::ReadHandle simDataMap{sdoKey, ctx};
69 if (!simDataMap.isPresent()) {
70 ATH_MSG_ERROR("SimDataCollection for key=" << sdoKey.key() << " not in storegate.");
71 return StatusCode::FAILURE;
72 }
73 // Create and fill the PRD truth structure
74 ATH_MSG_DEBUG("make PRD truth for " << outputKey.key());
75 SG::WriteHandle prdTruth{outputKey, ctx};
76 ATH_CHECK(prdTruth.record(std::make_unique<PRD_MultiTruthCollection>()));
77
78 for (const Muon::MuonPrepDataCollection<PrdType>* coll : *prdContainer) {
79 for (const PrdType* prd : *coll) {
80 ATH_MSG_VERBOSE("addPrepRawDatum(): new PRD " << prd << ", id=" << prd->identify() << ", number of RDOs: " << prd->rdoList().size());
81 bool gotSDO{false}, gotValidParticle{false};
82
83 for (const auto& nextRDO : prd->rdoList()) {
84 typename SimCollection::const_iterator iter(simDataMap->find(nextRDO));
85 if (iter == simDataMap->end()) {
86 continue;
87 }
88 gotSDO = true;
89 // Got an SDO. Try to associate the PRD to MC particles we have info about.
90 typedef typename SimCollection::mapped_type SIMDATA;
91 const SIMDATA& sdo = iter->second;
92 const std::vector<typename SIMDATA::Deposit>& deposits = sdo.getdeposits();
93 if (deposits.empty()) { continue; }
94 for (const auto& [particleLink, mcData] : deposits) {
95 ATH_MSG_VERBOSE("addPrepRawDatum(): particleLink.isValid() " << particleLink.isValid());
96 ATH_MSG_VERBOSE("addPrepRawDatum(): Barcode " << particleLink.barcode() << " evt " << particleLink.eventIndex());
97 if (!particleLink.isValid()) {
98 continue;
99 }
100 gotValidParticle = true;
101 // Associate the particle to the PRD. But don't add duplicates.
102 // Note: it may be more efficient to filter out duplicates among particles for the current PRD, then check-and-add the
103 // reduced set to the large multimap. But may be not for the typically small RDO/PRD ratio.
104 typedef PRD_MultiTruthCollection::iterator truthiter;
105 std::pair<truthiter, truthiter> r = prdTruth->equal_range(prd->identify());
106 const auto& pl = particleLink; // Work around problem with clang 6.0.1
107 if (r.second == std::find_if(r.first, r.second, [pl](const PRD_MultiTruthCollection::value_type& prd_to_truth) {
108 return prd_to_truth.second == pl;
109 })) {
110 prdTruth->insert(std::make_pair(prd->identify(), particleLink));
111 }
112 }
113 }
114 if (gotSDO && !gotValidParticle) {
115 // Looked at all the deposits from all the SDOs, but did not find any valid particle link.
116 // prdTruth->insert(std::make_pair(prd, particleLinkUnknown));
117 ATH_MSG_DEBUG("addPrepRawDatum(): got SDO but no particles");
118 }
119 }
120 }
121 return StatusCode::SUCCESS;
122}
123
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_MdtPrdKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_CscTruthMapKey
virtual StatusCode execute(const EventContext &ctx) const override final
SG::ReadHandleKey< Muon::CscPrepDataContainer > m_CscPrdKey
SG::ReadHandleKey< MuonSimDataCollection > m_TgcSDOKey
SG::ReadHandleKey< MuonSimDataCollection > m_sTgcSDOKey
SG::ReadHandleKey< CscSimDataCollection > m_CscSDOKey
SG::ReadHandleKey< Muon::MMPrepDataContainer > m_MmPrdKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_MmTruthMapKey
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
SG::ReadHandleKey< MuonSimDataCollection > m_MdtSDOKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_MdtTruthMapKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_RpcTruthMapKey
virtual StatusCode initialize() override final
SG::ReadHandleKey< MuonSimDataCollection > m_RpcSDOKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_TgcTruthMapKey
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_RpcPrdKey
SG::ReadHandleKey< Muon::TgcPrepDataContainer > m_TgcPrdKey
SG::WriteHandleKey< PRD_MultiTruthCollection > m_sTgcTruthMapKey
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_sTgcPrdKey
SG::ReadHandleKey< MuonSimDataCollection > m_MmSDOKey
StatusCode buildPRD_Truth(const EventContext &ctx, const SG::ReadHandleKey< Muon::MuonPrepDataContainerT< PrdType > > &prepDataKey, const SG::ReadHandleKey< SimCollection > &sdoKey, const SG::WriteHandleKey< PRD_MultiTruthCollection > &outputKey) const
Template to hold collections of MuonPrepRawData objects.
Property holding a SG store/key/clid from which a ReadHandle is made.
bool isPresent() const
Is the referenced object present in SG?
const std::string & key() const
Return the StoreGate ID for the referenced object.
Property holding a SG store/key/clid from which a WriteHandle is made.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
int r
Definition globals.cxx:22
MuonPrepDataContainer< MuonPrepDataCollection< PrdType > > MuonPrepDataContainerT