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