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 = 20;
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-BT");
147  ya->SetBinLabel(9, "45, 220, NR-HR");
148  ya->SetBinLabel(10, "45, 220, NR-TP");
149  ya->SetBinLabel(11, "56, 210, FR-BT");
150  ya->SetBinLabel(12, "56, 210, FR-HR");
151  ya->SetBinLabel(13, "56, 210, FR-TP");
152  ya->SetBinLabel(14, "56, 220, C1");
153  ya->SetBinLabel(15, "56, 220, FR-BT");
154  ya->SetBinLabel(16, "56, 220, FR-HR");
155  ya->SetBinLabel(17, "56, 220, FR-TP");
156  ya->SetBinLabel(18, "56, 220, NR-BT");
157  ya->SetBinLabel(19, "56, 220, NR-HR");
158  ya->SetBinLabel(20, "56, 220, NR-TP");
159  }
160 
161  h_trackCorr_hor = ibooker.book2D("track correlation hor", "ctpps_common_rp_hor", 8, -0.5, 7.5, 8, -0.5, 7.5);
162  {
163  TH2F *hist = h_trackCorr_hor->getTH2F();
164  TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
165  xa->SetBinLabel(1, "45, 210, FR");
166  ya->SetBinLabel(1, "45, 210, FR");
167  xa->SetBinLabel(2, "45, 220, NR");
168  ya->SetBinLabel(2, "45, 220, NR");
169  xa->SetBinLabel(3, "45, 220, C1");
170  ya->SetBinLabel(3, "45, 220, C1");
171  xa->SetBinLabel(4, "45, 220, FR");
172  ya->SetBinLabel(4, "45, 220, FR");
173 
174  xa->SetBinLabel(5, "56, 210, FR");
175  ya->SetBinLabel(5, "56, 210, FR");
176  xa->SetBinLabel(6, "56, 220, NR");
177  ya->SetBinLabel(6, "56, 220, NR");
178  xa->SetBinLabel(7, "56, 220, C1");
179  ya->SetBinLabel(7, "56, 220, C1");
180  xa->SetBinLabel(8, "56, 220, FR");
181  ya->SetBinLabel(8, "56, 220, FR");
182  }
183 
184  h_trackCorr_vert = ibooker.book2D("track correlation vert", "ctpps_common_rp_vert", 8, -0.5, 7.5, 8, -0.5, 7.5);
185  {
186  TH2F *hist = h_trackCorr_vert->getTH2F();
187  TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
188  xa->SetBinLabel(1, "45, 210, FR-TP");
189  ya->SetBinLabel(1, "45, 210, FR-TP");
190  xa->SetBinLabel(2, "45, 210, FR-BT");
191  ya->SetBinLabel(2, "45, 210, FR-BT");
192  xa->SetBinLabel(3, "45, 220, FR-TP");
193  ya->SetBinLabel(3, "45, 220, FR-TP");
194  xa->SetBinLabel(4, "45, 220, FR-BT");
195  ya->SetBinLabel(4, "45, 220, FR-BT");
196  xa->SetBinLabel(5, "56, 210, FR-TP");
197  ya->SetBinLabel(5, "56, 210, FR-TP");
198  xa->SetBinLabel(6, "56, 210, FR-BT");
199  ya->SetBinLabel(6, "56, 210, FR-BT");
200  xa->SetBinLabel(7, "56, 220, FR-TP");
201  ya->SetBinLabel(7, "56, 220, FR-TP");
202  xa->SetBinLabel(8, "56, 220, FR-BT");
203  ya->SetBinLabel(8, "56, 220, FR-BT");
204  }
205 }
206 
207 //----------------------------------------------------------------------------------------------------
208 
210  string name;
212 
213  ibooker.setCurrentFolder("CTPPS/common/sector " + name);
214 
215  string title = "ctpps_common_sector_" + name;
216 
218  ibooker.book1D("number of top RPs with tracks", title + ";number of top RPs with tracks", 5, -0.5, 4.5);
220  ibooker.book1D("number of hor RPs with tracks", title + ";number of hor RPs with tracks", 5, -0.5, 4.5);
222  ibooker.book1D("number of bot RPs with tracks", title + ";number of bot RPs with tracks", 5, -0.5, 4.5);
223 
224  h_trackCorr = ibooker.book2D("track correlation", title, 8, -0.5, 7.5, 8, -0.5, 7.5);
225  TH2F *h_trackCorr_h = h_trackCorr->getTH2F();
226  TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
227  xa->SetBinLabel(1, "210, FR-HR");
228  ya->SetBinLabel(1, "210, FR-HR");
229  xa->SetBinLabel(2, "210, FR-TP");
230  ya->SetBinLabel(2, "210, FR-TP");
231  xa->SetBinLabel(3, "210, FR-BT");
232  ya->SetBinLabel(3, "210, FR-BT");
233  xa->SetBinLabel(4, "220, NR-HR");
234  ya->SetBinLabel(4, "220, NR-HR");
235  xa->SetBinLabel(5, "220, C1");
236  ya->SetBinLabel(5, "220, C1");
237  xa->SetBinLabel(6, "220, FR-HR");
238  ya->SetBinLabel(6, "220, FR-HR");
239  xa->SetBinLabel(7, "220, FR-TP");
240  ya->SetBinLabel(7, "220, FR-TP");
241  xa->SetBinLabel(8, "220, FR-BT");
242  ya->SetBinLabel(8, "220, FR-BT");
243 
244  h_trackCorr_overlap = ibooker.book2D("track correlation hor-vert overlaps", title, 8, -0.5, 7.5, 8, -0.5, 7.5);
245  h_trackCorr_h = h_trackCorr_overlap->getTH2F();
246  xa = h_trackCorr_h->GetXaxis();
247  ya = h_trackCorr_h->GetYaxis();
248  xa->SetBinLabel(1, "210, FR-HR");
249  ya->SetBinLabel(1, "210, FR-HR");
250  xa->SetBinLabel(2, "210, FR-TP");
251  ya->SetBinLabel(2, "210, FR-TP");
252  xa->SetBinLabel(3, "210, FR-BT");
253  ya->SetBinLabel(3, "210, FR-BT");
254  xa->SetBinLabel(4, "220, NR-HR");
255  ya->SetBinLabel(4, "220, NR-HR");
256  xa->SetBinLabel(5, "220, C1");
257  ya->SetBinLabel(5, "220, C1");
258  xa->SetBinLabel(6, "220, FR-HR");
259  ya->SetBinLabel(6, "220, FR-HR");
260  xa->SetBinLabel(7, "220, FR-TP");
261  ya->SetBinLabel(7, "220, FR-TP");
262  xa->SetBinLabel(8, "220, FR-BT");
263  ya->SetBinLabel(8, "220, FR-BT");
264 
265  if (makeProtonRecoPlots) {
266  h_proton_xi = ibooker.book1D("proton xi", title + ";xi", 100, 0., 0.3);
267  h_proton_th_x = ibooker.book1D("proton theta st x", ";#theta^{*}_{x} (rad)", 250, -500E-6, +500E-6);
268  h_proton_th_y = ibooker.book1D("proton theta st y", ";#theta^{*}_{y} (rad)", 250, -500E-6, +500E-6);
269  h_proton_t = ibooker.book1D("proton t", title + ";|t| GeV^{2}", 100, 0., 5.);
270  h_proton_time = ibooker.book1D("proton time", title + ";time (ns)", 100, -1., 1.);
271  }
272 
273  for (const unsigned int rpDecId : {3, 22, 16, 23}) {
274  unsigned int st = rpDecId / 10, rp = rpDecId % 10, rpFullDecId = id * 100 + rpDecId;
275  CTPPSDetId rpId(CTPPSDetId::sdTrackingStrip, id, st, rp);
276  string stName, rpName;
277  rpId.stationName(stName, CTPPSDetId::nShort);
278  rpId.rpName(rpName, CTPPSDetId::nShort);
279  rpName = stName + "_" + rpName;
280 
281  const bool timingRP = (rpDecId == 22 || rpDecId == 16);
282 
283  if (timingRP) {
284  timingRPPlots[rpFullDecId] = {
285  ibooker.book1D(rpName + " - track x histogram", title + "/" + rpName + ";track x (mm)", 200, 0., 40.),
286  ibooker.book1D(
287  rpName + " - track time histogram", title + "/" + rpName + ";track time (ns)", 100, -25., +50.)};
288  } else {
289  trackingRPPlots[rpFullDecId] = {
290  ibooker.book1D(rpName + " - track x histogram", title + "/" + rpName + ";track x (mm)", 200, 0., 40.),
291  ibooker.book1D(rpName + " - track y histogram", title + "/" + rpName + ";track y (mm)", 200, -20., +20.)};
292  }
293  }
294 }
295 
296 //----------------------------------------------------------------------------------------------------
297 //----------------------------------------------------------------------------------------------------
298 
300  : verbosity(ps.getUntrackedParameter<unsigned int>("verbosity", 0)),
301  ctppsRecordToken(consumes<CTPPSRecord>(ps.getUntrackedParameter<edm::InputTag>("ctppsmetadata"))),
303  consumes<vector<CTPPSLocalTrackLite>>(ps.getUntrackedParameter<edm::InputTag>("tagLocalTrackLite"))),
305  consumes<std::vector<reco::ForwardProton>>(ps.getUntrackedParameter<InputTag>("tagRecoProtons"))),
306  makeProtonRecoPlots_(ps.getParameter<bool>("makeProtonRecoPlots")),
307  perLSsaving_(ps.getUntrackedParameter<bool>("perLSsaving", false)) {
308  currentLS = 0;
309  endLS = 0;
310  rpstate.clear();
311 }
312 
313 //----------------------------------------------------------------------------------------------------
314 
316 
317 //----------------------------------------------------------------------------------------------------
318 
320  // global plots
321  globalPlots.Init(ibooker);
322 
323  // loop over arms
324  for (unsigned int arm = 0; arm < 2; arm++) {
326  }
327 }
328 
329 //----------------------------------------------------------------------------------------------------
330 
334 
337 }
338 
339 //----------------------------------------------------------------------------------------------------
340 
342  Handle<CTPPSRecord> hCTPPSRecord;
343  event.getByToken(ctppsRecordToken, hCTPPSRecord);
344 
345  if (!hCTPPSRecord.isValid()) {
346  if (verbosity)
347  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeCTPPSRecord > input not available.";
348 
349  return;
350  }
351 
352  auto &rpstate = *luminosityBlockCache(event.getLuminosityBlock().index());
353  if (rpstate.empty()) {
354  rpstate.reserve(CTPPSRecord::RomanPot::Last);
355  for (uint8_t i = 0; i < CTPPSRecord::RomanPot::Last; ++i)
356  rpstate.push_back(hCTPPSRecord->status(i));
357  }
358 }
359 
360 //----------------------------------------------------------------------------------------------------
361 
363  // get event data
365  event.getByToken(tokenLocalTrackLite, hTracks);
366 
367  // check validity
368  if (!hTracks.isValid()) {
369  if (verbosity)
370  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeTracks > input not available.";
371 
372  return;
373  }
374 
375  //------------------------------
376  // collect indeces of RP with tracks, for each correlation plot
377  set<signed int> s_rp_idx_global_hor, s_rp_idx_global_vert;
378  map<unsigned int, set<signed int>> ms_rp_idx_arm;
379 
380  for (auto &tr : *hTracks) {
381  const CTPPSDetId rpId(tr.rpId());
382  const unsigned int arm = rpId.arm();
383  const unsigned int stNum = rpId.station();
384  const unsigned int rpNum = rpId.rp();
385  const unsigned int stRPNum = stNum * 10 + rpNum;
386 
387  {
388  signed int idx = -1;
389  if (stRPNum == 3)
390  idx = 0;
391  if (stRPNum == 22)
392  idx = 1;
393  if (stRPNum == 16)
394  idx = 2;
395  if (stRPNum == 23)
396  idx = 3;
397 
398  if (idx >= 0)
399  s_rp_idx_global_hor.insert(4 * arm + idx);
400  }
401 
402  {
403  signed int idx = -1;
404  if (stRPNum == 4)
405  idx = 0;
406  if (stRPNum == 5)
407  idx = 1;
408  if (stRPNum == 24)
409  idx = 2;
410  if (stRPNum == 25)
411  idx = 3;
412 
413  if (idx >= 0)
414  s_rp_idx_global_vert.insert(4 * arm + idx);
415  }
416 
417  {
418  signed int idx = -1;
419  if (stRPNum == 3)
420  idx = 0;
421  if (stRPNum == 4)
422  idx = 1;
423  if (stRPNum == 5)
424  idx = 2;
425  if (stRPNum == 22)
426  idx = 3;
427  if (stRPNum == 16)
428  idx = 4;
429  if (stRPNum == 23)
430  idx = 5;
431  if (stRPNum == 24)
432  idx = 6;
433  if (stRPNum == 25)
434  idx = 7;
435 
436  const signed int hor = ((rpNum == 2) || (rpNum == 3) || (rpNum == 6)) ? 1 : 0;
437 
438  if (idx >= 0)
439  ms_rp_idx_arm[arm].insert(idx * 10 + hor);
440  }
441  }
442 
443  //------------------------------
444  // Global Plots
445 
446  globalPlots.events_per_bx->Fill(event.bunchCrossing());
447  globalPlots.events_per_bx_short->Fill(event.bunchCrossing());
448 
449  for (const auto &idx1 : s_rp_idx_global_hor)
450  for (const auto &idx2 : s_rp_idx_global_hor)
451  globalPlots.h_trackCorr_hor->Fill(idx1, idx2);
452 
453  for (const auto &idx1 : s_rp_idx_global_vert)
454  for (const auto &idx2 : s_rp_idx_global_vert)
455  globalPlots.h_trackCorr_vert->Fill(idx1, idx2);
456 
457  //------------------------------
458  // Arm Plots
459 
460  map<unsigned int, set<unsigned int>> mTop, mHor, mBot;
461 
462  for (auto &tr : *hTracks) {
463  CTPPSDetId rpId(tr.rpId());
464  const unsigned int rpNum = rpId.rp();
465  const unsigned int armIdx = rpId.arm();
466 
467  if (rpNum == 0 || rpNum == 4)
468  mTop[armIdx].insert(rpId);
469  if (rpNum == 2 || rpNum == 3 || rpNum == 6)
470  mHor[armIdx].insert(rpId);
471  if (rpNum == 1 || rpNum == 5)
472  mBot[armIdx].insert(rpId);
473 
474  auto &ap = armPlots[rpId.arm()];
475  unsigned int rpDecId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
476 
477  // fill in reference tracking-RP plots
478  {
479  auto it = ap.trackingRPPlots.find(rpDecId);
480  if (it != ap.trackingRPPlots.end()) {
481  it->second.h_x->Fill(tr.x());
482  it->second.h_y->Fill(tr.y());
483  }
484  }
485 
486  // fill in reference timing-RP plots
487  {
488  auto it = ap.timingRPPlots.find(rpDecId);
489  if (it != ap.timingRPPlots.end()) {
490  it->second.h_x->Fill(tr.x());
491  it->second.h_time->Fill(tr.time());
492  }
493  }
494  }
495 
496  for (auto &p : armPlots) {
497  p.second.h_numRPWithTrack_top->Fill(mTop[p.first].size());
498  p.second.h_numRPWithTrack_hor->Fill(mHor[p.first].size());
499  p.second.h_numRPWithTrack_bot->Fill(mBot[p.first].size());
500  }
501 
502  //------------------------------
503  // Correlation plots
504 
505  for (const auto &ap : ms_rp_idx_arm) {
506  auto &plots = armPlots[ap.first];
507 
508  for (const auto &idx1 : ap.second) {
509  for (const auto &idx2 : ap.second) {
510  plots.h_trackCorr->Fill(idx1 / 10, idx2 / 10);
511 
512  if ((idx1 % 10) != (idx2 % 10))
513  plots.h_trackCorr_overlap->Fill(idx1 / 10, idx2 / 10);
514  }
515  }
516  }
517 }
518 
519 //----------------------------------------------------------------------------------------------------
520 
522  // get event data
524  event.getByToken(tokenRecoProtons, hRecoProtons);
525 
526  // check validity
527  if (!hRecoProtons.isValid()) {
528  if (verbosity)
529  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeProtons > input not available.";
530 
531  return;
532  }
533 
534  // loop over protons
535  for (auto &p : *hRecoProtons) {
536  if (!p.validFit())
537  continue;
538 
539  signed int armIndex = -1;
540  if (p.lhcSector() == reco::ForwardProton::LHCSector::sector45)
541  armIndex = 0;
542  if (p.lhcSector() == reco::ForwardProton::LHCSector::sector56)
543  armIndex = 1;
544  if (armIndex < 0)
545  continue;
546 
547  auto &plots = armPlots[armIndex];
548 
549  plots.h_proton_xi->Fill(p.xi());
550  plots.h_proton_th_x->Fill(p.thetaX());
551  plots.h_proton_th_y->Fill(p.thetaY());
552  plots.h_proton_t->Fill(fabs(p.t()));
553  plots.h_proton_time->Fill(p.time());
554  }
555 }
556 
557 //----------------------------------------------------------------------------------------------------
558 
560  const edm::EventSetup &) const {
561  return std::make_shared<std::vector<int>>();
562 }
563 
564 //----------------------------------------------------------------------------------------------------
565 
567  auto const &rpstate = *luminosityBlockCache(iLumi.index());
568  auto currentLS = iLumi.id().luminosityBlock();
569  if (!perLSsaving_) {
570  for (std::vector<int>::size_type i = 0; i < rpstate.size(); i++)
572  }
573 }
574 
575 //----------------------------------------------------------------------------------------------------
576 
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:63
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