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