ATLAS Offline Software
Loading...
Searching...
No Matches
VP1TriggerHandleL2.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 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_inner = 0;
125 int n_mdt_hits_middle = 0;
126 int n_mdt_hits_outer = 0;
127
128 //Process systems
129 if(systemID==0) { //Barrel
130 for(int i_tube=0; i_tube<(int)mdt_tube_residual.size(); i_tube++) {
131 QString tube;
132 float res = mdt_tube_residual[i_tube];
133 float r = mdt_tube_r[i_tube];
134 int imr = 2;
135
136 //Flags
137 if (r<650) { imr=0; }
138 else if(r<850) { imr=1; }
139
140 //Dump to vectors
141 if(imr==0) {
142 n_mdt_hits_inner++;
143 tube = (QString::number(i_tube));
144 barrelID.push_back(QString("muFast_MDT_Inn_residual_barrel Tube No-")+tube);
145 barrelData.push_back(QString::number(res));
146
152 }
153 else if(imr==1) {
154 n_mdt_hits_middle++;
155 tube = (QString::number(i_tube));
156 barrelID.push_back(QString("muFast_MDT_Mid_residual_barrel Tube No-")+tube);
157 barrelData.push_back(QString::number(res));
158
164 }
165 else if(imr==2) {
166 n_mdt_hits_outer++;
167 tube = (QString::number(i_tube));
168 barrelID.push_back(QString("muFast_MDT_Out_residual_barrel tube No-")+tube);
169 barrelData.push_back(QString::number(res));
170
176 }
177 }
178 }//END: systemID=0
179 else{ //Endcap
180 for(int i_tube=0; i_tube<(int)mdt_tube_residual.size(); i_tube++) {
181 QString tube;
182 float z = mdt_tube_z[i_tube];
183 int imr = 2;
184
185 if ( fabs(z) < 10000 ) { imr=0; }
186 else if( fabs(z) < 15000 ) { imr=1; }
187
188 //Dump to vectors
189 if(imr == 0) {
190 n_mdt_hits_inner++;
191 tube = (QString::number(i_tube));
192 endcapID.push_back(QString("muFast_MDT_Inn_residual_endcap Tube No-")+tube);
193 endcapData.push_back(QString::number(TGCMidRhoChi2));
194
200 }
201 else if(imr == 1) {
202 n_mdt_hits_middle++;
203 tube = (QString::number(i_tube));
204 endcapID.push_back(QString("muFast_MDT_Mid_residual_endcap Tube No-")+tube);
205 endcapData.push_back(QString::number(TGCMidRhoChi2));
206
212 } else if(imr == 2) {
213 n_mdt_hits_outer++;
214 tube = (QString::number(i_tube));
215 endcapID.push_back(QString("muFast_MDT_Out_residual_endcap Tube No-" )+tube);
216 endcapData.push_back(QString::number(TGCMidRhoChi2));
217
223 }
224 }
225 }//END: Endcap
226
227 //MDT flow
228 bool isMDThitThereForTriggerPlane = false;
229 bool isMDTFitOkForTriggerPlane = false;
230 bool isMDTFitOkFor2Plane = false;
231
232 int nMDT = (*itMfd)->mdt_onlineId().size();
233
234 float MDTInnChi2 = (*itMfd)->mdt_Inner_fit_chi();
235 float MDTMidChi2 = (*itMfd)->mdt_Middle_fit_chi();
236 float MDTOutChi2 = (*itMfd)->mdt_Outer_fit_chi();
237
238 const float MDT_CHI2_NO_VALUE = -99999;
239
240 if(n_mdt_hits_middle != 0) isMDThitThereForTriggerPlane = true;
241 if(fabs(MDTMidChi2-MDT_CHI2_NO_VALUE) > ZERO_LIMIT) isMDTFitOkForTriggerPlane = true;
242 if(isMDTFitOkForTriggerPlane && (fabs(MDTInnChi2 - MDT_CHI2_NO_VALUE) > ZERO_LIMIT || fabs(MDTOutChi2 - MDT_CHI2_NO_VALUE) > ZERO_LIMIT) ) {
243 isMDTFitOkFor2Plane = true;
244 }
245
246 //DEFs
247 int isL1hitTheret, isL1emuOkForTriggerPlanet, isMDThitTheret, isMDTFitOkForTriggerPlanet, isMDTFitOkFor2Planet;
248
249 if(isL1hitThere==true) isL1hitTheret=1;
250 else isL1hitTheret=0;
251
252 if(isL1emuOkForTriggerPlane==true) isL1emuOkForTriggerPlanet=1;
253 else isL1emuOkForTriggerPlanet=0;
254
255 if(isMDThitThereForTriggerPlane==true) isMDThitTheret=1;
256 else isMDThitTheret=0;
257
258 if(isMDTFitOkForTriggerPlane==true) isMDTFitOkForTriggerPlanet=1;
259 else isMDTFitOkForTriggerPlanet=0;
260
261 if(isMDTFitOkFor2Plane==true) isMDTFitOkFor2Planet=1;
262 else isMDTFitOkFor2Planet=0;
263
264 //Dump to vectors
265 generalID.push_back("isL1hitThere");
266 generalData.push_back(QString::number(isL1hitTheret));
267
268 generalID.push_back("L1emuOkForTriggerPlane");
269 generalData.push_back(QString::number(isL1emuOkForTriggerPlanet));
270
271 generalID.push_back("isMDThitThere");
272 generalData.push_back(QString::number(isMDThitTheret));
273
274 generalID.push_back("FitOkForTriggerPlane");
275 generalData.push_back(QString::number(isMDTFitOkForTriggerPlanet));
276
277 generalID.push_back("FitOkFor2Plane");
278 generalData.push_back(QString::number(isMDTFitOkFor2Planet));
279
280 //Dump to vectors
281 if(systemID==0) { //Barrel
282 barrelID.push_back("muFast_RPC_Pad_N" );
283 barrelData.push_back(QString::number(nRPC));
284
285 barrelID.push_back("muFast_MDT_Inn_fit_chi2_barrel");
286 barrelData.push_back(QString::number(MDTInnChi2));
287
288 barrelID.push_back("muFast_MDT_Mid_fit_chi2_barrel");
289 barrelData.push_back(QString::number(MDTMidChi2));
290
291 barrelID.push_back("muFast_MDT_Out_fit_chi2_barrel");
292 barrelData.push_back(QString::number(MDTOutChi2));
293
294 } else{ //Endcap
295 endcapID.push_back("muFast_TGC_Mid_rho_chi2");
296 endcapData.push_back(QString::number(TGCMidRhoChi2));
297
298 endcapID.push_back("muFast_TGC_Mid_phi_chi2" );
299 endcapData.push_back(QString::number(TGCMidPhiChi2));
300
301 endcapID.push_back("muFast_MDT_Inn_fit_chi2_endcap");
302 endcapData.push_back(QString::number(MDTInnChi2));
303
304 endcapID.push_back("FitOkFor2Plane");
305 endcapData.push_back(QString::number(MDTMidChi2));
306
307 endcapID.push_back("muFast_MDT_Out_fit_chi2_endcap");
308 endcapData.push_back(QString::number(MDTOutChi2));
309
310 endcapID.push_back("muFast_MDT_N_endcap");
311 endcapData.push_back(QString::number(nMDT));
312 }
313 }
314 //END: Looping MuonFeatureDetails
315
316 //Export Trigger Data according to pre-def. structure ------>
317 if(int(headerID.size())==3) {
318 if(int(barrelID.size())==int(barrelData.size()) && int(endcapID.size())==int(endcapData.size()) && int(generalID.size())==int(generalData.size())) {
319 if(int(barrelData.size())!=0 || int(endcapData.size())!=0 || int(generalData.size())) {
320 m_trigData.push_back(headerID); //[0]
321
322 m_trigData.push_back(barrelID); //[1]
323 m_trigData.push_back(endcapID); //[2]
324 m_trigData.push_back(generalID); //[3]
325
326 m_trigData.push_back(barrelData); //[4]
327 m_trigData.push_back(endcapData); //[5]
328 m_trigData.push_back(generalData); //[6]
329
330 return true;
331 }//one or more non-empty vectors
332 else
333 log_warning("processitem(): No Barrel, Endcap or General data found.");
334 }//ID-Data size match
335 else
336 log_error("processitem(): ID-Data size matching failed!");
337 }//header size
338 else
339 log_error("processitem(): incorrect headerID size!");
340 return false;
341 //----------------------------------------------------------<
342}//END: processitem
343
344
345//Processes L2 data item with storage in QTreeWidgetItem and returns processing success/failure
346//_____________________________________________________________________________________________
348{
349 //Process Handle item
350 bool status = processitem();
351
352 if(status) {
353 //VARs
354 m_qtrigData = new QTreeWidgetItem(0);
355 QTreeWidgetItem* dataL2item;
356 int x_id=0, x_data=0, diff=0, avail=0;
357
358 //DEFs
359 QString sep = " = ";
360
361 if(int(m_trigData.size())>1 && int(m_trigData[0].size())!=0 && int(m_trigData.size())==(int(m_trigData[0].size())*2)+1) {
362
363 diff=int(m_trigData[0].size());
364 for(int x=1; x<=int(m_trigData[0].size()); ++x) {
365 x_id=x;
366 x_data=x_id+diff;
367 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)) {
368 //New Item
369 dataL2item = new QTreeWidgetItem(m_qtrigData);
370
371 //Set ID
372 dataL2item->setText(0, m_trigData[0][x-1]);
373
374 //Load Data
375 QList<QTreeWidgetItem *> dataList;
376 for(int i=0; i<int(m_trigData[x_id].size()); ++i)
377 dataList.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[x_id][i]+sep+m_trigData[x_data][i])));
378 dataL2item->insertChildren(0, dataList);
379 //y loop
380 ++avail;
381 }//avail. range
382 }//x loop
383
384 //Data available
385 if(avail>0) m_qtrigstatus=true;
386 else m_qtrigstatus=false;
387 }//vector check
388 else {
389 log_error("processQTrigItem(): L2 data not available!");
390 m_qtrigstatus=false;
391 }
392 }
393 else
394 m_qtrigstatus=false;
395
396 return m_qtrigstatus;
397}//END: processQTrigItem
398
399
400//Processes L2 data item with storage in Vector and returns processing success/failure
401//_____________________________________________________________________________________________
403{
404 //Process Handle item
405 bool status = processitem();
406
407 if(status)
408 m_vtrigstatus=true;
409 else
410 m_vtrigstatus=false;
411
412 return m_vtrigstatus;
413}//END: processVTrigItem
414
415/*
416std::vector<QString>::iterator x_trigData;
417std::vector<std::vector<QString> >::iterator y_trigData;
418
419for(y_trigData=m_trigData.begin(); y_trigData!=m_trigData.end(); ++y_trigData) {
420 for(x_trigData=y_trigData->begin(); x_trigData!=y_trigData->end(); ++x_trigData) {
421 std::cout << (*x_trigData).toStdString() << " ";
422 }
423 std::cout << std::endl;
424 }
425*/
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