ATLAS Offline Software
Loading...
Searching...
No Matches
VP1TriggerHandleL2.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/***********************************************************************************
6 * @Package : VP1TriggerSystems
7 * @Class : VP1TriggerHandleL2
8 *
9 * @brief : L2 Trigger Data Handle
10 *
11 * @author : Manuel Proissl <mproissl@cern.ch> - University of Edinburgh
12 * @author : Edward Moyse <edward.moyse@cern.ch>
13 ***********************************************************************************/
14
15//Local includes
17
18//L2 includes
32
33//Other includes
34#include <QString>
35
36//DEFs
37const float ZERO_LIMIT = 0.00001;
38
39
40//Processing L2 data handle item
41//_____________________________________________________________________________________________
43{
44 //Vectors Data Structure Init ------------------------------>
45 std::vector<QString> headerID(3), barrelID, endcapID, generalID,
46 barrelData, endcapData, generalData;
47
48 //Define Header IDs (thus pre-define vector data structure)
49 headerID[0]=QString("Barrel");
50 headerID[1]=QString("Endcap");
51 headerID[2]=QString("General");
52
53 //Clear Export Vector
54 m_trigData.clear();
55 //----------------------------------------------------------<
56
57 //Muon feature iterator
58 std::vector<const MuonFeatureDetails*>::const_iterator itMfd;
59 //bool off_match = false; never used, code commented out below
60 for(itMfd=m_containerL2.begin(); itMfd!=m_containerL2.end(); ++itMfd) {
61 //Check ID
62 int id = (*itMfd)->id();
63 if(id!=1) continue; //muFast_Muon
64
65 //RoI System
66 int systemID = (*itMfd)->roi_system(); //0:barrel, 1:endcap, 2:forward
67
68 //Flow
69 bool isL1hitThere = false;
70 bool isL1emuOkForTriggerPlane = false;
71
72 int nRPC = (*itMfd)->pad_hit_onlineId().size();
73
74 int nTGCMidRho = (*itMfd)->tgc_Mid_rho_N();
75 int nTGCMidPhi = (*itMfd)->tgc_Mid_phi_N();
76
77 float TGCMidRhoChi2 = (*itMfd)->tgc_Mid_rho_chi2();
78 float TGCMidPhiChi2 = (*itMfd)->tgc_Mid_phi_chi2();
79
80 //Process systems
81 if(systemID==0) { //RPC
82 float rpc1_z = (*itMfd)->rpc1_z();
83 float rpc2_z = (*itMfd)->rpc2_z();
84 const float NO_VALUE = 99999;
85 if(nRPC!=0) isL1hitThere = true;
86 if(fabs(rpc1_z-NO_VALUE) > ZERO_LIMIT && fabs(rpc1_z) > ZERO_LIMIT && fabs(rpc2_z-NO_VALUE) > ZERO_LIMIT && fabs(rpc2_z) > ZERO_LIMIT) {
87 isL1emuOkForTriggerPlane = true;
88 }
89
90 //Dump to vectors
91 barrelID.push_back("RPC-1: Z");
92 barrelData.push_back(QString::number(rpc1_z));
93
94 barrelID.push_back("RPC-2: Z");
95 barrelData.push_back(QString::number(rpc2_z));
96
97 barrelID.push_back("RPC: nHits");
98 barrelData.push_back(QString::number(nRPC));
99 } else { //TGC
100 const float NO_VALUE = -99999;
101 if(nTGCMidRho!=0 && nTGCMidPhi!=0) isL1hitThere = true;
102 if(fabs(TGCMidRhoChi2 - NO_VALUE) > ZERO_LIMIT && fabs(TGCMidPhiChi2 - NO_VALUE) > ZERO_LIMIT) isL1emuOkForTriggerPlane = true;
103
104 //Dump to vectors
105 endcapID.push_back("TGC Mid nHits: Rho");
106 endcapData.push_back(QString::number(nTGCMidRho));
107
108 endcapID.push_back("TGC Mid nHits: Phi");
109 endcapData.push_back(QString::number(nTGCMidPhi));
110
111 endcapID.push_back("TGC Mid Chi2: Rho");
112 endcapData.push_back(QString::number(TGCMidRhoChi2));
113
114 endcapID.push_back("TGC Mid Chi2: Phi");
115 endcapData.push_back(QString::number(TGCMidPhiChi2));
116 }
117
118 //Loop over each MDT tube
119 std::vector<float> mdt_tube_residual = (*itMfd)->mdt_tube_residual();
120 std::vector<float> mdt_tube_r = (*itMfd)->mdt_tube_r();
121 std::vector<float> mdt_tube_z = (*itMfd)->mdt_tube_z();
122
123 //INIT counters
124 int n_mdt_hits_middle = 0;
125
126 //Process systems
127 if(systemID==0) { //Barrel
128 for(int i_tube=0; i_tube<(int)mdt_tube_residual.size(); i_tube++) {
129 QString tube;
130 float res = mdt_tube_residual[i_tube];
131 float r = mdt_tube_r[i_tube];
132 int imr = 2;
133
134 //Flags
135 if (r<650) { imr=0; }
136 else if(r<850) { imr=1; }
137
138 //Dump to vectors
139 if(imr==0) {
140 tube = (QString::number(i_tube));
141 barrelID.push_back(QString("muFast_MDT_Inn_residual_barrel Tube No-")+tube);
142 barrelData.push_back(QString::number(res));
143
149 }
150 else if(imr==1) {
151 n_mdt_hits_middle++;
152 tube = (QString::number(i_tube));
153 barrelID.push_back(QString("muFast_MDT_Mid_residual_barrel Tube No-")+tube);
154 barrelData.push_back(QString::number(res));
155
161 }
162 else if(imr==2) {
163 tube = (QString::number(i_tube));
164 barrelID.push_back(QString("muFast_MDT_Out_residual_barrel tube No-")+tube);
165 barrelData.push_back(QString::number(res));
166
172 }
173 }
174 }//END: systemID=0
175 else{ //Endcap
176 for(int i_tube=0; i_tube<(int)mdt_tube_residual.size(); i_tube++) {
177 QString tube;
178 float z = mdt_tube_z[i_tube];
179 int imr = 2;
180
181 if ( fabs(z) < 10000 ) { imr=0; }
182 else if( fabs(z) < 15000 ) { imr=1; }
183
184 //Dump to vectors
185 if(imr == 0) {
186 tube = (QString::number(i_tube));
187 endcapID.push_back(QString("muFast_MDT_Inn_residual_endcap Tube No-")+tube);
188 endcapData.push_back(QString::number(TGCMidRhoChi2));
189
195 }
196 else if(imr == 1) {
197 n_mdt_hits_middle++;
198 tube = (QString::number(i_tube));
199 endcapID.push_back(QString("muFast_MDT_Mid_residual_endcap Tube No-")+tube);
200 endcapData.push_back(QString::number(TGCMidRhoChi2));
201
207 } else if(imr == 2) {
208 tube = (QString::number(i_tube));
209 endcapID.push_back(QString("muFast_MDT_Out_residual_endcap Tube No-" )+tube);
210 endcapData.push_back(QString::number(TGCMidRhoChi2));
211
217 }
218 }
219 }//END: Endcap
220
221 //MDT flow
222 bool isMDThitThereForTriggerPlane = false;
223 bool isMDTFitOkForTriggerPlane = false;
224 bool isMDTFitOkFor2Plane = false;
225
226 int nMDT = (*itMfd)->mdt_onlineId().size();
227
228 float MDTInnChi2 = (*itMfd)->mdt_Inner_fit_chi();
229 float MDTMidChi2 = (*itMfd)->mdt_Middle_fit_chi();
230 float MDTOutChi2 = (*itMfd)->mdt_Outer_fit_chi();
231
232 const float MDT_CHI2_NO_VALUE = -99999;
233
234 if(n_mdt_hits_middle != 0) isMDThitThereForTriggerPlane = true;
235 if(fabs(MDTMidChi2-MDT_CHI2_NO_VALUE) > ZERO_LIMIT) isMDTFitOkForTriggerPlane = true;
236 if(isMDTFitOkForTriggerPlane && (fabs(MDTInnChi2 - MDT_CHI2_NO_VALUE) > ZERO_LIMIT || fabs(MDTOutChi2 - MDT_CHI2_NO_VALUE) > ZERO_LIMIT) ) {
237 isMDTFitOkFor2Plane = true;
238 }
239
240 //DEFs
241 int isL1hitTheret, isL1emuOkForTriggerPlanet, isMDThitTheret, isMDTFitOkForTriggerPlanet, isMDTFitOkFor2Planet;
242
243 if(isL1hitThere==true) isL1hitTheret=1;
244 else isL1hitTheret=0;
245
246 if(isL1emuOkForTriggerPlane==true) isL1emuOkForTriggerPlanet=1;
247 else isL1emuOkForTriggerPlanet=0;
248
249 if(isMDThitThereForTriggerPlane==true) isMDThitTheret=1;
250 else isMDThitTheret=0;
251
252 if(isMDTFitOkForTriggerPlane==true) isMDTFitOkForTriggerPlanet=1;
253 else isMDTFitOkForTriggerPlanet=0;
254
255 if(isMDTFitOkFor2Plane==true) isMDTFitOkFor2Planet=1;
256 else isMDTFitOkFor2Planet=0;
257
258 //Dump to vectors
259 generalID.push_back("isL1hitThere");
260 generalData.push_back(QString::number(isL1hitTheret));
261
262 generalID.push_back("L1emuOkForTriggerPlane");
263 generalData.push_back(QString::number(isL1emuOkForTriggerPlanet));
264
265 generalID.push_back("isMDThitThere");
266 generalData.push_back(QString::number(isMDThitTheret));
267
268 generalID.push_back("FitOkForTriggerPlane");
269 generalData.push_back(QString::number(isMDTFitOkForTriggerPlanet));
270
271 generalID.push_back("FitOkFor2Plane");
272 generalData.push_back(QString::number(isMDTFitOkFor2Planet));
273
274 //Dump to vectors
275 if(systemID==0) { //Barrel
276 barrelID.push_back("muFast_RPC_Pad_N" );
277 barrelData.push_back(QString::number(nRPC));
278
279 barrelID.push_back("muFast_MDT_Inn_fit_chi2_barrel");
280 barrelData.push_back(QString::number(MDTInnChi2));
281
282 barrelID.push_back("muFast_MDT_Mid_fit_chi2_barrel");
283 barrelData.push_back(QString::number(MDTMidChi2));
284
285 barrelID.push_back("muFast_MDT_Out_fit_chi2_barrel");
286 barrelData.push_back(QString::number(MDTOutChi2));
287
288 } else{ //Endcap
289 endcapID.push_back("muFast_TGC_Mid_rho_chi2");
290 endcapData.push_back(QString::number(TGCMidRhoChi2));
291
292 endcapID.push_back("muFast_TGC_Mid_phi_chi2" );
293 endcapData.push_back(QString::number(TGCMidPhiChi2));
294
295 endcapID.push_back("muFast_MDT_Inn_fit_chi2_endcap");
296 endcapData.push_back(QString::number(MDTInnChi2));
297
298 endcapID.push_back("FitOkFor2Plane");
299 endcapData.push_back(QString::number(MDTMidChi2));
300
301 endcapID.push_back("muFast_MDT_Out_fit_chi2_endcap");
302 endcapData.push_back(QString::number(MDTOutChi2));
303
304 endcapID.push_back("muFast_MDT_N_endcap");
305 endcapData.push_back(QString::number(nMDT));
306 }
307 }
308 //END: Looping MuonFeatureDetails
309
310 //Export Trigger Data according to pre-def. structure ------>
311 if(int(headerID.size())==3) {
312 if(int(barrelID.size())==int(barrelData.size()) && int(endcapID.size())==int(endcapData.size()) && int(generalID.size())==int(generalData.size())) {
313 if(int(barrelData.size())!=0 || int(endcapData.size())!=0 || int(generalData.size())) {
314 m_trigData.push_back(headerID); //[0]
315
316 m_trigData.push_back(barrelID); //[1]
317 m_trigData.push_back(endcapID); //[2]
318 m_trigData.push_back(generalID); //[3]
319
320 m_trigData.push_back(barrelData); //[4]
321 m_trigData.push_back(endcapData); //[5]
322 m_trigData.push_back(generalData); //[6]
323
324 return true;
325 }//one or more non-empty vectors
326 else
327 log_warning("processitem(): No Barrel, Endcap or General data found.");
328 }//ID-Data size match
329 else
330 log_error("processitem(): ID-Data size matching failed!");
331 }//header size
332 else
333 log_error("processitem(): incorrect headerID size!");
334 return false;
335 //----------------------------------------------------------<
336}//END: processitem
337
338
339//Processes L2 data item with storage in QTreeWidgetItem and returns processing success/failure
340//_____________________________________________________________________________________________
342{
343 //Process Handle item
344 bool status = processitem();
345
346 if(status) {
347 //VARs
348 m_qtrigData = new QTreeWidgetItem(0);
349 QTreeWidgetItem* dataL2item;
350 int x_id=0, x_data=0, diff=0, avail=0;
351
352 //DEFs
353 QString sep = " = ";
354
355 if(int(m_trigData.size())>1 && int(m_trigData[0].size())!=0 && int(m_trigData.size())==(int(m_trigData[0].size())*2)+1) {
356
357 diff=int(m_trigData[0].size());
358 for(int x=1; x<=int(m_trigData[0].size()); ++x) {
359 x_id=x;
360 x_data=x_id+diff;
361 if((x_data<int(m_trigData.size())) && (int(m_trigData[x_id].size())==int(m_trigData[x_data].size())) && (int(m_trigData[x_data].size())>0)) {
362 //New Item
363 dataL2item = new QTreeWidgetItem(m_qtrigData);
364
365 //Set ID
366 dataL2item->setText(0, m_trigData[0][x-1]);
367
368 //Load Data
369 QList<QTreeWidgetItem *> dataList;
370 for(int i=0; i<int(m_trigData[x_id].size()); ++i)
371 dataList.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[x_id][i]+sep+m_trigData[x_data][i])));
372 dataL2item->insertChildren(0, dataList);
373 //y loop
374 ++avail;
375 }//avail. range
376 }//x loop
377
378 //Data available
379 if(avail>0) m_qtrigstatus=true;
380 else m_qtrigstatus=false;
381 }//vector check
382 else {
383 log_error("processQTrigItem(): L2 data not available!");
384 m_qtrigstatus=false;
385 }
386 }
387 else
388 m_qtrigstatus=false;
389
390 return m_qtrigstatus;
391}//END: processQTrigItem
392
393
394//Processes L2 data item with storage in Vector and returns processing success/failure
395//_____________________________________________________________________________________________
397{
398 //Process Handle item
399 bool status = processitem();
400
401 if(status)
402 m_vtrigstatus=true;
403 else
404 m_vtrigstatus=false;
405
406 return m_vtrigstatus;
407}//END: processVTrigItem
408
409/*
410std::vector<QString>::iterator x_trigData;
411std::vector<std::vector<QString> >::iterator y_trigData;
412
413for(y_trigData=m_trigData.begin(); y_trigData!=m_trigData.end(); ++y_trigData) {
414 for(x_trigData=y_trigData->begin(); x_trigData!=y_trigData->end(); ++x_trigData) {
415 std::cout << (*x_trigData).toStdString() << " ";
416 }
417 std::cout << std::endl;
418 }
419*/
std::pair< std::vector< unsigned int >, bool > res
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
Definition Jet.cxx:631
#define x
#define z
const float ZERO_LIMIT
std::vector< std::vector< QString > > m_trigData
std::vector< const MuonFeatureDetails * > m_containerL2
int r
Definition globals.cxx:22