ATLAS Offline Software
Loading...
Searching...
No Matches
TrigT1RPC.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "TrigT1RPC.h"
6
9
11
14
17
20
21#include <algorithm>
22#include <cmath>
23#include <stdexcept>
24
27
28TrigT1RPC::TrigT1RPC(const std::string& name, ISvcLocator* pSvcLocator) :
29 AthReentrantAlgorithm(name, pSvcLocator) {
30}
31
32// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
33
35 ATH_MSG_INFO("Initializing");
36 ATH_CHECK(m_idHelperSvc.retrieve());
37 ATH_CHECK(m_readKey.initialize());
38 ATH_CHECK(m_rpcDigitKey.initialize());
41 ATH_CHECK(m_bis78TrigKey.initialize());
42 ATH_CHECK(m_muDetMgrKey.initialize());
43 if(m_nobxs>8){
44 //The RPC simulation uses many arrays that assume maximum 8 BCs are readout
45 //See TrigT1/TrigT1RPChardware/Matrix.h for example
46 ATH_MSG_ERROR("Readout of more than 8 BCs is not supported by the simulation");
47 return StatusCode::FAILURE;
48 }
49 return StatusCode::SUCCESS;
50}
51
52
53
54// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
55// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
56
57
58StatusCode TrigT1RPC::execute(const EventContext& ctx) const {
59
62
63 RPCsimuData data; // instantiate the container for the RPC digits
64 BIS78_triggerSimulation bis78Sim; // BIS78 simulation helper
65 CHECK(fill_RPCdata(ctx, data, bis78Sim, readCdo.cptr(), muDetMgrHandle.cptr())); // fill the data with RPC simulated digts
66
68 "RPC data loaded from G3:" << "\n"
70 << "RPC digits into station 1 ==> "
71 << data.how_many(-1,-1,1,-1,-1,-1) << "\n"
72 << "RPC digits into station 2 ==> "
73 << data.how_many(-1,-1,2,-1,-1,-1) << "\n"
74 << "RPC digits into station 3 ==> "
75 << data.how_many(-1,-1,3,-1,-1,-1)
76 );
77 // ******************** Start of Level-1 simulation section *****************
78 unsigned long int debug;
79
82 CMAdata patterns(&data, readCdo.cptr(), debug); //
83 //
84 ATH_MSG_DEBUG ( "CMApatterns created from RPC digits:" << "\n" //
87
88
91 PADdata pads(&patterns,debug); //
92 //
93 ATH_MSG_DEBUG ( "PADs created from CMA patterns:" << "\n"
94 << ShowData<PADdata>(pads,"",m_data_detail) );
96
97
100 SLdata sectors(&pads,debug); //
101 //
102 ATH_MSG_DEBUG("Sector Logics created from PAD patterns:" //
103 << "\n" //
104 << ShowData<SLdata>(sectors,"",m_data_detail) ); //
106
108 LVL1MUONIF::Lvl1MuCTPIInput * ctpiInRPC = nullptr;
109 LVL1MUONIF::Lvl1MuCTPIInputPhase1 * ctpiPhase1InRPC = nullptr;
110 if(m_useRun3Config){
112 ATH_CHECK(wh_muctpiRpc.record(std::make_unique<LVL1MUONIF::Lvl1MuCTPIInputPhase1>()));
113 ctpiPhase1InRPC = wh_muctpiRpc.ptr();
114 }else{
116 ATH_CHECK(wh_muctpiRpc.record(std::make_unique<LVL1MUONIF::Lvl1MuCTPIInput>()));
117 ctpiInRPC = wh_muctpiRpc.ptr();
118 }
119
120 //
121 SLdata::PatternsList sectors_patterns = sectors.give_patterns(); //
122 SLdata::PatternsList::iterator SLit = sectors_patterns.begin(); //
123 //
124 while(SLit != sectors_patterns.end()) //
125 { //
126 SectorLogic* logic = (*SLit)->give_SectorL(readCdo.cptr(), m_nobxs, m_bczero);
127 int sector = (*SLit)->sector(); //
128 int subsystem = (sector > 31)? 1 : 0; //
129 int logic_sector = sector%32;//
130
131 for (int dbc=m_firstBC_to_MUCTPI; dbc<=m_lastBC_to_MUCTPI; dbc++){
132
133 unsigned int data_word = 0;
134 try {
135 data_word = logic->outputToMuCTPI(dbc);
136 }
137 catch (const std::out_of_range& ex) {
138 ATH_MSG_WARNING(ex.what());
139 }
140 ATH_MSG_DEBUG( //
141 "Input to MuCTPI: side=" << subsystem //
142 << ", SL= " << logic_sector //
143 << ", BC= " << dbc
144 << ", RoI=" << TriggerRPC::ROI1(data_word) //
145 << ", Th=" << TriggerRPC::PT1(data_word) //
146 << ", data word " << MSG::hex << data_word //
147 << MSG::dec ); //
148 if(m_useRun3Config){
150 sldata.convertFromWordFormat(data_word);
152 sldata2.bcid( sldata.bcid() );
153 if(sldata.is2candidatesInSector()) sldata2.set2candidatesInSector();
154 else sldata2.clear2candidatesInSector();
155 for(int icand = 0 ; icand < 2 ; icand++){ // up to 2 candidates
156 sldata2.pt(icand, sldata.pt(icand) );
157 sldata2.roi(icand, sldata.roi(icand) );
158 sldata2.ovl(icand, sldata.ovl(icand) );
159 sldata2.charge(icand, sldata.charge(icand) );
160 if(sldata.is2candidates(icand)) sldata2.set2candidates(icand);
161 else sldata2.clear2candidates(icand);
162 }
163 ctpiPhase1InRPC->setSectorLogicData(sldata2,0,subsystem,logic_sector,dbc);
164 }else{
165 ctpiInRPC->setSectorLogicData(data_word,0,subsystem,logic_sector,dbc);
166 }
167 }
168 //
169 ++SLit; //
170 }
171
172 //
173 //
174
175 ATH_MSG_DEBUG ("put RPC Lvl1MuCTPIInput into SG" ); //
176
178
179
180
181 // ******************* Start of Level-1 computation section *****************
182
183
184 // ******************* Start Byte Stream production *************************
185
187 {
188 RPCbytestream bytestream (patterns,
189 (std::string) m_bytestream_file,
190 msg(),
191 (unsigned long int) m_cma_ro_debug,
192 (unsigned long int) m_pad_ro_debug,
193 (unsigned long int) m_rx_ro_debug,
194 (unsigned long int) m_sl_ro_debug,
195 (unsigned long int) m_cma_rostruct_debug,
196 (unsigned long int) m_pad_rostruct_debug,
197 (unsigned long int) m_rx_rostruct_debug,
198 (unsigned long int) m_sl_rostruct_debug,
200
201
202 // Example on how to access the byte stream data.
203 // Only the bare structure is dump. To access a specific data member, use
204 // the interface methods of MatrixReadOut and PadReadOut classes.
205
206 ATH_MSG_DEBUG("Start retrieving data from the RPC bytestream class");
207
208 RPCbytestream::PAD_Readout PADmap = bytestream.pad_readout();
209 RPCbytestream::PAD_Readout::iterator it = PADmap.begin();
210 while (it != PADmap.end())
211 {
212 // load the PAD data into a ostrstream object
213 std::ostringstream PADdata;
214
215 (*it).second.give_pad_readout()->bytestream(PADdata);
216
217 //access to PadReadOut class and print the informations inside
218 ATH_MSG_DEBUG ("Start dumping the PAD " << (*it).second.PAD()
219 << " bytestream structure" << "\n"
220 << PADdata.str());
221
222 //access to MatrixReadOut classes given in input to that PAD
223 for (int i=0;i<8;++i)
224 {
225 ATH_MSG_DEBUG( "Start dumping the Matrix " << i
226 << " into the PAD n. " << (*it).second.PAD());
227
228 MatrixReadOut* matrix_read_out=(*it).second.matrices_readout(i);
229
230 if(matrix_read_out)
231 { // load the Matrix data into a ostrstream object
232 std::ostringstream CMAdata;
233 CMAdata << *matrix_read_out;
234
235 ATH_MSG_DEBUG (CMAdata.str());
236 }
237 else
238 {
239 ATH_MSG_DEBUG( "Matrix Read Out not loaded");
240 }
241 }
242
243 ++it;
244 }
245 }
246
247 // ******************* Start of BIS78 section *****************
248
249 // Now BIS78 Trigger
250 const uint8_t dstrip_phi=1; // Delta phi for BIS78 coincidence
251 const uint8_t dstrip_eta=1; // Delta eta for BIS78 coincidence
252 const uint16_t bcid=0;
253
255 ATH_CHECK(wh_bis78RpcTrigData.record(std::make_unique<Muon::RpcBis78_TrigRawDataContainer>()));
256
257 bis78Sim.build_trigRawData(wh_bis78RpcTrigData.ptr(), dstrip_phi, dstrip_eta, bcid);
258
259 return StatusCode::SUCCESS;
260}
261
262StatusCode TrigT1RPC::fill_RPCdata(const EventContext& ctx, RPCsimuData &data, BIS78_triggerSimulation& bis78Sim, const RpcCablingCondData *readCdo, const MuonGM::MuonDetectorManager *muDetMgr) const
263{
264 ATH_MSG_DEBUG("in execute(): fill RPC data");
265
267 if (!rh_rpcDigits.isValid())
268 {
269 ATH_MSG_WARNING("No RPC digits container found");
270 return StatusCode::SUCCESS;
271 }
272
273 int bisStationIndex = m_idHelperSvc->rpcIdHelper().stationNameIndex("BIS");
274
275 for (const RpcDigitCollection *rpcCollection : *rh_rpcDigits)
276 {
277
278 Identifier moduleId = rpcCollection->identify();
279
280 if (!m_idHelperSvc->isRpc(moduleId))
281 {
282 continue;
283 }
284
285 for (const RpcDigit *rpcDigit : *rpcCollection) {
286
287 Identifier channelId = rpcDigit->identify();
288 const int stationType = m_idHelperSvc->rpcIdHelper().stationName(channelId);
289 std::string StationName = m_idHelperSvc->rpcIdHelper().stationNameString(stationType);
290 int StationEta = m_idHelperSvc->rpcIdHelper().stationEta(channelId);
291 int StationPhi = m_idHelperSvc->rpcIdHelper().stationPhi(channelId);
292 int DoubletR = m_idHelperSvc->rpcIdHelper().doubletR(channelId);
293 int DoubletZ = m_idHelperSvc->rpcIdHelper().doubletZ(channelId);
294 int DoubletP = m_idHelperSvc->rpcIdHelper().doubletPhi(channelId);
295 int GasGap = m_idHelperSvc->rpcIdHelper().gasGap(channelId);
296 int MeasuresPhi = m_idHelperSvc->rpcIdHelper().measuresPhi(channelId);
297 int Strip = m_idHelperSvc->rpcIdHelper().strip(channelId);
298
299 const MuonGM::RpcReadoutElement *descriptor =
300 muDetMgr->getRpcReadoutElement(channelId);
301
302 // Get the global position of RPC strip from MuonDetDesc
303 Amg::Vector3D pos = descriptor->stripPos(channelId);
304
305 // Get the Level-1 numbering schema for the RPC strips
306 unsigned long int strip_code_cab = readCdo->strip_code_fromOffId(StationName, StationEta, StationPhi,
307 DoubletR, DoubletZ, DoubletP, GasGap, MeasuresPhi, Strip);
308
309 if (strip_code_cab)
310 {
311 // Fill data for the Level-1 RPC digit
312 float xyz[4];
313 xyz[1] = pos.x() / 10.; // coo[0]; //RPC strip x coordinate
314 xyz[2] = pos.y() / 10.; // coo[1]; //RPC strip y coordinate
315 xyz[3] = pos.z() / 10.; // coo[2]; //RPC strip z coordinate
316 xyz[0] = rpcDigit->time(); // time of digits
317
318 int param[3] = {0, 0, 0};
319
320 RPCsimuDigit digit(0, strip_code_cab, param, xyz);
321
322 data << digit;
323
324 ATH_MSG_DEBUG("Muon Identifiers from GM:" << "\n"
325 << " StationName = " << StationName << "\n"
326 << " StationEta = " << StationEta << "\n"
327 << " StationPhi = " << StationPhi << "\n"
328 << " DoubletR = " << DoubletR << "\n"
329 << " DoubletZ = " << DoubletZ << "\n"
330 << " DoubletP = " << DoubletP << "\n"
331 << " GasGap = " << GasGap << "\n"
332 << " MeasuresPhi = " << MeasuresPhi << "\n"
333 << " Strip = " << Strip);
334
335 ATH_MSG_DEBUG("RPC Digit from GM:" << "\n"
336 << " " << std::hex << channelId << std::dec << "\n"
337 << " GlobalPosition (cm) = "
338 << setiosflags(std::ios::fixed) << std::setprecision(3)
339 << std::setw(11) << pos.x()
340 << setiosflags(std::ios::fixed) << std::setprecision(3)
341 << std::setw(11) << pos.y()
342 << setiosflags(std::ios::fixed) << std::setprecision(3)
343 << std::setw(11) << pos.z());
344 }
345
346 // This section fills the BIS strip data
347 if (stationType == bisStationIndex) {
348 ATH_MSG_DEBUG("Filling BIS strip data: StationName=" << StationName << " StationEta=" << StationEta
349 << " StationPhi=" << StationPhi << " MeasuresPhi=" << MeasuresPhi
350 << " Strip=" << Strip << " GasGap=" << GasGap
351 << " Time=" << rpcDigit->time());
352
353 bis78Sim.AddStrip(StationEta, StationPhi, GasGap, MeasuresPhi, Strip);
354 }
355 }
356 }
357
358 return StatusCode::SUCCESS;
359}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
const bool debug
#define xyz
An algorithm that can be simultaneously executed in multiple threads.
unsigned int AddStrip(int sectoreta, int sectorphi, int igap, int mphi, int strip)
void build_trigRawData(Muon::RpcBis78_TrigRawDataContainer *trgContainer, uint8_t dstrip_phi, uint8_t dstrip_eta, uint16_t bcid) const
Class representing data from a barrel SL board.
Class representing data from a barrel SL board.
const Lvl1MuSectorLogicData & convertFromWordFormat(const SectorLogicWord &)
Convert SectorLogicData from 32 bit word data.
Class representing (part of) the input data to the MuCTPI for Phase 1.
void setSectorLogicData(const Lvl1MuSectorLogicDataPhase1 &data, size_t systemAddress, size_t subSystemAddress, size_t sectorAddress, int bcid=0)
Class representing (part of) the input data to the MuCTPI.
void setSectorLogicData(const Lvl1MuSectorLogicData &data, size_t systemAddress, size_t subSystemAddress, size_t sectorAddress, int bcid=0)
The MuonDetectorManager stores the transient representation of the Muon Spectrometer geometry and pro...
const RpcReadoutElement * getRpcReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
An RpcReadoutElement corresponds to a single RPC module; therefore typicaly a barrel muon station con...
std::map< int, PADreadout, std::less< int > > PAD_Readout
const PAD_Readout & pad_readout(void) const
unsigned long int strip_code_fromOffId(const std::string &stationName, int stationEta, int stationPhi, int doubletR, int doubletZ, int doubletPhi, int gasGap, int measuresPhi, int strip) const
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
PatternsList give_patterns(void)
Definition SLdata.cxx:78
std::list< SLpatterns * > PatternsList
Definition SLdata.h:19
CMAword outputToMuCTPI(int deltaBC=0)
IntegerProperty m_sl_rostruct_debug
Definition TrigT1RPC.h:58
BooleanProperty m_data_detail
Definition TrigT1RPC.h:66
BooleanProperty m_hardware_emulation
Definition TrigT1RPC.h:62
IntegerProperty m_rx_rostruct_debug
Definition TrigT1RPC.h:57
IntegerProperty m_fast_debug
Definition TrigT1RPC.h:44
IntegerProperty m_pad_rostruct_debug
Definition TrigT1RPC.h:56
SG::ReadCondHandleKey< MuonGM::MuonDetectorManager > m_muDetMgrKey
Definition TrigT1RPC.h:77
Gaudi::Property< int > m_nobxs
Definition TrigT1RPC.h:87
IntegerProperty m_firstBC_to_MUCTPI
Definition TrigT1RPC.h:69
IntegerProperty m_rx_ro_debug
Definition TrigT1RPC.h:52
SG::WriteHandleKey< Muon::RpcBis78_TrigRawDataContainer > m_bis78TrigKey
Definition TrigT1RPC.h:85
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition TrigT1RPC.h:78
SG::WriteHandleKey< LVL1MUONIF::Lvl1MuCTPIInput > m_muctpiKey
Definition TrigT1RPC.h:83
SG::ReadHandleKey< RpcDigitContainer > m_rpcDigitKey
Definition TrigT1RPC.h:82
IntegerProperty m_lastBC_to_MUCTPI
Definition TrigT1RPC.h:70
BooleanProperty m_useRun3Config
Definition TrigT1RPC.h:72
virtual StatusCode initialize() override
Definition TrigT1RPC.cxx:34
StringProperty m_bytestream_file
Definition TrigT1RPC.h:64
virtual StatusCode execute(const EventContext &ctx) const override
Definition TrigT1RPC.cxx:58
TrigT1RPC(const std::string &name, ISvcLocator *pSvcLocator)
Definition TrigT1RPC.cxx:28
IntegerProperty m_cma_debug
Definition TrigT1RPC.h:46
SG::WriteHandleKey< LVL1MUONIF::Lvl1MuCTPIInputPhase1 > m_muctpiPhase1Key
Definition TrigT1RPC.h:84
Gaudi::Property< int > m_bczero
Definition TrigT1RPC.h:88
SG::ReadCondHandleKey< RpcCablingCondData > m_readKey
Definition TrigT1RPC.h:80
StatusCode fill_RPCdata(const EventContext &ctx, RPCsimuData &, BIS78_triggerSimulation &, const RpcCablingCondData *readCdo, const MuonGM::MuonDetectorManager *muDetMgr) const
IntegerProperty m_cma_ro_debug
Definition TrigT1RPC.h:50
IntegerProperty m_sl_ro_debug
Definition TrigT1RPC.h:53
IntegerProperty m_cma_rostruct_debug
Definition TrigT1RPC.h:55
IntegerProperty m_sl_debug
Definition TrigT1RPC.h:48
IntegerProperty m_pad_debug
Definition TrigT1RPC.h:47
BooleanProperty m_bytestream_production
Definition TrigT1RPC.h:63
IntegerProperty m_pad_ro_debug
Definition TrigT1RPC.h:51
std::vector< std::string > patterns
Definition listroot.cxx:187
Eigen::Matrix< double, 3, 1 > Vector3D
unsigned short int PT1(unsigned long int slword)
Definition decodeSL.cxx:70
unsigned short int ROI1(unsigned long int slword)
Definition decodeSL.cxx:34