ATLAS Offline Software
Loading...
Searching...
No Matches
MM_ROD_Decoder.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 <memory>
6#include <unordered_map>
7
11
16
18#include "eformat/Issue.h"
19#include "MM_ROD_Decoder.h"
20
21//===============================================================================
22Muon::MM_ROD_Decoder::MM_ROD_Decoder( const std::string& type, const std::string& name,const IInterface* parent )
23: AthAlgTool(type, name, parent)
24{
25 declareInterface<IMM_ROD_Decoder>( this );
26}
27
28
29//===============================================================================
31{
32 ATH_CHECK(detStore()->retrieve(m_MmIdHelper, "MMIDHELPER"));
33 ATH_CHECK(m_cablingKey.initialize(!m_cablingKey.empty()));
34 ATH_CHECK(m_dscKey.initialize(!m_dscKey.empty()));
35 return StatusCode::SUCCESS;
36}
37
38
39//===============================================================================
40// Processes a ROB fragment and fills the RDO container.
41// If the vector of IdentifierHashes is not empty, then seeded mode is assumed
42// (only requested modules are decoded). This must be made here, because the
43// trigger granularity is a module, whereas ROB granularity is a whole sector.
44// Therefore, refined selection is needed with decoded information.
45StatusCode Muon::MM_ROD_Decoder::fillCollection(const EventContext& ctx, const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment& robFrag, const std::vector<IdentifierHash>& rdoIdhVect, std::unordered_map<IdentifierHash, std::unique_ptr<MM_RawDataCollection>> &rdo_map) const
46{
47 // check fragment for errors
48 try {
49 robFrag.check();
50 } catch (const eformat::Issue &ex) {
51 ATH_MSG_WARNING(ex.what());
52 return StatusCode::SUCCESS;
53 }
54 const Nsw_CablingMap* mmCablingMap{nullptr};
55 if (!m_cablingKey.empty()) {
57 if(!readCondHandle.isValid()){
58 ATH_MSG_ERROR("Cannot find Micromegas cabling map!");
59 return StatusCode::FAILURE;
60 }
61 mmCablingMap = readCondHandle.cptr();
62 }
63 const NswDcsDbData* dcsData{nullptr};
64 if(!m_dscKey.empty()) {
65 SG::ReadCondHandle<NswDcsDbData> readCondHandle{m_dscKey, ctx};
66 if(!readCondHandle.isValid()){
67 ATH_MSG_ERROR("Cannot find the NSW DcsCondDataObj "<<m_dscKey.fullKey());
68 return StatusCode::FAILURE;
69 }
70 dcsData = readCondHandle.cptr();
71 }
72
73
74 // if the vector of hashes is not empty, then we are in seeded mode
75 bool seeded_mode(!rdoIdhVect.empty());
76
77 // have the NSWCommonDecoder take care of the decoding
78 Muon::nsw::NSWCommonDecoder common_decoder(robFrag);
79 const std::vector<Muon::nsw::NSWElink *>& elinks = common_decoder.get_elinks();
80 ATH_MSG_DEBUG("Retrieved "<<elinks.size()<<" elinks");
81 if (elinks.empty()) return StatusCode::SUCCESS;
82
83
84 // loop on elinks. we need an RDO (collection) per quadruplet!
85 for (auto* elink : elinks) {
86
87 // skip null packets
88 if (elink->isNull()) continue;
89
90 // get the offline ID hash (module ctx) to be passed to the RDO
91 // also specifies the index of the RDO in the container.
92 const char* station_name = elink->elinkId()->is_large_station() ? "MML" : "MMS";
93 int station_eta = (int)elink->elinkId()->station_eta();
94 unsigned int station_phi = (unsigned int)elink->elinkId()->station_phi();
95 unsigned int multi_layer = (unsigned int)elink->elinkId()->multi_layer();
96 unsigned int gas_gap = (unsigned int)elink->elinkId()->gas_gap();
97 Identifier module_ID = m_MmIdHelper->elementID(station_name, station_eta, station_phi);
98
99 IdentifierHash module_hashID{0};
100 m_MmIdHelper->get_module_hash(module_ID, module_hashID);
101
102 // if we are in ROI-seeded mode, check if this hashID is requested
103 if (seeded_mode && std::find(rdoIdhVect.begin(), rdoIdhVect.end(), module_hashID) == rdoIdhVect.end()) continue;
104
105 std::unique_ptr<MM_RawDataCollection>& rdo = rdo_map[module_hashID];
106 if (!rdo) rdo = std::make_unique<MM_RawDataCollection>(module_hashID);
107
108 // loop on all channels of this elink to fill the collection
109 const std::vector<Muon::nsw::VMMChannel *>& channels = elink->get_channels();
110 for (auto *channel : channels) {
111 unsigned int channel_number = channel->channel_number();
112 if (channel_number == 0) continue; // skip disconnected vmm channels
113 Identifier channel_ID = m_MmIdHelper->channelID(module_ID, multi_layer, gas_gap, channel_number); // not validating the IDs (too slow)
114 // now we have to check if for this channel there is a correction of the cabling needed
115 if (mmCablingMap) {
116 std::optional<Identifier> correctedChannelId = mmCablingMap->correctChannel(channel_ID, msgStream());
117 if (!correctedChannelId) {
118 ATH_MSG_DEBUG("Channel was shifted outside its connector and is therefore not decoded into and RDO");
119 continue;
120 }
121 channel_ID = (*correctedChannelId);
122 channel_number = m_MmIdHelper->channel(channel_ID);
123 }
124 if (dcsData && !dcsData->isGood(ctx,channel_ID)) continue;
125
126 rdo->push_back(new MM_RawData(channel_ID, channel_number, channel->tdo(),
127 channel->pdo(), channel->rel_bcid(), true));
128 }
129 }
130
131 return StatusCode::SUCCESS;
132}
133
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
This is a "hash" representation of an Identifier.
virtual StatusCode initialize() override
virtual StatusCode fillCollection(const EventContext &, const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment &, const std::vector< IdentifierHash > &, std::unordered_map< IdentifierHash, std::unique_ptr< MM_RawDataCollection > > &) const override
Convert ROBFragments to RDOs.
SG::ReadCondHandleKey< Nsw_CablingMap > m_cablingKey
MM_ROD_Decoder(const std::string &type, const std::string &name, const IInterface *parent)
const MmIdHelper * m_MmIdHelper
SG::ReadCondHandleKey< NswDcsDbData > m_dscKey
Temporary class to hold the MM RDO.
Definition MM_RawData.h:20
const std::vector< Muon::nsw::NSWElink * > & get_elinks() const
bool isGood(const EventContext &ctx, const Identifier &channelId, bool issTgcQ1OuterHv=false) const
Returns whether the channel is alive, i.e. DCS state on, etc...
std::optional< Identifier > correctChannel(const Identifier &id, MsgStream &msg) const
const_pointer_type cptr()
eformat::ROBFragment< PointerType > ROBFragment
Definition RawEvent.h:27