CMS 3D CMS Logo

L1TGlobalUtil.cc
Go to the documentation of this file.
1 // L1TGlobalUtil
2 //
3 // author: Brian Winer Ohio State
4 //
5 
7 
8 #include <iostream>
9 #include <fstream>
10 
15 
23 
24 
27 
28 
29 // constructor
31  m_l1GtMenu(nullptr)
32 {
33  // initialize cached IDs
34  m_l1GtMenuCacheID = 0ULL;
35  m_l1GtPfAlgoCacheID = 0ULL;
36  m_filledPrescales = false;
39 
40  edm::FileInPath f1("L1Trigger/L1TGlobal/data/Luminosity/startup/prescale_L1TGlobal.csv");
42  m_numberPhysTriggers = 512; //need to get this out of the EventSetup
43  m_PreScaleColumn = 0;
45 
46  m_prescaleFactorsAlgoTrig = nullptr;
47  m_triggerMaskAlgoTrig = nullptr;
48 }
49 
52  L1TGlobalUtil(pset, iC) {
53 }
54 
57  L1TGlobalUtil() {
58  m_l1tGlobalUtilHelper.reset(new L1TGlobalUtilHelper(pset, iC));
59  m_readPrescalesFromFile=m_l1tGlobalUtilHelper->readPrescalesFromFile();
60 }
61 
62 // destructor
64  // empty
65 }
66 
69  return m_l1GtMenuCacheID != 0ULL and m_l1GtMenu != nullptr;
70 }
71 
73  edm::FileInPath f1("L1Trigger/L1TGlobal/data/Luminosity/startup/" + filename);
75  m_PreScaleColumn = psColumn;
76 }
77 
79  // typically, the L1T menu and prescale table (may change only between Runs)
80  retrieveL1Setup(evSetup);
81  // typically the prescale set index used and the event by event accept/reject info (changes between Events)
82  retrieveL1Event(iEvent,evSetup);
83 }
84 
86  edm::EDGetToken gtAlgToken) {
87  // typically, the L1T menu and prescale table (may change only between Runs)
88  retrieveL1Setup(evSetup);
89  // typically the prescale set index used and the event by event accept/reject info (changes between Events)
90  retrieveL1Event(iEvent,evSetup,gtAlgToken);
91 }
92 
94 
95  // get / update the trigger menu from the EventSetup
96  // local cache & check on cacheIdentifier
97  unsigned long long l1GtMenuCacheID = evSetup.get<L1TUtmTriggerMenuRcd>().cacheIdentifier();
98 
99  if (m_l1GtMenuCacheID != l1GtMenuCacheID) {
100 
102  evSetup.get< L1TUtmTriggerMenuRcd>().get(l1GtMenu) ;
103  m_l1GtMenu = l1GtMenu.product();
104 
105  //std::cout << "Attempting to fill the map " << std::endl;
107 
108  //reset vectors since we have new menu
110 
111  m_l1GtMenuCacheID = l1GtMenuCacheID;
112  }
113 
115  unsigned long long l1GtPfAlgoCacheID = evSetup.get<L1TGlobalPrescalesVetosRcd>().cacheIdentifier();
116 
117  if (m_l1GtPfAlgoCacheID != l1GtPfAlgoCacheID) {
118  //std::cout << "Reading Prescales and Masks from dB" << std::endl;
119 
120  // clear and dimension
123  m_PreScaleColumn = 0;
126 
127  edm::ESHandle< L1TGlobalPrescalesVetos > l1GtPrescalesVetoes;
128  evSetup.get< L1TGlobalPrescalesVetosRcd >().get( l1GtPrescalesVetoes );
129  const L1TGlobalPrescalesVetos * es = l1GtPrescalesVetoes.product();
131 
134  m_numberPhysTriggers = (*m_prescaleFactorsAlgoTrig)[0].size(); // assumes all prescale columns are the same length
135 
137 
138  m_l1GtPfAlgoCacheID = l1GtPfAlgoCacheID;
139  }
140  } else {
141  //Load the prescales from external file
142  // clear and dimension
143  if (!m_filledPrescales){
146 
148 
149  // Set Prescale factors to initial
152  m_filledPrescales=true;
153  }
154  }
155 
156  //Protect against poor prescale column choice (I don't think there is a way this happen as currently structured)
158  LogTrace("l1t|Global")
159  << "\nNo Prescale Set: " << m_PreScaleColumn
160  << "\nMax Prescale Set value : " << m_prescaleFactorsAlgoTrig->size()
161  << "\nSetting prescale column to 0"
162  << std::endl;
163  m_PreScaleColumn = 0;
164  }
165  //std::cout << "Using prescale column: " << m_PreScaleColumn << std::endl;
166  const std::vector<int>& prescaleSet = (*m_prescaleFactorsAlgoTrig)[m_PreScaleColumn];
167 
168  for (std::map<std::string, L1TUtmAlgorithm>::const_iterator itAlgo = m_algorithmMap->begin(); itAlgo != m_algorithmMap->end(); itAlgo++) {
169 
170  // Get the algorithm name
171  std::string algName = itAlgo->first;
172  int algBit = (itAlgo->second).getIndex(); //algoBitNumber();
173 
174  (m_prescales[algBit]).first = algName;
175  (m_prescales[algBit]).second = prescaleSet[algBit];
176 
177  LogDebug("l1t|Global")<< "Number of bunch crossings stored: " << (*m_triggerMaskAlgoTrig).size() << endl;
178 
179  const std::map<int, std::vector<int> >* triggerAlgoMaskAlgoTrig = m_triggerMaskAlgoTrig;
180  std::map<int, std::vector<int> >::const_iterator it=triggerAlgoMaskAlgoTrig->begin();
181 
182  std::vector<int> maskedBxs;
183  (m_masks[algBit]).first = algName;
184  (m_masks[algBit]).second = maskedBxs;
185  while(it != triggerAlgoMaskAlgoTrig->end())
186  {
187  std::vector<int> masks = it->second;
188  //std::cout<< "BX: " << it->first<<" VecSize: "<< masks.size();
189  //std::cout << "\tMasked algos: ";
190  for ( unsigned int imask=0; imask< masks.size(); imask++){
191  if (masks.at(imask) == algBit) maskedBxs.push_back(it->first);
192  // std::cout << "\t" << masks.at(imask);
193  }
194  //std::cout << "\n";
195  it++;
196  }
197 
198  if (!maskedBxs.empty()){
199  LogDebug("l1t|Global") << "i Algo: "<< algBit << "\t" << algName << " masked\n";
200  for ( unsigned int ibx=0; ibx< maskedBxs.size(); ibx++){
201  // std::cout << "\t" << maskedBxs.at(ibx);
202  (m_masks[algBit]).second = maskedBxs;
203  }
204  }
205  }
206 
207 }
208 
210  retrieveL1Event(iEvent, evSetup, m_l1tGlobalUtilHelper->l1tAlgBlkToken());
211 }
212 
214  edm::EDGetToken gtAlgToken) {
215 
216 // Get the Global Trigger Output Algorithm block
217  iEvent.getByToken(gtAlgToken,m_uGtAlgBlk);
218  m_finalOR = false;
219 
220  //Make sure we have a valid AlgBlk
221  if(m_uGtAlgBlk.isValid()) {
222  // get the GlabalAlgBlk (Stupid find better way) of BX=0
223  std::vector<GlobalAlgBlk>::const_iterator algBlk = m_uGtAlgBlk->begin(0);
224  if (algBlk != m_uGtAlgBlk->end(0)){
226  m_PreScaleColumn = static_cast<unsigned int>(algBlk->getPreScColumn());
227  }
228  const std::vector<int>& prescaleSet = (*m_prescaleFactorsAlgoTrig)[m_PreScaleColumn];
229 
230  // Grab the final OR from the AlgBlk,
231  m_finalOR = algBlk->getFinalOR();
232 
233  // Make a map of the trigger name and whether it passed various stages (initial,prescale,final)
234  // Note: might be able to improve performance by not full remaking map with names each time
235  for (std::map<std::string, L1TUtmAlgorithm>::const_iterator itAlgo = m_algorithmMap->begin(); itAlgo != m_algorithmMap->end(); itAlgo++) {
236 
237  // Get the algorithm name
238  std::string algName = itAlgo->first;
239  int algBit = (itAlgo->second).getIndex(); //algoBitNumber();
240 
241  bool decisionInitial = algBlk->getAlgoDecisionInitial(algBit);
242  (m_decisionsInitial[algBit]).first = algName;
243  (m_decisionsInitial[algBit]).second = decisionInitial;
244 
245  bool decisionInterm = algBlk->getAlgoDecisionInterm(algBit);
246  (m_decisionsInterm[algBit]).first = algName;
247  (m_decisionsInterm[algBit]).second = decisionInterm;
248 
249  bool decisionFinal = algBlk->getAlgoDecisionFinal(algBit);
250  (m_decisionsFinal[algBit]).first = algName;
251  (m_decisionsFinal[algBit]).second = decisionFinal;
252 
253  (m_prescales[algBit]).first = algName;
254  (m_prescales[algBit]).second = prescaleSet[algBit];
255 
256  LogDebug("l1t|Global") << "Number of bunch crossings stored: " << (*m_triggerMaskAlgoTrig).size() << endl;
257 
258  const std::map<int, std::vector<int> >* triggerAlgoMaskAlgoTrig = m_triggerMaskAlgoTrig;
259  std::map<int, std::vector<int> >::const_iterator it=triggerAlgoMaskAlgoTrig->begin();
260 
261  std::vector<int> maskedBxs;
262  (m_masks[algBit]).first = algName;
263  (m_masks[algBit]).second = maskedBxs;
264 
265  while(it != triggerAlgoMaskAlgoTrig->end())
266  {
267  std::vector<int> masks = it->second;
268  //std::cout<< "BX: " << it->first<<" VecSize: "<< masks.size();
269  //std::cout << "\tMasked algos: ";
270  for ( unsigned int imask=0; imask< masks.size(); imask++){
271  if (masks.at(imask) == algBit) maskedBxs.push_back(it->first);
272  // std::cout << "\t" << masks.at(imask);
273  }
274  it++;
275  }
276 
277  if (!maskedBxs.empty()){
278  LogDebug("l1t|Global") << "Algo: "<< algBit << "\t" << algName << " masked\n";
279  for ( unsigned int ibx=0; ibx< maskedBxs.size(); ibx++){
280  // std::cout << "\t" << maskedBxs.at(ibx);
281  (m_masks[algBit]).second = maskedBxs;
282  }
283  }
284  }
285  } else {
286  //cout << "Error empty AlgBlk recovered.\n";
287  }
288  } else {
289  //cout<< "Error no valid uGT Algorithm Data with Token provided " << endl;
290  }
291 }
292 
294 
295  std::ifstream inputPrescaleFile;
296  //std::cout << "Reading prescales from file: " << m_preScaleFileName << std::endl;
297  inputPrescaleFile.open(m_preScaleFileName);
298 
299  std::vector<std::vector<int> > vec;
300  std::vector<std::vector<int> > prescale_vec;
301 
302  if( inputPrescaleFile ){
303  std::string prefix1("#");
304  std::string prefix2("-1");
305 
307 
308  bool first = true;
309 
310  while( getline(inputPrescaleFile,line) ){
311 
312  if( !line.compare(0, prefix1.size(), prefix1) ) continue;
313  //if( !line.compare(0, prefix2.size(), prefix2) ) continue;
314 
315  istringstream split(line);
316  int value;
317  int col = 0;
318  char sep;
319 
320  while( split >> value ){
321  if( first ){
322  // Each new value read on line 1 should create a new inner vector
323  vec.push_back(std::vector<int>());
324  }
325 
326  vec[col].push_back(value);
327  ++col;
328 
329  // read past the separator
330  split>>sep;
331  }
332 
333  // Finished reading line 1 and creating as many inner
334  // vectors as required
335  first = false;
336  }
337 
338 
339  int NumPrescaleSets = 0;
340  for( int iCol=0; iCol<int(vec.size()); iCol++ ){
341  if( !vec[iCol].empty() ){
342  int firstRow = vec[iCol][0];
343 
344  if( firstRow >= 0 ) NumPrescaleSets++;
345  //else if( firstRow==-2 ) maskColumn = iCol;
346  //else if( firstRow==-3 ) maskVetoColumn = iCol;
347  }
348  }
349 
350  //std::cout << "NumPrescaleSets= " << NumPrescaleSets << std::endl;
351  if( NumPrescaleSets > 0 ){
352  // Fill default prescale set
353  for( int iSet=0; iSet<NumPrescaleSets; iSet++ ){
354  prescale_vec.push_back(std::vector<int>());
355  for( unsigned int iBit = 0; iBit < m_numberPhysTriggers; ++iBit ){
356  int inputDefaultPrescale = 1;
357  prescale_vec[iSet].push_back(inputDefaultPrescale);
358  }
359  }
360 
361  // Fill non-trivial prescale set
362  for( int iBit=1; iBit<int(vec[0].size()); iBit++ ){
363  unsigned int algoBit = vec[0][iBit];
364  // algoBit must be less than the number of triggers
365  if( algoBit < m_numberPhysTriggers ){
366  for( int iSet=0; iSet<int(vec.size()); iSet++ ){
367  int useSet = -1;
368  if( !vec[iSet].empty() ){
369  useSet = vec[iSet][0];
370  }
371  useSet -= 1;
372 
373  if( useSet<0 ) continue;
374 
375  int prescale = vec[iSet][iBit];
376  prescale_vec[useSet][algoBit] = prescale;
377  }
378  }
379  else{
380  LogTrace("l1t|Global")
381  << "\nPrescale file has algo bit: " << algoBit
382  << "\nThis is larger than the number of triggers: " << m_numberPhysTriggers
383  << "\nSomething is wrong. Ignoring."
384  << std::endl;
385  }
386  }
387  }
388 
389  }
390  else {
391  LogTrace("l1t|Global")
392  << "\nCould not find file: " << m_preScaleFileName
393  << "\nFilling the prescale vectors with prescale 1"
394  << "\nSetting prescale set to 0"
395  << std::endl;
396 
397  m_PreScaleColumn = 0;
398 
399  for( int col=0; col < 1; col++ ){
400  prescale_vec.push_back(std::vector<int>());
401  for( unsigned int iBit = 0; iBit < m_numberPhysTriggers; ++iBit ){
402  int inputDefaultPrescale = 0;
403  prescale_vec[col].push_back(inputDefaultPrescale);
404  }
405  }
406  }
407 
408  inputPrescaleFile.close();
409 
410  m_initialPrescaleFactorsAlgoTrig = prescale_vec;
411  // setting of bx masks from an input file not enabled; do not see a use case at the moment
412  std::map<int, std::vector<int> > m_initialTriggerMaskAlgoTrig;
413 
414 }
415 
417 
418  // Reset all the vector contents with null information
419  m_decisionsInitial.clear();
421  m_decisionsInterm.clear();
423  m_decisionsFinal.clear();
425 
426 
427  for(unsigned int algBit = 0; algBit< m_maxNumberPhysTriggers; algBit++) {
428 
429  (m_decisionsInitial[algBit]).first = "NULL";
430  (m_decisionsInitial[algBit]).second = false;
431 
432  (m_decisionsInterm[algBit]).first = "NULL";
433  (m_decisionsInterm[algBit]).second = false;
434 
435  (m_decisionsFinal[algBit]).first = "NULL";
436  (m_decisionsFinal[algBit]).second = false;
437 
438  }
439 
440 
441 }
442 
444 
445  // Reset all the vector contents with null information
446  m_prescales.clear();
448 
449  for(unsigned int algBit = 0; algBit< m_maxNumberPhysTriggers; algBit++) {
450 
451  (m_prescales[algBit]).first = "NULL";
452  (m_prescales[algBit]).second = 1;
453 
454  }
455 
456 }
457 
459 
460  // Reset all the vector contents with null information
461  m_masks.clear();
463 
464  for(unsigned int algBit = 0; algBit< m_maxNumberPhysTriggers; algBit++) {
465 
466  (m_masks[algBit]).first = "NULL";
467  // ccla (m_masks[algBit]).second = true;
468 
469  }
470 
471 }
472 
473 const bool l1t::L1TGlobalUtil::getAlgBitFromName(const std::string& algName, int& bit) const {
474 
475  std::map<std::string, L1TUtmAlgorithm>::const_iterator itAlgo = m_algorithmMap->find(algName);
476  if(itAlgo != m_algorithmMap->end()) {
477  bit = (itAlgo->second).getIndex(); //algoBitNumber();
478  return true;
479  }
480 
481  return false; //did not find anything by that name
482 }
483 
484 const bool l1t::L1TGlobalUtil::getAlgNameFromBit(int& bit, std::string& algName) const {
485 
486  // since we are just looking up the name, doesn't matter which vector we get it from
487  if((m_decisionsInitial[bit]).first != "NULL") {
488  algName = (m_decisionsInitial[bit]).first;
489  return true;
490  }
491  return false; //No name associated with this bit
492 
493 }
494 
495 const bool l1t::L1TGlobalUtil::getInitialDecisionByBit(int& bit, bool& decision) const {
496 
497  /*
498  for(std::vector<GlobalAlgBlk>::const_iterator algBlk = m_uGtAlgBlk->begin(0); algBlk != m_uGtAlgBlk->end(0); ++algBlk) {
499  decision = algBlk->getAlgoDecisionFinal(bit);
500  }
501  */
502  // Need some check that this is a valid bit
503  if((m_decisionsInitial[bit]).first != "NULL") {
504  decision = (m_decisionsInitial[bit]).second;
505  return true;
506  }
507 
508  return false; //couldn't get the information requested.
509 }
510 const bool l1t::L1TGlobalUtil::getIntermDecisionByBit(int& bit, bool& decision) const {
511 
512  // Need some check that this is a valid bit
513  if((m_decisionsInterm[bit]).first != "NULL") {
514  decision = (m_decisionsInterm[bit]).second;
515  return true;
516  }
517 
518  return false; //couldn't get the information requested.
519 }
520 const bool l1t::L1TGlobalUtil::getFinalDecisionByBit(int& bit, bool& decision) const {
521 
522  // Need some check that this is a valid bit
523  if((m_decisionsFinal[bit]).first != "NULL") {
524  decision = (m_decisionsFinal[bit]).second;
525  return true;
526  }
527 
528  return false; //couldn't get the information requested.
529 }
530 const bool l1t::L1TGlobalUtil::getPrescaleByBit(int& bit, int& prescale) const {
531 
532  // Need some check that this is a valid bit
533  if((m_prescales[bit]).first != "NULL") {
534  prescale = (m_prescales[bit]).second;
535  return true;
536  }
537 
538  return false; //couldn't get the information requested.
539 }
540 const bool l1t::L1TGlobalUtil::getMaskByBit(int& bit, std::vector<int>& mask) const {
541 
542  // Need some check that this is a valid bit
543  if((m_masks[bit]).first != "NULL") {
544  mask = (m_masks[bit]).second;
545  return true;
546  }
547 
548  return false; //couldn't get the information requested.
549 }
550 
551 const bool l1t::L1TGlobalUtil::getInitialDecisionByName(const std::string& algName, bool& decision) const {
552 
553  int bit = -1;
554  if(getAlgBitFromName(algName,bit)) {
555  decision = (m_decisionsInitial[bit]).second;
556  return true;
557  }
558 
559  return false; //trigger name was not the menu.
560 }
561 
562 const bool l1t::L1TGlobalUtil::getIntermDecisionByName(const std::string& algName, bool& decision) const {
563 
564  int bit = -1;
565  if(getAlgBitFromName(algName,bit)) {
566  decision = (m_decisionsInterm[bit]).second;
567  return true;
568  }
569 
570  return false; //trigger name was not the menu.
571 }
572 
573 const bool l1t::L1TGlobalUtil::getFinalDecisionByName(const std::string& algName, bool& decision) const {
574 
575  int bit = -1;
576  if(getAlgBitFromName(algName,bit)) {
577  decision = (m_decisionsFinal[bit]).second;
578  return true;
579  }
580 
581  return false; //trigger name was not the menu.
582 }
583 const bool l1t::L1TGlobalUtil::getPrescaleByName(const std::string& algName, int& prescale) const {
584 
585  int bit = -1;
586  if(getAlgBitFromName(algName,bit)) {
587  prescale = (m_prescales[bit]).second;
588  return true;
589  }
590 
591  return false; //trigger name was not the menu.
592 }
593 const bool l1t::L1TGlobalUtil::getMaskByName(const std::string& algName, std::vector<int>& mask) const {
594 
595  int bit = -1;
596  if(getAlgBitFromName(algName,bit)) {
597  mask = (m_masks[bit]).second;
598  return true;
599  }
600 
601  return false; //trigger name was not the menu.
602 }
#define LogDebug(id)
size
Write out results.
const_iterator end(int bx) const
const bool getInitialDecisionByBit(int &bit, bool &decision) const
const L1TUtmTriggerMenu * m_l1GtMenu
std::string m_preScaleFileName
const bool getAlgBitFromName(const std::string &AlgName, int &bit) const
const std::vector< std::vector< int > > & prescaleTable() const
void retrieveL1Event(const edm::Event &iEvent, const edm::EventSetup &evSetup)
bool m_algorithmTriggersUnmasked
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
unsigned long long m_l1GtPfAlgoCacheID
const bool getPrescaleByBit(int &bit, int &prescale) const
const bool getIntermDecisionByBit(int &bit, bool &decision) const
unsigned int m_numberOfPreScaleColumns
unsigned int m_PreScaleColumn
std::vector< std::vector< int > > m_initialPrescaleFactorsAlgoTrig
#define nullptr
std::unique_ptr< L1TGlobalUtilHelper > m_l1tGlobalUtilHelper
const bool getInitialDecisionByName(const std::string &algName, bool &decision) const
std::vector< std::pair< std::string, bool > > m_decisionsInitial
bool valid() const
check that the L1TGlobalUtil has been properly initialised
void resetDecisionVectors()
clear decision vectors on a menu change
const std::map< int, std::vector< int > > & triggerAlgoBxMask() const
const std::map< std::string, L1TUtmAlgorithm > * m_algorithmMap
U second(std::pair< T, U > const &p)
const std::map< int, std::vector< int > > m_initialTriggerMaskAlgoTrig
static const PrescalesVetosHelper * readFromEventSetup(const L1TGlobalPrescalesVetos *es)
std::vector< std::pair< std::string, std::vector< int > > > m_masks
int iEvent
Definition: GenABIO.cc:230
const std::map< int, std::vector< int > > * m_triggerMaskAlgoTrig
const std::vector< std::vector< int > > * m_prescaleFactorsAlgoTrig
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
bool isValid() const
Definition: HandleBase.h:74
const bool getFinalDecisionByName(const std::string &algName, bool &decision) const
void OverridePrescalesAndMasks(std::string filename, unsigned int psColumn=1)
#define LogTrace(id)
const bool getMaskByName(const std::string &algName, std::vector< int > &mask) const
std::vector< std::pair< std::string, bool > > m_decisionsInterm
const bool getAlgNameFromBit(int &bit, std::string &AlgName) const
unsigned long long m_l1GtMenuCacheID
const T & get() const
Definition: EventSetup.h:58
const l1t::PrescalesVetosHelper * m_l1GtPrescalesVetoes
const bool getFinalDecisionByBit(int &bit, bool &decision) const
const std::map< std::string, L1TUtmAlgorithm > & getAlgorithmMap() const
std::vector< std::pair< std::string, bool > > m_decisionsFinal
col
Definition: cuy.py:1008
const bool getPrescaleByName(const std::string &algName, int &prescale) const
std::string fullPath() const
Definition: FileInPath.cc:197
const bool getMaskByBit(int &bit, std::vector< int > &mask) const
bool m_algorithmTriggersUnprescaled
edm::Handle< BXVector< GlobalAlgBlk > > m_uGtAlgBlk
const std::vector< std::pair< std::string, std::vector< int > > > & masks()
const bool getIntermDecisionByName(const std::string &algName, bool &decision) const
const unsigned int m_maxNumberPhysTriggers
const_iterator begin(int bx) const
virtual ~L1TGlobalUtil()
destructor
void retrieveL1Setup(const edm::EventSetup &evSetup)
T const * product() const
Definition: ESHandle.h:86
std::vector< std::pair< std::string, int > > m_prescales
double split
Definition: MVATrainer.cc:139
unsigned int m_numberPhysTriggers
void retrieveL1(const edm::Event &iEvent, const edm::EventSetup &evSetup)
initialize the class (mainly reserve)