ATLAS Offline Software
Loading...
Searching...
No Matches
TopoSteering.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
7
8
16
20
27
28// c++ libraries
29#include <iostream>
30#include <iomanip>
31#include <string>
32
33using namespace std;
34using namespace TCS;
35using namespace TrigConf;
36
37
41
43TopoSteering::setupFromConfiguration ATLAS_NOT_THREAD_SAFE (const TrigConf::L1Menu& l1menu){
44
45 TCS::StatusCode sc = m_structure.setupFromMenu( l1menu, m_isLegacyTopo );
46
47 // configure layout of the simulation result
48 sc &= m_simulationResult.setupFromMenu( m_structure.outputConnectors(), m_structure.countConnectors() );
49
50 return sc;
51
52}
53
54TCS::StatusCode
87
88
91 TRG_MSG_INFO("initializing algorithms");
92 if( ! structure().isConfigured() ) {
93 TCS_EXCEPTION("L1Topo Steering has not been configured, can't run")
94 }
95
96 for(auto conn: m_structure.connectors()) {
97 TCS::ConfigurableAlg * alg = conn->algorithm();
98 if(alg) {
99 TRG_MSG_INFO("initializing algorithm " << alg->name());
100 if(m_histSvc) {
101 alg->setL1TopoHistSvc(m_histSvc);
102 }
103 alg->setLegacyMode(m_isLegacyTopo);
104 alg->initialize();
105 }
106
107 }
108
110}
111
112
114TopoSteering::setHistSvc(std::shared_ptr<IL1TopoHistSvc> histSvc) {
115 TRG_MSG_INFO("setting L1TopoHistSvc ");
116 m_histSvc = std::move(histSvc);
118}
119
120
123 if(m_histSvc) {
124 m_histSvc->save();
125 } else {
126 TRG_MSG_WARNING("saveHist called without an L1TopoHistSvc being available");
127 }
129}
130
131
134
135
136 TRG_MSG_INFO("L1 TopoSteering: start executing event " << m_evtCounter << "-----------------------------------");
137
138
139 if( ! structure().isConfigured() ) {
140 TRG_MSG_INFO("L1Topo Steering has not been configured, can't run");
141 TCS_EXCEPTION("L1Topo Steering has not been configured, can't run");
142 }
143
144 inputEvent().print();
145
146 // execute all connectors
148 TRG_MSG_INFO("Going to execute " << m_structure.outputConnectors().size() << " decision connectors and " << m_structure.countConnectors().size() << " multiplicity connectors.");
149 for(const auto & [name, pConnector]: m_structure.outputConnectors()) {
150 TRG_MSG_INFO("executing trigger line " << name);
151 sc |= executeConnector(pConnector);
152 TRG_MSG_INFO("result of trigger line " << name << " : " << pConnector->decision().decision());
153 }
154
155 for(const auto & [name, pConnector]: m_structure.countConnectors()) {
156 TRG_MSG_INFO("executing trigger line " << name);
157 sc |= executeConnector(pConnector);
158 }
159
160 sc |= m_simulationResult.collectResult();
161
162 m_simulationResult.globalOutput().print();
163
164 TRG_MSG_INFO("finished executing event " << m_evtCounter++);
166}
167
168
169
171TopoSteering::executeTrigger(const std::string & TrigName) {
172 if( ! structure().isConfigured() )
173 TCS_EXCEPTION("TopoSteering has not been configured, can't run");
174
175 DecisionConnector * outConn = m_structure.outputConnector(TrigName);
176
178
179 m_simulationResult.collectResult(outConn);
180
181 return sc;
182}
183
184
185
186
187
188
191
192 if (conn == NULL) {
194 }
195
196 // caching
197 if(conn->isExecuted())
198 return conn->executionStatusCode();
199
201
202 if(conn->isInputConnector()) {
203 //TRG_MSG_DEBUG(" ... executing input connector '" << conn->name() << "'");
204 sc = executeInputConnector(dynamic_cast<InputConnector*>(conn));
205 } else if(conn->isSortingConnector()) {
206 //TRG_MSG_DEBUG(" ... executing sorting connector '" << conn->name() << "'");
207 sc = executeSortingConnector(dynamic_cast<SortingConnector*>(conn));
208 } else if(conn->isDecisionConnector()){
209 //TRG_MSG_DEBUG(" ... executing decision connector '" << conn->name() << "'");
210 sc = executeDecisionConnector(dynamic_cast<DecisionConnector*>(conn));
211 } else if(conn->isCountingConnector()){
212 sc = executeCountingConnector(dynamic_cast<CountingConnector*>(conn));
213 }
214
215 conn->setIsExecuted(true);
216 conn->setExecutionStatusCode(sc);
217
218 return sc;
219}
220
221
222
225
226 if (conn == NULL) {
228 }
229
231
232 // attaching data from inputEvent to input connector, depending on the configured input type
233
234 const InputTOBArray * inputData = inputEvent().inputTOBs( conn->inputTOBType() );
235 const bool hasInputOverflow = inputEvent().hasInputOverflow(conn->inputTOBType());
236 conn->attachOutputData( inputData );
237 conn->toggleInputOverflow(hasInputOverflow);
238
239 TRG_MSG_DEBUG(" ... executing input connector '" << conn->name() << "' -> attaching '" << inputData->name() << "' of size " << inputData->size());
240
241 return sc;
242}
243
244
245
248
249 if (conn == NULL) {
250 return StatusCode::FAILURE;
251 }
252
254
255 // execute all the prior connectors
256 for( TCS::Connector* inputConn: conn->inputConnectors() ){
257 sc &= executeConnector(inputConn);
258 conn->toggleInputOverflow(conn->hasInputOverflow() ||
259 inputConn->hasInputOverflow());
260 }
261 TCS::SortingAlg* alg = conn->sortingAlgorithm();
262
263 TOBArray * sortedOutput = new TOBArray(conn->outputName());
264
265 sc &= executeSortingAlgorithm(alg, conn->inputConnector(), sortedOutput);
266
267 conn->toggleAmbiguity(sortedOutput->ambiguityFlag());
268
269 TRG_MSG_DEBUG(" ... executing sorting connector '" << conn->name() << "' -> attaching '" << sortedOutput->name() << "' of size " << sortedOutput->size());
270
271 conn->attachOutputData(sortedOutput);
272
273 return sc;
274}
275
276
277
280
281 if (conn == NULL) {
283 }
284
286
287 // execute all the prior connectors
288 for( TCS::Connector* inputConn: conn->inputConnectors() ){
289 sc &= executeConnector(inputConn);
290 conn->toggleInputOverflow(conn->hasInputOverflow() ||
291 inputConn->hasInputOverflow());
292 conn->toggleAmbiguity(conn->hasAmbiguity() ||
293 inputConn->hasAmbiguity());
294 }
295 // execute
296 TCS::DecisionAlg* alg = conn->decisionAlgorithm();
297
298 // TRG_MSG_DEBUG(" ... executing decision connector '" << conn->name() << "' with " << conn->triggers().size() << " active trigger lines. The algorithm has " << alg->numberOutputBits() << " output bits.");
299
300 // the output is one TOBArray per output line
301 vector<TOBArray *> output( alg->numberOutputBits() );
302
303 for(unsigned int i=0; i<alg->numberOutputBits(); ++i) {
304 output[i] = new TOBArray(conn->triggers()[i].name());
305 output[i]->setAmbiguityFlag(conn->hasAmbiguity());
306 }
307
308 sc &= executeDecisionAlgorithm(alg, conn->inputConnectors(), output, conn->m_decision);
309
310 TRG_MSG_DEBUG(" ... executing decision connector '" << conn->name() << "' -> attaching output data:");
311 for(TOBArray const * outarr : output) {
312 TRG_MSG_DEBUG(" data '" << outarr->name() << "' of size " << outarr->size());
313 conn->toggleAmbiguity(conn->hasAmbiguity() || outarr->ambiguityFlag());
314 }
315
316 conn->attachOutputData(output);
317
318 conn->setIsExecuted(true);
319 conn->setExecutionStatusCode(sc);
320 bool sortOverflow = false;
321 for(TCS::Connector* inputConnector: conn->inputConnectors()) {
322 // TODO DG-2017-04-18 the sort overflow (>10 TOBs) in the SortAlg is not implemented yet
323 if(inputConnector->isSortingConnector()) {
324 if (auto sortConn = dynamic_cast<SortingConnector*>(inputConnector)) {
325 sortOverflow = sortConn->sortingAlgorithm()->overflow();
326 if (sortOverflow) break;
327 }
328 }
329 }
330 conn->m_decision.setOverflow(conn->hasInputOverflow() || sortOverflow);
331 conn->m_decision.setAmbiguity(conn->hasAmbiguity());
332 return sc;
333}
334
335
338
339 if (conn == NULL) {
341 }
342
344
345 // execute all the prior connectors
346 for( TCS::Connector* inputConn: conn->inputConnectors() ){
347 sc &= executeConnector(inputConn);
348 conn->toggleInputOverflow(conn->hasInputOverflow() ||
349 inputConn->hasInputOverflow());
350 }
351
352 // execute
353 TCS::CountingAlg* alg = conn->countingAlgorithm();
354
355 // Execute algorithm with no output data - not needed for now
356 sc &= executeCountingAlgorithm(alg, conn->inputConnector(), conn->m_count);
357
358 conn->setIsExecuted(true);
359 conn->setExecutionStatusCode(sc);
360
361 // TO-DO overflows in multiplicity algorithms
362
363 return sc;
364}
365
366
367
370 TCS::InputConnector* inputConnector,
371 TCS::TOBArray * & sortedOutput) {
372
373 TRG_MSG_DEBUG(" ... executing sorting alg '" << alg->fullname() << "'"
374 <<(m_useBitwise?" (bitwise)":""));
375
376 const InputTOBArray * input = inputConnector->outputData();
377
378 if(m_useBitwise) alg->sortBitCorrect(*input, *sortedOutput);
379 else alg->sort(*input, *sortedOutput);
380
382}
383
384
385
388 const std::vector<Connector*> & inputConnectors,
389 const std::vector<TCS::TOBArray *> & output,
390 TCS::Decision & decision) {
391
392 TRG_MSG_DEBUG(" ... executing decision alg '" << alg->fullname() << "'"
393 <<(m_useBitwise?" (bitwise)":""));
394
395 if(inputConnectors.size()<1) {
396 TCS_EXCEPTION("L1Topo Steering: Decision algorithm expects at least 1 input array but got 0");
397 }
398
399 std::vector<TCS::TOBArray const *> input; // needs to be optimized
400 for(const Connector* inConn: inputConnectors)
401 {
402 if (inConn == nullptr) continue;
403 const SortingConnector * sc = dynamic_cast<const SortingConnector *>(inConn);
404 if (sc==nullptr) {
405 TCS_EXCEPTION("L1Topo Steering: Decision algorithm " << alg->name() << " could not cast as SortingConnector* the input connector " << inConn->name());
406 }
407 else {
408 const TOBArray * tobA = dynamic_cast<const TOBArray *>( sc->outputData());
409 if(tobA==nullptr) {
410 TCS_EXCEPTION("L1Topo Steering: Decision algorithm " << alg->name() << " expects TOBArray(s) as input, but did not get it from connector " << (inConn ? inConn->name() : ""));
411 }
412 input.push_back( tobA );
413 }
414 }
415
416 alg->reset();
417
418
419 if(m_useBitwise) alg->processBitCorrect( input, output, decision);
420 else alg->process( input, output, decision );
421 //TRG_MSG_ALWAYS("[XS1234sz]L1Topo Steering alg " << alg->name() << " has decision " << decision.decision());
422
424}
425
426
429 TCS::InputConnector* inputConnector,
430 TCS::Count & count) {
431
432 TRG_MSG_DEBUG(" ... executing multiplicity alg '" <<alg->fullname() << "'");
433
434 const InputTOBArray * input = inputConnector->outputData();
435
436 alg->process( *input, count);
437
439}
440
441
442void
444 TRG_MSG_INFO("Number of ClusterTOB : " << ClusterTOB::heap().size());
445 TRG_MSG_INFO("Number of eEmTOB : " << eEmTOB::heap().size());
446 TRG_MSG_INFO("Number of JetTOB : " << JetTOB::heap().size());
447 TRG_MSG_INFO("Number of jJetTOB : " << jJetTOB::heap().size());
448 TRG_MSG_INFO("Number of GenericTOB : " << GenericTOB::heap().size());
449 TRG_MSG_INFO("Number of CompositeTOB: " << CompositeTOB::heap().size());
450 TRG_MSG_INFO("Number of MuonTOB : " << MuonTOB::heap().size());
451 TRG_MSG_INFO("Number of LateMuonTOB : " << LateMuonTOB::heap().size());
452}
453
454
455
456void
457TopoSteering::printConfiguration(std::ostream & o) const {
458 o << "==========================\n"
459 << "TopoSteering configuration\n"
460 << "--------------------------\n";
461 structure().print(o);
462 o << "==========================" << endl;
463}
464
465
466
467void
469
470 //const char* levelNames[TrigConf::MSGTC::NUM_LEVELS] = {"NIL","VERBOSE","DEBUG","INFO",
471 // "WARNING","ERROR","FATAL","ALWAYS"};
472 msg().setLevel( lvl );
473
474 inputEvent().msg().setLevel(lvl);
475
476 m_simulationResult.setMsgLevel( lvl );
477}
478
479void
481 m_AlgMsgLvl = lvl;
482 for( Connector * conn : m_structure.connectors() ) {
483 const ConfigurableAlg * alg = conn->algorithm();
484 if(alg==nullptr) continue;
485 alg->msg().setLevel(lvl);
486 }
487}
488
489//----------------------------------------------------------
490void
491TopoSteering::setHardwareBits(const std::bitset<numberOfL1TopoBits> &triggerBits,
492 const std::bitset<numberOfL1TopoBits> &ovrflowBits){
493 m_triggerHdwBits = triggerBits;
494 m_ovrflowHdwBits = ovrflowBits;
495}
496//----------------------------------------------------------
497void
499 for(const auto & [connectorName, outCon] : m_structure.outputConnectors()) {
500 outCon->decisionAlgorithm()->resetHardwareBits();
501 unsigned int pos = 0; // for multi-output algorithms pos is the output index
502 for(const TrigConf::TriggerLine &trigger : outCon->triggers()){
503 unsigned int bitNumber = trigger.flatindex();
504 outCon->decisionAlgorithm()->setHardwareBits(pos,
505 m_triggerHdwBits[bitNumber],
506 m_ovrflowHdwBits[bitNumber]);
507 pos++;
508 TRG_MSG_DEBUG("propagating hardware bit (dec/ovr) "<<bitNumber
509 <<" to algo "<<connectorName<<"["<<pos<<"]"
510 <<" "<<m_triggerHdwBits[bitNumber]<<" /"
511 <<" "<<m_ovrflowHdwBits[bitNumber]);
512
513 }
514 }
515}
516//----------------------------------------------------------
517void
519 for(const auto & [connectorName, outCon] : m_structure.outputConnectors()) {
520 if(outCon) {
521 outCon->decisionAlgorithm()->setFillHistosBasedOnHardware(value);
522 } else {
523 TRG_MSG_DEBUG("skipping invalid DecisionConnector '"<<connectorName<<"'");
524 }
525 }
526}
527//----------------------------------------------------------
528void
530 for(const auto & [connectorName,outCon] : m_structure.outputConnectors()) {
531 if(outCon) {
532 outCon->decisionAlgorithm()->setSkipHistos(value);
533 } else {
534 TRG_MSG_DEBUG("skipping invalid DecisionConnector '"<<connectorName<<"'");
535 }
536 }
537}
538//----------------------------------------------------------
static Double_t sc
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
static void clearHeap()
static const Heap< TCS::ClusterTOB > & heap()
Definition ClusterTOB.h:56
static const Heap< TCS::CompositeTOB > & heap()
static void clearHeap()
size_t size() const
const std::string & name() const
Definition DataArray.h:20
static const Heap< TCS::GenericTOB > & heap()
Definition GenericTOB.h:110
static void clearHeap()
const InputTOBArray * outputData() const
virtual unsigned int size() const =0
static void clearHeap()
Definition JetTOB.cxx:37
static const Heap< TCS::JetTOB > & heap()
Definition JetTOB.h:71
static const Heap< TCS::LateMuonTOB > & heap()
Definition LateMuonTOB.h:74
static void clearHeap()
static void clearHeap()
Definition MetTOB.cxx:38
static void clearHeap()
static const Heap< TCS::MuonTOB > & heap()
Definition MuonTOB.h:79
static void clearHeap()
Definition MuonTOB.cxx:33
bool ambiguityFlag() const
Definition TOBArray.h:37
const InputTOBArray * inputTOBs(TCS::inputTOBType_t) const
bool hasInputOverflow(TCS::inputTOBType_t) const
whether there are input overflows from Mioct for muon and from CMX for calo
void print(std::ostream &o) const
StatusCode executeSortingAlgorithm(SortingAlg *alg, TCS::InputConnector *inputConnector, TOBArray *&output)
StatusCode saveHist()
void setOutputAlgosFillBasedOnHardware(const bool &value)
tell output algos to fill accept/reject histos based on hdw decision.
void printConfiguration(std::ostream &o) const
std::bitset< numberOfL1TopoBits > m_ovrflowHdwBits
StatusCode executeEvent()
StatusCode reset()
std::bitset< numberOfL1TopoBits > m_triggerHdwBits
StatusCode executeSortingConnector(TCS::SortingConnector *conn)
void setMsgLevel(TrigConf::MSGTC::Level lvl)
void setHardwareBits(const std::bitset< numberOfL1TopoBits > &triggerBits, const std::bitset< numberOfL1TopoBits > &ovrflowBits)
cache the decision/overflow bits from hardware These bits are propagated to the algorithms with propa...
std::shared_ptr< IL1TopoHistSvc > m_histSvc
TopoSteeringStructure m_structure
void setOutputAlgosSkipHistograms(const bool &value)
skip filling the histos
StatusCode executeDecisionConnector(TCS::DecisionConnector *conn)
const TopoSteeringStructure & structure() const
TopoInputEvent & inputEvent()
unsigned int m_evtCounter
StatusCode executeInputConnector(TCS::InputConnector *conn)
void propagateHardwareBitsToAlgos()
propagate the bits from hardware to each simulated decision algo.
StatusCode executeTrigger(const std::string &triggerName)
StatusCode setHistSvc(std::shared_ptr< IL1TopoHistSvc > histSvc)
enables the histogramming service
StatusCode executeConnector(TCS::Connector *conn)
StatusCode executeCountingConnector(TCS::CountingConnector *conn)
TopoCoreSimResult m_simulationResult
StatusCode executeCountingAlgorithm(TCS::CountingAlg *alg, TCS::InputConnector *inputConnector, Count &count)
TrigConf::MSGTC::Level m_AlgMsgLvl
StatusCode executeDecisionAlgorithm(TCS::DecisionAlg *alg, const std::vector< Connector * > &inputConnectors, const std::vector< TCS::TOBArray * > &output, Decision &decsion)
StatusCode initializeAlgorithms()
void setAlgMsgLevel(TrigConf::MSGTC::Level lvl)
static void clearHeap()
Definition cTauTOB.cxx:38
static const Heap< TCS::eEmTOB > & heap()
static void clearHeap()
Definition eTauTOB.cxx:38
static void clearHeap()
Definition gJetTOB.cxx:35
static void clearHeap()
Definition gLJetTOB.cxx:35
static void clearHeap()
Definition gTETOB.cxx:31
static void clearHeap()
Definition gXETOB.cxx:33
static void clearHeap()
Definition jEmTOB.cxx:32
static const Heap< TCS::jJetTOB > & heap()
Definition jJetTOB.h:54
static void clearHeap()
Definition jJetTOB.cxx:32
static void clearHeap()
Definition jLJetTOB.cxx:32
static void clearHeap()
Definition jTETOB.cxx:31
static void clearHeap()
Definition jTauTOB.cxx:32
static void clearHeap()
Definition jXETOB.cxx:33
L1 menu configuration.
Definition L1Menu.h:28
void setLevel(MSGTC::Level lvl)
Set message level of stream.
MsgStreamTC & msg() const
The standard message stream.
TrigConfMessaging(const std::string &name)
Constructor with parameters.
a TriggerLine entry describes the location of a threshold multiplicity on a cable (connector)
Definition L1Connector.h:22
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
Forward iterator to traverse the main components of the trigger configuration.
Definition Config.h:22
STL namespace.