ATLAS Offline Software
Run2ToRun3TrigNavConverterV2.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <boost/functional/hash.hpp>
6 #include <GaudiKernel/StatusCode.h>
7 #include "AthLinks/ElementLinkVector.h"
16 #include "SpecialCases.h"
17 
18 namespace TCU = TrigCompositeUtils;
19 
20 // helper class
22 {
23  teIDs.push_back(te->getId());
24 }
25 
26 // find if proxy is a child of other proxies, also follows to children of the children etc...
27 bool ConvProxy::isChild(const ConvProxy* other ) const {
28  for ( auto c: children ) {
29  if (other == c)
30  return true;
31  if ( c->isChild(other) )
32  return true;
33  }
34  return false;
35 }
36 
37 bool ConvProxy::isParent(const ConvProxy* other ) const {
38  for ( auto c: parents ) {
39  if (other == c)
40  return true;
41  if ( c->isParent(other) )
42  return true;
43  }
44  return false;
45 }
46 
47 
49 {
50  if (this == other)
51  return false; // no merging with self
52  // never merge children with parents
53  if ( isChild(other) )
54  return false;
55  if ( isParent(other) )
56  return false;
57  return true;
58 }
59 
61 {
62  if (other == this)
63  {
64  return;
65  }
66  // copy over chains
67  runChains.insert(other->runChains.begin(), other->runChains.end());
68  passChains.insert(other->passChains.begin(), other->passChains.end());
69  teIDs.push_back(other->te->getId());
70  /* the intention of the code below is following.
71  Intial structure like is like this (the line is always bidirectional):
72  P1 P2 P3 <- parents
73  | | /
74  T1 T2 <- "this" and "other"
75  | |
76  C1 C2 <- children
77  1) Lets assume that the first proxies we treat are B1 & B2 ath they are mergable. The resulting structure should look like this:
78  P1 P2 P3
79  |/__/
80  T1 T2
81  |\
82  C1 C2
83 
84  */
85  auto add = [](ConvProxy *toadd, std::set<ConvProxy *> &coll)
86  {
87  if (std::find(coll.begin(), coll.end(), toadd) == coll.end())
88  {
89  coll.insert(toadd);
90  }
91  };
92 
93  auto remove = [](ConvProxy *torem, std::set<ConvProxy *> &coll)
94  {
95  auto place = std::find(coll.begin(), coll.end(), torem);
96  if (place != coll.end())
97  {
98  coll.erase(place);
99  }
100  };
101 
102  // this is T <-> C connection
103  for (auto otherChild : other->children)
104  {
105  add(otherChild, children);
106  add(this, otherChild->parents);
107  }
108  // this is T <-> P connection rewiring
109  for (auto otherParent : other->parents)
110  {
111  add(otherParent, parents);
112  add(this, otherParent->children);
113  }
114 
115  // now need to remove links back to the "other"
116  for (auto otherParent : other->parents)
117  {
118  remove(other, otherParent->children);
119  }
120 
121  for (auto otherChild : other->children)
122  {
123  remove(other, otherChild->parents);
124  }
125  other->children.clear();
126  other->parents.clear();
127 }
128 
129 std::string ConvProxy::description() const
130 {
131  std::string ret;
132  ret += " N parents: " + std::to_string(parents.size());
133  ret += " N children: " + std::to_string(children.size());
134  std::ostringstream os;
135  for ( auto c: children )
136  os << c << " ";
137  ret += " ptrs: " + os.str();
138  ret += " feaHash: " + std::to_string(feaHash);
139  ret += " N run chains: " + std::to_string(runChains.size());
140  return ret;
141 }
142 
143 // the algorithm
144 Run2ToRun3TrigNavConverterV2::Run2ToRun3TrigNavConverterV2(const std::string &name, ISvcLocator *pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator)
145 {
146 }
147 
149 {
150 }
151 
153 {
154  ATH_CHECK(m_trigOutputNavKey.initialize());
155  ATH_CHECK(m_tdt.empty() != m_trigNavKey.key().empty()); // either of the two has to be enabled but not both
156  if (!m_tdt.empty())
157  {
158  ATH_CHECK(m_tdt.retrieve());
159  ATH_MSG_INFO("Will use Trigger Navigation from TrigDecisionTool");
160  }
161  else
162  {
164  ATH_MSG_INFO("Will use Trigger Navigation decoded from TrigNavigation object");
165  }
166 
167  if (!m_chainsToSave.empty()) {
168  ATH_MSG_DEBUG("Will only save features for these chains " << m_chainsToSave);
169  }
170 
171  ATH_CHECK(m_configSvc.retrieve());
172  ATH_CHECK(m_clidSvc.retrieve());
173 
174  // configured collections can be either just type name, or type#key
175  // decoding takes this into account, if only the type is configured then empty string is places in the decoded lookup map
176  // else CLID + a name is placed
177 
178  for (const auto &name : m_collectionsToSave)
179  {
180  std::string typeName = name;
181  std::string collName;
182  size_t delimeterIndex = name.find('#');
183  if (delimeterIndex != std::string::npos)
184  {
185  ATH_MSG_ERROR("Not support for specific collection name yet");
186  return StatusCode::FAILURE;
187  typeName = name.substr(0, delimeterIndex);
188  collName = name.substr(delimeterIndex + 1);
189  }
190  CLID id{0};
191  ATH_CHECK(m_clidSvc->getIDOfTypeName(typeName, id));
192  ATH_MSG_DEBUG("Will be linking collection type " << typeName << " name (empty==all) " << collName);
193  m_collectionsToSaveDecoded[id].insert(collName);
194  }
195 
196  for (const auto &name : m_roisToSave)
197  {
198  m_setRoiName.push_back(name);
199  }
200 
201  // sanity check, i.e. if there is at least one entry w/o the coll name no other entries are needed for a given clid
202  for (auto [clid, keysSet] : m_collectionsToSaveDecoded)
203  {
204  if (keysSet.size() > 1 and keysSet.count("") != 0)
205  {
206  ATH_MSG_ERROR("Bad configuration for CLID " << clid << " reuested saving of all (empty coll name configures) collections, yet there are also specific keys");
207  return StatusCode::FAILURE;
208  }
209 
210  }
211 
212  bool anyChainBad=false;
213  for ( auto chain: m_chainsToSave ) {
214  if ( chain.find('*') != std::string::npos or chain.find('|') != std::string::npos ) {
215  ATH_MSG_ERROR("Supplied chain name: " << chain << " contains wildcard characters, this is not supported by the conversion tool");
216  anyChainBad=true;
217  }
218  }
219  if ( anyChainBad ) {
220  ATH_MSG_ERROR("Supplied chain names contain wildcard characters, this is not supported by the conversion tool");
221  return StatusCode::FAILURE;
222  }
223  if ( m_chainsToSave.empty() ) {
224  ATH_MSG_INFO("No chains list supplied, the conversion will occur for all chains");
225  }
226 
227  ATH_CHECK(m_clidSvc->getIDOfTypeName("TrigRoiDescriptor", m_roIDescriptorCLID));
228  ATH_CHECK(m_clidSvc->getIDOfTypeName("TrigRoiDescriptorCollection", m_roIDescriptorCollectionCLID));
229  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::TrigRingerRings", m_TrigRingerRingsCLID));
230  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::TrigRingerRingsContainer", m_TrigRingerRingsContainerCLID));
231  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::TrigEMCluster", m_TrigEMClusterCLID));
232  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::TrigEMClusterContainer", m_TrigEMClusterContainerCLID));
233  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::CaloCluster", m_CaloClusterCLID));
234  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::CaloClusterContainer", m_CaloClusterContainerCLID));
235  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::TrackParticleContainer", m_TrackParticleContainerCLID));
236  ATH_CHECK(m_clidSvc->getIDOfTypeName("xAOD::TauTrackContainer", m_TauTrackContainerCLID));
237 
238  return StatusCode::SUCCESS;
239 }
240 
242 {
243  return StatusCode::SUCCESS;
244 }
245 
246 StatusCode Run2ToRun3TrigNavConverterV2::execute(const EventContext &context) const
247 {
248  // ATH_MSG_INFO("EVENT " << context.evt());
249  // if ( 4 == context.evt() ) return StatusCode::SUCCESS;
250  // ATH_MSG_INFO("EVENT processing " << context.evt());
251 
252  {
253  // configuration reading could not be done before the event loop
254  // it needs to be done only once though
255  std::scoped_lock lock(m_configUpdateMutex);
256  if (m_allTEIdsToChains.empty())
258  }
259 
260  ConvProxySet_t convProxies;
261  HLT::StandaloneNavigation standaloneNav; // needed to keep TEs around, so it is out of the scope where it is filled and referenced
262  const HLT::TrigNavStructure *run2NavigationPtr = nullptr;
263  if (!m_trigNavKey.key().empty())
264  {
265  SG::ReadHandle navReadHandle(m_trigNavKey, context);
266  ATH_CHECK(navReadHandle.isValid());
267  standaloneNav.deserialize(navReadHandle->serialized());
268  run2NavigationPtr = &standaloneNav;
269  }
270  else
271  {
272  run2NavigationPtr = m_tdt->ExperimentalAndExpertMethods().getNavigation();
273  }
274 
275  ATH_CHECK(mirrorTEsStructure(convProxies, *run2NavigationPtr));
276  // printProxies(convProxies, [](auto ){ return true;},
277  // {m_chainIdsPrinter});
278 
279  if (m_doSelfValidation)
280  ATH_CHECK(allProxiesConnected(convProxies));
281 
283  // printProxies(convProxies, [](auto ){ return true;},
284  // {m_chainIdsPrinter});
285 
286  ATH_CHECK(cureUnassociatedProxies(convProxies));
287  ATH_MSG_DEBUG("Proxies to chains mapping done");
288 
289  ATH_CHECK(removeTopologicalProxies(convProxies));
290 
291  if (not m_chainsToSave.empty())
292  {
293  ATH_CHECK(removeUnassociatedProxies(convProxies));
294  printProxies(convProxies, [](auto ){ return true;},
296  ATH_MSG_DEBUG("Removed proxies to chains that are not converted, remaining number of elements " << convProxies.size());
297  }
298  if (m_doSelfValidation)
299  {
300  ATH_CHECK(allProxiesHaveChain(convProxies));
301  }
302  if (m_doCompression)
303  {
304  ATH_CHECK(doCompression(convProxies, *run2NavigationPtr));
305  // printProxies(convProxies, [](auto ){ return true;},
306  // {m_chainIdsPrinter});
307 
308  }
309 
311  auto decisionOutput = outputNavigation.ptr();
312  TrigCompositeUtils::newDecisionIn(decisionOutput, TCU::summaryPassNodeName()); // we rely on the fact that the 1st element is the top
313 
314  if (m_doLinkFeatures)
315  {
316  ATH_CHECK(fillRelevantFeatures(convProxies, *run2NavigationPtr));
317  ATH_CHECK(fillRelevantRois(convProxies, *run2NavigationPtr));
318  ATH_CHECK(fillRelevantTracks(convProxies));
319  ATH_MSG_DEBUG("Features to link found");
320  }
321 
322  ATH_CHECK(createIMHNodes(convProxies, *decisionOutput, context));
323  if (m_doSelfValidation)
324  {
326  }
327 
328  ATH_CHECK(createL1Nodes(convProxies, *decisionOutput, context));
329  ATH_CHECK(linkFeaNode(convProxies, *decisionOutput, *run2NavigationPtr, context));
330  ATH_CHECK(linkRoiNode(convProxies, *run2NavigationPtr));
331  ATH_CHECK(linkTrkNode(convProxies, *run2NavigationPtr));
332  ATH_CHECK(createSFNodes(convProxies, *decisionOutput, m_finalTEIdsToChains, context));
333  ATH_CHECK(updateTerminusNode(*decisionOutput, context));
334  ATH_MSG_DEBUG("Conversion done, from " << convProxies.size() << " elements to " << decisionOutput->size() << " elements");
335 
336  printProxies(convProxies, [](auto ){ return true;},
338  ATH_MSG_DEBUG("Resulting nodes");
339  size_t index = 0;
340  for ( auto o: *decisionOutput) {
341  ATH_MSG_DEBUG("Index: " << index << " " << *o);
342  index++;
343  }
344 
345  // dispose temporaries
346  for (auto proxy : convProxies)
347  {
348  delete proxy;
349  }
350 
351  return StatusCode::SUCCESS;
352 }
353 
355  // chains of configs structure
356  // A B
357  // \/
358  // C
359  // where C is the output TE of sequence consuming A & B
360  // sometimes there are an additional leafs
361  // C
362  // |
363  // D
364  if ( not std::regex_match(ptrChain->name(), SpecialCases::isTopo) ) return 0;
365  size_t stepToConsider = 0;
366  const size_t sigsSize = ptrChain->signatures().size();
367  if ( sigsSize < 2 ) return 0;
368  for ( size_t step = sigsSize-1; step > 1; step --) {
369  if ( (ptrChain->signatures()[step-1])->outputTEs().size() == 2 and (ptrChain->signatures()[step])->outputTEs().size() == 1 ) {
370  stepToConsider = step;
371  break;
372  }
373  }
374  if ( stepToConsider == 0 ) return 0; // not a topo
375 
376  //counting is right, need to see now if TEs are connected
377  auto finalTE = (ptrChain->signatures()[stepToConsider])->outputTEs()[0];
378  auto preFinalTEs = (ptrChain->signatures()[stepToConsider-1])->outputTEs();
379 
380  auto finalSeq = m_configSvc->sequences().getSequence(finalTE->id());
381  std::set<HLT::te_id_type> tesInSeq;
382  std::set<HLT::te_id_type> tesInChain;
383 
384  for ( auto te: finalSeq->inputTEs()) {
385  tesInSeq.insert(te->id());
386  }
387 
388  for ( auto te: preFinalTEs) {
389  tesInChain.insert(te->id());
390  }
391 
392  if (tesInSeq == tesInChain) {
393  return stepToConsider;
394  }
395  return 0;
396 }
397 
399 {
400 
401  ATH_CHECK(not m_configSvc->chains().empty());
402 
403  // obtain map output TE -> input TE via sequences
404  for (auto ptrChain : m_configSvc->chains())
405  {
406  std::string chainName = ptrChain->name();
407  if (not m_chainsToSave.empty())
408  {
409  auto found = std::find(m_chainsToSave.begin(), m_chainsToSave.end(), chainName);
410  if (found == m_chainsToSave.end())
411  {
412  continue;
413  }
414  }
415  // hack for etcut chains
416  // if we ever need to generalise that it should be moved to separate function
417  std::map<HLT::te_id_type, HLT::te_id_type> etcutReplacementTEs;
418  auto etcutReplacement = [&etcutReplacementTEs](HLT::te_id_type in) { auto out = etcutReplacementTEs.find(in); return (out == etcutReplacementTEs.end() ? in : out->second ); };
419  if ( chainName.find("etcut") != std::string::npos ) {
420  std::set<size_t> positionsOfEtCutLegs;
421  // use heuristics to mention
422  if( std::regex_match(chainName, SpecialCases::egammaDiEtcut) ) {
423  ATH_MSG_DEBUG("EtCut chains hack, chain with two etcut legs ");
424  positionsOfEtCutLegs.insert({0, 1});
425  } else if ( std::regex_match(chainName, SpecialCases::egammaCombinedWithEtcut) ) {
426  ATH_MSG_DEBUG("EtCut chains hack, egamma chain with second etcut leg ");
427  positionsOfEtCutLegs.insert({1});
428  } else if ( std::regex_match(chainName, SpecialCases::egammaEtcut) ) {
429  ATH_MSG_DEBUG("EtCut chains hack, single leg egamma chain");
430  positionsOfEtCutLegs.insert({0});
431  }
432 
433  // pilot pass to fill the replacement map
434  std::map<size_t, HLT::te_id_type> positionToDesiredIDmap;
435  for (auto ptrHLTSignature : ptrChain->signatures()) {
436  size_t position = 0;
437  for (auto ptrHLTTE : ptrHLTSignature->outputTEs()) {
438  if (positionsOfEtCutLegs.count(position) and positionToDesiredIDmap.find(position) != positionToDesiredIDmap.end() ) {
439  etcutReplacementTEs[ptrHLTTE->id()] = positionToDesiredIDmap[position];
440  ATH_MSG_DEBUG("EtCut chains hack, TE " << ptrHLTTE->name() << " will be replaced by: " << TrigConf::HLTUtils::hash2string(positionToDesiredIDmap[position]));
441  } else {
442  if ( ptrHLTTE->name().find("calocalib") != std::string::npos and positionsOfEtCutLegs.count(position) ) { // we have final TE for this leg
443  positionToDesiredIDmap[position] = ptrHLTTE->id();
444  }
445  }
446  position++;
447  }
448  }
449  }
450 
451  // chains with a single leg
453  ATH_MSG_DEBUG(" CHAIN name " << chainName << " CHAIN Id " << chainId);
454  for (auto ptrHLTSignature : ptrChain->signatures()) {
455  for (auto ptrHLTTE : ptrHLTSignature->outputTEs()) {
456  unsigned int teId = etcutReplacement(ptrHLTTE->id());
457  allTEs[teId].insert(chainId);
458  if (ptrHLTSignature == ptrChain->signatures().back()) {
459  finalTEs[teId].insert(chainId);
460  ATH_MSG_DEBUG("TE will be used to mark final chain decision " << ptrHLTTE->name() << " chain " << chainName );
461  }
462  }
463  }
464  // chains with a multiple legs
466 
467  // dirty hacks for failing chains parsing
468  if(std::regex_match(chainName, SpecialCases::gammaXeChain))
469  multiplicities={1,1};
470 
471 
472  if ( multiplicities.size() > 1 ) {
473  ATH_MSG_DEBUG(" this " << (is2LegTopoChain(ptrChain) ? "is": "is not") << " topological chain");
474  // the chain structure (in terms of multiplicities) may change along the way
475  // we'll assign legs only to these TEs of the steps that have identical multiplicity pattern
476  // e.g. for the chain: HLT_2g25_loose_g20 the multiplicities are: [2, 1]
477  //
478 
479  // hack for HLT.*tau.*xe.* case
480  if (std::regex_match(chainName, SpecialCases::tauXeChain)) {
481  if (multiplicities.size()==3) multiplicities={1,1};
482  else if (multiplicities.size()==2) multiplicities={1};
483  }
484 
485  ATH_MSG_DEBUG("CHAIN " << chainName << " needs legs: " << multiplicities );
486  std::vector<unsigned int> teIdsLastHealthyStepIds;
487 
488  for (auto ptrHLTSignature : ptrChain->signatures())
489  {
490  std::vector<int> teCounts;
491  std::vector<unsigned int> teIds;
492  unsigned int lastSeenId = 0;
493  for (auto ptrHLTTE : ptrHLTSignature->outputTEs())
494  {
495  if ( lastSeenId != ptrHLTTE->id()) {
496  teCounts.push_back(1);
497  teIds.push_back(ptrHLTTE->id());
498  } else {
499  teCounts.back()++;
500  }
501  lastSeenId = ptrHLTTE->id();
502  }
503 
504  ATH_MSG_DEBUG("TE multiplicities seen in this step " << teCounts);
505  bool multiplicityCounts = multiplicities == teCounts;
506  // hack for HLT.*tau.*xe.* case
507  if(std::regex_match(chainName, SpecialCases::tauXeChain)) multiplicityCounts = true;
508  if ( multiplicityCounts ) {
509  teIdsLastHealthyStepIds = teIds;
510  ATH_MSG_DEBUG("There is a match, will assign chain leg IDs to TEs " << teCounts << " " << teIds);
511  for ( size_t legNumber = 0; legNumber < teIds.size(); ++ legNumber){
512  HLT::Identifier chainLegId = TrigCompositeUtils::createLegName(chainId, legNumber);
513  allTEs[etcutReplacement(teIds[legNumber])].insert(chainLegId);
514  }
515  }
516  }
517  for ( size_t legNumber = 0; legNumber < teIdsLastHealthyStepIds.size(); ++ legNumber ) {
518  HLT::Identifier chainLegId = TrigCompositeUtils::createLegName(chainId, legNumber);
519 
520  ATH_MSG_DEBUG("created leg id " << chainLegId << " that will replace TE ID " << etcutReplacement(teIdsLastHealthyStepIds[legNumber]));
521  finalTEs[etcutReplacement(teIdsLastHealthyStepIds[legNumber])].insert(chainLegId);
522  }
523  }
524 
525  }
526  ATH_MSG_DEBUG("Recognised " << allTEs.size() << " kinds of TEs and among them " << finalTEs.size() << " final types");
527  return StatusCode::SUCCESS;
528 }
529 
531 {
532 
533  // iterate over the TEs, for each make the ConvProxy and build connections
534  std::map<const HLT::TriggerElement *, ConvProxy *> teToProxy;
535  ATH_MSG_DEBUG("TrigNavStructure with " << run2Nav.getAllTEs().size() << " TEs acquired");
536  for (auto te : run2Nav.getAllTEs())
537  {
538  // skip event seed node
540  continue;
541  auto proxy = new ConvProxy(te);
542  convProxies.insert(proxy);
543  teToProxy[te] = proxy;
544  // add linking
545  for (auto predecessor : HLT::TrigNavStructure::getDirectPredecessors(te))
546  {
547  ConvProxy *predecessorProxy = teToProxy[predecessor];
548  if (predecessorProxy != nullptr)
549  { // because we skip some
550  proxy->parents.insert(predecessorProxy);
551  predecessorProxy->children.insert(proxy);
552  }
553  }
554  }
555 
556  if (m_doSelfValidation)
557  {
558  int counter = -1;
559  for (auto proxy : convProxies)
560  {
561  counter++;
562  ATH_MSG_DEBUG("Proxy " << counter << " " << proxy->description() << "ptr " << proxy);
563  for (auto p : proxy->children)
564  ATH_MSG_DEBUG("Child ptr " << p);
565  for (auto p : proxy->parents)
566  ATH_MSG_DEBUG("Parent ptr " << p);
567 
568  for (auto p : proxy->parents)
569  {
570  for (auto pp : p->parents)
571  {
572  if (pp == proxy)
573  {
574  ATH_MSG_WARNING("Weird, proxy is in parents list of parents");
575  }
576  }
577  }
578  for (auto c : proxy->children)
579  {
580  for (auto cc : c->children)
581  {
582  if (cc == proxy)
583  {
584  ATH_MSG_WARNING("Weird, proxy is in children list of children");
585  }
586  }
587  }
588  }
589  }
590 
591  ATH_MSG_DEBUG("Created " << convProxies.size() << " proxy objects");
592  return StatusCode::SUCCESS;
593 }
594 
595 
597  std::function<bool(const ConvProxy*)> selector,
598  const std::vector<std::function<void(const ConvProxy*)>>& printers) const {
599  ATH_MSG_DEBUG("Printing proxies");
600  ATH_MSG_DEBUG("" );
601  for ( auto p: proxies) {
602  if ( selector(p) ){
603  ATH_MSG_DEBUG("Proxy " << p->description() );
604  for (auto& printer: printers) {
605  printer(p);
606  }
607  ATH_MSG_DEBUG("" );
608  }
609  }
610 }
611 
613 {
614 
615  for (auto &ptrConvProxy : convProxies)
616  {
617  auto teId = ptrConvProxy->te->getId();
618  bool teActive = ptrConvProxy->te->getActiveState();
619  auto iter = allTEs.find(teId);
620  if (iter != allTEs.end())
621  {
622  ptrConvProxy->runChains.insert(iter->second.begin(), iter->second.end());
623  if (teActive)
624  {
625  ptrConvProxy->passChains.insert(iter->second.begin(), iter->second.end());
626  }
627  }
628 
629  for (auto &objTeIdToChain : allTEs)
630  {
631  if (teId == objTeIdToChain.first)
632  {
633  for (auto &chainId : objTeIdToChain.second)
634  {
635  (ptrConvProxy->runChains).insert(chainId);
636  }
637  break;
638  }
639  }
640  }
641  return StatusCode::SUCCESS;
642 }
643 
645 {
646  // propagate up (towards L1) chain IDs if they are not in proxies
647  // technically each proxy looks at the children proxies and inserts from it all unseen chains
648  // procedure is repeated until, no single proxy needs an update (tedious - we may be smarter in future)
649 
650  while (true)
651  {
652  size_t numberOfUpdates = 0;
653  for (auto p : convProxies)
654  {
655  for (auto child : p->children)
656  {
657  size_t startSize = p->runChains.size();
658  p->runChains.insert(std::begin(child->runChains), std::end(child->runChains));
659 
660  if (startSize != p->runChains.size())
661  { // some chain needed to be inserted
662  numberOfUpdates++;
663  // if update was need, it means set of chains that passed need update as well
664  p->passChains.insert(std::begin(child->runChains), std::end(child->runChains));
665  }
666  }
667  }
668  ATH_MSG_DEBUG("Needed to propagate chains from " << numberOfUpdates << " child(ren)");
669  if (numberOfUpdates == 0)
670  {
671  break;
672  }
673  }
674  return StatusCode::SUCCESS;
675 }
676 
678 {
679  // remove proxies that have no chains
680  for (auto i = std::begin(convProxies); i != std::end(convProxies);)
681  {
682  if ((*i)->runChains.empty())
683  {
684  ConvProxy *toDel = *i;
685  // remove it from parents/children
686  for (auto parent : toDel->parents)
687  {
688  parent->children.erase(toDel);
689  }
690  for (auto child : toDel->children)
691  {
692  child->parents.erase(toDel);
693  }
694  delete toDel;
695  i = convProxies.erase(i);
696  }
697  else
698  {
699  ++i;
700  }
701  }
702  ATH_MSG_DEBUG("After eliminating proxies not associated to chainsof intereset left with " << convProxies.size());
703  return StatusCode::SUCCESS;
704 }
705 
707 {
708 
709  ATH_CHECK(collapseFeaturesProxies(convProxies, run2Nav));
711  if (m_doSelfValidation)
712  {
713  ATH_CHECK(allProxiesHaveChain(convProxies));
714  ATH_CHECK(allProxiesConnected(convProxies));
715  }
716  ATH_MSG_DEBUG("Compression done");
717 
718  return StatusCode::SUCCESS;
719 }
720 
721 template <typename MAP>
723 {
724  // collapse proxies based on the mapping in the map argument(generic) and clean proxiesSet
725  std::vector<ConvProxy *> todelete;
726  for (auto &[key, proxies] : keyToProxyMap)
727  {
728  if (proxies.size() > 1)
729  {
730  ATH_MSG_DEBUG("Merging " << proxies.size() << " similar proxies");
731  for (auto p : proxies)
732  {
733  if (p->mergeAllowed(*proxies.begin()))
734  {
735  (*proxies.begin())->merge(p);
736  todelete.push_back(p);
737  }
738  // TODO consider scanning proxies another time if merge is not allowed, it may be allowed with other proxies here
739  }
740  }
741  }
742  for (auto proxy : todelete)
743  {
744  convProxies.erase(proxy);
745  delete proxy;
746  }
747  // remove from proxies set all elements that are now unassociated (remember to delete after)
748  return StatusCode::SUCCESS;
749 }
750 
752 {
753 
754  const size_t beforeCount = convProxies.size();
755  std::map<uint64_t, ConvProxySet_t> feaToProxyMap;
756  for (auto proxy : convProxies)
757  {
758  proxy->feaHash = feaToHash(proxy->te->getFeatureAccessHelpers(), proxy->te, run2Nav);
759  if (proxy->feaHash != ConvProxy::MissingFEA)
760  feaToProxyMap[proxy->feaHash].insert(proxy);
761 
762  ATH_MSG_VERBOSE("TE " << TrigConf::HLTUtils::hash2string(proxy->te->getId()) << " FEA hash " << proxy->feaHash);
763  for (const HLT::TriggerElement::FeatureAccessHelper& fea : proxy->te->getFeatureAccessHelpers())
764  {
765  ATH_MSG_VERBOSE("FEA: " << fea);
766  }
767  }
768 
769  for (auto [feaHash, proxies] : feaToProxyMap)
770  {
771  auto first = *proxies.begin();
772  for (auto p : proxies)
773  {
774  if (filterFEAs(first->te->getFeatureAccessHelpers(), run2Nav) !=
775  filterFEAs(p->te->getFeatureAccessHelpers(), run2Nav))
776  {
777  ATH_MSG_ERROR("Proxies grouped by FEA hash have actually distinct features (specific FEAs are different)");
778  for (auto id: p->passChains ) ATH_MSG_ERROR("... chain id for this proxy " << id);
779  ATH_MSG_ERROR(".... TE id of this proxy: " << TrigConf::HLTUtils::hash2string(p->te->getId()));
780  for ( auto fea: first->te->getFeatureAccessHelpers() ) {
781  ATH_MSG_ERROR("FEA1 " << fea);
782  }
783  for ( auto fea: p->te->getFeatureAccessHelpers() ) {
784  ATH_MSG_ERROR("FEA2 " << fea);
785  }
786 
787  return StatusCode::FAILURE;
788  }
789  }
790  }
791 
792 
793  ATH_CHECK(collapseProxies(convProxies, feaToProxyMap));
794  ATH_MSG_DEBUG("Proxies with features collapsing reduces size from " << beforeCount << " to " << convProxies.size());
795 
796  return StatusCode::SUCCESS;
797 }
798 
800 {
801  // merge proxies bases on the parent child relation (this has to run after feature based collapsing)
802  struct ParentChildCharacteristics
803  {
804  ConvProxy *parent = nullptr;
805  ConvProxy *child = nullptr;
806  size_t distanceFromParent = 0;
807  bool operator<(const ParentChildCharacteristics &rhs) const
808  {
809  if (parent != rhs.parent)
810  return parent < rhs.parent;
811  if (child != rhs.child)
812  return child < rhs.child;
813  return distanceFromParent < rhs.distanceFromParent;
814  }
815  };
816  const size_t beforeCount = convProxies.size();
817  std::map<ParentChildCharacteristics, ConvProxySet_t> groupedProxies;
818  for (auto proxy : convProxies)
819  {
820  if (proxy->feaHash == ConvProxy::MissingFEA)
821  {
822  ATH_MSG_VERBOSE("Featureless proxy to deal with: " << proxy->description());
823  /* the canonical case
824  merged parent
825  / | | \
826  C1 C2 C3 C4 <-- proxies to merge
827  \ | | /
828  merged child
829  */
830  auto hasSomeFeatures = [](const ConvProxy* p){ return p->feaHash != ConvProxy::MissingFEA; };
831  if (proxy->children.size() == 1 and
832  std::all_of(proxy->children.begin(), proxy->children.end(), hasSomeFeatures ) and
833  proxy->parents.size() == 1 and
834  std::all_of(proxy->parents.begin(), proxy->parents.end(), hasSomeFeatures )
835  )
836  {
837  ATH_MSG_VERBOSE("Proxy to possibly merge: " << proxy->description());
838  groupedProxies[{*(proxy->parents.begin()), *(proxy->children.begin()), 0}].insert(proxy);
839  // TODO expand it to cover longer featureless sequences
840  }
841  else
842  {
843  ATH_MSG_VERBOSE("Featureless proxy in noncanonical situation " << proxy->description());
844  ATH_MSG_VERBOSE("parents ");
845  for (auto pp : proxy->parents)
846  {
847  ATH_MSG_VERBOSE(pp->description());
848  }
849  ATH_MSG_VERBOSE("children ");
850  for (auto cp : proxy->children)
851  {
852  ATH_MSG_VERBOSE(cp->description());
853  }
854  }
855  }
856  }
857 
858  ATH_CHECK(collapseProxies(convProxies, groupedProxies));
859  ATH_MSG_DEBUG("Proxies without features collapsing reduces size from " << beforeCount << " to " << convProxies.size());
860  return StatusCode::SUCCESS;
861 }
862 
864 {
865  for (auto i = std::begin(convProxies); i != std::end(convProxies);)
866  {
867  if ((*i)->parents.size() > 1)
868  {
869  ConvProxy *toDel = *i;
870  // remove it from parents/children
871  for (auto parent : toDel->parents)
872  {
873  parent->children.erase(toDel);
874  }
875  for (auto child : toDel->children)
876  {
877  child->parents.erase(toDel);
878  }
879  delete toDel;
880  i = convProxies.erase(i);
881  }
882  else
883  {
884  ++i;
885  }
886  }
887  return StatusCode::SUCCESS;
888 }
889 
891 {
892  // from all FEAs of the associated TE pick those objects that are to be linked
893  for (auto &proxy : convProxies)
894  {
895  if (proxy->te != nullptr)
896  {
897 
898  for (HLT::TriggerElement::FeatureAccessHelper helper : proxy->te->getFeatureAccessHelpers())
899  {
900  auto [sgKey, sgCLID, sgName] = getSgKey(run2Nav, helper);
901  if (sgKey != 0)
902  {
903  if (feaToSave(helper) == true)
904  {
905  proxy->features.push_back(helper);
906  }
907  }
908  }
909  }
910  }
911 
912  return StatusCode::SUCCESS;
913 }
914 
916 {
917 
918  // ordered_sorter
919  auto ordered_sorter = [&setRoiName = std::as_const(m_setRoiName)](const std::string &left, const std::string &right) -> bool
920  {
921  return std::find(cbegin(setRoiName), cend(setRoiName), left) < std::find(cbegin(setRoiName), cend(setRoiName), right);
922  };
923 
924  std::map<std::string, HLT::TriggerElement::FeatureAccessHelper, decltype(ordered_sorter)> mp(ordered_sorter);
925 
926  for (auto &proxy : convProxies)
927  {
928  // TODO need check & handling of case when there is more RoIs, now overwriting
929  if (HLT::TrigNavStructure::getRoINodes(proxy->te).size() > 1)
930  ATH_MSG_DEBUG("Several RoIs pointing to a proxy, taking latest one for now");
931 
932  mp.clear();
933 
934  for (const HLT::TriggerElement::FeatureAccessHelper& helper : proxy->te->getFeatureAccessHelpers())
935  {
936  auto [sgKey, sgCLID, sgName] = getSgKey(run2Nav, helper);
937  if (std::find(m_setRoiName.begin(), m_setRoiName.end(), sgName) == m_setRoiName.end())
938  {
939  // do not filter continue;
940  continue;
941  }
942  mp[sgName] = helper;
943  }
944 
945  std::transform(cbegin(mp), cend(mp), back_inserter(proxy->rois),
946  [](const std::map<std::string, HLT::TriggerElement::FeatureAccessHelper>::value_type &p)
947  { return p.second; });
948  }
949 
950  // roiPropagator
951  std::set<const ConvProxy*> visited;
952  std::function<void(std::set<ConvProxy *> &, const std::vector<HLT::TriggerElement::FeatureAccessHelper> &)>
953  roiPropagator = [&](std::set<ConvProxy *> &convProxyChildren, const std::vector<HLT::TriggerElement::FeatureAccessHelper> &roiParent)
954  {
955  for (auto &proxyChild : convProxyChildren)
956  {
957  if ( visited.count(proxyChild) == 1 ) {
958  continue;
959  }
960  visited.insert(proxyChild);
961  if (proxyChild->rois.empty())
962  { // no roi update, copy from parent
963  proxyChild->rois = roiParent;
964  if (proxyChild->children.empty() == false)
965  {
966  roiPropagator(proxyChild->children, roiParent);
967  }
968  }
969  }
970  };
971 
972  for (auto &proxy : convProxies)
973  {
974  roiPropagator(proxy->children, proxy->rois);
975  }
976 
977  return StatusCode::SUCCESS;
978 }
979 
981 {
982  for (auto &proxy : convProxies)
983  {
984  for (HLT::TriggerElement::FeatureAccessHelper helper : proxy->te->getFeatureAccessHelpers())
985  {
986  if (helper.getCLID() == m_TrackParticleContainerCLID || helper.getCLID() == m_TauTrackContainerCLID)
987  {
988  proxy->tracks.push_back(helper);
989  }
990  }
991  }
992 
993  return StatusCode::SUCCESS;
994 }
995 
997 {
998  for (auto &proxy : convProxies)
999  {
1001  for (auto chainId : proxy->runChains)
1002  {
1003  TrigCompositeUtils::addDecisionID(chainId, proxy->imNode);
1004  }
1006  for (auto chainId : proxy->passChains)
1007  {
1008  TrigCompositeUtils::addDecisionID(chainId, proxy->hNode.back());
1009  }
1010 
1011  TrigCompositeUtils::linkToPrevious(proxy->hNode.front(), proxy->imNode, context); // H low IM up
1012  }
1013  // connecting current IM to all Hs in parent proxies
1014  for (auto &proxy : convProxies)
1015  {
1016  for (auto &parentProxy : proxy->parents)
1017  {
1018  TrigCompositeUtils::linkToPrevious(proxy->imNode, parentProxy->hNode.front(), context); // IM low H up (in parent)
1019  }
1020  }
1021  ATH_MSG_DEBUG("IM & H nodes made, output nav elements " << decisions.size());
1022  return StatusCode::SUCCESS;
1023 }
1024 
1026  const TEIdToChainsMap_t &terminalIds, const EventContext &context) const
1027 {
1028  // make node & link it properly
1029  auto makeSingleSFNode = [&decisions, &context](auto lastDecisionNode, auto chainIds, TrigCompositeUtils::DecisionID idStore = 0)
1030  {
1032  sfNode->setName("SF");
1033  TrigCompositeUtils::linkToPrevious(decisions.at(0), sfNode, context);
1034  TrigCompositeUtils::linkToPrevious(sfNode, lastDecisionNode, context);
1035  for (auto chainId : chainIds)
1036  {
1037  if (idStore == 0)
1038  {
1039  TrigCompositeUtils::addDecisionID(chainId, sfNode);
1041  }
1042  else if (chainId.numeric() == idStore)
1043  {
1044  TrigCompositeUtils::addDecisionID(chainId, sfNode);
1046  }
1047  }
1048  return sfNode;
1049  };
1050  auto makeSFNodes = [makeSingleSFNode](auto proxy, TrigCompositeUtils::DecisionID idToStore = 0)
1051  {
1052  if (proxy->hNode.empty())
1053  { // nothing has passed, so link to the IM node
1054  // TODO make sure it needs to be done like that
1055  makeSingleSFNode(proxy->imNode, proxy->runChains, idToStore);
1056  }
1057  else
1058  {
1059  // makeSFNode(proxy->hNode[0], TCU::decisionIDs(proxy->hNode[0])); // not using passChains as there may be additional filtering
1060  for (auto &hNode : proxy->hNode)
1061  {
1062  makeSingleSFNode(hNode, proxy->passChains, idToStore); // using passChains
1063  }
1064  }
1065  };
1066 
1067  for (auto proxy : convProxies)
1068  {
1069  // associate terminal nodes to filter nodes,
1070  if (proxy->children.empty())
1071  { // the H modes are terminal
1072  makeSFNodes(proxy);
1073  }
1074  else
1075  {
1076  // likely need more iterations
1077  // nonterminal nodes that are nevertheless terminal for a given chain
1078  std::vector<TCU::DecisionID> toRetain;
1079  for (auto teId : proxy->teIDs)
1080  {
1081  auto whereInMap = terminalIds.find(teId);
1082  if (whereInMap != terminalIds.end())
1083  {
1084  toRetain.insert(toRetain.end(), whereInMap->second.begin(), whereInMap->second.end());
1085  }
1086  }
1087  for (auto chainIdstore : toRetain)
1088  {
1089  makeSFNodes(proxy, chainIdstore);
1090  }
1091  }
1092  }
1093  // associate all nodes designated as final one with the filter nodes
1094 
1095  ATH_MSG_DEBUG("SF nodes made, output nav elements " << decisions.size());
1096  return StatusCode::SUCCESS;
1097 }
1098 
1100 {
1101  // Check that only ChainIDs (not LegIDs) are present in the terminus "HLTPassRaw" node.
1102  // Check that only chains which pass the event are included.
1103  TCU::Decision* terminus = decisions.at(0);
1104  ATH_CHECK( terminus->name() == TCU::summaryPassNodeName() );
1105  TCU::DecisionIDContainer currentIDs;
1106  TCU::DecisionIDContainer filteredIDs;
1107  TCU::decisionIDs(terminus, currentIDs); // Extract, std::vector -> std::set
1108  for (const TCU::DecisionID id : currentIDs)
1109  {
1110  const TCU::DecisionID idToCheck = ( TCU::isLegId(id) ? TCU::getIDFromLeg( HLT::Identifier(id) ).numeric() : id );
1111  const std::string chainName = HLT::Identifier(idToCheck).name();
1112  // Sanity check
1113  if (!m_chainsToSave.empty())
1114  {
1115  if (std::find(m_chainsToSave.begin(), m_chainsToSave.end(), chainName) == m_chainsToSave.end())
1116  {
1117  ATH_MSG_ERROR("Navigation information for chain " << chainName << " in "
1118  << TCU::summaryPassNodeName() << " but this chain wasn't on the list of chains to save");
1119  return StatusCode::FAILURE;
1120  }
1121  }
1122  if (m_tdt->isPassed(chainName))
1123  {
1124  filteredIDs.insert(idToCheck);
1125  }
1126  }
1127  terminus->setDecisions( std::vector<TCU::DecisionID>() ); // decisions.clear(), but via the xAOD setter function
1128  TCU::insertDecisionIDs(filteredIDs, terminus); // Insert, std::set -> std::vector
1129  ATH_MSG_VERBOSE("After filtering out leg IDs and checking isPassed, "
1130  "the terminus node goes from " << currentIDs.size() << " to " << filteredIDs.size() << " chain IDs.");
1131  if (msgLvl(MSG::VERBOSE))
1132  {
1133  for (const TCU::DecisionID id : filteredIDs)
1134  {
1135  ATH_MSG_VERBOSE(" -- Retained passing ID: " << HLT::Identifier(id));
1136  }
1137  }
1138  return StatusCode::SUCCESS;
1139 }
1140 
1142  const EventContext &context) const
1143 {
1144 
1145  auto makeL1Node = [&decisions, &context](auto firstDecisionNode, auto chainIds)
1146  {
1148  L1Node->setName(TrigCompositeUtils::hltSeedingNodeName()); // L1
1149  for (auto chainId : chainIds)
1150  {
1151  TrigCompositeUtils::addDecisionID(chainId, L1Node);
1152  }
1153  TrigCompositeUtils::linkToPrevious(firstDecisionNode, L1Node, context); // IM -> L1
1154 
1155  return L1Node;
1156  };
1157 
1158  for (auto &proxy : convProxies)
1159  {
1160  // associate initial node to filter nodes,
1161  if (proxy->parents.empty())
1162  { // the IM node is initial
1163  proxy->l1Node = makeL1Node(proxy->imNode, TCU::decisionIDs(proxy->imNode)); // not using passChains as there may be additional filtering
1164  }
1165  }
1166 
1167  ATH_MSG_DEBUG("L1 nodes made, output nav elements ");
1168  return StatusCode::SUCCESS;
1169 }
1170 
1172 {
1173  size_t feaCount{0};
1174  if (proxy.features.empty())
1175  { // no features
1176  ++feaCount;
1177  }
1178  for (const auto &fea : proxy.features)
1179  {
1180  if (fea.getIndex().objectsBegin() == fea.getIndex().objectsEnd())
1181  {
1182  ++feaCount;
1183  }
1184  for (auto n = fea.getIndex().objectsBegin(); n < fea.getIndex().objectsEnd(); ++n)
1185  {
1186  ++feaCount;
1187  }
1188  }
1189  // 1 means a deafult H node created is enough, no need to expand H nodes
1190  return feaCount;
1191 }
1192 
1194 {
1195  // from all FEAs of the associated TE pick those objects that are to be linked
1196  for (const auto &proxy : convProxies)
1197  {
1198  auto feaN = getFeaSize(*proxy);
1199  if (feaN > 1)
1200  { // expand for more H nodes and connect them
1201  while (--feaN)
1202  {
1204  for (auto chainId : proxy->passChains) // adding hash values of active chains to expanded H nodes
1205  {
1206  TrigCompositeUtils::addDecisionID(chainId, proxy->hNode.back());
1207  }
1208  // connecting to upeer IM node
1209  TrigCompositeUtils::linkToPrevious(proxy->hNode.back(), proxy->imNode, context); // H low IM up
1210  // connecting created H to IM in children proxies
1211  for (auto &childProxy : proxy->children)
1212  {
1213  TrigCompositeUtils::linkToPrevious(childProxy->imNode, proxy->hNode.back(), context); // IM child H up (just created))
1214  }
1215  }
1216  }
1217 
1218  if (proxy->features.empty())
1219  { // no features attached, self link
1221  proxy->hNode.front()->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), linkToSelf);
1222  }
1223 
1224  auto hNodeIter = proxy->hNode.begin();
1225  for (auto &fea : proxy->features)
1226  {
1227  auto [sgKey, sgCLID, sgName] = getSgKey(run2Nav, fea);
1228  if (fea.getIndex().objectsBegin() == fea.getIndex().objectsEnd())
1229  {
1231  (*hNodeIter)->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), linkToSelf);
1232  ++hNodeIter;
1233  }
1234  for (auto n = fea.getIndex().objectsBegin(); n < fea.getIndex().objectsEnd(); ++n)
1235  {
1236  // connecting feature
1237  (*hNodeIter)->typelessSetObjectLink(TrigCompositeUtils::featureString(), sgKey, sgCLID, n, n + 1);
1238  ++hNodeIter;
1239  }
1240  }
1241  }
1242 
1243  return StatusCode::SUCCESS;
1244 }
1245 
1247 {
1248  // from all Rois of the associated TE pick those objects that are to be linked
1249  for (auto &proxy : convProxies)
1250  {
1251  for (auto &roi : proxy->rois)
1252  {
1253  auto [sgKey, sgCLID, sgName] = getSgKey(run2Nav, roi);
1254  if (proxy->l1Node)
1255  {
1256  proxy->l1Node->typelessSetObjectLink(TrigCompositeUtils::initialRoIString(), sgKey, sgCLID, roi.getIndex().objectsBegin());
1257  }
1258  if (proxy->rois.empty() == false)
1259  {
1260  proxy->imNode->typelessSetObjectLink(TrigCompositeUtils::roiString(), sgKey, sgCLID, roi.getIndex().objectsBegin());
1261  }
1262  }
1263  }
1264 
1265  return StatusCode::SUCCESS;
1266 }
1267 
1269 {
1270  for (auto &proxy : convProxies)
1271  {
1272  for (auto &trk : proxy->tracks)
1273  {
1274  if (proxy->imNode->hasObjectLink(TrigCompositeUtils::roiString()))
1275  {
1276  try
1277  {
1279  if (ROIElementLink.isValid())
1280  {
1282  auto [sgKey, sgCLID, sgName] = getSgKey(run2Nav, trk);
1283  if (sgCLID == m_TrackParticleContainerCLID || sgCLID == m_TauTrackContainerCLID)
1284  {
1285  const char *tName = sgCLID == m_TrackParticleContainerCLID ? "TEMP_TRACKS" : "TEMP_TAU_TRACKS";
1286  auto d = std::make_unique<TrigCompositeUtils::Decision>();
1287  d->makePrivateStore();
1288  d->typelessSetObjectLink(tName, sgKey, sgCLID, trk.getIndex().objectsBegin());
1289  if (sgCLID == m_TrackParticleContainerCLID)
1290  {
1291  for (const ElementLink<xAOD::TrackParticleContainer> &track : d->objectCollectionLinks<xAOD::TrackParticleContainer>(tName))
1292  {
1293  if (track.isValid())
1294  {
1295  const xAOD::TrackParticle *t = *track;
1296  viewBookkeeper(*t) = ROIElementLink;
1297  }
1298  }
1299  }
1300  if (m_includeTauTrackFeatures == false && sgCLID == m_TauTrackContainerCLID)
1301  {
1302  for (const ElementLink<xAOD::TauTrackContainer> &track : d->objectCollectionLinks<xAOD::TauTrackContainer>(tName))
1303  {
1304  if (track.isValid())
1305  {
1306  const xAOD::TauTrack_v1 *t = *track;
1307  viewBookkeeper(*t) = ROIElementLink;
1308  }
1309  }
1310  }
1311  }
1312  }
1313  } catch (SG::ExcBadForwardLink&) {
1314  ATH_MSG_WARNING("Unable to create an ElementLink into a container with no entries");
1315  }
1316  }
1317  }
1318  }
1319 
1320  return StatusCode::SUCCESS;
1321 }
1322 
1323 // does not need to be a method, so kept as local
1325 {
1326  CLID thePassBitsCLID = ClassID_traits<xAOD::TrigPassBits>::ID();
1327  CLID thePassBitsContCLID = ClassID_traits<xAOD::TrigPassBitsContainer>::ID();
1328 
1329  return fea.getCLID() == thePassBitsCLID or fea.getCLID() == thePassBitsContCLID;
1330 }
1331 
1332 std::vector<HLT::TriggerElement::FeatureAccessHelper> Run2ToRun3TrigNavConverterV2::filterFEAs(const std::vector<HLT::TriggerElement::FeatureAccessHelper> &feaVector, const HLT::TrigNavStructure &navigationDecoder) const {
1333  std::vector<HLT::TriggerElement::FeatureAccessHelper> out;
1334  for (auto fea : feaVector)
1335  {
1336  if (feaToSkip(fea))
1337  {
1338  ATH_MSG_VERBOSE("Skipping in FEA hash calculation");
1339  continue;
1340  }
1341 
1342  auto [sgKey, sgCLID, sgName] = getSgKey(navigationDecoder, fea);
1343 
1344  if (sgKey == 0)
1345  {
1346  ATH_MSG_VERBOSE("Skipping unrecorded (missing in SG) FEA hash calculation - name in SG: " << sgName << " FEA " << fea);
1347  continue;
1348  }
1349  out.push_back(fea);
1350  }
1351  return out;
1352 }
1353 
1354 uint64_t Run2ToRun3TrigNavConverterV2::feaToHash(const std::vector<HLT::TriggerElement::FeatureAccessHelper> &feaVector, const HLT::TriggerElement *te_ptr, const HLT::TrigNavStructure &navigationDecoder) const
1355 {
1356  // FEA vectors hashing
1357  ATH_MSG_VERBOSE("Calculating FEA hash");
1358  uint64_t hash = 0;
1359  for (auto fea : filterFEAs(feaVector, navigationDecoder))
1360  {
1361  ATH_MSG_VERBOSE("Including FEA in hash CLID: " << fea.getCLID() << " te Id: " << te_ptr->getId());
1362  boost::hash_combine(hash, fea.getCLID());
1363  boost::hash_combine(hash, fea.getIndex().subTypeIndex());
1364  boost::hash_combine(hash, fea.getIndex().objectsBegin());
1365  boost::hash_combine(hash, fea.getIndex().objectsEnd());
1366  }
1367  ATH_MSG_VERBOSE("Obtained FEA hash " << hash);
1368  return hash;
1369 }
1370 
1372 {
1374  {
1375  return true; // feature accepted for saving
1376  }
1377 
1378  return false;
1379 }
1380 
1382 {
1383  auto [sgKey, sgCLID, sgName] = getSgKey(run2Nav, roi);
1384  if (std::find(m_setRoiName.begin(), m_setRoiName.end(), sgName) != m_setRoiName.end())
1385  {
1386  return true;
1387  }
1388 
1389  return false;
1390 }
1391 
1393 {
1394  for (auto p : proxies)
1395  {
1396  if (p->runChains.empty())
1397  {
1398  ATH_MSG_ERROR("Proxy with no chains");
1399  return StatusCode::FAILURE;
1400  }
1401  }
1402  ATH_MSG_DEBUG("CHECK OK, no proxies w/o a chain");
1403  return StatusCode::SUCCESS;
1404 }
1405 
1407 {
1408  for (auto p : proxies)
1409  {
1410  if (p->children.empty() and p->parents.empty() and not p->runChains.empty())
1411  {
1412  ATH_MSG_ERROR("Orphanted proxy N chains run:" << p->runChains.size());
1413  return StatusCode::FAILURE;
1414  }
1415  }
1416  ATH_MSG_DEBUG("CHECK OK, no orphanted proxies");
1417  return StatusCode::SUCCESS;
1418 }
1419 
1421 {
1422  ATH_MSG_DEBUG("CHECK OK, no excessive number of H nodes per proxy");
1423  return StatusCode::SUCCESS;
1424 }
1425 
1427 {
1428  // build map of all links to H nodes from IMs and FS
1429  std::set<const TrigCompositeUtils::Decision *> linkedHNodes;
1430  for (auto d : decisions)
1431  {
1432  if (d->name() == "IM" or d->name() == "FS")
1433  {
1434  for (auto el : TCU::getLinkToPrevious(d))
1435  {
1436  linkedHNodes.insert(*el); // dereferences to bare pointer
1437  }
1438  }
1439  }
1440  for (auto d : decisions)
1441  {
1442  if (d->name() == "H")
1443  {
1444  if (linkedHNodes.count(d) == 0)
1445  {
1446  ATH_MSG_ERROR("Orphaned H node");
1447  return StatusCode::FAILURE;
1448  }
1449  }
1450  }
1451  ATH_MSG_DEBUG("CHECK OK, all H modes are connected");
1452 
1453  return StatusCode::SUCCESS;
1454 }
1455 
1456 std::tuple<uint32_t, CLID, std::string> Run2ToRun3TrigNavConverterV2::getSgKey(const HLT::TrigNavStructure &navigationDecoder, const HLT::TriggerElement::FeatureAccessHelper &helper) const
1457 {
1458  const std::string hltLabel = navigationDecoder.label(helper.getCLID(), helper.getIndex().subTypeIndex());
1459 
1460  const CLID saveCLID = [&](const CLID &clid)
1461  {
1462  if (clid == m_roIDescriptorCLID)
1464  if (clid == m_TrigEMClusterCLID)
1466  if (clid == m_TrigRingerRingsCLID)
1468  return clid;
1469  }(helper.getCLID());
1470 
1471  std::string type_name;
1472  if (m_clidSvc->getTypeNameOfID(saveCLID, type_name).isFailure())
1473  {
1474  return {0, 0, ""};
1475  }
1476 
1477  const auto sgStringKey = HLTNavDetails::formatSGkey("HLT", type_name, hltLabel);
1478  const bool isAvailable = evtStore()->contains(saveCLID, sgStringKey);
1479  ATH_MSG_DEBUG(" Objects presence " << helper << " " << sgStringKey << (isAvailable ? " present" : " absent"));
1480  if (!isAvailable)
1481  {
1482  return {0, saveCLID, ""};
1483  }
1484 
1485  return {evtStore()->stringToKey(sgStringKey, saveCLID), saveCLID, hltLabel}; // sgKey, sgCLID, sgName
1486 }
Run2ToRun3TrigNavConverterV2::fillRelevantTracks
StatusCode fillRelevantTracks(ConvProxySet_t &convProxies) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:980
operator<
bool operator<(const DataVector< T > &a, const DataVector< T > &b)
Vector ordering relation.
Run2ToRun3TrigNavConverterV2::m_roIDescriptorCLID
CLID m_roIDescriptorCLID
Definition: Run2ToRun3TrigNavConverterV2.h:173
Run2ToRun3TrigNavConverterV2::collapseProxies
StatusCode collapseProxies(ConvProxySet_t &, MAP &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:722
Run2ToRun3TrigNavConverterV2::m_trigNavKey
SG::ReadHandleKey< xAOD::TrigNavigation > m_trigNavKey
Definition: Run2ToRun3TrigNavConverterV2.h:78
TrigConf::TrigConfData::name
const std::string & name() const
Definition: TrigConfData.h:22
Run2ToRun3TrigNavConverterV2::fillRelevantRois
StatusCode fillRelevantRois(ConvProxySet_t &convProxies, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:915
Run2ToRun3TrigNavConverterV2::createL1Nodes
StatusCode createL1Nodes(const ConvProxySet_t &convProxies, xAOD::TrigCompositeContainer &decisions, const EventContext &context) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1141
ChainNameParser.h
ConvProxy::merge
void merge(ConvProxy *other)
Definition: Run2ToRun3TrigNavConverterV2.cxx:60
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:392
Run2ToRun3TrigNavConverterV2::initialize
virtual StatusCode initialize() override
Definition: Run2ToRun3TrigNavConverterV2.cxx:152
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
runLayerRecalibration.chain
chain
Definition: runLayerRecalibration.py:175
TrigCompositeUtils::DecisionID
unsigned int DecisionID
Definition: TrigComposite_v1.h:27
Run2ToRun3TrigNavConverterV2::~Run2ToRun3TrigNavConverterV2
virtual ~Run2ToRun3TrigNavConverterV2() override
Definition: Run2ToRun3TrigNavConverterV2.cxx:148
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
ConvProxy::runChains
std::set< HLT::Identifier > runChains
Definition: Run2ToRun3TrigNavConverterV2.h:44
Run2ToRun3TrigNavConverterV2::Run2ToRun3TrigNavConverterV2
Run2ToRun3TrigNavConverterV2(const std::string &name, ISvcLocator *pSvcLocator)
Definition: Run2ToRun3TrigNavConverterV2.cxx:144
HLT::TrigNavStructure::label
std::string label(class_id_type clid, const index_or_label_type &sti_or_label) const
Definition: TrigNavStructure.cxx:775
HLT::Identifier::numeric
TrigCompositeUtils::DecisionID numeric() const
numeric ID
Definition: TrigCompositeUtils/TrigCompositeUtils/HLTIdentifier.h:47
TrigCompositeUtils::hltSeedingNodeName
const std::string & hltSeedingNodeName()
Definition: TrigCompositeUtilsRoot.cxx:894
Run2ToRun3TrigNavConverterV2::linkRoiNode
StatusCode linkRoiNode(ConvProxySet_t &convProxies, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1246
Run2ToRun3TrigNavConverterV2::updateTerminusNode
StatusCode updateTerminusNode(xAOD::TrigCompositeContainer &, const EventContext &context) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1099
TrigCompositeUtils::newDecisionIn
Decision * newDecisionIn(DecisionContainer *dc, const std::string &name)
Helper method to create a Decision object, place it in the container and return a pointer to it.
Definition: TrigCompositeUtilsRoot.cxx:46
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
Run2ToRun3TrigNavConverterV2::allProxiesConnected
StatusCode allProxiesConnected(const ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1406
hist_file_dump.d
d
Definition: hist_file_dump.py:137
xAOD::teId
teId
Definition: L2StandAloneMuon_v1.cxx:323
TrigCompositeUtils::hypoAlgNodeName
const std::string & hypoAlgNodeName()
Definition: TrigCompositeUtilsRoot.cxx:906
Run2ToRun3TrigNavConverterV2::m_configSvc
ServiceHandle< TrigConf::IHLTConfigSvc > m_configSvc
Definition: Run2ToRun3TrigNavConverterV2.h:80
Run2ToRun3TrigNavConverterV2::m_configUpdateMutex
std::mutex m_configUpdateMutex
Definition: Run2ToRun3TrigNavConverterV2.h:95
Run2ToRun3TrigNavConverterV2::removeUnassociatedProxies
StatusCode removeUnassociatedProxies(ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:677
TrigCompositeUtils::addDecisionID
void addDecisionID(DecisionID id, Decision *d)
Appends the decision (given as ID) to the decision object.
Definition: TrigCompositeUtilsRoot.cxx:61
Run2ToRun3TrigNavConverterV2::getSgKey
std::tuple< uint32_t, CLID, std::string > getSgKey(const HLT::TrigNavStructure &navigationDecoder, const HLT::TriggerElement::FeatureAccessHelper &helper) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1456
ConvProxy::MissingFEA
static const uint64_t MissingFEA
Definition: Run2ToRun3TrigNavConverterV2.h:46
Run2ToRun3TrigNavConverterV2::m_collectionsToSave
Gaudi::Property< std::vector< std::string > > m_collectionsToSave
Definition: Run2ToRun3TrigNavConverterV2.h:89
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
python.TrigCompositeUtils.isLegId
def isLegId(chainName)
Definition: DecisionHandling/python/TrigCompositeUtils.py:18
HLT::TriggerElement::getId
te_id_type getId() const
reset internals.
Definition: TrigNavStructure/TrigNavStructure/TriggerElement.h:43
Run2ToRun3TrigNavConverterV2::m_trigOutputNavKey
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_trigOutputNavKey
Definition: Run2ToRun3TrigNavConverterV2.h:92
HLT::TriggerElement::FeatureAccessHelper::getCLID
class_id_type getCLID() const
Class ID of object.
Definition: TrigNavStructure/TrigNavStructure/TriggerElement.h:208
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
Run2ToRun3TrigNavConverterV2.h
SpecialCases.h
TrigCompositeUtils::insertDecisionIDs
void insertDecisionIDs(const Decision *src, Decision *dest)
Appends the decision IDs of src to the dest decision object.
Definition: TrigCompositeUtilsRoot.cxx:80
Run2ToRun3TrigNavConverterV2::m_roisToSave
Gaudi::Property< std::vector< std::string > > m_roisToSave
Definition: Run2ToRun3TrigNavConverterV2.h:90
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Run2ToRun3TrigNavConverterV2::m_TrigRingerRingsCLID
CLID m_TrigRingerRingsCLID
Definition: Run2ToRun3TrigNavConverterV2.h:175
TrigCompositeUtils::createAndStore
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
Definition: TrigCompositeUtilsRoot.cxx:30
Run2ToRun3TrigNavConverterV2::m_setRoiName
std::vector< std::string > m_setRoiName
Definition: Run2ToRun3TrigNavConverterV2.h:171
TrigConf::HLTChain::signatures
const std::vector< HLTSignature * > & signatures() const
Definition: TrigConfHLTData/TrigConfHLTData/HLTChain.h:109
xAOD::TrigComposite_v1::setDecisions
void setDecisions(const std::vector< TrigCompositeUtils::DecisionID > &decisions)
Set positive HLT chain decisions associated with this TrigComposite. Navigation use.
Run2ToRun3TrigNavConverterV2::m_collectionsToSaveDecoded
std::map< CLID, std::set< std::string > > m_collectionsToSaveDecoded
Definition: Run2ToRun3TrigNavConverterV2.h:169
HLTNavDetails::formatSGkey
std::string formatSGkey(const std::string &prefix, const std::string &containername, const std::string &label)
declaration of formatting function.
Definition: Holder.cxx:122
Run2ToRun3TrigNavConverterV2::m_TauTrackContainerCLID
CLID m_TauTrackContainerCLID
Definition: Run2ToRun3TrigNavConverterV2.h:182
Run2ToRun3TrigNavConverterV2::m_tdt
PublicToolHandle< Trig::TrigDecisionTool > m_tdt
Definition: Run2ToRun3TrigNavConverterV2.h:79
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TrigConf::HLTChain
HLT chain configuration information.
Definition: TrigConfHLTData/TrigConfHLTData/HLTChain.h:35
Run2ToRun3TrigNavConverterV2::m_chainIdsPrinter
std::function< void(const ConvProxy *)> m_chainIdsPrinter
Definition: Run2ToRun3TrigNavConverterV2.h:148
Run2ToRun3TrigNavConverterV2::m_allTEIdsToChains
TEIdToChainsMap_t m_allTEIdsToChains
Definition: Run2ToRun3TrigNavConverterV2.h:96
HLT::TrigNavStructure
Definition: TrigNavStructure.h:40
SpecialCases::egammaDiEtcut
const std::regex egammaDiEtcut
Definition: SpecialCases.h:9
SpecialCases::gammaXeChain
const std::regex gammaXeChain
Definition: SpecialCases.h:8
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
ConvProxy::children
std::set< ConvProxy * > children
Definition: Run2ToRun3TrigNavConverterV2.h:42
ExpressionParsing::isAvailable
bool isAvailable(const T_Aux &cont, SG::auxid_t auxid)
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
Run2ToRun3TrigNavConverterV2::feaToHash
uint64_t feaToHash(const std::vector< HLT::TriggerElement::FeatureAccessHelper > &feaVector, const HLT::TriggerElement *te_ptr, const HLT::TrigNavStructure &navigationDecoder) const
returns true if this particular feature is to be saved (linked)
Definition: Run2ToRun3TrigNavConverterV2.cxx:1354
Run2ToRun3TrigNavConverterV2::m_roIDescriptorCollectionCLID
CLID m_roIDescriptorCollectionCLID
Definition: Run2ToRun3TrigNavConverterV2.h:174
runBeamSpotCalibration.helper
helper
Definition: runBeamSpotCalibration.py:112
PixelModuleFeMask_create_db.remove
string remove
Definition: PixelModuleFeMask_create_db.py:83
ClassID_traits::ID
static const CLID & ID()
the CLID of T
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:50
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
Run2ToRun3TrigNavConverterV2::createSFNodes
StatusCode createSFNodes(const ConvProxySet_t &, xAOD::TrigCompositeContainer &, const TEIdToChainsMap_t &finalTEs, const EventContext &context) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1025
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Run2ToRun3TrigNavConverterV2::filterFEAs
std::vector< HLT::TriggerElement::FeatureAccessHelper > filterFEAs(const std::vector< HLT::TriggerElement::FeatureAccessHelper > &feaVector, const HLT::TrigNavStructure &navigationDecoder) const
< both method skip TrigPassBits
Definition: Run2ToRun3TrigNavConverterV2.cxx:1332
HLTUtils.h
Run2ToRun3TrigNavConverterV2::extractTECtoChainMapping
StatusCode extractTECtoChainMapping(TEIdToChainsMap_t &allTES, TEIdToChainsMap_t &finalTEs) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:398
HLT::TrigNavStructure::getDirectPredecessors
static const std::vector< TriggerElement * > & getDirectPredecessors(const TriggerElement *te)
returns list of direct predecessors (nodes seeding me)
Definition: TrigNavStructure.cxx:120
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:58
TrigPassBitsContainer.h
ConvProxy::teIDs
std::vector< HLT::te_id_type > teIDs
Definition: Run2ToRun3TrigNavConverterV2.h:40
lumiFormat.i
int i
Definition: lumiFormat.py:92
TrigCompositeUtils::initialRoIString
const std::string & initialRoIString()
Definition: TrigCompositeUtilsRoot.cxx:870
TrigCompositeUtils::getLinkToPrevious
const std::vector< ElementLink< DecisionContainer > > getLinkToPrevious(const Decision *d)
returns links to previous decision object 'seed'
Definition: TrigCompositeUtilsRoot.cxx:156
ClassID_traits.h
a traits class that associates a CLID to a type T It also detects whether T inherits from Gaudi DataO...
ret
T ret(T t)
Definition: rootspy.cxx:260
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::WriteHandle::ptr
pointer_type ptr()
Dereference the pointer.
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
SpecialCases::isTopo
const std::regex isTopo
Definition: SpecialCases.h:12
HLT::TriggerElement
TriggerElement is the basic ingreedient of the interface between HLT algorithms and the navigation It...
Definition: TrigNavStructure/TrigNavStructure/TriggerElement.h:27
ConvProxy::description
std::string description() const
Definition: Run2ToRun3TrigNavConverterV2.cxx:129
Types.h
TriggerElement.h
Run2ToRun3TrigNavConverterV2::linkTrkNode
StatusCode linkTrkNode(ConvProxySet_t &convProxies, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1268
Run2ToRun3TrigNavConverterV2::createIMHNodes
StatusCode createIMHNodes(ConvProxySet_t &, xAOD::TrigCompositeContainer &, const EventContext &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:996
ConvProxy::passChains
std::set< HLT::Identifier > passChains
Definition: Run2ToRun3TrigNavConverterV2.h:45
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
Run2ToRun3TrigNavConverterV2::m_includeTauTrackFeatures
Gaudi::Property< bool > m_includeTauTrackFeatures
Definition: Run2ToRun3TrigNavConverterV2.h:86
Run2ToRun3TrigNavConverterV2::m_TrigEMClusterContainerCLID
CLID m_TrigEMClusterContainerCLID
Definition: Run2ToRun3TrigNavConverterV2.h:178
TEIdToChainsMap_t
std::map< HLT::te_id_type, std::set< HLT::Identifier > > TEIdToChainsMap_t
Definition: Run2ToRun3TrigNavConverterV2.h:60
TrigCompositeUtils::decisionToElementLink
ElementLink< DecisionContainer > decisionToElementLink(const Decision *d, const EventContext &ctx)
Takes a raw pointer to a Decision and returns an ElementLink to the Decision.
Definition: TrigCompositeUtilsRoot.cxx:122
test_pyathena.parent
parent
Definition: test_pyathena.py:15
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
add
bool add(const std::string &hname, TKey *tobj)
Definition: fastadd.cxx:55
xAOD::TrigComposite_v1
Class used to describe composite objects in the HLT.
Definition: TrigComposite_v1.h:52
ConvProxy::ConvProxy
ConvProxy(const HLT::TriggerElement *te)
Definition: Run2ToRun3TrigNavConverterV2.cxx:21
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
HLT::Identifier
Definition: TrigCompositeUtils/TrigCompositeUtils/HLTIdentifier.h:20
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
ReadFromCoolCompare.os
os
Definition: ReadFromCoolCompare.py:231
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::decisions
decisions
Definition: TrigComposite_v1.cxx:81
Run2ToRun3TrigNavConverterV2::removeTopologicalProxies
StatusCode removeTopologicalProxies(ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:863
Run2ToRun3TrigNavConverterV2::noUnconnectedHNodes
StatusCode noUnconnectedHNodes(const xAOD::TrigCompositeContainer &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1426
SpecialCases::egammaEtcut
const std::regex egammaEtcut
Definition: SpecialCases.h:10
Run2ToRun3TrigNavConverterV2::feaToSave
bool feaToSave(const HLT::TriggerElement::FeatureAccessHelper &fea) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1371
TrigCompositeUtils::featureString
const std::string & featureString()
Definition: TrigCompositeUtilsRoot.cxx:886
ChainNameParser::multiplicities
std::vector< int > multiplicities(const std::string &chain)
Definition: ChainNameParser.cxx:202
ConvProxy::isParent
bool isParent(const ConvProxy *other) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:37
Run2ToRun3TrigNavConverterV2::collapseFeaturesProxies
StatusCode collapseFeaturesProxies(ConvProxySet_t &convProxies, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:751
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:194
Run2ToRun3TrigNavConverterV2::m_finalTEIdsToChains
TEIdToChainsMap_t m_finalTEIdsToChains
Definition: Run2ToRun3TrigNavConverterV2.h:96
HLT::StandaloneNavigation
Definition: StandaloneNavigation.h:14
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
Run2ToRun3TrigNavConverterV2::m_doCompression
Gaudi::Property< bool > m_doCompression
Definition: Run2ToRun3TrigNavConverterV2.h:84
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
ConvProxySet_t
std::set< ConvProxy * > ConvProxySet_t
Definition: Run2ToRun3TrigNavConverterV2.h:59
TrigConf::HLTUtils::hash2string
static const std::string hash2string(HLTHash, const std::string &category="TE")
hash function translating identifiers into names (via internal dictionary)
Run2ToRun3TrigNavConverterV2::associateChainsToProxies
StatusCode associateChainsToProxies(ConvProxySet_t &, const TEIdToChainsMap_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:612
TrigCompositeUtils::summaryPassNodeName
const std::string & summaryPassNodeName()
Definition: TrigCompositeUtilsRoot.cxx:918
LArNewCalib_PedestalAutoCorr.cp
cp
Definition: LArNewCalib_PedestalAutoCorr.py:175
Run2ToRun3TrigNavConverterV2::m_doLinkFeatures
Gaudi::Property< bool > m_doLinkFeatures
Definition: Run2ToRun3TrigNavConverterV2.h:85
Run2ToRun3TrigNavConverterV2::execute
virtual StatusCode execute(const EventContext &context) const override
Definition: Run2ToRun3TrigNavConverterV2.cxx:246
Run2ToRun3TrigNavConverterV2::getFeaSize
std::size_t getFeaSize(const ConvProxy &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1171
Run2ToRun3TrigNavConverterV2::numberOfHNodesPerProxyNotExcessive
StatusCode numberOfHNodesPerProxyNotExcessive(const ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1420
TrigCompositeUtils::createLegName
HLT::Identifier createLegName(const HLT::Identifier &chainIdentifier, size_t counter)
Generate the HLT::Identifier which corresponds to a specific leg of a given chain.
Definition: TrigCompositeUtilsRoot.cxx:166
Run2ToRun3TrigNavConverterV2::allProxiesHaveChain
StatusCode allProxiesHaveChain(const ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1392
HLT::TrigNavStructure::getRoINodes
static const std::vector< TriggerElement * > & getRoINodes(const TriggerElement *somenode)
gets all RoI type nodes seeding indirectly this TriggerElement
Definition: TrigNavStructure.cxx:73
Run2ToRun3TrigNavConverterV2::fillRelevantFeatures
StatusCode fillRelevantFeatures(ConvProxySet_t &convProxies, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:890
xAOD::TrigComposite_v1::name
const std::string & name() const
Get a human-readable name for the object.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
HLT::TrigNavStructure::getAllTEs
std::vector< TriggerElement * > & getAllTEs()
access needed by slimming tools.
Definition: TrigNavStructure.cxx:376
TrigCompositeUtils::linkToPrevious
void linkToPrevious(Decision *d, const std::string &previousCollectionKey, size_t previousIndex)
Links to the previous object, location of previous 'seed' decision supplied by hand.
Definition: TrigCompositeUtilsRoot.cxx:139
Run2ToRun3TrigNavConverterV2::collapseFeaturelessProxies
StatusCode collapseFeaturelessProxies(ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:799
Run2ToRun3TrigNavConverterV2::m_CaloClusterCLID
CLID m_CaloClusterCLID
Definition: Run2ToRun3TrigNavConverterV2.h:179
HLT::TrigNavStructure::isInitialNode
static bool isInitialNode(const TriggerElement *te)
queries if node is an initial one
Definition: TrigNavStructure.cxx:501
TrigCompositeUtils::DecisionIDContainer
std::set< DecisionID > DecisionIDContainer
Definition: TrigComposite_v1.h:28
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
Run2ToRun3TrigNavConverterV2::roiToSave
bool roiToSave(const HLT::TrigNavStructure &run2Nav, const HLT::TriggerElement::FeatureAccessHelper &fea) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1381
python.selector.AtlRunQuerySelectorLhcOlc.selector
selector
Definition: AtlRunQuerySelectorLhcOlc.py:611
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
HLT::TriggerElement::FeatureAccessHelper
the FeatureAccessHelper is a class used to keep track of features attached to this TE.
Definition: TrigNavStructure/TrigNavStructure/TriggerElement.h:192
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
TrigRoiDescriptorCollection
Definition: TrigRoiDescriptorCollection.h:21
xAOD::TauTrack_v1
Definition: TauTrack_v1.h:27
HLT::StandaloneNavigation::deserialize
virtual bool deserialize(const std::vector< uint32_t > &input)
Definition: StandaloneNavigation.cxx:88
HLTSequenceList.h
Run2ToRun3TrigNavConverterV2::is2LegTopoChain
size_t is2LegTopoChain(const TrigConf::HLTChain *ptrChain) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:354
DeMoScan.first
bool first
Definition: DeMoScan.py:534
Run2ToRun3TrigNavConverterV2::mirrorTEsStructure
StatusCode mirrorTEsStructure(ConvProxySet_t &, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:530
python.TriggerAPI.TriggerAPISession.chainName
chainName
Definition: TriggerAPISession.py:353
Run2ToRun3TrigNavConverterV2::finalize
virtual StatusCode finalize() override
Definition: Run2ToRun3TrigNavConverterV2.cxx:241
Run2ToRun3TrigNavConverterV2::m_clidSvc
ServiceHandle< IClassIDSvc > m_clidSvc
Definition: Run2ToRun3TrigNavConverterV2.h:81
TrigCompositeUtils::decisionIDs
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.
Definition: TrigCompositeUtilsRoot.cxx:67
Run2ToRun3TrigNavConverterV2::doCompression
StatusCode doCompression(ConvProxySet_t &convProxies, const HLT::TrigNavStructure &run2Nav) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:706
python.utility.LHE.merge
def merge(input_file_pattern, output_file)
Merge many input LHE files into a single output file.
Definition: LHE.py:17
HLT::Identifier::name
std::string name() const
reports human redable name if it is enabled or, empty string
Definition: HLTIdentifier.cxx:14
Run2ToRun3TrigNavConverterV2::m_CaloClusterContainerCLID
CLID m_CaloClusterContainerCLID
Definition: Run2ToRun3TrigNavConverterV2.h:180
ConvProxy
Definition: Run2ToRun3TrigNavConverterV2.h:33
LArCellBinning.step
step
Definition: LArCellBinning.py:158
TrigCompositeUtils
Definition: Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h:19
feaToSkip
bool feaToSkip(const HLT::TriggerElement::FeatureAccessHelper &fea)
Definition: Run2ToRun3TrigNavConverterV2.cxx:1324
ReadCalibFromCool.typeName
typeName
Definition: ReadCalibFromCool.py:477
SpecialCases::tauXeChain
const std::regex tauXeChain
Definition: SpecialCases.h:14
Run2ToRun3TrigNavConverterV2::printProxies
void printProxies(const ConvProxySet_t &proxies, std::function< bool(const ConvProxy *)> selector=[](const ConvProxy *){return true;}, const std::vector< std::function< void(const ConvProxy *)>> &printers={}) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:596
TrigCompositeUtils::roiString
const std::string & roiString()
Definition: TrigCompositeUtilsRoot.cxx:878
ConvProxy::mergeAllowed
bool mergeAllowed(const ConvProxy *other) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:48
ConvProxy::feaHash
uint64_t feaHash
Definition: Run2ToRun3TrigNavConverterV2.h:47
Run2ToRun3TrigNavConverterV2::linkFeaNode
StatusCode linkFeaNode(ConvProxySet_t &convProxies, xAOD::TrigCompositeContainer &, const HLT::TrigNavStructure &run2Nav, const EventContext &context) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:1193
Run2ToRun3TrigNavConverterV2::m_TrigRingerRingsContainerCLID
CLID m_TrigRingerRingsContainerCLID
Definition: Run2ToRun3TrigNavConverterV2.h:176
Run2ToRun3TrigNavConverterV2::cureUnassociatedProxies
StatusCode cureUnassociatedProxies(ConvProxySet_t &) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:644
TrigCompositeUtils::getIDFromLeg
HLT::Identifier getIDFromLeg(const HLT::Identifier &legIdentifier)
Generate the HLT::Identifier which corresponds to the chain name from the leg name.
Definition: TrigCompositeUtilsRoot.cxx:180
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
Run2ToRun3TrigNavConverterV2::m_teIDPrinter
std::function< void(const ConvProxy *)> m_teIDPrinter
Definition: Run2ToRun3TrigNavConverterV2.h:149
ConvProxy::parents
std::set< ConvProxy * > parents
Definition: Run2ToRun3TrigNavConverterV2.h:43
test_pyathena.counter
counter
Definition: test_pyathena.py:15
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
Run2ToRun3TrigNavConverterV2::m_TrigEMClusterCLID
CLID m_TrigEMClusterCLID
Definition: Run2ToRun3TrigNavConverterV2.h:177
python.compressB64.c
def c
Definition: compressB64.py:93
Run2ToRun3TrigNavConverterV2::m_chainsToSave
Gaudi::Property< std::vector< std::string > > m_chainsToSave
Definition: Run2ToRun3TrigNavConverterV2.h:88
Run2ToRun3TrigNavConverterV2::m_TrackParticleContainerCLID
CLID m_TrackParticleContainerCLID
Definition: Run2ToRun3TrigNavConverterV2.h:181
SpecialCases::egammaCombinedWithEtcut
const std::regex egammaCombinedWithEtcut
Definition: SpecialCases.h:11
ConvProxy::isChild
bool isChild(const ConvProxy *other) const
Definition: Run2ToRun3TrigNavConverterV2.cxx:27
TrigCompositeUtils::inputMakerNodeName
const std::string & inputMakerNodeName()
Definition: TrigCompositeUtilsRoot.cxx:902
python.handimod.cc
int cc
Definition: handimod.py:523
Run2ToRun3TrigNavConverterV2::m_doSelfValidation
Gaudi::Property< bool > m_doSelfValidation
Definition: Run2ToRun3TrigNavConverterV2.h:83
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
HLT::te_id_type
uint32_t te_id_type
Definition: Trigger/TrigEvent/TrigNavStructure/TrigNavStructure/Types.h:11