ATLAS Offline Software
Loading...
Searching...
No Matches
TrigT1TRT.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 <stdint.h>
6#include <fstream>
7
8#include "TrigT1TRT.h"
9
11#include "nlohmann/json.hpp"
12
13namespace LVL1 {
14
15 //--------------------------------
16 // Constructors and destructors
17 //--------------------------------
18
19 TrigT1TRT::TrigT1TRT(const std::string& name, ISvcLocator* pSvcLocator) :
20 AthReentrantAlgorithm(name, pSvcLocator)
21 {
22 }
23
24 //---------------------------------
25 // initialise()
26 //---------------------------------
27
28 StatusCode TrigT1TRT::initialize() {
29
30 ATH_CHECK( m_trtCTPLocation.initialize() );
31
32 ATH_CHECK( m_trtRDOKey.initialize() );
33
34 ATH_CHECK( detStore()->retrieve(m_mgr, "TRT") );
35 ATH_MSG_DEBUG( "Connected to TRT DetectorManager" );
36
37 ATH_CHECK( detStore()->retrieve(m_pTRTHelper, "TRT_ID") );
38 ATH_MSG_DEBUG( "Connected to TRT Helper" );
39
40 ATH_CHECK( m_ConditionsSummary.retrieve() );
41
43
44 ATH_MSG_INFO("Setting Fast-OR trigger multiplicity" << m_TTCMultiplicity );
45
46 // Find the full path to filename:
47 std::string file = PathResolver::find_file(m_maskedChipsFile, "DATAPATH");
48 ATH_MSG_INFO("Reading file " << file);
49 std::ifstream fin(file.c_str());
50 if(!fin){
51 ATH_MSG_ERROR("Can not read file: " << file);
52 return StatusCode::FAILURE;
53 }
54 nlohmann::json data = nlohmann::json::parse(fin);
55
58
59 // initialize numberOfStraws array for use in strawNumber function.
60 for(int j=0; j<75; j++) {
62 }
63
64 // numberofstraws in a phi module layer. m_numberOfStraws[<layer number>]
65 m_numberOfStraws[1]=15;
70 m_numberOfStraws[19]=18;
71 m_numberOfStraws[20]=19;
77 m_numberOfStraws[43]=23;
78 m_numberOfStraws[44]=23;
85 m_numberOfStraws[73]=28;
86
87 // loop over straw hash index to create straw number mapping for TRTViewer
88 unsigned int maxHash = m_pTRTHelper->straw_layer_hash_max();
89 for (unsigned int index = 0; index < maxHash; index++) {
90 IdentifierHash idHash = index;
91 Identifier id = m_pTRTHelper->layer_id(idHash);
92
93 int idBarrelEndcap = m_pTRTHelper->barrel_ec(id);
94 int idLayerWheel = m_pTRTHelper->layer_or_wheel(id);
95 int idPhiModule = m_pTRTHelper->phi_module(id);
96 int idStrawLayer = m_pTRTHelper->straw_layer(id);
97
98 const InDetDD::TRT_BaseElement * element= nullptr;
99
100 // BARREL
101 if (m_pTRTHelper->is_barrel(id)) {
102 int idSide = idBarrelEndcap?1:-1;
103 if(m_pTRTHelper->barrel_ec(id)==-1) {
104 element = m_mgr->getBarrelElement(idSide, idLayerWheel, idPhiModule, idStrawLayer);
105 if (element == nullptr) continue;
106
107 for(unsigned int istraw = 0; istraw < element->nStraws(); istraw++) {
108
109 Identifier strawID = m_pTRTHelper->straw_id(id, int(istraw));
110 int i_chip;
111
112 int tempStrawNumber = BarrelStrawNumber(istraw, idStrawLayer, idLayerWheel);
113
114 m_TRTStrawNeighbourSvc->getChip(strawID,i_chip);
115
116 //21 chips in mod layer 0
117 //33 chips in mod layer 1
118 //50 chips in mod layer 2
119 if (idLayerWheel == 1) i_chip+=21;
120 if (idLayerWheel == 2) i_chip+=54;
121
122 m_mat_chip_barrel[idPhiModule][tempStrawNumber]=i_chip;
123 m_mat_chip_barrel[idPhiModule+32][tempStrawNumber]=i_chip;
124 }
125 }
126 }
127 // ENDCAP
128 else if (m_pTRTHelper->barrel_ec(id)!=1) {
129 int idSide = idBarrelEndcap?2:-2;
130 if(((m_pTRTHelper->barrel_ec(id)==-2) || (m_pTRTHelper->barrel_ec(id)==2))) {
131
132 if (m_pTRTHelper->barrel_ec(id)==-2) idSide =0;
133 else idSide=1;
134
135 element = m_mgr->getEndcapElement(idSide, idLayerWheel, idStrawLayer, idPhiModule);
136 if (element == nullptr) continue;
137
138 for(unsigned int istraw = 0; istraw < element->nStraws(); istraw++) {
139
140 int tempStrawNumber = EndcapStrawNumber(istraw, idStrawLayer, idLayerWheel, idPhiModule, idSide);
141
142 Identifier strawID = m_pTRTHelper->straw_id(id, int(istraw));
143
144 int i_chip = 0;
145
146 m_TRTStrawNeighbourSvc->getChip(strawID,i_chip);
147 i_chip -= 103;
148
149 m_mat_chip_endcap[idPhiModule][tempStrawNumber]=i_chip;
150 m_mat_chip_endcap[idPhiModule+32][tempStrawNumber]=i_chip;
151 }
152 }
153 }
154 }
155
156 ATH_MSG_DEBUG("TrigT1TRT initilized");
157 return StatusCode::SUCCESS;
158 }
159
160 //----------------------------------------------
161 // execute() method called once per event
162 //----------------------------------------------
163
164 StatusCode TrigT1TRT::execute(const EventContext &ctx) const {
165
166 // initialise and empty board score table
167 int barrel_trigger_board[2][32][9] = {{{0}}};
168 int endcap_trigger_board[2][32][20] = {{{0}}};
169
170 // initialise and empty empty ttc score table
171 int barrel_trigger_ttc[2][8] = {{0}};
172 int endcap_trigger_ttc[2][16] = {{0}};
173
174 // access TRT RDO hits container
176
177 ATH_CHECK( trtRDOs.isValid() );
178
179 for (const auto trtRDO : *trtRDOs) {
180 const InDetRawDataCollection<TRT_RDORawData>* TRT_Collection(trtRDO);
181
182 if(!TRT_Collection) {
183 ATH_MSG_WARNING("InDetRawDataCollection<TRT_RDORawData> is empty");
184 continue;
185 }
186 else {
187 // loop over TRT RDOs
188 for (const auto p_rdo : *TRT_Collection) {// p_rdo is pointer to trt rdo data vector
189 if(!p_rdo)
190 ATH_MSG_WARNING("pointer to TRT_RDORawData is nullptr");
191 else {
192 Identifier TRT_Identifier = p_rdo->identify();
193
194 int barrel_ec = m_pTRTHelper->barrel_ec(TRT_Identifier);
195
196 const TRT_LoLumRawData* p_lolum = dynamic_cast<const TRT_LoLumRawData*>(p_rdo);
197 if(!p_lolum) continue;
198
199 // get TRT Identifier (need to know phi module, module layer, straw layer, and straw # with in the layer, to get proper straw numbering.
200 TRT_Identifier = p_lolum->identify();
201 int phi_module = m_pTRTHelper->phi_module(TRT_Identifier);
202 int layer_or_wheel = m_pTRTHelper->layer_or_wheel(TRT_Identifier);
203 int straw_layer = m_pTRTHelper->straw_layer(TRT_Identifier);
204 int straw = m_pTRTHelper->straw(TRT_Identifier);
205 int strawNumber = 0;
206 int chip = 0;
207 int board = 0;
208
209 // Require good straw status
210 if (m_ConditionsSummary->getStatus(TRT_Identifier,ctx) != TRTCond::StrawStatus::Good)
211 continue;
212
213 if (barrel_ec == 1 || barrel_ec == -1) {
214 int side = barrel_ec>0?1:0;
215 strawNumber = BarrelStrawNumber(straw, straw_layer, layer_or_wheel);
216 chip = m_mat_chip_barrel[phi_module][strawNumber];
217 board = BarrelChipToBoard(chip);
218 if (board < 0) {
219 ATH_MSG_FATAL( "Failure in BarrelChipToBoard" );
220 return StatusCode::FAILURE;
221 }
222
223 // check if chip is masked
224 std::vector<int> maskedChips = m_maskedChipsBarrel.at(side).at(phi_module);
225 if(std::find(maskedChips.begin(), maskedChips.end(), chip) != maskedChips.end())
226 continue;
227
228 if ( (p_lolum)->highLevel() ) {
229 barrel_trigger_board[side][phi_module][board]++;
230 }
231
232 }
233 else if (barrel_ec == 2 || barrel_ec == -2) {
234
235 int side = barrel_ec>0?1:0;
236 strawNumber = EndcapStrawNumber(straw, straw_layer, layer_or_wheel, phi_module, barrel_ec);
237 chip = m_mat_chip_endcap[phi_module][strawNumber];
238 board = EndcapChipToBoard(chip);
239
240 // check if chip is masked
241 std::vector<int> maskedChips = m_maskedChipsEc.at(side).at(phi_module);
242 if(std::find(maskedChips.begin(), maskedChips.end(), chip) != maskedChips.end())
243 continue;
244
245 if ( (p_lolum)->highLevel() ) {
246 endcap_trigger_board[side][phi_module][board]++;
247 }
248 }
249 }
250 }
251 }
252 }
253
254 // analyse board score table - fill ttc score table
255 for (int i=0; i<2; i++) {
256 for (int j=0; j<32; j++) {
257 for (int k=0; k<9; k++) {
258 if (barrel_trigger_board[i][j][k]) {
259 barrel_trigger_ttc[i][j%4]++;
260 }
261 }
262 for (int k=0; k<20; k++) {
263 if (endcap_trigger_board[i][j][k]) {
264 endcap_trigger_ttc[i][j%2]++;
265 }
266 }
267 }
268 }
269
270 unsigned int cableWord0 = 0;
271
272 // analyse ttc score table - set cable word
273 for (int i=0; i<2; i++) {
274 for (int j=0; j<8; j++) {
275 if (barrel_trigger_ttc[i][j] >= m_TTCMultiplicity) {
276 cableWord0 |= (uint64_t(0x1) << 21); // use of hard coded cable start
277 }
278 }
279 for (int j=0; j<16; j++) {
280 if (endcap_trigger_ttc[i][j] >= m_TTCMultiplicity) {
281 cableWord0 |= (uint64_t(0x1) << 21); // use of hard coded cable start
282 }
283 }
284 }
285
286 ATH_MSG_DEBUG( " cableWord: " << cableWord0 );
287
288 // form CTP obejct
290
291 // record CTP object
292 ATH_CHECK(trtCTP.record(std::make_unique<TrtCTP>(cableWord0)));
293 ATH_MSG_DEBUG("Stored TRT CTP object with bit " << std::dec << cableWord0);
294
295 return StatusCode::SUCCESS;
296 }
297
298
299 //----------------------------------------------
300 // trigger logic methods
301 //----------------------------------------------
302
303 int TrigT1TRT::BarrelChipToBoard(int chip) const {
304 // return logical board index:
305 // 0 for Board 1S (has 10 chips) 0 - 9
306 // 1 for 1L (11) 10 - 20
307 // 2 for 2S (15) 21 - 35
308 // 3 for 2L, first 9 chips 36 - 44
309 // 4 for 2L, second 9 chips 45 - 53
310 // 5 for 3S, first 11 54 - 64
311 // 6 for 3S, second 12 65 - 76
312 // 7 for 3L, first 13 77 - 89
313 // 8 for 3L, second 14 90 - 103
314
315 int list[] = {10, 11, 15, 9, 9, 11, 12, 13, 14};
316 int count = 0;
317 chip--;
318
319 for (int i=0; i<9; i++) {
320 count += list[i];
321 if (chip < count) return i+1;
322 else if (chip == 104) return 9;
323 }
324
325 throw std::runtime_error("Board not found!");
326 return -1;
327 }
328
329 int TrigT1TRT::EndcapChipToBoard(int chip) const {
330 int Board = -1;
331
332 int remainder = (chip-1) % 12;
333 Board = int(((chip -1) - remainder) / 12);
334 return Board;
335 }
336
337 int TrigT1TRT::EndcapStrawNumber(int strawNumber, int strawLayerNumber, int LayerNumber, int phi_stack, int side) const {
338
339 // before perfoming map, corrections need to be perfomed.
341
342 // for eca, rotate triplets by 180 for stacks 9-16, and 25-32.
343 static const int TripletOrientation[2][32] = {
344 {1,1,1,1,1,1,1,1,
345 0,0,0,0,0,0,0,0,
346 1,1,1,1,1,1,1,1,
347 0,0,0,0,0,0,0,0},
348 {1,1,1,1,1,1,1,1,
349 0,0,0,0,0,0,0,0,
350 1,1,1,1,1,1,1,1,
351 0,0,0,0,0,0,0,0}
352 };
353
354 int phi1=-1;
355 if(side==2) phi1=phi_stack, side=1;
356 else if (side==-2) phi1=31-phi_stack, side=0;
357 if (phi1>-1){
358 if (TripletOrientation[side][phi1]){
359 // change straw number from 0-23 in straw layer to 0-192
360 if (strawLayerNumber < 8)strawNumber = strawNumber + 24*strawLayerNumber;
361 if (strawLayerNumber > 7)strawNumber = strawNumber + 24*(strawLayerNumber -8);
362 strawNumber = (192-1)*TripletOrientation[side][phi1]+strawNumber*(1-2*TripletOrientation[side][phi1]);//actual rotation
363
364 // take strawNumber back to 0-23
365 if (strawLayerNumber<8) strawLayerNumber = int(strawNumber/24);
366 if (strawLayerNumber>7) strawLayerNumber = int(strawNumber/24) + 8;
367 strawNumber = strawNumber%24;
368 }
369
370 // finish rotation
371
372 // flip straw in layer.
373
374 if (side==0) strawNumber = 23 - strawNumber;
375
376 // finish flipping
377 }
378
379 // done with corrections
380
381 // start mapping from athena identifiers to TRTViewer maps
382 int strawNumberNew=0;
383
384 if(LayerNumber<6 && strawLayerNumber>7) {
385 strawNumberNew=strawNumberNew+(384*LayerNumber);
386 strawNumberNew=strawNumberNew+192+(strawLayerNumber%8)+(strawNumber*8);
387 }
388 else if(LayerNumber<6 && strawLayerNumber<8) {
389 strawNumberNew=strawNumberNew+(384*LayerNumber);
390 strawNumberNew=strawNumberNew + (strawLayerNumber%8) + (strawNumber*8);
391 }
392 else if(LayerNumber>5 && strawLayerNumber>7) {
393 strawNumberNew = strawNumberNew + 2304 + 192*(LayerNumber-6);
394 strawNumberNew = strawNumberNew + 192 + (strawLayerNumber%8) + (8*strawNumber);
395 }
396 else if(LayerNumber>5 && strawLayerNumber<8) {
397 strawNumberNew = strawNumberNew + 2304 + 192*(LayerNumber-6);
398 strawNumberNew = strawNumberNew + (strawLayerNumber%8) + (8*strawNumber);
399 }
400
401 strawNumber=strawNumberNew;
402
403 return strawNumber;
404 }
405
406 int TrigT1TRT::BarrelStrawNumber(int strawNumber, int strawlayerNumber, int LayerNumber) const {
407 int addToStrawNumber=0;
408 int addToStrawNumberNext=0;
409 int i=0;
410
411 do {
412 i++;
413 addToStrawNumber+=m_numberOfStraws[i-1];
414 addToStrawNumberNext = addToStrawNumber+m_numberOfStraws[i];
415 }
416 while(BarrelStrawLayerNumber(strawlayerNumber,LayerNumber)!=i-1);
417 strawNumber = addToStrawNumberNext - strawNumber-1;
418 return strawNumber;
419 }
420
421 int TrigT1TRT::BarrelStrawLayerNumber(int strawLayerNumber, int LayerNumber) const {
422 if(LayerNumber==0) {
423 strawLayerNumber+=0;
424 } else if(LayerNumber==1) {
425 strawLayerNumber+=19;
426 } else if(LayerNumber==2) {
427 strawLayerNumber+=43;
428 }
429 return strawLayerNumber;
430 }
431
432}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
This is a "hash" representation of an Identifier.
Virtual base class of TRT readout elements.
unsigned int nStraws() const
Number of straws in the element.
virtual Identifier identify() const override final
virtual StatusCode initialize() override
Definition TrigT1TRT.cxx:28
ToolHandle< ITRT_StrawStatusSummaryTool > m_ConditionsSummary
Definition TrigT1TRT.h:50
int m_numberOfStraws[75]
Definition TrigT1TRT.h:77
Gaudi::Property< std::string > m_maskedChipsFile
Definition TrigT1TRT.h:61
Gaudi::Property< int > m_TTCMultiplicity
Definition TrigT1TRT.h:60
SG::WriteHandleKey< TrtCTP > m_trtCTPLocation
Definition TrigT1TRT.h:44
const TRT_ID * m_pTRTHelper
Definition TrigT1TRT.h:57
SG::ReadHandleKey< TRT_RDO_Container > m_trtRDOKey
Definition TrigT1TRT.h:47
ServiceHandle< ITRT_StrawNeighbourSvc > m_TRTStrawNeighbourSvc
Definition TrigT1TRT.h:53
int BarrelStrawNumber(int strawNumber, int strawlayerNumber, int LayerNumber) const
unsigned char m_mat_chip_endcap[64][3840]
Definition TrigT1TRT.h:75
int BarrelStrawLayerNumber(int strawLayerNumber, int LayerNumber) const
virtual StatusCode execute(const EventContext &ctx) const override
unsigned char m_mat_chip_barrel[64][1642]
Definition TrigT1TRT.h:74
std::array< std::array< std::vector< int >, 32 >, 2 > m_maskedChipsBarrel
Definition TrigT1TRT.h:64
TrigT1TRT(const std::string &name, ISvcLocator *pSvcLocator)
Definition TrigT1TRT.cxx:19
int EndcapStrawNumber(int strawNumber, int strawLayerNumber, int LayerNumber, int phi_stack, int side) const
int EndcapChipToBoard(int chip) const
int BarrelChipToBoard(int chip) const
const InDetDD::TRT_DetectorManager * m_mgr
Definition TrigT1TRT.h:56
std::array< std::array< std::vector< int >, 32 >, 2 > m_maskedChipsEc
Definition TrigT1TRT.h:65
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
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.
std::vector< std::string > remainder(const std::vector< std::string > &v1, const std::vector< std::string > &v2)
bool highLevel(unsigned int m_word)
Definition driftCircle.h:88
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition index.py:1
TFile * file