ATLAS Offline Software
NSWTP_ROD_Decoder.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 "NSWTP_ROD_Decoder.h"
5 #include "Identifier/Identifier.h"
6 #include "eformat/Issue.h"
7 #include "eformat/SourceIdentifier.h"
12 
13 
14 namespace Muon {
15 
16 using namespace nsw::STGTPSegments;
20 using namespace nsw::STGTPMMData;
21 //=====================================================================
22 NSWTP_ROD_Decoder::NSWTP_ROD_Decoder(const std::string& type, const std::string& name, const IInterface* parent)
24 {
25  declareInterface<INSWTP_ROD_Decoder>(this);
26 }
27 
29  ATH_CHECK(m_idHelperSvc.retrieve());
30  return StatusCode::SUCCESS;
31 }
32 
33 //=====================================================================
35 {
36  try {
37  fragment.check();
38  } catch (const eformat::Issue& ex) {
39  ATH_MSG_ERROR(ex.what());
40  return StatusCode::FAILURE;
41  }
42 
43  Muon::nsw::NSWTriggerCommonDecoder nsw_trigger_decoder (fragment, "STGL1A");
44 
45  if (nsw_trigger_decoder.has_error()) {
46  ATH_MSG_DEBUG("NSW sTGC TP Common Decoder found exceptions while reading this STGL1A fragment from " + std::to_string(fragment.rob_source_id()) + ". Skipping. Error id: "+std::to_string(nsw_trigger_decoder.error_id()));
47  return StatusCode::SUCCESS;
48  }
49 
50  if (nsw_trigger_decoder.get_elinks().size()==1) {
51  if (dynamic_cast<Muon::nsw::NSWTriggerSTGL1AElink*>(nsw_trigger_decoder.get_elinks()[0].get())->l1a_versionID() >= 3){
52  ATH_MSG_DEBUG("NSW sTGC TP Common Decoder found only one elink in output but incosistent L1A version: something off with this fragment. Skipping.");
53  return StatusCode::SUCCESS;
54  }
55  } else if (nsw_trigger_decoder.get_elinks().size()!=3 && nsw_trigger_decoder.get_elinks().size()!=5) {
56  // this is a severe requirement: a single elink missing would imply the whole event is problematic
57  ATH_MSG_DEBUG("NSW sTGC TP Common Decoder didn't give 3 or 5 elinks in output for: something off with this fragment. Skipping.");
58  return StatusCode::SUCCESS;
59  }
60 
61  bool consistent = true;
62  const auto l0 = dynamic_cast<Muon::nsw::NSWTriggerSTGL1AElink*>(nsw_trigger_decoder.get_elinks()[0].get());
63  for(const auto& baseLink: nsw_trigger_decoder.get_elinks()) {
64  const auto l = dynamic_cast<Muon::nsw::NSWTriggerSTGL1AElink*>(baseLink.get());
65  if (l0->head_sectID() != l->head_sectID()) {consistent = false; break;}
66  if (l0->L1ID() != l->L1ID()) {consistent = false; break;}
67  if (l0->l1a_versionID() != l->l1a_versionID()) {consistent = false; break;}
68  if (l0->l1a_req_BCID() != l->l1a_req_BCID()) {consistent = false; break;}
69  }
70  if (!consistent) {
71  ATH_MSG_WARNING("NSW sTGC TP Common Decoder found inconsistent header parameters in the elinks: something off with this fragment. Skipping.");
72  return StatusCode::SUCCESS;
73  }
74 
75  xAOD::NSWTPRDO* rdo = new xAOD::NSWTPRDO();
76  rdoContainer.push_back(rdo);
77 
78  for(const auto& baseLink: nsw_trigger_decoder.get_elinks()){
80  const auto link = dynamic_cast<Muon::nsw::NSWTriggerSTGL1AElink*>(baseLink.get());
81  const std::shared_ptr<Muon::nsw::NSWResourceId>& elinkID = link->elinkId ();
82 
83  uint32_t moduleID{0};
86  encodeIdentifierProperty(ModuleIDProperty::stationEta, std::abs(elinkID->station_eta()) , moduleID );
88  rdo->set_moduleID(moduleID);
89 
90  // now filling all the header data
91  rdo->set_ROD_L1ID(fragment.rod_lvl1_id ());
92  rdo->set_sectID(link->head_sectID());
93  rdo->set_EC(link->head_EC());
94  rdo->set_BCID(link->head_BCID());
95  rdo->set_L1ID(link->L1ID());
96  rdo->set_window_open_bcid(link->l1a_open_BCID());
97  rdo->set_l1a_request_bcid(link->l1a_req_BCID());
98  rdo->set_window_close_bcid(link->l1a_close_BCID());
99  rdo->set_config_window_open_bcid_offset(link->l1a_open_BCID_offset());
100  rdo->set_config_l1a_request_bcid_offset(link->l1a_req_BCID_offset());
101  rdo->set_config_window_close_bcid_offset(link->l1a_close_BCID_offset());
102 
103  // now we are filling all the pad segment variables
104  const std::vector<STGTPPadPacket>& pad_packets = link->pad_packets();
105  for(uint i_packetIndex = 0; i_packetIndex<pad_packets.size(); i_packetIndex++){
106  const STGTPPadPacket& pad_packet = pad_packets.at(i_packetIndex);
107  for(uint i_candidateIndex=0; i_candidateIndex < 4; i_candidateIndex++){ // we have at most 4 candidates in the input
108  if(pad_packet.BandID(i_candidateIndex) == 255 && pad_packet.PhiID(i_candidateIndex) == 63) continue; // ignore candidates that the trigger processor flags as invalid
109  uint8_t candidateNumber = (i_packetIndex<<4) | i_candidateIndex;
110  rdo->pad_candidateNumber().push_back(candidateNumber);
111  rdo->pad_phiID().push_back(pad_packet.PhiID(i_candidateIndex));
112  rdo->pad_bandID().push_back(pad_packet.BandID(i_candidateIndex));
113  }
114  rdo->pad_BCID().push_back(pad_packet.BCID());
115  rdo->pad_idleFlag().push_back(pad_packet.PadIdleFlag());
116  rdo->pad_coincidence_wedge().push_back(pad_packet.CoincidenceWedge());
117 
118  }
119 
120  // lets fill the output segments (merged)
121  const std::vector<STGTPSegmentPacket>& segment_packets = link->segment_packet();
122  for(uint i_packetIndex = 0; i_packetIndex<segment_packets.size(); i_packetIndex++){
123  const STGTPSegmentPacket& segment_packet = segment_packets.at(i_packetIndex);
124  uint8_t i_candidateIndex{0};
125  for (const STGTPSegmentPacket::SegmentData& payload : segment_packet.Segments()){
126  // we have at most 8 candidates in the output
127  if(payload.dTheta == 16) {
128  ++i_candidateIndex;
129  continue; // ignore candidates that the trigger processor flags as invalid
130  }
131  uint32_t word{0}; // word containing all information about the candidate
133  encodeSegmentProperty(MergedSegmentProperty::Spare, payload.spare ,word);
139  uint8_t candidateNumber = (i_packetIndex<<4) | i_candidateIndex;
140  ++i_candidateIndex;
141 
142  rdo->merge_segments().push_back(word);
143  rdo->merge_candidateNumber().push_back(candidateNumber);
144  }
145  // the first 12 bit are used for the bcid and the last 4 for sector ID
146  uint16_t merge_BCID_sectorID = (segment_packet.BCID() << 4) | segment_packet.SectorID();
147  rdo->merge_BCID_sectorID().push_back(merge_BCID_sectorID);
148  rdo->merge_valid_segmentSelector().push_back(segment_packet.ValidSegmentSelector());
149  rdo->merge_nsw_segmentSelector().push_back(segment_packet.NSW_SegmentSelector());
150  rdo->merge_LUT_choiceSelection().push_back(segment_packet.LUT_ChoiceSelection());
151  }
152 
153  if (link->l1a_versionID() < 3){
154  return StatusCode::SUCCESS;
155  }
156 
157  const std::vector<STGTPMMPacket>& mm_packets = link->mm_packet();
158  for(uint i_packetIndex = 0; i_packetIndex<mm_packets.size(); i_packetIndex++){
159  const STGTPMMPacket& mm_packet = mm_packets.at(i_packetIndex);
160  uint8_t i_candidateIndex{0};
161  for (const STGTPMMPacket::MMSegmentData& payload : mm_packet.Segments()){
162  // we have at most 8 candidates in the output
163  if(payload.dTheta == 16) {
164  ++i_candidateIndex;
165  continue; // ignore candidates that the trigger processor flags as invalid
166  }
167  uint32_t word{0}; // word containing all information about the candidate
169  encodeSegmentProperty(MergedSegmentProperty::Spare, payload.spare ,word);
175  uint8_t candidateNumber = (i_packetIndex<<4) | i_candidateIndex;
176  ++i_candidateIndex;
177 
178  rdo->NSWTP_mm_segments().push_back(word);
179  rdo->NSWTP_mm_candidateNumber().push_back(candidateNumber);
180  }
181  // the first 12 bit are used for the bcid and the last 4 for sector ID
182  rdo->NSWTP_mm_BCID().push_back(mm_packet.BCID());
183  }
184 
185  }
186  return StatusCode::SUCCESS;
187 
188 }
189 } // namespace Muon
Muon::nsw::STGTPSegments::moduleIDBits::detectorSite
constexpr uint8_t detectorSite
Side 0 for A / 1 for C.
Definition: NSWSTGTPDecodeBitmaps.h:154
Muon::nsw::STGTPSegments::ModuleIDProperty::stationPhi
@ stationPhi
NSWTriggerCommonDecoder.h
Muon::nsw::STGTPSegments::encodeIdentifierProperty
constexpr void encodeIdentifierProperty(const ModuleIDProperty prop, const uint32_t word, uint32_t &buffer)
Definition: NSWSTGTPDecodeBitmaps.h:174
Muon::STGTPPadPacket
nsw::STGTPPadPacket STGTPPadPacket
Definition: NSWTP_ROD_Decoder.cxx:18
Muon::nsw::STGTPPadPacket::BCID
std::uint32_t BCID() const
Definition: STGTPPackets.h:50
Muon::NSWTP_ROD_Decoder::initialize
StatusCode initialize() override
Definition: NSWTP_ROD_Decoder.cxx:28
Muon::nsw::STGTPSegments::MergedSegmentProperty::phiID
@ phiID
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:557
xAOD::NSWTPRDO_v1::NSWTP_mm_BCID
const std::vector< uint32_t > & NSWTP_mm_BCID() const
Definition: NSWTPRDO_v1.cxx:77
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
Issue
Configuration Issue
Definition: PscIssues.h:31
Muon::nsw::STGTPSegmentPacket::SectorID
std::uint32_t SectorID() const
Definition: STGTPPackets.h:89
NSWSTGTPDecodeBitmaps.h
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
Muon::nsw::NSWResourceId::station_eta
int8_t station_eta() const
Definition: NSWResourceId.h:99
Muon
This class provides conversion from CSC RDO data to CSC Digits.
Definition: TrackSystemController.h:45
Muon::nsw::STGTPSegments::ModuleIDProperty::stationID
@ stationID
STGTPPackets.h
Muon::nsw::NSWTriggerCommonDecoder::error_id
int error_id() const
Definition: NSWTriggerCommonDecoder.h:34
Muon::nsw::NSWTriggerCommonDecoder::get_elinks
const std::vector< std::shared_ptr< Muon::nsw::NSWTriggerElink > > & get_elinks() const
Definition: NSWTriggerCommonDecoder.h:29
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
Muon::nsw::STGTPSegments::MergedSegmentProperty::phiRes
@ phiRes
xAOD::NSWTPRDO_v1::NSWTP_mm_candidateNumber
const std::vector< uint8_t > & NSWTP_mm_candidateNumber() const
Definition: NSWTPRDO_v1.cxx:67
Muon::nsw::STGTPMMPacket::BCID
std::uint32_t BCID() const
Definition: STGTPPackets.h:38
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Muon::nsw::STGTPSegmentPacket::ValidSegmentSelector
std::uint32_t ValidSegmentSelector() const
Definition: STGTPPackets.h:83
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
eformat::ROBFragment
Definition: L1CaloBsDecoderUtil.h:12
xAOD::NSWTPRDO_v1::NSWTP_mm_segments
const std::vector< uint32_t > & NSWTP_mm_segments() const
Encode the Monitoring, Spare, lowRes, phiRes, dTheta, phiID, rIndex information of each candidate.
Definition: NSWTPRDO_v1.cxx:57
Muon::nsw::STGTPPadPacket::BandID
std::uint32_t BandID(const std::size_t num) const
Definition: STGTPPackets.h:51
Muon::NSWTP_ROD_Decoder::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: NSWTP_ROD_Decoder.h:26
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
xAOD::NSWTPRDO
NSWTPRDO_v1 NSWTPRDO
Define the version of the NRPC RDO class.
Definition: NSWTPRDO.h:13
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Muon::nsw::NSWResourceId::is_large_station
bool is_large_station() const
Definition: NSWResourceId.h:93
Muon::nsw::STGTPPadPacket::CoincidenceWedge
std::uint32_t CoincidenceWedge() const
Definition: STGTPPackets.h:54
Muon::nsw::STGTPSegmentPacket::BCID
std::uint32_t BCID() const
Definition: STGTPPackets.h:88
Muon::nsw::STGTPMMPacket::Segments
const std::array< MMSegmentData, STGTPMMData::num_mm > & Segments() const
Definition: STGTPPackets.h:35
Muon::nsw::NSWResourceId::station_phi
uint8_t station_phi() const
Definition: NSWResourceId.h:114
Muon::nsw::STGTPMMPacket::MMSegmentData
Definition: STGTPPackets.h:21
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Muon::nsw::STGTPSegmentPacket::NSW_SegmentSelector
std::uint32_t NSW_SegmentSelector() const
Definition: STGTPPackets.h:82
Muon::nsw::STGTPSegmentPacket::Segments
const std::array< SegmentData, STGTPSegments::num_segments > & Segments() const
Definition: STGTPPackets.h:85
Muon::nsw::STGTPMMPacket
Definition: STGTPPackets.h:18
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
Muon::nsw::STGTPPadPacket::PadIdleFlag
std::uint32_t PadIdleFlag() const
Definition: STGTPPackets.h:53
xAOD::NSWTPRDO_v1
Definition: NSWTPRDO_v1.h:22
Muon::nsw::NSWTriggerCommonDecoder::has_error
bool has_error() const
Definition: NSWTriggerCommonDecoder.h:33
Muon::nsw::STGTPSegments::ModuleIDProperty::stationEta
@ stationEta
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
Muon::STGTPMMPacket
nsw::STGTPMMPacket STGTPMMPacket
Definition: NSWTP_ROD_Decoder.cxx:19
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
Muon::NSWTP_ROD_Decoder::fillCollection
StatusCode fillCollection(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment &fragment, xAOD::NSWTPRDOContainer &rdoContainer) const override
Definition: NSWTP_ROD_Decoder.cxx:34
NSWTP_ROD_Decoder.h
Muon::nsw::STGTPPadPacket::PhiID
std::uint32_t PhiID(const std::size_t num) const
Definition: STGTPPackets.h:52
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Muon::nsw::STGTPSegments::MergedSegmentProperty::dTheta
@ dTheta
Muon::nsw::STGTPSegmentPacket::LUT_ChoiceSelection
std::uint32_t LUT_ChoiceSelection() const
Definition: STGTPPackets.h:81
ReadCellNoiseFromCoolCompare.l0
l0
Definition: ReadCellNoiseFromCoolCompare.py:359
Muon::NSWTP_ROD_Decoder::NSWTP_ROD_Decoder
NSWTP_ROD_Decoder(const std::string &type, const std::string &name, const IInterface *parent)
Definition: NSWTP_ROD_Decoder.cxx:22
Muon::STGTPSegmentPacket
nsw::STGTPSegmentPacket STGTPSegmentPacket
Definition: NSWTP_ROD_Decoder.cxx:17
Muon::nsw::STGTPSegments::MergedSegmentProperty::Monitor
@ Monitor
AthAlgTool
Definition: AthAlgTool.h:26
Muon::nsw::STGTPSegmentPacket::SegmentData
Definition: STGTPPackets.h:68
Muon::nsw::STGTPPadPacket
Definition: STGTPPackets.h:46
Muon::nsw::NSWTriggerCommonDecoder
Definition: NSWTriggerCommonDecoder.h:21
Muon::nsw::STGTPSegments::MergedSegmentProperty::lowRes
@ lowRes
Muon::nsw::STGTPSegmentPacket
Definition: STGTPPackets.h:66
Muon::nsw::STGTPSegments::encodeSegmentProperty
constexpr void encodeSegmentProperty(const MergedSegmentProperty prop, const uint32_t word, uint32_t &buffer)
Definition: NSWSTGTPDecodeBitmaps.h:141
Muon::nsw::STGTPSegments::MergedSegmentProperty::rIndex
@ rIndex