CMS 3D CMS Logo

CTPPSCommonDQMSource.cc
Go to the documentation of this file.
1 /****************************************************************************
2  *
3  * This is a part of TotemDQM and TOTEM offline software.
4  * Authors:
5  * Jan Kašpar (jan.kaspar@gmail.com)
6  *
7  ****************************************************************************/
8 
15 
18 
23 
24 #include <string>
25 
26 //----------------------------------------------------------------------------------------------------
27 
28 class CTPPSCommonDQMSource : public DQMOneEDAnalyzer<edm::LuminosityBlockCache<std::vector<int>>> {
29 public:
31  ~CTPPSCommonDQMSource() override;
32 
33 protected:
34  void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
35  void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override;
36  std::shared_ptr<std::vector<int>> globalBeginLuminosityBlock(const edm::LuminosityBlock &iLumi,
37  const edm::EventSetup &c) const override;
38  void globalEndLuminosityBlock(const edm::LuminosityBlock &iLumi, const edm::EventSetup &c) override;
39 
43 
44 private:
45  const unsigned int verbosity;
46  constexpr static int MAX_LUMIS = 6000;
47  constexpr static int MAX_VBINS = 18;
48 
52 
54  bool perLSsaving_; //to avoid nanoDQMIO crashing, driven by DQMServices/Core/python/DQMStore_cfi.py
55 
56  int currentLS;
57  int endLS;
58 
59  std::vector<int> rpstate;
60 
62  struct GlobalPlots {
63  MonitorElement *RPState = nullptr;
66 
67  void Init(DQMStore::IBooker &ibooker);
68  };
69 
71 
73  struct ArmPlots {
74  int id;
75 
78 
79  MonitorElement *h_proton_xi = nullptr, *h_proton_th_x = nullptr, *h_proton_th_y = nullptr, *h_proton_t = nullptr,
80  *h_proton_time = nullptr;
81 
82  struct TrackingRPPlots {
84  };
85 
86  std::map<unsigned int, TrackingRPPlots> trackingRPPlots;
87 
88  struct TimingRPPlots {
90  };
91 
92  std::map<unsigned int, TimingRPPlots> timingRPPlots;
93 
94  ArmPlots() {}
95 
96  ArmPlots(DQMStore::IBooker &ibooker, int _id, bool makeProtonRecoPlots);
97  };
98 
99  std::map<unsigned int, ArmPlots> armPlots;
100 };
101 
102 //----------------------------------------------------------------------------------------------------
103 //----------------------------------------------------------------------------------------------------
104 
105 using namespace std;
106 using namespace edm;
107 
110 
111 //----------------------------------------------------------------------------------------------------
112 
114  ibooker.setCurrentFolder("CTPPS/common");
115 
116  events_per_bx = ibooker.book1D("events per BX", "rp;Event.BX", 4002, -1.5, 4000. + 0.5);
117  events_per_bx_short = ibooker.book1D("events per BX (short)", "rp;Event.BX", 102, -1.5, 100. + 0.5);
118 
119  /*
120  RP State (HV & LV & Insertion):
121  0 -> not used
122  1 -> bad
123  2 -> warning
124  3 -> ok
125  */
126  RPState = ibooker.book2D("rpstate per LS",
127  "RP State per Lumisection;Luminosity Section;",
128  MAX_LUMIS,
129  0,
130  MAX_LUMIS,
131  MAX_VBINS,
132  0.,
133  MAX_VBINS);
134  {
135  TH2F *hist = RPState->getTH2F();
136  hist->SetCanExtend(TH1::kAllAxes);
137  TAxis *ya = hist->GetYaxis();
138  ya->SetBinLabel(1, "45, 210, FR-BT");
139  ya->SetBinLabel(2, "45, 210, FR-HR");
140  ya->SetBinLabel(3, "45, 210, FR-TP");
141  ya->SetBinLabel(4, "45, 220, C1");
142  ya->SetBinLabel(5, "45, 220, FR-BT");
143  ya->SetBinLabel(6, "45, 220, FR-HR");
144  ya->SetBinLabel(7, "45, 220, FR-TP");
145  ya->SetBinLabel(8, "45, 220, NR-BP");
146  ya->SetBinLabel(9, "45, 220, NR-TP");
147  ya->SetBinLabel(10, "56, 210, FR-BT");
148  ya->SetBinLabel(11, "56, 210, FR-HR");
149  ya->SetBinLabel(12, "56, 210, FR-TP");
150  ya->SetBinLabel(13, "56, 220, C1");
151  ya->SetBinLabel(14, "56, 220, FR-BT");
152  ya->SetBinLabel(15, "56, 220, FR-HR");
153  ya->SetBinLabel(16, "56, 220, FR-TP");
154  ya->SetBinLabel(17, "56, 220, NR-BP");
155  ya->SetBinLabel(18, "56, 220, NR-TP");
156  }
157 
158  h_trackCorr_hor = ibooker.book2D("track correlation hor", "ctpps_common_rp_hor", 8, -0.5, 7.5, 8, -0.5, 7.5);
159  {
160  TH2F *hist = h_trackCorr_hor->getTH2F();
161  TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
162  xa->SetBinLabel(1, "45, 210, FR");
163  ya->SetBinLabel(1, "45, 210, FR");
164  xa->SetBinLabel(2, "45, 220, NR");
165  ya->SetBinLabel(2, "45, 220, NR");
166  xa->SetBinLabel(3, "45, 220, C1");
167  ya->SetBinLabel(3, "45, 220, C1");
168  xa->SetBinLabel(4, "45, 220, FR");
169  ya->SetBinLabel(4, "45, 220, FR");
170 
171  xa->SetBinLabel(5, "56, 210, FR");
172  ya->SetBinLabel(5, "56, 210, FR");
173  xa->SetBinLabel(6, "56, 220, NR");
174  ya->SetBinLabel(6, "56, 220, NR");
175  xa->SetBinLabel(7, "56, 220, C1");
176  ya->SetBinLabel(7, "56, 220, C1");
177  xa->SetBinLabel(8, "56, 220, FR");
178  ya->SetBinLabel(8, "56, 220, FR");
179  }
180 
181  h_trackCorr_vert = ibooker.book2D("track correlation vert", "ctpps_common_rp_vert", 8, -0.5, 7.5, 8, -0.5, 7.5);
182  {
183  TH2F *hist = h_trackCorr_vert->getTH2F();
184  TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
185  xa->SetBinLabel(1, "45, 210, FR-TP");
186  ya->SetBinLabel(1, "45, 210, FR-TP");
187  xa->SetBinLabel(2, "45, 210, FR-BT");
188  ya->SetBinLabel(2, "45, 210, FR-BT");
189  xa->SetBinLabel(3, "45, 220, FR-TP");
190  ya->SetBinLabel(3, "45, 220, FR-TP");
191  xa->SetBinLabel(4, "45, 220, FR-BT");
192  ya->SetBinLabel(4, "45, 220, FR-BT");
193  xa->SetBinLabel(5, "56, 210, FR-TP");
194  ya->SetBinLabel(5, "56, 210, FR-TP");
195  xa->SetBinLabel(6, "56, 210, FR-BT");
196  ya->SetBinLabel(6, "56, 210, FR-BT");
197  xa->SetBinLabel(7, "56, 220, FR-TP");
198  ya->SetBinLabel(7, "56, 220, FR-TP");
199  xa->SetBinLabel(8, "56, 220, FR-BT");
200  ya->SetBinLabel(8, "56, 220, FR-BT");
201  }
202 }
203 
204 //----------------------------------------------------------------------------------------------------
205 
207  string name;
209 
210  ibooker.setCurrentFolder("CTPPS/common/sector " + name);
211 
212  string title = "ctpps_common_sector_" + name;
213 
215  ibooker.book1D("number of top RPs with tracks", title + ";number of top RPs with tracks", 5, -0.5, 4.5);
217  ibooker.book1D("number of hor RPs with tracks", title + ";number of hor RPs with tracks", 5, -0.5, 4.5);
219  ibooker.book1D("number of bot RPs with tracks", title + ";number of bot RPs with tracks", 5, -0.5, 4.5);
220 
221  h_trackCorr = ibooker.book2D("track correlation", title, 8, -0.5, 7.5, 8, -0.5, 7.5);
222  TH2F *h_trackCorr_h = h_trackCorr->getTH2F();
223  TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
224  xa->SetBinLabel(1, "210, FR-HR");
225  ya->SetBinLabel(1, "210, FR-HR");
226  xa->SetBinLabel(2, "210, FR-TP");
227  ya->SetBinLabel(2, "210, FR-TP");
228  xa->SetBinLabel(3, "210, FR-BT");
229  ya->SetBinLabel(3, "210, FR-BT");
230  xa->SetBinLabel(4, "220, NR-HR");
231  ya->SetBinLabel(4, "220, NR-HR");
232  xa->SetBinLabel(5, "220, C1");
233  ya->SetBinLabel(5, "220, C1");
234  xa->SetBinLabel(6, "220, FR-HR");
235  ya->SetBinLabel(6, "220, FR-HR");
236  xa->SetBinLabel(7, "220, FR-TP");
237  ya->SetBinLabel(7, "220, FR-TP");
238  xa->SetBinLabel(8, "220, FR-BT");
239  ya->SetBinLabel(8, "220, FR-BT");
240 
241  h_trackCorr_overlap = ibooker.book2D("track correlation hor-vert overlaps", title, 8, -0.5, 7.5, 8, -0.5, 7.5);
242  h_trackCorr_h = h_trackCorr_overlap->getTH2F();
243  xa = h_trackCorr_h->GetXaxis();
244  ya = h_trackCorr_h->GetYaxis();
245  xa->SetBinLabel(1, "210, FR-HR");
246  ya->SetBinLabel(1, "210, FR-HR");
247  xa->SetBinLabel(2, "210, FR-TP");
248  ya->SetBinLabel(2, "210, FR-TP");
249  xa->SetBinLabel(3, "210, FR-BT");
250  ya->SetBinLabel(3, "210, FR-BT");
251  xa->SetBinLabel(4, "220, NR-HR");
252  ya->SetBinLabel(4, "220, NR-HR");
253  xa->SetBinLabel(5, "220, C1");
254  ya->SetBinLabel(5, "220, C1");
255  xa->SetBinLabel(6, "220, FR-HR");
256  ya->SetBinLabel(6, "220, FR-HR");
257  xa->SetBinLabel(7, "220, FR-TP");
258  ya->SetBinLabel(7, "220, FR-TP");
259  xa->SetBinLabel(8, "220, FR-BT");
260  ya->SetBinLabel(8, "220, FR-BT");
261 
262  if (makeProtonRecoPlots) {
263  h_proton_xi = ibooker.book1D("proton xi", title + ";xi", 100, 0., 0.3);
264  h_proton_th_x = ibooker.book1D("proton theta st x", ";#theta^{*}_{x} (rad)", 250, -500E-6, +500E-6);
265  h_proton_th_y = ibooker.book1D("proton theta st y", ";#theta^{*}_{y} (rad)", 250, -500E-6, +500E-6);
266  h_proton_t = ibooker.book1D("proton t", title + ";|t| GeV^{2}", 100, 0., 5.);
267  h_proton_time = ibooker.book1D("proton time", title + ";time (ns)", 100, -1., 1.);
268  }
269 
270  for (const unsigned int rpDecId : {3, 22, 16, 23}) {
271  unsigned int st = rpDecId / 10, rp = rpDecId % 10, rpFullDecId = id * 100 + rpDecId;
272  CTPPSDetId rpId(CTPPSDetId::sdTrackingStrip, id, st, rp);
273  string stName, rpName;
274  rpId.stationName(stName, CTPPSDetId::nShort);
275  rpId.rpName(rpName, CTPPSDetId::nShort);
276  rpName = stName + "_" + rpName;
277 
278  const bool timingRP = (rpDecId == 22 || rpDecId == 16);
279 
280  if (timingRP) {
281  timingRPPlots[rpFullDecId] = {
282  ibooker.book1D(rpName + " - track x histogram", title + "/" + rpName + ";track x (mm)", 200, 0., 40.),
283  ibooker.book1D(
284  rpName + " - track time histogram", title + "/" + rpName + ";track time (ns)", 100, -25., +50.)};
285  } else {
286  trackingRPPlots[rpFullDecId] = {
287  ibooker.book1D(rpName + " - track x histogram", title + "/" + rpName + ";track x (mm)", 200, 0., 40.),
288  ibooker.book1D(rpName + " - track y histogram", title + "/" + rpName + ";track y (mm)", 200, -20., +20.)};
289  }
290  }
291 }
292 
293 //----------------------------------------------------------------------------------------------------
294 //----------------------------------------------------------------------------------------------------
295 
297  : verbosity(ps.getUntrackedParameter<unsigned int>("verbosity", 0)),
298  ctppsRecordToken(consumes<CTPPSRecord>(ps.getUntrackedParameter<edm::InputTag>("ctppsmetadata"))),
300  consumes<vector<CTPPSLocalTrackLite>>(ps.getUntrackedParameter<edm::InputTag>("tagLocalTrackLite"))),
302  consumes<std::vector<reco::ForwardProton>>(ps.getUntrackedParameter<InputTag>("tagRecoProtons"))),
303  makeProtonRecoPlots_(ps.getParameter<bool>("makeProtonRecoPlots")),
304  perLSsaving_(ps.getUntrackedParameter<bool>("perLSsaving", false)) {
305  currentLS = 0;
306  endLS = 0;
307  rpstate.clear();
308 }
309 
310 //----------------------------------------------------------------------------------------------------
311 
313 
314 //----------------------------------------------------------------------------------------------------
315 
317  // global plots
318  globalPlots.Init(ibooker);
319 
320  // loop over arms
321  for (unsigned int arm = 0; arm < 2; arm++) {
323  }
324 }
325 
326 //----------------------------------------------------------------------------------------------------
327 
331 
334 }
335 
336 //----------------------------------------------------------------------------------------------------
337 
339  Handle<CTPPSRecord> hCTPPSRecord;
340  event.getByToken(ctppsRecordToken, hCTPPSRecord);
341 
342  if (!hCTPPSRecord.isValid()) {
343  if (verbosity)
344  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeCTPPSRecord > input not available.";
345 
346  return;
347  }
348 
349  auto &rpstate = *luminosityBlockCache(event.getLuminosityBlock().index());
350  if (rpstate.empty()) {
351  rpstate.reserve(CTPPSRecord::RomanPot::Last);
352  for (uint8_t i = 0; i < CTPPSRecord::RomanPot::Last; ++i)
353  rpstate.push_back(hCTPPSRecord->status(i));
354  }
355 }
356 
357 //----------------------------------------------------------------------------------------------------
358 
360  // get event data
362  event.getByToken(tokenLocalTrackLite, hTracks);
363 
364  // check validity
365  if (!hTracks.isValid()) {
366  if (verbosity)
367  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeTracks > input not available.";
368 
369  return;
370  }
371 
372  //------------------------------
373  // collect indeces of RP with tracks, for each correlation plot
374  set<signed int> s_rp_idx_global_hor, s_rp_idx_global_vert;
375  map<unsigned int, set<signed int>> ms_rp_idx_arm;
376 
377  for (auto &tr : *hTracks) {
378  const CTPPSDetId rpId(tr.rpId());
379  const unsigned int arm = rpId.arm();
380  const unsigned int stNum = rpId.station();
381  const unsigned int rpNum = rpId.rp();
382  const unsigned int stRPNum = stNum * 10 + rpNum;
383 
384  {
385  signed int idx = -1;
386  if (stRPNum == 3)
387  idx = 0;
388  if (stRPNum == 22)
389  idx = 1;
390  if (stRPNum == 16)
391  idx = 2;
392  if (stRPNum == 23)
393  idx = 3;
394 
395  if (idx >= 0)
396  s_rp_idx_global_hor.insert(4 * arm + idx);
397  }
398 
399  {
400  signed int idx = -1;
401  if (stRPNum == 4)
402  idx = 0;
403  if (stRPNum == 5)
404  idx = 1;
405  if (stRPNum == 24)
406  idx = 2;
407  if (stRPNum == 25)
408  idx = 3;
409 
410  if (idx >= 0)
411  s_rp_idx_global_vert.insert(4 * arm + idx);
412  }
413 
414  {
415  signed int idx = -1;
416  if (stRPNum == 3)
417  idx = 0;
418  if (stRPNum == 4)
419  idx = 1;
420  if (stRPNum == 5)
421  idx = 2;
422  if (stRPNum == 22)
423  idx = 3;
424  if (stRPNum == 16)
425  idx = 4;
426  if (stRPNum == 23)
427  idx = 5;
428  if (stRPNum == 24)
429  idx = 6;
430  if (stRPNum == 25)
431  idx = 7;
432 
433  const signed int hor = ((rpNum == 2) || (rpNum == 3) || (rpNum == 6)) ? 1 : 0;
434 
435  if (idx >= 0)
436  ms_rp_idx_arm[arm].insert(idx * 10 + hor);
437  }
438  }
439 
440  //------------------------------
441  // Global Plots
442 
443  globalPlots.events_per_bx->Fill(event.bunchCrossing());
444  globalPlots.events_per_bx_short->Fill(event.bunchCrossing());
445 
446  for (const auto &idx1 : s_rp_idx_global_hor)
447  for (const auto &idx2 : s_rp_idx_global_hor)
448  globalPlots.h_trackCorr_hor->Fill(idx1, idx2);
449 
450  for (const auto &idx1 : s_rp_idx_global_vert)
451  for (const auto &idx2 : s_rp_idx_global_vert)
452  globalPlots.h_trackCorr_vert->Fill(idx1, idx2);
453 
454  //------------------------------
455  // Arm Plots
456 
457  map<unsigned int, set<unsigned int>> mTop, mHor, mBot;
458 
459  for (auto &tr : *hTracks) {
460  CTPPSDetId rpId(tr.rpId());
461  const unsigned int rpNum = rpId.rp();
462  const unsigned int armIdx = rpId.arm();
463 
464  if (rpNum == 0 || rpNum == 4)
465  mTop[armIdx].insert(rpId);
466  if (rpNum == 2 || rpNum == 3 || rpNum == 6)
467  mHor[armIdx].insert(rpId);
468  if (rpNum == 1 || rpNum == 5)
469  mBot[armIdx].insert(rpId);
470 
471  auto &ap = armPlots[rpId.arm()];
472  unsigned int rpDecId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
473 
474  // fill in reference tracking-RP plots
475  {
476  auto it = ap.trackingRPPlots.find(rpDecId);
477  if (it != ap.trackingRPPlots.end()) {
478  it->second.h_x->Fill(tr.x());
479  it->second.h_y->Fill(tr.y());
480  }
481  }
482 
483  // fill in reference timing-RP plots
484  {
485  auto it = ap.timingRPPlots.find(rpDecId);
486  if (it != ap.timingRPPlots.end()) {
487  it->second.h_x->Fill(tr.x());
488  it->second.h_time->Fill(tr.time());
489  }
490  }
491  }
492 
493  for (auto &p : armPlots) {
494  p.second.h_numRPWithTrack_top->Fill(mTop[p.first].size());
495  p.second.h_numRPWithTrack_hor->Fill(mHor[p.first].size());
496  p.second.h_numRPWithTrack_bot->Fill(mBot[p.first].size());
497  }
498 
499  //------------------------------
500  // Correlation plots
501 
502  for (const auto &ap : ms_rp_idx_arm) {
503  auto &plots = armPlots[ap.first];
504 
505  for (const auto &idx1 : ap.second) {
506  for (const auto &idx2 : ap.second) {
507  plots.h_trackCorr->Fill(idx1 / 10, idx2 / 10);
508 
509  if ((idx1 % 10) != (idx2 % 10))
510  plots.h_trackCorr_overlap->Fill(idx1 / 10, idx2 / 10);
511  }
512  }
513  }
514 }
515 
516 //----------------------------------------------------------------------------------------------------
517 
519  // get event data
521  event.getByToken(tokenRecoProtons, hRecoProtons);
522 
523  // check validity
524  if (!hRecoProtons.isValid()) {
525  if (verbosity)
526  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeProtons > input not available.";
527 
528  return;
529  }
530 
531  // loop over protons
532  for (auto &p : *hRecoProtons) {
533  if (!p.validFit())
534  continue;
535 
536  signed int armIndex = -1;
537  if (p.lhcSector() == reco::ForwardProton::LHCSector::sector45)
538  armIndex = 0;
539  if (p.lhcSector() == reco::ForwardProton::LHCSector::sector56)
540  armIndex = 1;
541  if (armIndex < 0)
542  continue;
543 
544  auto &plots = armPlots[armIndex];
545 
546  plots.h_proton_xi->Fill(p.xi());
547  plots.h_proton_th_x->Fill(p.thetaX());
548  plots.h_proton_th_y->Fill(p.thetaY());
549  plots.h_proton_t->Fill(fabs(p.t()));
550  plots.h_proton_time->Fill(p.time());
551  }
552 }
553 
554 //----------------------------------------------------------------------------------------------------
555 
557  const edm::EventSetup &) const {
558  return std::make_shared<std::vector<int>>();
559 }
560 
561 //----------------------------------------------------------------------------------------------------
562 
564  auto const &rpstate = *luminosityBlockCache(iLumi.index());
565  auto currentLS = iLumi.id().luminosityBlock();
566  if (!perLSsaving_) {
567  for (std::vector<int>::size_type i = 0; i < rpstate.size(); i++)
569  }
570 }
571 
572 //----------------------------------------------------------------------------------------------------
573 
LuminosityBlockNumber_t luminosityBlock() const
std::shared_ptr< std::vector< int > > globalBeginLuminosityBlock(const edm::LuminosityBlock &iLumi, const edm::EventSetup &c) const override
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
std::map< unsigned int, TimingRPPlots > timingRPPlots
Local (=single RP) track with essential information only.
const unsigned int verbosity
uint16_t size_type
void globalEndLuminosityBlock(const edm::LuminosityBlock &iLumi, const edm::EventSetup &c) override
CTPPSCommonDQMSource(const edm::ParameterSet &ps)
std::vector< int > rpstate
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::map< unsigned int, ArmPlots > armPlots
void Fill(long long x)
void Init(DQMStore::IBooker &ibooker)
static constexpr int MAX_VBINS
const edm::EDGetTokenT< std::vector< reco::ForwardProton > > tokenRecoProtons
void rpName(std::string &name, NameFlag flag=nFull) const
Definition: CTPPSDetId.h:134
void analyzeTracks(edm::Event const &event, edm::EventSetup const &eventSetup)
void armName(std::string &name, NameFlag flag=nFull) const
Definition: CTPPSDetId.h:98
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
plots related to the whole system
uint32_t rp() const
Definition: CTPPSDetId.h:71
std::map< unsigned int, TrackingRPPlots > trackingRPPlots
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
LuminosityBlockID id() const
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
bool isValid() const
Definition: HandleBase.h:70
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
LuminosityBlockIndex index() const
const edm::EDGetTokenT< std::vector< CTPPSLocalTrackLite > > tokenLocalTrackLite
void analyzeProtons(edm::Event const &event, edm::EventSetup const &eventSetup)
Class to contain CTPPS information from soft FED 1022.
Definition: CTPPSRecord.h:20
fixed size matrix
HLT enums.
void stationName(std::string &name, NameFlag flag=nFull) const
Definition: CTPPSDetId.h:116
void analyzeCTPPSRecord(edm::Event const &event, edm::EventSetup const &eventSetup)
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
const edm::EDGetTokenT< CTPPSRecord > ctppsRecordToken
Status status(const uint8_t rp) const
Return the status of the given roman pot.
Definition: CTPPSRecord.h:61
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
static constexpr int MAX_LUMIS
Definition: event.py:1
Definition: Run.h:45
Log< level::Error, true > LogProblem