ATLAS Offline Software
LVL1ResultRetriever.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 //#include <string>
9 //#include "TrigSteeringEvent/TrigRoiDescriptor.h"
10 
11 //#include "TrigDecisionTool/ChainGroup.h"
12 //#include "TrigDecisionTool/FeatureContainer.h"
13 //#include "TrigDecisionTool/Feature.h"
14 
17 namespace JiveXML {
18 
19 
23  LVL1ResultRetriever::LVL1ResultRetriever(const std::string& type, const std::string& name, const IInterface* parent):
25  {
26  declareInterface<IDataRetriever>(this);
27  }
28 
35 
36  //be verbose
37  ATH_MSG_VERBOSE("initialize()");
38 
39  //Try to retrieve the trig decision tool
40  if ( !m_trigDecTool.retrieve() ) {
41  ATH_MSG_FATAL("Could not retrieve TrigDecisionTool!");
42  return StatusCode::FAILURE;
43  }
44 
45  // We define the chain groups relying on the name convention (i.e. all L1
46  // items start their name from "L1_", etc) In principle we would not have to do
47  // so as the TrigDecisionTool jobOptions defines these as public chain
48  // groups. This way, we are independant of jobOptions
49  m_all = m_trigDecTool->getChainGroup(".*");
50  m_allL1 = m_trigDecTool->getChainGroup("L1_.*");
51  m_allL2 = m_trigDecTool->getChainGroup("L2_.*");
52  m_allEF = m_trigDecTool->getChainGroup("EF_.*");
53  m_allHLT = m_trigDecTool->getChainGroup("HLT_.*");
54 
55  return StatusCode::SUCCESS;
56  }
57 
63  std::string& itemList, std::string& prescaleList) {
64 
65  std::string sig_name;
66 
67  //Get a list of L1 items
68  std::vector<std::string> chainList = chains->getListOfTriggers();
69  ATH_MSG_DEBUG("Number of items in chain is " << chainList.size());
70 
71  for (auto &trigName : chainList){
72  // Make sure the item is not empty
73  // (can this actually happen ?!?
74  if ( trigName.empty() ) continue;
75 
76  auto trigChain = m_trigDecTool->getChainGroup(trigName);
77  // getPrescale() returns 0.0 for the first event: trigger decision tool needs
78  // to internally cache the values prior to the event, but running from RAW the
79  // conditions algorithm only runs during the event. Hence the "live" loading of
80  // prescales are 1 event late - No trigger decisions for the first event
81  if ( std::abs(trigChain->getPrescale()-1.0) > 1e-5 ) continue;
82 
83  //Output debug info
84  std::string myItem = trigName;
85  ATH_MSG_VERBOSE(" * item : name=" << myItem
86  << "; result = " << (trigChain->isPassed() ? "passed" : "failed")
87  << "; prescale = " << trigChain->getPrescale());
88 
89  // replace HLT with EF (as AtlantisJava doesn't know 'HLT'):
90  if ( myItem.find("HLT",0) != std::string::npos){
91  myItem.replace(0,4,"EF_");
92  ATH_MSG_VERBOSE(trigName << " renamed into: " << myItem);
93  }
94 
95  // prescale: see TWiki page TrigDecisionTool15
96 
97  //Only add passed items
98  if ( trigChain->isPassed() ) {
99 
100  //Add item to list
101  itemList += "-" + myItem;
102 
103  // prescale factor
104  prescaleList += "-" + DataType( trigChain->getPrescale() ).toString();
105  }
106  }
107 
108 
109  //Mark empty item lists
110  if ( itemList.empty() ){ itemList = "empty"; }
111  if ( prescaleList.empty() ){ prescaleList = "empty"; }
112 
113  //print debug information
114  ATH_MSG_DEBUG(" itemList: " << itemList);
115  ATH_MSG_DEBUG(" prescaleList: " << prescaleList);
116 
117  return StatusCode::SUCCESS;
118  }
119 
126  StatusCode LVL1ResultRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
127 
128  //be verbose
129  ATH_MSG_VERBOSE("retrieve()");
130 
131  //Get the item and prescale lists for all levels
132  std::string itemListL1="";
133  std::string prescaleListL1="";
134  std::string itemListL2="";
135  std::string prescaleListL2="";
136  std::string itemListEF="";
137  std::string prescaleListEF="";
138  std::string itemListHLT="";
139  std::string prescaleListHLT="";
140 
141  //Get L1
142  getItemLists( m_allL1, itemListL1, prescaleListL1 ).ignore();
143  //Summarize L1 result
144  int flagL1Passed = m_allL1->isPassed();
145  ATH_MSG_DEBUG("Decision : Level-1 " << ((flagL1Passed)? "passed":"failed"));
146 
147  //Get L2
148  getItemLists( m_allL2, itemListL2, prescaleListL2 ).ignore();
149  //Summarize L2 result
150  int flagL2Passed = m_allL2->isPassed();
151  ATH_MSG_DEBUG("Decision : Level-2 " << ((flagL2Passed)? "passed":"failed"));
152 
153  //Get EF
154  getItemLists( m_allEF, itemListEF, prescaleListEF ).ignore();
155  //Summarize EF result
156  int flagEFPassed = m_allEF->isPassed();
157  ATH_MSG_DEBUG("Decision : EventFilter " << ((flagEFPassed)? "passed":"failed"));
158 
159  //Get HLT
160  getItemLists( m_allHLT, itemListHLT, prescaleListHLT ).ignore();
161  //Summarize HLT result
162  int flagHLTPassed = m_allHLT->isPassed();
163  ATH_MSG_DEBUG("Decision : HLT " << ((flagHLTPassed)? "passed":"failed"));
164 
165  //Do not write trigger info if we failed to obtain any of it
166  if ((itemListL1=="empty") && (itemListL2=="empty") && (itemListEF=="empty") && (itemListHLT=="empty") ){
167  ATH_MSG_INFO("All item lists empty, will not write out any data");
168  return StatusCode::SUCCESS;
169  }
170 
171  //Store results in data list
172  DataVect itemListL1Vec; itemListL1Vec.push_back( DataType( itemListL1 ));
173  DataVect prescaleListL1Vec; prescaleListL1Vec.push_back( DataType( prescaleListL1 ));
174  DataVect itemListL2Vec; itemListL2Vec.push_back( DataType( itemListL2 ));
175  DataVect prescaleListL2Vec; prescaleListL2Vec.push_back( DataType( prescaleListL2 ));
176  DataVect itemListEFVec; itemListEFVec.push_back( DataType( itemListEF ));
177  DataVect prescaleListEFVec; prescaleListEFVec.push_back( DataType( prescaleListEF ));
178  DataVect itemListHLTVec; itemListHLTVec.push_back( DataType( itemListHLT ));
179  DataVect prescaleListHLTVec; prescaleListHLTVec.push_back( DataType( prescaleListHLT ));
180  DataVect passedTrigger; passedTrigger.push_back(DataType( flagHLTPassed )); //this is just a duplicate
181  DataVect passedL1; passedL1.push_back(DataType( flagL1Passed ));
182  DataVect passedL2; passedL2.push_back(DataType( flagL2Passed ));
183  DataVect passedEF; passedEF.push_back(DataType( flagHLTPassed )); // temporary.
184  DataVect passedHLT; passedHLT.push_back(DataType( flagHLTPassed ));
185  // placeholders only ! For backwards compatibility.
186  // Trigger energies moved to TriggerInfoRetriever
187  DataVect energySumEt; energySumEt.push_back(DataType( -1. ) );
188  DataVect energyEx; energyEx.push_back(DataType( -1. ) );
189  DataVect energyEy; energyEy.push_back(DataType( -1. ) );
190  DataVect energyEtMiss; energyEtMiss.push_back(DataType( -1. ) );
191 
192  //Finally create data map and write out results
194  dataMap["ctpItemList"] = itemListL1Vec;
195  dataMap["prescaleListL1"] = prescaleListL1Vec;
196  dataMap["itemListL2"] = itemListL2Vec;
197  dataMap["prescaleListL2"] = prescaleListL2Vec;
198  dataMap["itemListEF"] = itemListHLTVec; // temporary. AtlantisJava doesn't know 'HLT' yet. jpt 23Jun15
199  dataMap["prescaleListEF"] = prescaleListHLTVec;
200  dataMap["passedTrigger"] = passedTrigger;
201  dataMap["passedL1"] = passedL1;
202  dataMap["passedL2"] = passedHLT; // temporary. AtlantisJava doesn't know 'HLT' yet. jpt 23Jun15
203  dataMap["passedEF"] = passedHLT; // temporary. AtlantisJava doesn't know 'HLT' yet. jpt 23Jun15
204  dataMap["energySumEt"] = energySumEt;
205  dataMap["energyEx"] = energyEx;
206  dataMap["energyEy"] = energyEy;
207  dataMap["energyEtMiss"] = energyEtMiss;
208 
209  ATH_MSG_DEBUG(dataTypeName() << ": "<< itemListL1Vec.size());
210  //forward data to formating tool
211  return FormatTool->AddToEvent(dataTypeName(), "TrigDecision", &dataMap);
212  }
213 }
JiveXML::LVL1ResultRetriever::m_trigDecTool
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
A handle to the TrigDecisionTool.
Definition: LVL1ResultRetriever.h:44
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
JiveXML::LVL1ResultRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: LVL1ResultRetriever.h:29
JiveXML::LVL1ResultRetriever::m_allL2
const Trig::ChainGroup * m_allL2
Definition: LVL1ResultRetriever.h:49
JiveXML::LVL1ResultRetriever::getItemLists
StatusCode getItemLists(const Trig::ChainGroup *chains, std::string &listName, std::string &prescaleName)
Subroutine for constructing the item list string.
Definition: LVL1ResultRetriever.cxx:62
JiveXML::DataVect
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition: DataType.h:58
DataType
OFFLINE_FRAGMENTS_NAMESPACE::PointerType DataType
Definition: RoIBResultByteStreamTool.cxx:25
LVL1ResultRetriever.h
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
LArHistMerge_trf.dataMap
dataMap
Definition: LArHistMerge_trf.py:218
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
test_pyathena.parent
parent
Definition: test_pyathena.py:15
JiveXML::LVL1ResultRetriever::LVL1ResultRetriever
LVL1ResultRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: LVL1ResultRetriever.cxx:23
JiveXML::LVL1ResultRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: LVL1ResultRetriever.cxx:126
JiveXML::LVL1ResultRetriever::initialize
StatusCode initialize()
Initialize the tool.
Definition: LVL1ResultRetriever.cxx:34
Chain.h
JiveXML::LVL1ResultRetriever::m_allHLT
const Trig::ChainGroup * m_allHLT
Definition: LVL1ResultRetriever.h:51
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
Trig::ChainGroup
Definition: Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/ChainGroup.h:51
Trig::ChainGroup::isPassed
bool isPassed(unsigned int condition=TrigDefs::Physics) const
tells if chain group passed
Definition: Trigger/TrigAnalysis/TrigDecisionTool/Root/ChainGroup.cxx:208
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
python.copyTCTOutput.chains
chains
Definition: copyTCTOutput.py:81
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
AthAlgTool
Definition: AthAlgTool.h:26
JiveXML::LVL1ResultRetriever::m_allL1
const Trig::ChainGroup * m_allL1
Definition: LVL1ResultRetriever.h:48
JiveXML::LVL1ResultRetriever::m_all
const Trig::ChainGroup * m_all
the trigger chains
Definition: LVL1ResultRetriever.h:47
JiveXML::LVL1ResultRetriever::m_allEF
const Trig::ChainGroup * m_allEF
Definition: LVL1ResultRetriever.h:50