ATLAS Offline Software
Loading...
Searching...
No Matches
VP1TriggerHandleEF.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 : VP1TriggerHandleEF
8 *
9 * @brief : EF Trigger Data Handle
10 *
11 * @author : Manuel Proissl <mproissl@cern.ch> - University of Edinburgh
12 ***********************************************************************************/
13
14//Local includes
16
17//EF includes
30
31//Other includes
32#include <math.h>
33
34//Trigger data vectors
35std::vector<QString> h_type, h_source, h_id; //header data
36std::vector<std::vector<QString> > t_data; //track data
37
38//Data structure settings
39//--- Note: When making changes, do adapt vector ---
40//--- loading order in loadTrackContainer() ---
41const int HWIDTH = 3; //header width
42const int TYPIDX = 0; //h_type index
43const int SRCIDX = 1; //h_source index
44const int TIDIDX = 2; //h_id index
45
46//MuonEF and MuGirl count
48
49//Muon Track Info: Instant holders
52
53//Muon Track Info: Names
54std::string muonTrackName[18] =
55 {
56 "Charge", //ID: 0
57 "iPt", //ID: 1
58 "Theta", //ID: 2
59 "Phi", //ID: 3
60 "m", //ID: 4
61 "chi2", //ID: 5
62 "chi2prob", //ID: 6
63 "posX", //ID: 7
64 "posY", //ID: 8
65 "posZ", //ID: 9
66 "NCscHitsEta", //ID: 10
67 "NCscHitsPhi", //ID: 11
68 "NTgcHitsEta", //ID: 12
69 "NTgcHitsPhi", //ID: 13
70 "NRpcHitsEta", //ID: 14
71 "NRpcHitsPhi", //ID: 15
72 "d0", //ID: 16
73 "z0" //ID: 17
74 };
75
76
77//Muon Track Info: Data
78//_____________________________________________________________________________________________
80{
81 double data=-101;
82
83 if(type=="s_mef" || type=="s_mg" || type=="e_mef" || type=="e_mg") {
84 switch(id)
85 {
86 case 0: data = muonEFTrack->Charge(); break;
87 case 1: data = muonEFTrack->iPt(); break;
88 case 2: data = muonEFTrack->cotTh(); break;
89 case 3: data = muonEFTrack->phi(); break;
90 case 4: data = muonEFTrack->m(); break;
91 case 5: data = muonEFTrack->chi2(); break;
92 case 6: data = muonEFTrack->chi2prob(); break;
93 case 7: data = muonEFTrack->posX(); break;
94 case 8: data = muonEFTrack->posY(); break;
95 case 9: data = muonEFTrack->posZ(); break;
96 case 10: data = muonEFTrack->NCscHitsEta(); break;
97 case 11: data = muonEFTrack->NCscHitsPhi(); break;
98 case 12: data = muonEFTrack->NTgcHitsEta(); break;
99 case 13: data = muonEFTrack->NTgcHitsPhi(); break;
100 case 14: data = muonEFTrack->NRpcHitsEta(); break;
101 case 15: data = muonEFTrack->NRpcHitsPhi(); break;
102 case 16: data = muonEFTrack->d0(); break;
103 case 17: data = muonEFTrack->z0(); break;
104 default: data = -102;
105 }
106 } else if(type=="c_mef" || type=="c_mg") {
107 switch(id)
108 {
109 case 0: data = muonEFCbTrack->Charge(); break;
110 case 1: data = muonEFCbTrack->iPt(); break;
111 case 2: data = muonEFCbTrack->cotTh(); break;
112 case 3: data = muonEFCbTrack->phi(); break;
113 case 4: data = muonEFCbTrack->m(); break;
114 case 5: data = muonEFCbTrack->chi2(); break;
115 case 6: data = muonEFCbTrack->chi2prob(); break;
116 case 7: data = muonEFCbTrack->posX(); break;
117 case 8: data = muonEFCbTrack->posY(); break;
118 case 9: data = muonEFCbTrack->posZ(); break;
119 case 10: data = muonEFCbTrack->NCscHitsEta(); break;
120 case 11: data = muonEFCbTrack->NCscHitsPhi(); break;
121 case 12: data = muonEFCbTrack->NTgcHitsEta(); break;
122 case 13: data = muonEFCbTrack->NTgcHitsPhi(); break;
123 case 14: data = muonEFCbTrack->NRpcHitsEta(); break;
124 case 15: data = muonEFCbTrack->NRpcHitsPhi(); break;
125 case 16: data = muonEFCbTrack->d0(); break;
126 case 17: data = muonEFCbTrack->z0(); break;
127 default: data = -103;
128 }
129 }
130 else
131 log_error("muonTrackData(): invalid type!");
132
133 return data;
134}//END: muonTrackData
135
136
137//Query TrackContainer and via loadMuonTrack() store track info to corresponding vectors
138//_____________________________________________________________________________________________
140{
141 //VARs
142 int mt=0; //muon flag: type id
143 QString type="_"; //muon flag: type name
144 int trackNo=0;
145
146 //Resets
147 h_type.clear();
148 h_source.clear();
149 h_id.clear();
150 t_data.clear();
151 m_trigData.clear();
152 count_mef=0;
153 count_mg=0;
154
155 if(m_containerEF->hasTrack()) { //Muon in RoI
156 const TrigMuonEFInfoTrackContainer *tc = m_containerEF->TrackContainer(); //TrackContainer: more than one muon in RoI
158
159 for(TrackItr = tc->begin(); TrackItr!=tc->end(); ++TrackItr) {
160 const TrigMuonEFInfoTrack* muonInfo = (*TrackItr);
161 mt = int(muonInfo->MuonType()); //<1> MuonEF, <2> MuGirl
162
163 //Safety check
164 if(mt!=1 && mt!=2) {
165 log_error("loadTrackContainer(): invalid muon type flag found: "+VP1String::str(mt));
166 return false;
167 }
168
169 //-----------------------------------------------------------------------
170 muonEFTrack = muonInfo->SpectrometerTrack();
171 if(mt==1) type="s_mef"; //-> (S)pec. (M)uon(EF)
172 else if(mt==2) type="s_mg"; //-> (S)pec. (M)u(G)irl
173
174 if(muonEFTrack)
175 loadMuonTrack(trackNo++,type);
176 else
177 log_info("loadTrackContainer(): no SpectrometerTrack found");
178
179 //-----------------------------------------------------------------------
180 muonEFTrack = muonInfo->ExtrapolatedTrack();
181 if(mt==1) type="e_mef"; //-> (E)xtra. (M)uon(EF)
182 else if(mt==2) type="e_mg"; //-> (E)xtra. (M)u(G)irl
183
184 if(muonEFTrack)
185 loadMuonTrack(trackNo++,type);
186 else
187 log_info("loadTrackContainer(): no ExtrapolatedTrack found");
188
189 //-----------------------------------------------------------------------
190 muonEFCbTrack = muonInfo->CombinedTrack();
191 if(mt==1) type="c_mef"; //-> (C)omb. (M)uon(EF)
192 else if(mt==2) type="c_mg"; //-> (C)omb. (M)u(G)irl
193
194 if(muonEFCbTrack)
195 loadMuonTrack(trackNo++,type);
196 else
197 log_info("loadTrackContainer(): no CombinedTrack found");
198 }//loop
199
200 //ASSIGN DATA STRUCTURE AND EXPORT TO EF TRIGGER HANDLE DATA VECTOR ------->
201 /*************************************************************
202 < HEADER > < TRACK DATA ... >
203 | | | | |
204 TYPE SOURCE ID DATA - DATA - ...
205
206 TYPE: MuonEF, MuGirl
207 [y-y correspondence to SOURCE]
208 SOURCE: SpectrometerTrack, ExtrapolatedTrack, CombinedTrack
209 [y-x correspondence to DATA]
210 ID: Charge, iPT, etc.
211 [y-y correspondence to DATA]
212 DATA: values corresponding to ID
213 *************************************************************/
214 if(int(h_type.size())!=0 && int(h_source.size())!=0 && int(h_id.size())!=0 && int(t_data.size())!=0 && int(m_trigData.size())==0) {
215 if(int(h_type.size())==int(h_source.size()) && int(h_source.size())==int(t_data.size())) {
216 m_trigData.push_back(h_type);
217 m_trigData.push_back(h_source);
218 m_trigData.push_back(h_id);
219 for(int q=0; q<int(t_data.size()); ++q)
220 m_trigData.push_back(t_data[q]);
221 return true;
222 }//size match
223 }//data available
224 //-------------------------------------------------------------------------<
225 return false;
226 }//hasTrack
227 else
228 log_warning("loadTrackContainer(): no tracks found in EF container.");
229 return false;
230}//END: loadTrackContainer
231
232
233//Load Muon Track data to corresponding vectors
234//_____________________________________________________________________________________________
236{
237 //PROCESS TRACK DATA AND STORE IN TEMP. VECTOR ---------------------------->
238 std::vector<QString> data;
239
240 for(int i=0; i < int(sizeof muonTrackName/sizeof(std::string)); ++i) {
241 if(trackNo==0) h_id.push_back(QString::fromStdString(muonTrackName[i]));
242 if(muonTrackName[i]=="Theta") {
243 double cotTh = muonTrackData(type,i);
244 if(cotTh!=0) data.push_back(QString::number((M_PI_2)-std::atan(1/cotTh)));
245 else data.push_back(QString::number(0));
246 }
247 else {
248 data.push_back(QString::number(muonTrackData(type,i)));
249 }
250 }
251 //-------------------------------------------------------------------------<
252
253 //LOAD HEADER TYPE, SOURCE AND DATA TO TEMP. VECTORS ---------------------->
254 if(int(data.size())!=0) {
255 if(type=="s_mef") { //SpectrometerTrack - MuonEF
256 //Header Update
257 h_type.push_back("MuonEF");
258 h_source.push_back("SpectrometerTrack");
259 //Track Update
260 t_data.push_back(data);
261 ++count_mef;
262 }
263 else if(type=="s_mg") { //SpectrometerTrack - MuGirl
264 //Header Update
265 h_type.push_back("MuGirl");
266 h_source.push_back("SpectrometerTrack");
267 //Track Update
268 t_data.push_back(data);
269 ++count_mg;
270 }
271 else if(type=="e_mef") { //ExtrapolatedTrack - MuonEF
272 //Header Update
273 h_type.push_back("MuonEF");
274 h_source.push_back("ExtrapolatedTrack");
275 //Track Update
276 t_data.push_back(data);
277 ++count_mef;
278 }
279 else if(type=="e_mg") { //ExtrapolatedTrack - MuGirl
280 //Header Update
281 h_type.push_back("MuGirl");
282 h_source.push_back("ExtrapolatedTrack");
283 //Track Update
284 t_data.push_back(data);
285 ++count_mg;
286 }
287 else if(type=="c_mef") { //CombinedTrack - MuonEF
288 //Header Update
289 h_type.push_back("MuonEF");
290 h_source.push_back("CombinedTrack");
291 //Track Update
292 t_data.push_back(data);
293 ++count_mef;
294 }
295 else if(type=="c_mg") { //CombinedTrack - MuGirl
296 //Header Update
297 h_type.push_back("MuGirl");
298 h_source.push_back("CombinedTrack");
299 //Track Update
300 t_data.push_back(data);
301 ++count_mg;
302 }
303 else
304 log_error("loadMuonTrack(): invalid type!");
305 }//data available
306 else
307 log_error("loadMuonTrack(): no data available!");
308 //-------------------------------------------------------------------------<
309}//END: loadMuonTrack
310
311
312//Processes EF data item with storage in QTreeWidgetItem and returns processing success/failure
313//_____________________________________________________________________________________________
315{
316 //Query TrackContainer and store
317 //data to corresponding vectors
318 bool status = loadTrackContainer();
319
320 if(status) {
321 //VARs
322 m_qtrigData = new QTreeWidgetItem(0);
323 m_qtrigData->setText(0, QString(m_trigID));
324 int avail=0;
325
326 //DEFs
327 QString sep = " = ";
328 int TWIDTH = int(m_trigData.size())-HWIDTH;
329
330 if(int(m_trigData.size())>HWIDTH) {
331 if(int(m_trigData[TYPIDX].size())==int(m_trigData[SRCIDX].size()) && int(m_trigData[SRCIDX].size())==TWIDTH) {
332
333 //### chainIDs ### >>>
334 if(!(m_chainIDs.isEmpty())) {
335 QTreeWidgetItem* chain = new QTreeWidgetItem(m_qtrigData);
336 chain->setText(0, QString("Passed Triggers"));
337 QList<QTreeWidgetItem *> chainItems;
338 for(int i=0; i < int(m_chainIDs.size()); ++i)
339 chainItems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_chainIDs[i])));
340 chain->insertChildren(0, chainItems);
341 }//chain data available
342
343 //### EF ### >>>>
344 if(count_mef!=0) {
345 QTreeWidgetItem* eftree = new QTreeWidgetItem(m_qtrigData);
346 eftree->setText(0, QString("Muon Type 1 -> EF"));
347
348 for(int i=0; i<TWIDTH; ++i) {
349 if(m_trigData[TYPIDX][i].contains("MuonEF") && m_trigData[SRCIDX][i].contains("Spectrometer")) {
350 QTreeWidgetItem* eftree_s = new QTreeWidgetItem(eftree);
351 eftree_s->setText(0, QString("Spectrometer Track-")+QString::number(i+1));
352 QList<QTreeWidgetItem *> efitem_s;
353 for(int j=0; j < int(m_trigData[i+HWIDTH].size()); ++j) {
354 efitem_s.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[TIDIDX][j]+sep+m_trigData[i+HWIDTH][j])));
355 }
356 eftree_s->insertChildren(0, efitem_s);
357 }
358 }//loop
359
360 for(int i=0; i<TWIDTH; ++i) {
361 if(m_trigData[TYPIDX][i].contains("MuonEF") && m_trigData[SRCIDX][i].contains("Extrapolated")) {
362 QTreeWidgetItem* eftree_e = new QTreeWidgetItem(eftree);
363 eftree_e->setText(0, QString("Extrapolated Track-")+QString::number(i+1));
364 QList<QTreeWidgetItem *> efitem_e;
365 for(int j=0; j < int(m_trigData[i+HWIDTH].size()); ++j) {
366 efitem_e.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[TIDIDX][j]+sep+m_trigData[i+HWIDTH][j])));
367 }
368 eftree_e->insertChildren(0, efitem_e);
369 }
370 }//loop
371
372 for(int i=0; i<TWIDTH; ++i) {
373 if(m_trigData[TYPIDX][i].contains("MuonEF") && m_trigData[SRCIDX][i].contains("Combined")) {
374 QTreeWidgetItem* eftree_c = new QTreeWidgetItem(eftree);
375 eftree_c->setText(0, QString("Combined Track-")+QString::number(i+1));
376 QList<QTreeWidgetItem *> efitem_c;
377 for(int j=0; j < int(m_trigData[i+HWIDTH].size()); ++j) {
378 efitem_c.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[TIDIDX][j]+sep+m_trigData[i+HWIDTH][j])));
379 }
380 eftree_c->insertChildren(0, efitem_c);
381 }
382 }//loop
383 ++avail;
384 }//mef data available
385
386 //### MuonGirl ### >>>
387 if(count_mg!=0) {
388 QTreeWidgetItem* mgtree = new QTreeWidgetItem(m_qtrigData);
389 mgtree->setText(0, QString("Muon Type 2 -> MuGirl"));
390
391 for(int i=0; i<TWIDTH; ++i) {
392 if(m_trigData[TYPIDX][i].contains("MuGirl") && m_trigData[SRCIDX][i].contains("Spectrometer")) {
393 QTreeWidgetItem* mgtree_s = new QTreeWidgetItem(mgtree);
394 mgtree_s->setText(0, QString("Spectrometer Track-")+QString::number(i+1));
395 QList<QTreeWidgetItem *> mgitem_s;
396 for(int j=0; j < int(m_trigData[i+HWIDTH].size()); ++j) {
397 mgitem_s.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[TIDIDX][j]+sep+m_trigData[i+HWIDTH][j])));
398 }
399 mgtree_s->insertChildren(0, mgitem_s);
400 }
401 }//loop
402
403 for(int i=0; i<TWIDTH; ++i) {
404 if(m_trigData[TYPIDX][i].contains("MuGirl") && m_trigData[SRCIDX][i].contains("Extrapolated")) {
405 QTreeWidgetItem* mgtree_e = new QTreeWidgetItem(mgtree);
406 mgtree_e->setText(0, QString("Extrapolated Track-")+QString::number(i+1));
407 QList<QTreeWidgetItem *> mgitem_e;
408 for(int j=0; j < int(m_trigData[i+HWIDTH].size()); ++j) {
409 mgitem_e.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[TIDIDX][j]+sep+m_trigData[i+HWIDTH][j])));
410 }
411 mgtree_e->insertChildren(0, mgitem_e);
412 }
413 }//loop
414
415 for(int i=0; i<TWIDTH; ++i) {
416 if(m_trigData[TYPIDX][i].contains("MuGirl") && m_trigData[SRCIDX][i].contains("Combined")) {
417 QTreeWidgetItem* mgtree_c = new QTreeWidgetItem(mgtree);
418 mgtree_c->setText(0, QString("Combined Track-")+QString::number(i+1));
419 QList<QTreeWidgetItem *> mgitem_c;
420 for(int j=0; j < int(m_trigData[i+HWIDTH].size()); ++j) {
421 mgitem_c.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(m_trigData[TIDIDX][j]+sep+m_trigData[i+HWIDTH][j])));
422 }
423 mgtree_c->insertChildren(0, mgitem_c);
424 }
425 }//loop
426 ++avail;
427 }// mg data available
428
429 }//size match check
430 }//simple size check
431
432 //Data available
433 if(avail>0) m_qtrigstatus=true;
434 else {
435 log_error("processQTrigItem(): EF data not available!");
436 m_qtrigstatus=false;
437 }
438
439 }//status
440 else
441 m_qtrigstatus=false;
442
443 return m_qtrigstatus;
444}//END: processQTrigItem
445
446
447//Processes EF data item with storage in Vector and returns processing success/failure
448//_____________________________________________________________________________________________
450{
451 //Query TrackContainer and store
452 //data to corresponding vectors
453 bool status = loadTrackContainer();
454
455 if(status) {
456 if(int(m_trigData.size())>3 && int(m_trigData[0].size())==int(m_trigData[1].size()) && int(m_trigData[1].size())==(int(m_trigData.size())-3))
457 m_vtrigstatus=true;
458 }
459 else
460 m_vtrigstatus=false;
461
462 return m_vtrigstatus;
463}//END: processVTrigItem
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t tc
int count_mg
const TrigMuonEFCbTrack * muonEFCbTrack
std::vector< QString > h_type
const int SRCIDX
const TrigMuonEFTrack * muonEFTrack
std::vector< std::vector< QString > > t_data
std::vector< QString > h_id
int count_mef
std::vector< QString > h_source
const int TYPIDX
const int TIDIDX
std::string muonTrackName[18]
const int HWIDTH
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
TrigMuonEFCbTrack * CombinedTrack()
unsigned short int MuonType() const
TrigMuonEFTrack * ExtrapolatedTrack()
TrigMuonEFTrack * SpectrometerTrack()
static QString str(const QString &s)
Definition VP1String.h:49
double muonTrackData(QString type, int id)
const TrigMuonEFInfo * m_containerEF
std::vector< std::vector< QString > > m_trigData
void loadMuonTrack(int trackNo, QString type)
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114