CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
L1TGlobalSummary.cc
Go to the documentation of this file.
1 // L1TGlobalSummary: Use L1TGlobalUtils to print summary of L1TGlobal output
2 //
3 // author: Brian Winer Ohio State
4 //
5 
6 #include <fstream>
7 #include <iomanip>
8 
17 
20 
22 
24 
25 using namespace edm;
26 using namespace std;
27 using namespace l1t;
28 
29 // class declaration
30 class L1TGlobalSummary : public edm::one::EDAnalyzer<edm::one::WatchRuns> {
31 public:
32  explicit L1TGlobalSummary(const edm::ParameterSet&);
33  ~L1TGlobalSummary() override{};
34  void analyze(const edm::Event&, const edm::EventSetup&) override;
35  void beginRun(Run const&, EventSetup const&) override;
36  void endRun(Run const&, EventSetup const&) override;
37  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
38 
39 private:
48  int minBx_;
49  int maxBx_;
51 
52  std::vector<int> decisionCount_;
53  std::vector<int> intermCount_;
54  std::vector<int> finalCount_;
56 };
57 
59  algInputTag_ = iConfig.getParameter<InputTag>("AlgInputTag");
60  extInputTag_ = iConfig.getParameter<InputTag>("ExtInputTag");
61  algToken_ = consumes<BXVector<GlobalAlgBlk>>(algInputTag_);
62  extToken_ = consumes<BXVector<GlobalExtBlk>>(extInputTag_);
63  dumpRecord_ = iConfig.getParameter<bool>("DumpRecord");
64  dumpTriggerResults_ = iConfig.getParameter<bool>("DumpTrigResults");
65  dumpTriggerSummary_ = iConfig.getParameter<bool>("DumpTrigSummary");
66  readPrescalesFromFile_ = iConfig.getParameter<bool>("ReadPrescalesFromFile");
67  minBx_ = iConfig.getParameter<int>("MinBx");
68  maxBx_ = iConfig.getParameter<int>("MaxBx");
70  if (dumpTriggerResults_ || dumpTriggerSummary_) {
71  useEventSetupIn = l1t::UseEventSetupIn::RunAndEvent;
72  }
73  gtUtil_ = new L1TGlobalUtil(iConfig, consumesCollector(), *this, algInputTag_, extInputTag_, useEventSetupIn);
74  finalOrCount = 0;
75 
76  if (readPrescalesFromFile_) {
77  std::string preScaleFileName = iConfig.getParameter<std::string>("psFileName");
78  unsigned int preScColumn = iConfig.getParameter<int>("psColumn");
79  gtUtil_->OverridePrescalesAndMasks(preScaleFileName, preScColumn);
80  }
81 }
82 
85  // These parameters are part of the L1T/HLT interface, avoid changing if possible::
86  desc.add<edm::InputTag>("AlgInputTag", edm::InputTag(""))
87  ->setComment("InputTag for uGT Algorithm Block (required parameter: default value is invalid)");
88  desc.add<edm::InputTag>("ExtInputTag", edm::InputTag(""))
89  ->setComment("InputTag for uGT External Block (required parameter: default value is invalid)");
90  // These parameters have well defined default values and are not currently
91  // part of the L1T/HLT interface. They can be cleaned up or updated at will:
92  desc.add<int>("MinBx", 0);
93  desc.add<int>("MaxBx", 0);
94  desc.add<bool>("DumpTrigResults", false);
95  desc.add<bool>("DumpRecord", false);
96  desc.add<bool>("DumpTrigSummary", true);
97  desc.add<bool>("ReadPrescalesFromFile", false);
98  desc.add<std::string>("psFileName", "prescale_L1TGlobal.csv")
99  ->setComment("File should be located in directory: L1Trigger/L1TGlobal/data/Luminosity/startup");
100  desc.add<int>("psColumn", 0);
101  descriptions.add("L1TGlobalSummary", desc);
102 }
103 
104 void L1TGlobalSummary::beginRun(Run const&, EventSetup const& evSetup) {
105  decisionCount_.clear();
106  intermCount_.clear();
107  finalCount_.clear();
108 
109  finalOrCount = 0;
110  gtUtil_->retrieveL1Setup(evSetup);
111 
112  int size = gtUtil_->decisionsInitial().size();
113  decisionCount_.resize(size);
114  intermCount_.resize(size);
115  finalCount_.resize(size);
116  std::fill(decisionCount_.begin(), decisionCount_.end(), 0);
117  std::fill(intermCount_.begin(), intermCount_.end(), 0);
118  std::fill(finalCount_.begin(), finalCount_.end(), 0);
119 }
120 
122  if (dumpTriggerSummary_) {
123  LogVerbatim out("L1TGlobalSummary");
124  if (gtUtil_->valid()) {
125  out << "================== L1 Trigger Report "
126  "=====================================================================\n";
127  out << '\n';
128  out << " L1T menu Name : " << gtUtil_->gtTriggerMenuName() << '\n';
129  out << " L1T menu Version: " << gtUtil_->gtTriggerMenuVersion() << '\n';
130  out << " L1T menu Comment: " << gtUtil_->gtTriggerMenuComment() << '\n';
131  out << '\n';
132  out << " Bit Algorithm Name Init PScd Final PS Factor Num Bx "
133  "Masked\n";
134  out << "========================================================================================================="
135  "===\n";
136  auto const& prescales = gtUtil_->prescales();
137  auto const& masks = gtUtil_->masks();
138  for (unsigned int i = 0; i < prescales.size(); i++) {
139  // get the prescale and mask (needs some error checking here)
140  int resultInit = decisionCount_[i];
141  int resultPre = intermCount_[i];
142  int resultFin = finalCount_[i];
143 
144  auto const& name = prescales.at(i).first;
145  if (name != "NULL") {
146  double prescale = prescales.at(i).second;
147  auto const& mask = masks.at(i).second;
148  out << std::dec << setfill(' ') << " " << setw(5) << i << " " << setw(40) << name << " " << setw(7)
149  << resultInit << setw(7) << resultPre << setw(7) << resultFin << setw(10) << prescale << setw(11)
150  << mask.size() << '\n';
151  }
152  }
153  out << " Final OR Count = " << finalOrCount << '\n';
154  out << "========================================================================================================="
155  "===\n";
156  } else {
157  out << "================== No Level-1 Trigger menu "
158  "===============================================================\n";
159  }
160  }
161 }
162 
163 // loop over events
166  iEvent.getByToken(algToken_, alg);
167 
169  iEvent.getByToken(extToken_, ext);
170 
171  LogDebug("l1t|Global") << "retrieved L1 GT data blocks" << endl;
172 
173  if (dumpTriggerResults_ || dumpTriggerSummary_) {
174  //Fill the L1 result maps
175  gtUtil_->retrieveL1(iEvent, evSetup, algToken_);
176 
177  LogDebug("l1t|Global") << "retrieved L1 data from GT Util" << endl;
178 
179  // grab the map for the final decisions
180  const std::vector<std::pair<std::string, bool>> initialDecisions = gtUtil_->decisionsInitial();
181  const std::vector<std::pair<std::string, bool>> intermDecisions = gtUtil_->decisionsInterm();
182  const std::vector<std::pair<std::string, bool>> finalDecisions = gtUtil_->decisionsFinal();
183  const std::vector<std::pair<std::string, double>> prescales = gtUtil_->prescales();
184  const std::vector<std::pair<std::string, std::vector<int>>> masks = gtUtil_->masks();
185 
186  if ((decisionCount_.size() != gtUtil_->decisionsInitial().size()) ||
187  (intermCount_.size() != gtUtil_->decisionsInterm().size()) ||
188  (finalCount_.size() != gtUtil_->decisionsFinal().size())) {
189  LogError("l1t|Global") << "gtUtil sizes inconsistent across run." << endl;
190  return;
191  }
192 
193  if (dumpTriggerResults_) {
194  cout << "\n===================================== Trigger Results for BX=0 "
195  "=============================================\n"
196  << endl;
197  cout << " Bit Algorithm Name Init aBXM Final PS Factor Num Bx "
198  "Masked"
199  << endl;
200  cout << "========================================================================================================"
201  "===="
202  << endl;
203  }
204  for (unsigned int i = 0; i < initialDecisions.size(); i++) {
205  // get the name and trigger result
206  std::string name = (initialDecisions.at(i)).first;
207  if (name == "NULL")
208  continue;
209 
210  bool resultInit = (initialDecisions.at(i)).second;
211 
212  // get prescaled and final results (need some error checking here)
213  bool resultInterm = (intermDecisions.at(i)).second;
214  bool resultFin = (finalDecisions.at(i)).second;
215 
216  // get the prescale and mask (needs some error checking here)
217  double prescale = (prescales.at(i)).second;
218  std::vector<int> mask = (masks.at(i)).second;
219 
220  if (resultInit)
221  decisionCount_[i]++;
222  if (resultInterm)
223  intermCount_[i]++;
224  if (resultFin)
225  finalCount_[i]++;
226 
227  //cout << i << " " << decisionCount_[i] << "\n";
228 
229  if (dumpTriggerResults_) {
230  cout << std::dec << setfill(' ') << " " << setw(5) << i << " " << setw(40) << name.c_str() << " "
231  << setw(7) << resultInit << setw(7) << resultInterm << setw(7) << resultFin << setw(10) << prescale
232  << setw(11) << mask.size() << endl;
233  }
234  }
235  bool finOR = gtUtil_->getFinalOR();
236  if (finOR)
237  finalOrCount++;
238  if (dumpTriggerResults_) {
239  cout << " FinalOR = " << finOR << endl;
240  cout << "========================================================================================================"
241  "==="
242  << endl;
243  }
244  }
245 
246  if (dumpRecord_) {
247  //int i = 0; // now now just printing BX=0...
248  for (int i = minBx_; i <= maxBx_; i++) {
249  // Dump the coutput record
250  cout << " ------ Bx= " << i << " ext ----------" << endl;
251  if (ext.isValid()) {
252  if (i >= ext->getFirstBX() && i <= ext->getLastBX()) {
253  for (std::vector<GlobalExtBlk>::const_iterator extBlk = ext->begin(i); extBlk != ext->end(i); ++extBlk) {
254  extBlk->print(cout);
255  cout << std::dec;
256  }
257  } else {
258  cout << "No Ext Conditions stored for this bx " << i << endl;
259  }
260  } else {
261  LogError("L1TGlobalSummary") << "No ext Data in this event " << endl;
262  }
263 
264  // Dump the coutput record
265  cout << " ------ Bx= " << i << " alg ----------" << endl;
266  if (alg.isValid()) {
267  if (i >= alg->getFirstBX() && i <= alg->getLastBX()) {
268  for (std::vector<GlobalAlgBlk>::const_iterator algBlk = alg->begin(i); algBlk != alg->end(i); ++algBlk) {
269  algBlk->print(cout);
270  cout << std::dec;
271  }
272  } else {
273  cout << "No Alg Decisions stored for this bx " << i << endl;
274  }
275  } else {
276  LogError("L1TGlobalSummary") << "No alg Data in this event " << endl;
277  }
278  }
279  }
280 }
281 
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void analyze(const edm::Event &, const edm::EventSetup &) override
~L1TGlobalSummary() override
L1TGlobalUtil * gtUtil_
Log< level::Error, false > LogError
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
U second(std::pair< T, U > const &p)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
int iEvent
Definition: GenABIO.cc:224
std::vector< int > finalCount_
std::vector< int > decisionCount_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:70
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void fill(std::map< std::string, TH1 * > &h, const std::string &s, double x)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void endRun(Run const &, EventSetup const &) override
tuple cout
Definition: gather_cfg.py:144
UseEventSetupIn
Definition: L1TGlobalUtil.h:42
T first(std::pair< T, U > const &p)
std::vector< int > intermCount_
tuple size
Write out results.
L1TGlobalSummary(const edm::ParameterSet &)
void beginRun(Run const &, EventSetup const &) override
Definition: Run.h:45
#define LogDebug(id)