ATLAS Offline Software
Loading...
Searching...
No Matches
MM_RawDataProviderToolMT.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6// MM_RawDataProviderToolMT.cxx, (c) ATLAS Detector software
8
11#include "eformat/SourceIdentifier.h"
12using eformat::helper::SourceIdentifier;
13
14//==============================================================================
15Muon::MM_RawDataProviderToolMT::MM_RawDataProviderToolMT(const std::string& t, const std::string& n, const IInterface* p)
17{
18 declareInterface<IMuonRawDataProviderTool>(this);
19
20}
21
22
23//==============================================================================
25{
26 // generate all the Source Identifiers for MicroMegas to request the fragments.
27 // assume 16 RODs per side (one per sector) and that ROB ID = ROD ID.
28 for (uint32_t detID : {eformat::MUON_MMEGA_ENDCAP_A_SIDE, eformat::MUON_MMEGA_ENDCAP_C_SIDE}) { //0x6B, 0x6C
29 for (uint8_t sectorID(0); sectorID < 16; ++sectorID) {
30 // for now lets build all the possible ROB ids of all possible readout configurations
31 // maybe later we can come up with a smart way to detect which readout sheme is running and only request the relevant ROB ids from the ROBDataProviderSvc
32 // reference: slide 6 of https://indico.cern.ch/event/1260377/contributions/5294286/attachments/2603399/4495810/NSW-SwRod-Felix-v3.pdf
33
34 uint16_t moduleID = (0x0 << 8) | sectorID; // combined/single ROB
35 SourceIdentifier sid(static_cast<eformat::SubDetector>(detID), moduleID);
36 m_allRobIds.push_back(sid.simple_code());
37
38 moduleID = (0x1 << 8) | sectorID; // full device ROB (split configuration)
39 sid = SourceIdentifier(static_cast<eformat::SubDetector>(detID), moduleID);
40 m_allRobIds.push_back(sid.simple_code());
41
42 moduleID = (0x2 << 8) | sectorID; // shared device ROB (split configuration)
43 sid = SourceIdentifier(static_cast<eformat::SubDetector>(detID), moduleID);
44 m_allRobIds.push_back(sid.simple_code());
45
46 }
47 }
48
51 return StatusCode::SUCCESS;
52}
53
54
55//==============================================================================
56StatusCode Muon::MM_RawDataProviderToolMT::initRdoContainer(const EventContext& ctx, MM_RawDataContainer*& rdoContainer) const
57{
58 // Create the identifiable RdoContainer in StoreGate to be filled with decoded fragment contents.
60
61
62 const bool externalCacheRDO = !m_rdoContainerCacheKey.key().empty();
63 if(!externalCacheRDO){
64 ATH_CHECK(rdoContainerHandle.record(std::make_unique<MM_RawDataContainer>(m_maxhashtoUse)));
65 ATH_MSG_DEBUG("Created MM container");
66 } else {
68 ATH_CHECK(update.isValid());
69 ATH_CHECK(rdoContainerHandle.record(std::make_unique<MM_RawDataContainer>(update.ptr())));
70 ATH_MSG_DEBUG("Created MM container using cache for " << m_rdoContainerCacheKey.key());
71 }
72
73 // this should never happen, but since we dereference the pointer, we should check
74 if (!(rdoContainer = rdoContainerHandle.ptr())) {
75 ATH_MSG_ERROR("the MM RDO container is null, cannot decode MM data");
76 return StatusCode::FAILURE;
77 }
78
79 return StatusCode::SUCCESS;
80}
81
82//==============================================================================
83StatusCode Muon::MM_RawDataProviderToolMT::convert(const std::vector<uint32_t>& robIds, const EventContext& ctx) const {
84 // method for RoI-seeded mode via ROB IDs
85 MM_RawDataContainer* rdoContainer{nullptr};
86 ATH_CHECK(initRdoContainer(ctx, rdoContainer));
87
88 if (robIds.empty() || m_skipDecoding) return StatusCode::SUCCESS;
89
90 std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> vecRobf;
91
92 m_robDataProvider->getROBData(ctx, robIds, vecRobf);
93
94 // pass empty list of ID hashes, every ROB ID in list will be decoded
95 const std::vector<IdentifierHash> hashIDList;
96 return convertIntoContainer(ctx, vecRobf, hashIDList, *rdoContainer);
97}
98
99//==============================================================================
100StatusCode Muon::MM_RawDataProviderToolMT::convert(const std::vector<IdentifierHash>& rdoIdhVect, const EventContext& ctx) const
101{
102 // method for RoI-seeded mode via hash IDs. we don't let empty hash containers reach the decoder,
103 // since an empty container means unseeded mode (decode everything).
104
105 MM_RawDataContainer* rdoContainer{nullptr};
106 ATH_CHECK(initRdoContainer(ctx, rdoContainer));
107
108 if (rdoIdhVect.empty() || m_skipDecoding) return StatusCode::SUCCESS;
109
110 std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> vecRobf;
111 m_robDataProvider->getROBData(ctx, m_allRobIds, vecRobf);
112
113 return convertIntoContainer(ctx, vecRobf, rdoIdhVect, *rdoContainer);
114}
115
116
117//==============================================================================
118StatusCode Muon::MM_RawDataProviderToolMT::convert(const EventContext& ctx) const
119{
120 // method for unseeded mode. just decode everything.
121
122 MM_RawDataContainer* rdoContainer{nullptr};
123 ATH_CHECK(initRdoContainer(ctx, rdoContainer));
124 if(m_skipDecoding) return StatusCode::SUCCESS;
125
126 std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> vecRobf;
127 m_robDataProvider->getROBData(ctx, m_allRobIds, vecRobf);
128
129 // dummy hashID vector for the decoder (empty = unseeded mode)
130 const std::vector<IdentifierHash> rdoIdhVect;
131
132 return convertIntoContainer(ctx, vecRobf, rdoIdhVect, *rdoContainer);
133}
134
135
136//==============================================================================
137StatusCode Muon::MM_RawDataProviderToolMT::convert() const //call decoding function using list of all detector ROBId's
138{
139 ATH_MSG_ERROR("MM_RawDataProviderToolMT::convert() Not implemented.");
140 return StatusCode::FAILURE;
141}
142
143StatusCode Muon::MM_RawDataProviderToolMT::convert(const std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*>&) const
144{
145 ATH_MSG_ERROR("MM_RawDataProviderToolMT::convert(const ROBFragmentList&) not implemented.");
146 return StatusCode::FAILURE;
147}
148
149StatusCode Muon::MM_RawDataProviderToolMT::convert(const std::vector<IdentifierHash>&) const
150{
151 ATH_MSG_ERROR("MM_RawDataProviderToolMT::convert(const std::vector<IdentifierHash>&) not implemented.");
152 return StatusCode::FAILURE;
153}
154
155StatusCode Muon::MM_RawDataProviderToolMT::convert( const std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*>&, const std::vector<IdentifierHash>&) const
156{
157 ATH_MSG_ERROR("MM_RawDataProviderToolMT::convert(const ROBFragmentList&) not implemented.");
158 return StatusCode::FAILURE;
159}
160
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
virtual StatusCode initialize() override
Standard AlgTool method.
ServiceHandle< IROBDataProviderSvc > m_robDataProvider
Rob Data Provider handle.
Gaudi::Property< bool > m_skipDecoding
Flag to skip decoding and write empty container.
virtual StatusCode convertIntoContainer(const EventContext &ctx, const std::vector< const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment * > &, const std::vector< IdentifierHash > &, MM_RawDataContainer &) const
Method that converts the ROBFragments into the passed container.
MM_RawDataProviderToolCore(const std::string &t, const std::string &n, const IInterface *p)
Default constructor.
SG::WriteHandleKey< MM_RawDataContainer > m_rdoContainerKey
RDO container key.
virtual StatusCode convert() const override
for the entire event
virtual StatusCode initialize() override
Standard AlgTool method.
SG::UpdateHandleKey< MM_RawDataCollection_Cache > m_rdoContainerCacheKey
MM_RawDataProviderToolMT(const std::string &t, const std::string &n, const IInterface *p)
Default constructor.
StatusCode initRdoContainer(const EventContext &, MM_RawDataContainer *&) const
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.