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