ATLAS Offline Software
HLTChainLoader.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "./HLTChainLoader.h"
6 
13 
14 #include "boost/lexical_cast.hpp"
15 
16 #include "./DBHelper.h"
17 
18 using namespace std;
19 
20 bool
22  m_smk=frame.smk();
23 
24  m_schemaversion = triggerDBSchemaVersion();
25  TRG_MSG_INFO("Loading HLT chains");
26 
28 
29  try {
30  startSession ();
31  loadChains( chains );
32  loadGroups( chains );
33  loadTypes( chains );
34  loadStreams( chains );
35  loadSignatures( chains );
36  commitSession();
37  }
38  catch( const coral::Exception& e ) {
39  TRG_MSG_ERROR("Coral::Exception: " << e.what());
40  m_session.transaction().rollback();
41  throw;
42  }
43 
44  chains.setEFLowerChainCounter();
45 
46  return true;
47 }
48 
49 
50 void
52 
53  TRG_MSG_INFO("Loading chains with SMK " << m_smk);
54 
55  std::unique_ptr< coral::IQuery > q( m_session.nominalSchema().newQuery() );
56 
57  //Set the tables that are used
58  q->addToTableList ( "SUPER_MASTER_TABLE", "SM" );
59  q->addToTableList ( "HLT_MASTER_TABLE", "HM" );
60  q->addToTableList ( "HLT_TRIGGER_MENU", "TM" );
61  q->addToTableList ( "HLT_TM_TO_TC", "TM2TC" );
62  q->addToTableList ( "HLT_TRIGGER_CHAIN", "TC" );
63 
64  //Bind list
65  coral::AttributeList bindList;
66  bindList.extend<int>("smid");
67  bindList[0].data<int>() = (int)m_smk;
68 
69  string theCondition = "";
70  theCondition += string( " SM.SMT_ID = :smid");
71  theCondition += string( " AND HM.HMT_ID = SM.SMT_HLT_MASTER_TABLE_ID" );
72  theCondition += string( " AND TM.HTM_ID = HM.HMT_TRIGGER_MENU_ID" );
73  theCondition += string( " AND TM.HTM_ID = TM2TC.HTM2TC_TRIGGER_MENU_ID " );
74  theCondition += string( " AND TC.HTC_ID = TM2TC.HTM2TC_TRIGGER_CHAIN_ID" );
75 
76  q->setCondition( theCondition, bindList );
77 
78  //Output data and types
79  coral::AttributeList attList;
80  attList.extend<long> ( "TC.HTC_ID" );
81  attList.extend<string>( "TC.HTC_NAME" );
82  attList.extend<string>( "TC.HTC_LOWER_CHAIN_NAME" );
83  if(isRun1()) {
84  attList.extend<string>( "TC.HTC_L2_OR_EF" );
85  attList.extend<string>( "TC.HTC_RERUN_PRESCALE" );
86  }
87  attList.extend<int> ( "TC.HTC_CHAIN_COUNTER" );
88  attList.extend<int> ( "TC.HTC_VERSION" );
89  fillQuery(q.get(),attList);
90 
91  // the ordering
92  string theOrder = "";
93  if(isRun1()) {
94  theOrder += " TC.HTC_L2_OR_EF DESC, ";
95  }
96  theOrder += " TC.HTC_CHAIN_COUNTER ASC";
97  q->addToOrderList( theOrder );
98 
99  // process the query
100  q->setDistinct();
101  coral::ICursor& cursor = q->execute();
102 
103  while ( cursor.next() ) {
104  const coral::AttributeList& row = cursor.currentRow();
105 
106  long chainId = row["TC.HTC_ID"].data<long>();
107  int counter = row["TC.HTC_CHAIN_COUNTER"].data<int>();
108  int version = row["TC.HTC_VERSION"].data<int>();
109  string name = rmtilde(row["TC.HTC_NAME"].data<string>());
110  string lower_chain_name = rmtilde(row["TC.HTC_LOWER_CHAIN_NAME"].data<string>());
111 
112  // level
113  string level = "HLT";
114  if(isRun1()) {
115  level = rmtilde(row["TC.HTC_L2_OR_EF"].data<string>());
116  if(level=="HL") level="HLT";
117  }
118 
119  HLTChain* ch = new HLTChain( name, counter, version, level, lower_chain_name, 0, std::vector<HLTSignature*>() );
120 
121  // rerun ps from the chain table only in run 1
122  if(isRun1()) {
123  float rerunps = 0;
124  string rerunps_s = rmtilde(row["TC.HTC_RERUN_PRESCALE"].data<string>());
125  rerunps = boost::lexical_cast<float,string>(rerunps_s);
126  if(rerunps>=0)
127  ch->set_rerun_prescale(rerunps);
128  }
129 
130  ch->setId(chainId);
131  chainlist.addHLTChain(ch);
132  }
133  cursor.close();
134 
135  TRG_MSG_INFO("Loaded " << chainlist.size() << " chains");
136 
137 }
138 
139 
140 namespace {
141  void
142  defineChainSubQuery( coral::IQuery* q, std::string& theCondition, coral::AttributeList& bindings, int smk, coral::AttributeList& output) {
143 
144  q->addToTableList ( "SUPER_MASTER_TABLE", "SM" );
145  q->addToTableList ( "HLT_MASTER_TABLE", "HM" );
146  q->addToTableList ( "HLT_TM_TO_TC", "TM2TC" );
147  q->addToTableList ( "HLT_TRIGGER_CHAIN", "TC" );
148 
149  theCondition += string( " SM.SMT_ID = :smid" );
150  theCondition += string( " AND SM.SMT_HLT_MASTER_TABLE_ID = HM.HMT_ID" );
151  theCondition += string( " AND HM.HMT_TRIGGER_MENU_ID = TM2TC.HTM2TC_TRIGGER_MENU_ID " );
152  theCondition += string( " AND TC.HTC_ID = TM2TC.HTM2TC_TRIGGER_CHAIN_ID" );
153 
154  bindings.extend<int>("smid");
155  bindings[0].data<int>() = smk;
156 
157  output.extend<string>( "TC.HTC_NAME" );
158  }
159 }
160 
161 
162 
163 void
165 
166  std::unique_ptr< coral::IQuery > q( m_session.nominalSchema().newQuery() );
167  string theCondition("");
168  coral::AttributeList bindings, output;
169 
170  defineChainSubQuery( q.get(), theCondition, bindings, m_smk, output);
171 
172  q->addToTableList ( "HLT_TRIGGER_GROUP", "GR" );
173 
174  theCondition += string( " AND GR.HTG_TRIGGER_CHAIN_ID = TM2TC.HTM2TC_TRIGGER_CHAIN_ID" );
175 
176  q->setCondition( theCondition, bindings );
177 
178  output.extend<string>( "GR.HTG_NAME" );
179 
180  fillQuery(q.get(), output);
181 
182  q->setDistinct();
183  coral::ICursor& cursor = q->execute();
184 
185  uint count(0);
186  while ( cursor.next() ) {
187  ++count;
188  const coral::AttributeList& row = cursor.currentRow();
189  string name = rmtilde(row["TC.HTC_NAME"].data<string>());
190  string grname = rmtilde(row["GR.HTG_NAME"].data<string>());
191  chainlist.chain(name)->addGroup(grname);
192  }
193  cursor.close();
194 
195  TRG_MSG_INFO("Loaded " << count << " groups");
196 
197 }
198 
199 
200 
201 
202 void
204 
205  std::unique_ptr< coral::IQuery > q( m_session.nominalSchema().newQuery() );
206  string theCondition("");
207  coral::AttributeList bindings, output;
208 
209  defineChainSubQuery( q.get(), theCondition, bindings, m_smk, output);
210 
211  q->addToTableList ( "HLT_TRIGGER_TYPE", "TT" );
212 
213  theCondition += string( " AND TT.HTT_TRIGGER_CHAIN_ID = TM2TC.HTM2TC_TRIGGER_CHAIN_ID" );
214 
215  q->setCondition( theCondition, bindings );
216 
217  output.extend<int>( "TT.HTT_TYPEBIT" );
218 
219  fillQuery(q.get(), output);
220 
221  q->setDistinct();
222  coral::ICursor& cursor = q->execute();
223 
224  uint count(0);
225  while ( cursor.next() ) {
226  ++count;
227  const coral::AttributeList& row = cursor.currentRow();
228  string name = rmtilde(row["TC.HTC_NAME"].data<string>());
229  int triggertype = row["TT.HTT_TYPEBIT"].data<int>();
230  chainlist.chain(name)->triggerTypeList().push_back(new HLTTriggerType(triggertype));
231  }
232  cursor.close();
233 
234  TRG_MSG_INFO("Loaded " << count << " trigger types");
235 }
236 
237 
238 void
240 
241  std::unique_ptr< coral::IQuery > q( m_session.nominalSchema().newQuery() );
242  string theCondition("");
243  coral::AttributeList bindings, output;
244 
245  defineChainSubQuery( q.get(), theCondition, bindings, m_smk, output);
246 
247  q->addToTableList ( "HLT_TC_TO_TR", "TC2TR" );
248  q->addToTableList ( "HLT_TRIGGER_STREAM", "TR" );
249 
250  theCondition += string( " AND TC2TR.HTC2TR_TRIGGER_CHAIN_ID = TC.HTC_ID" );
251  theCondition += string( " AND TC2TR.HTC2TR_TRIGGER_STREAM_ID = TR.HTR_ID" );
252 
253  output.extend<string>( "TC2TR.HTC2TR_TRIGGER_STREAM_PRESCALE");
254  output.extend<string>( "TR.HTR_NAME" );
255  output.extend<string>( "TR.HTR_TYPE" );
256  output.extend<int>( "TR.HTR_OBEYLB" );
257 
258  fillQuery(q.get(), output);
259 
260  q->setCondition( theCondition, bindings );
261 
262  q->setDistinct();
263  coral::ICursor& cursor = q->execute();
264 
265  uint count(0);
266  while ( cursor.next() ) {
267  ++count;
268  const coral::AttributeList& row = cursor.currentRow();
269  string chainname = rmtilde(row["TC.HTC_NAME"].data<string>());
270  string prescale_str = rmtilde(row["TC2TR.HTC2TR_TRIGGER_STREAM_PRESCALE"].data<string>());
271  string streamname = rmtilde(row["TR.HTR_NAME"].data<string>());
272  string type = rmtilde(row["TR.HTR_TYPE"].data<string>());
273  bool obeyLB = row["TR.HTR_OBEYLB"].data<int>();
274  int prescale = 1;
275  try {
276  prescale = boost::lexical_cast<int,string>(prescale_str);
277  }
278  catch(boost::bad_lexical_cast & e) {}
279  chainlist.chain(chainname)->addStream( new HLTStreamTag(streamname, type, obeyLB, prescale) );
280  }
281  cursor.close();
282 
283  TRG_MSG_INFO("Loaded " << count << " streams");
284 }
285 
286 
287 void
289 
290  std::unique_ptr< coral::IQuery > q( m_session.nominalSchema().newQuery() );
291  string theCondition("");
292  coral::AttributeList bindings, output;
293 
294  defineChainSubQuery( q.get(), theCondition, bindings, m_smk, output);
295 
296  q->addToTableList ( "HLT_TC_TO_TS", "TC2TS" );
297  q->addToTableList ( "HLT_TRIGGER_SIGNATURE", "TS" );
298  q->addToTableList ( "HLT_TS_TO_TE", "TS2TE" );
299  q->addToTableList ( "HLT_TRIGGER_ELEMENT", "TE" );
300 
301 
302  theCondition += string( " AND TC2TS.HTC2TS_TRIGGER_CHAIN_ID = TC.HTC_ID" );
303  theCondition += string( " AND TC2TS.HTC2TS_TRIGGER_SIGNATURE_ID = TS.HTS_ID" );
304  theCondition += string( " AND TC2TS.HTC2TS_TRIGGER_SIGNATURE_ID = TS2TE.HTS2TE_TRIGGER_SIGNATURE_ID" );
305  theCondition += string( " AND TE.HTE_ID = TS2TE.HTS2TE_TRIGGER_ELEMENT_ID" );
306  theCondition += string( " AND TS2TE.HTS2TE_ELEMENT_COUNTER>=0" ); // counter<0 are for TE's that are only input TEs for a menu
307 
308  output.extend<int>( "TC2TS.HTC2TS_SIGNATURE_COUNTER" );
309  output.extend<int>( "TS2TE.HTS2TE_ELEMENT_COUNTER" );
310  output.extend<int>( "TS.HTS_LOGIC" );
311  output.extend<int>( "TE.HTE_ID" );
312  output.extend<string>( "TE.HTE_NAME" );
313  fillQuery(q.get(), output);
314 
315  q->setCondition( theCondition, bindings );
316 
317  q->setDistinct();
318 
319  q->addToOrderList( "TC.HTC_NAME" );
320  q->addToOrderList( "TC2TS.HTC2TS_SIGNATURE_COUNTER" );
321  q->addToOrderList( "TS2TE.HTS2TE_ELEMENT_COUNTER" );
322 
323  coral::ICursor& cursor = q->execute();
324 
325  uint count(0);
326  while ( cursor.next() ) {
327  ++count;
328 
329  const coral::AttributeList& row = cursor.currentRow();
330 
331  string chainname = rmtilde(row["TC.HTC_NAME"].data<string>());
332  vector<HLTSignature*>& sig_list = chainlist.chain(chainname)->signatureList();
333 
334  unsigned int sig_counter = (unsigned int)row["TC2TS.HTC2TS_SIGNATURE_COUNTER"].data<int>();
335  if( sig_list.size() < sig_counter+1 )
336  sig_list.resize( sig_counter+1, 0 );
337 
338  if( sig_list[sig_counter] == 0) {
339  int logic = row["TS.HTS_LOGIC"].data<int>();
340  sig_list[sig_counter] = new HLTSignature(sig_counter, logic, std::vector<HLTTriggerElement*>());
341  sig_list[sig_counter]->set_label( chainname + "_" + boost::lexical_cast<string,int>(sig_counter) );
342  }
343 
344  HLTSignature* sig = sig_list[sig_counter];
345  vector<HLTTriggerElement*>& te_list = sig->outputTEs();
346 
347  unsigned int te_counter = (unsigned int)row["TS2TE.HTS2TE_ELEMENT_COUNTER"].data<int>();
348  if( te_list.size() < te_counter+1 )
349  te_list.resize( te_counter+1, 0 );
350 
351  if( te_list[te_counter] == 0) {
352  int te_id = row["TE.HTE_ID"].data<int>();
353  string te_name = row["TE.HTE_NAME"].data<string>();
354  te_list[te_counter] = new HLTTriggerElement(te_id, te_name);
355  }
356 
357  }
358  cursor.close();
359 
360  TRG_MSG_INFO("Loaded " << count << " signatures");
361 
362  // remove 0 pointers from signature list of each chain to keep old
363  // behavior, would be nicer if 0's were kept and step could be
364  // accessed by index (to be seen)
365  for(HLTChain* ch : chainlist) {
366  vector<HLTSignature*>& s = ch->signatureList();
367  s.erase(remove(s.begin(), s.end(), (HLTSignature*)0), s.end());
368  }
369 
370 }
TRG_MSG_ERROR
#define TRG_MSG_ERROR(x)
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStreamMacros.h:29
query_example.row
row
Definition: query_example.py:24
sendEI_SPB.ch
ch
Definition: sendEI_SPB.py:35
HLTChainList.h
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
TrigConf::HLTChainLoader::loadStreams
void loadStreams(HLTChainList &chainlist)
Definition: HLTChainLoader.cxx:239
TrigConf::HLTChainLoader::loadChains
void loadChains(HLTChainList &chainlist)
Definition: HLTChainLoader.cxx:51
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
RunEBWeightsComputation.smk
smk
Definition: RunEBWeightsComputation.py:87
TrigConf::HLTChain::triggerTypeList
std::vector< HLTTriggerType * > & triggerTypeList()
Definition: TrigConfHLTData/TrigConfHLTData/HLTChain.h:88
TrigConf::HLTChain::addGroup
void addGroup(const std::string &group)
Definition: TrigConfHLTData/TrigConfHLTData/HLTChain.h:130
DBHelper.h
TrigConf::fillQuery
void fillQuery(coral::IQuery *q, coral::AttributeList &attList)
Definition: DBHelper.cxx:13
TrigConf::HLTChain::addStream
void addStream(HLTStreamTag *)
Definition: TrigConfHLTData/Root/HLTChain.cxx:238
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
TrigConf::HLTChain
HLT chain configuration information.
Definition: TrigConfHLTData/TrigConfHLTData/HLTChain.h:35
TrigConf::HLTChain::signatureList
std::vector< HLTSignature * > & signatureList()
Definition: TrigConfHLTData/TrigConfHLTData/HLTChain.h:107
trigbs_dumpPrescaleBits.HLTChain
HLTChain
Definition: trigbs_dumpPrescaleBits.py:41
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
PixelModuleFeMask_create_db.remove
string remove
Definition: PixelModuleFeMask_create_db.py:83
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
TrigConf::HLTSignature
HLT signature configuration information.
Definition: HLTSignature.h:29
TrigConf::HLTChainList
list of all HLT chains in a trigger menu
Definition: HLTChainList.h:56
HLTStreamTag.h
TrigConf::HLTTriggerType
HLT trigger type configuration information.
Definition: HLTTriggerType.h:22
TrigConf::HLTChainList::chain
HLTChain * chain(const std::string &chainname) const
access the chain by name returns null-pointer if chain not found
Definition: HLTChainList.cxx:52
HLTSignature.h
python.BuildSignatureFlags.sig
sig
Definition: BuildSignatureFlags.py:215
TrigConf::HLTChainList::addHLTChain
bool addHLTChain(HLTChain *ch)
adds an HLTChain to the menu
Definition: HLTChainList.cxx:42
TrigConf::name
Definition: HLTChainList.h:35
TRG_MSG_INFO
#define TRG_MSG_INFO(x)
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStreamMacros.h:27
merge.output
output
Definition: merge.py:17
TrigConf::TrigConfData::smk
unsigned int smk() const
Definition: TrigConfData.h:20
TrigConf::counter
Definition: HLTChainList.h:37
TrigConf::HLTChainLoader::loadSignatures
void loadSignatures(HLTChainList &chainlist)
Definition: HLTChainLoader.cxx:288
HLTFrame.h
TrigConf::HLTTriggerElement
HLT trigger element configuration information.
Definition: HLTTriggerElement.h:26
TrigConf::HLTChainLoader::loadGroups
void loadGroups(HLTChainList &chainlist)
Definition: HLTChainLoader.cxx:164
HLTTriggerElement.h
TrigConf::HLTStreamTag
HLT stream configuration information.
Definition: HLTStreamTag.h:23
TrigConf::HLTChainLoader::loadTypes
void loadTypes(HLTChainList &chainlist)
Definition: HLTChainLoader.cxx:203
TrigConf::rmtilde
std::string rmtilde(const std::string &input)
Definition: DBHelper.h:24
python.copyTCTOutput.chains
chains
Definition: copyTCTOutput.py:81
TrigConf::HLTFrame
The HLT trigger menu,.
Definition: HLTFrame.h:33
get_generator_info.version
version
Definition: get_generator_info.py:33
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
query_example.cursor
cursor
Definition: query_example.py:21
HLTTriggerType.h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
extractSporadic.q
list q
Definition: extractSporadic.py:98
TrigConf::HLTChainLoader::load
virtual bool load(HLTFrame &frame)
Definition: HLTChainLoader.cxx:21
TrigConf::HLTFrame::theHLTChainList
HLTChainList & theHLTChainList()
accessor to the list of HLT chains
Definition: HLTFrame.h:44
HLTChainLoader.h