ATLAS Offline Software
Loading...
Searching...
No Matches
VP1TriggerProcessor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***********************************************************************************
6 * @Package : VP1TriggerSystems
7 * @Class : VP1TriggerProcessor
8 *
9 * @brief : Trigger Processor - trigger data processing methods;
10 * - VP1TriggerTool interface to VP1TriggerSystem
11 *
12 * @author : Manuel Proissl <mproissl@cern.ch> - University of Edinburgh
13 ***********************************************************************************/
14
15//Local includes
18
19//Other includes
20#include <iostream>
21#include <string>
22#include <vector>
23#include <map>
24#include <stdio.h>
25#include <QTreeWidget>
26#include <QTreeWidgetItem>
27
28//Global VARs ------------------------->
30//-------------------------------------<
31
32
33//Trigger Processor Constructor
34//_____________________________________________________________________________________________
36 : Logger("VP1TriggerProcessor"),
37 m_triggersystem(nullptr),
38 m_initStatus(false),
39 m_daqStatus(false),
40 m_trigLvl("all"),
41 m_dataFormat('v'),
43 log_verbose("constructor");
44 }
45
46
47//Trigger Processor Destructor
48//_____________________________________________________________________________________________
54
55
56//Initialize Trigger System
57//_____________________________________________________________________________________________
59{
60 log_info("Initializing VP1Trig::VP1TriggerSystem");
62 m_initStatus=true;
63}
64
65
66//Load Trigger Data
67//_____________________________________________________________________________________________
69{
70 QString method="loadData(): ";
71 log_info("Loading trigger data via VP1TriggerSystem");
72
73 //--- Note: Filling trigger handle (L1, L2, EF) objects via the VP1TriggerSystem. ---
74 if(m_initStatus) {
75 m_daqStatus = m_triggersystem->loadTriggerHandles(storeGate, m_trigLvl);
76 if(m_daqStatus)
78 else
79 log_fatal(method+"system initialized but retrieving data failed!");
80 }
81 else
82 log_error(method+"trigger system not initialized!");
83}
84
85
86//Process Trigger Data
87//_____________________________________________________________________________________________
89{
90 QString method="processData(): ";
91 log_info("Processing trigger data: start");
92
93 //Status flags
94 bool l1status=false,l2status=false,efstatus=false;
95
96 //L2 and EF triggers from L1 handle processor ------------->
97 QTreeWidgetItem * L1_triggers, * L2_triggers, * EF_triggers;
98 L1_triggers = new QTreeWidgetItem(0);
99 L2_triggers = new QTreeWidgetItem(0);
100 EF_triggers = new QTreeWidgetItem(0);
101 L1_triggers->setText(0, QString("Triggers"));
102 L2_triggers->setText(0, QString("Triggers"));
103 EF_triggers->setText(0, QString("Triggers"));
104 //---------------------------------------------------------<
105
106 //--- Note: Handles for L1, L2, EF contain trigger data previously stored in each ---
107 //--- object's containers by the VP1TriggerSystem via loadData() and are ---
108 //--- being modified in each "Fill" section below by calling each handles' ---
109 //--- processing methods, which fill m_trigData with processed data. ---
110
111 //L1 PROCESSING ------------------------------------------------------------------------------>
112 if(m_trigLvl.compare("ALL", Qt::CaseInsensitive)==0 || m_trigLvl.compare("L1", Qt::CaseInsensitive)==0) {
113 std::vector<VP1Trig::VP1TriggerHandleL1> handleL1 = m_triggersystem->getHandleL1();
114 std::vector<VP1Trig::VP1TriggerHandleL1>::iterator l1it;
115
116 if(handleL1.size()>0) {
117 log_info(pfx1()+"processing L1 data: start");
118
119 if(m_dataFormat=='q') {
120 log_verbose("processing sector for QTree format");
121 //************************* INIT *************************//
122 m_L1_QData = new QTreeWidgetItem(0);
123 m_L1_QData->setText(0, QString("L1 Data"));
124
125 //************************* FILL *************************//
126 for(l1it=handleL1.begin(); l1it!=handleL1.end(); ++l1it) {
127 if(l1it->processQTrigItem()) {
128 QString trigID = l1it->m_trigID;
129 if(trigID.contains("L2_"))
130 L2_triggers->addChild(l1it->m_qtrigitem);
131 else if(trigID.contains("EF_"))
132 EF_triggers->addChild(l1it->m_qtrigitem);
133 else
134 L1_triggers->addChild(l1it->m_qtrigitem);
135 }
136 }
137 m_L1_QData->addChild(L1_triggers);
138
139 //************************* DIST *************************//
141
142 //General processing status update
143 if(int(m_L1_QData->childCount())>0)
144 l1status=true;
145 else
146 log_warning("L1 QTree has no children");
147
148 }//END: [q] processing
149 else if(m_dataFormat=='v') {
150 log_verbose("processing sector for vector format");
151 //************************* INIT *************************//
152 int p_success=0, p_failed=0;
153
154 //************************* FILL *************************//
155 for(l1it=handleL1.begin(); l1it!=handleL1.end(); ++l1it) {
156 if(l1it->processVTrigItem())
157 ++p_success;
158 else
159 ++p_failed;
160 }
161
162 //General processing status update
163 if(p_success>0)
164 l1status=true;
165 if(p_failed>0)
166 log_warning("L1 data item(s) failed processing: "+VP1String::str(p_failed));
167 }//END: [v] processing
168 else
169 log_error(method+"data container format invalid!");
170 log_info(pfx1()+"processing L1 data: complete");
171 }//END: size>0
172 else
173 log_warning(method+"L1 data requested but not available");
174 }//END: L1
175 //--------------------------------------------------------------------------------------------<
176
177
178 //L2 PROCESSING ------------------------------------------------------------------------------>
179 if(m_trigLvl.compare("ALL", Qt::CaseInsensitive)==0 || m_trigLvl.compare("L2", Qt::CaseInsensitive)==0) {
180 std::vector<VP1Trig::VP1TriggerHandleL2> handleL2 = m_triggersystem->getHandleL2();
181 std::vector<VP1Trig::VP1TriggerHandleL2>::iterator l2it = handleL2.begin();
182
183 if(handleL2.size()>0) {
184 log_info(pfx1()+"processing L2 data: start");
185 if(m_dataFormat=='q') {
186 log_verbose("processing sector for QTree format");
187 //************************* FILL *************************//
188 if(l2it->processQTrigItem())
189 m_L2_QData = l2it->m_qtrigData;
190 else
191 m_L2_QData = new QTreeWidgetItem(0);
192 m_L2_QData->setText(0, QString("L2 Data"));
193
194 if(int(L2_triggers->childCount())>0)
195 m_L2_QData->insertChild(0,L2_triggers); //from L1 processor
196
197 //************************* DIST *************************//
199
200 //General processing status update
201 if(int(m_L2_QData->childCount())>0)
202 l2status=true;
203 else
204 log_warning("L2 QTree has no children");
205 }//END: [q] processing
206 else if(m_dataFormat=='v') {
207 log_verbose("processing sector for vector format");
208 //************************* FILL *************************//
209 l2it->processVTrigItem();
210
211 //General processing status update
212 l2status=true;
213 }//END: [v] processing
214 else
215 log_error(method+"data container format invalid!");
216 log_info(pfx1()+"processing L2 data: complete");
217 }//END: size>0
218 else
219 log_warning(method+"L2 data requested but not available");
220 }//END: L2
221 //--------------------------------------------------------------------------------------------<
222
223
224 //EF PROCESSING ------------------------------------------------------------------------------>
225 if(m_trigLvl.compare("ALL", Qt::CaseInsensitive)==0 || m_trigLvl.compare("EF", Qt::CaseInsensitive)==0) {
226 std::vector<VP1Trig::VP1TriggerHandleEF> handleEF = m_triggersystem->getHandleEF();
227 std::vector<VP1Trig::VP1TriggerHandleEF>::iterator efit;
228
229 //Muons in event
230 muonsInEvt = int(handleEF.size());
231
232 if(handleEF.size()>0) {
233 log_info(pfx1()+"processing EF data: start");
234 if(m_dataFormat=='q') {
235 log_verbose("processing sector for QTree format");
236 //************************* INIT *************************//
237 m_EF_QData = new QTreeWidgetItem(0);
238 m_EF_QData->setText(0, QString("EF Data"));
239
240 //************************* FILL *************************//
241 if(int(EF_triggers->childCount())>0)
242 m_EF_QData->addChild(EF_triggers); //from L1 processor
243 for(efit=handleEF.begin(); efit!=handleEF.end(); ++efit) {
244 if(efit->processQTrigItem())
245 m_EF_QData->addChild(efit->m_qtrigData);
246 }
247
248 //************************* DIST *************************//
250
251 //General processing status update
252 if(int(m_EF_QData->childCount())>0)
253 efstatus=true;
254 else
255 log_warning("EF QTree has no children");
256 }//END: [q] processing
257 else if(m_dataFormat=='v') {
258 log_verbose("processing sector for vector format");
259 //************************* INIT *************************//
260 int p_success=0, p_failed=0;
261
262 //************************* FILL *************************//
263 for(efit=handleEF.begin(); efit!=handleEF.end(); ++efit) {
264 if(efit->processVTrigItem())
265 ++p_success;
266 else
267 ++p_failed;
268 }
269
270 //General processing status update
271 if(p_success>0)
272 efstatus=true;
273 if(p_failed>0)
274 log_warning("EF data item(s) failed processing: "+VP1String::str(p_failed));
275 }//END: [v] processing
276 else
277 log_error(method+"data container format invalid!");
278 log_info(pfx1()+"processing EF data: complete");
279 }//END: size>0
280 else
281 log_warning(method+"EF data requested but not available");
282 }//END: EF
283 //--------------------------------------------------------------------------------------------<
284
285 //Update DAQ Status flag ~~~~~~~~~~~~~~~
286 if(m_daqStatus) {
287 if(l1status || l2status || efstatus)
288 m_daqStatus=true;
289 else
290 m_daqStatus=false;
291 }//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
292
293 log_info("Processing trigger data: complete");
294}//END: processData
295
296
297//Clear System (at erase)
298//_____________________________________________________________________________________________
300{
301 log_info("clearSystem()");
302
303 m_triggersystem->clearTriggerHandles();
304
305 m_trigLvlDataSet.clear();
306
307 m_L1_QData->takeChildren();
308 m_L2_QData->takeChildren();
309 m_EF_QData->takeChildren();
310}//END: clearSystem
311
312
313//#############################################################################################
314// PUBLIC USER ACCESS METHODS [GETTER]
315//#############################################################################################
316
317
318//Return Status of Initalization
319//_____________________________________________________________________________________________
321{
322 log_verbose("User request: return status of initalization");
323 return m_initStatus;
324}
325
326
327//Return DAQ Status
328//_____________________________________________________________________________________________
330{
331 log_verbose("User request: return daq status");
332 return m_daqStatus;
333}
334
335
336//Return Data Container Export Format
337//_____________________________________________________________________________________________
339{
340 log_verbose("User request: return data container export type");
341 return m_dataFormat;
342}
343
344
345//Return Trigger Level flag to Process
346//_____________________________________________________________________________________________
348{
349 log_verbose("User request: return trigger level flag to process");
350 return m_trigLvl;
351}
352
353
354//Return Number of Muons in Event (requires EF trigLvl)
355//_____________________________________________________________________________________________
357{
358 log_verbose("User request: return number of muons in event");
359 return muonsInEvt;
360}
361
362
363//Return collected Trigger Data in QTree container format
364//_____________________________________________________________________________________________
365QList<QTreeWidgetItem *> VP1Trig::VP1TriggerProcessor::getQTrigData(QString triglvl)
366{
367 log_verbose("User request: return collected trigger data in QTree container format");
368 QList<QTreeWidgetItem *> customDataSet;
369
370 if(m_daqStatus) {
371 if(triglvl.compare("ALL", Qt::CaseInsensitive)==0 || triglvl.compare("L1", Qt::CaseInsensitive)==0 || triglvl.compare("L2", Qt::CaseInsensitive)==0 || triglvl.compare("EF", Qt::CaseInsensitive)==0) {
372 if(m_trigLvl.compare(triglvl, Qt::CaseInsensitive)==0)
373 return m_trigLvlDataSet;
374 else if(m_trigLvl.compare("ALL", Qt::CaseInsensitive)==0) {
375 if(triglvl.compare("ALL", Qt::CaseInsensitive)==0)
376 return m_trigLvlDataSet;
377 else if(triglvl.compare("L1", Qt::CaseInsensitive)==0) {
378 customDataSet << m_L1_QData;
379 return customDataSet;
380 }
381 else if(triglvl.compare("L2", Qt::CaseInsensitive)==0) {
382 customDataSet << m_L2_QData;
383 return customDataSet;
384 }
385 else if(triglvl.compare("EF", Qt::CaseInsensitive)==0) {
386 customDataSet << m_EF_QData;
387 return customDataSet;
388 }
389 }//all available
390 }//available trigger levels
391 }//daq status ok
392 else {
393 log_fatal("User data request: DAQ not available!");
394 return customDataSet;
395 }
396
397 log_error("User requested ["+triglvl+"] trigger data which is not available! Only ["+m_trigLvl+"] available.");
398 return m_trigLvlDataSet;
399}
400
401
402//#############################################################################################
403// PUBLIC USER ACCESS METHODS [SETTER]
404//#############################################################################################
405
406
407//Set Trigger Level flag to Process
408//_____________________________________________________________________________________________
410{
411 if(triglvl.compare("L1", Qt::CaseInsensitive)==0 || triglvl.compare("L2", Qt::CaseInsensitive)==0 || triglvl.compare("EF", Qt::CaseInsensitive)==0 || triglvl.compare("ALL", Qt::CaseInsensitive)==0) {
412 log_verbose("User request: set trigger level flag to "+triglvl);
413 m_trigLvl = triglvl;
414 }
415 else
416 log_error("setTrigLvl(): ["+triglvl+"] as trigger level flag not available!");
417}
418
419
420//Set Data Container Format (> dataFormat)
421//_____________________________________________________________________________________________
423{
424 if(ctnid=='v' || ctnid=='q' || ctnid=='a') { //[v]ector, [q]tree, [a]ll available
425 log_verbose("User request: set data container format to "+qstr(ctnid));
426 m_dataFormat = ctnid;
427 }
428 else
429 log_error("setDataFormat(): ["+qstr(ctnid)+"] as data container format not available!");
430}
int muonsInEvt
The Athena Transient Store API.
static QString str(const QString &s)
Definition VP1String.h:49
QList< QTreeWidgetItem * > m_trigLvlDataSet
QList< QTreeWidgetItem * > getQTrigData(QString)
void loadData(StoreGateSvc *m_storeGate)