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"))),
300  tokenLocalTrackLite(consumes<vector<CTPPSLocalTrackLite>>(ps.getParameter<edm::InputTag>("tagLocalTrackLite"))),
301  tokenRecoProtons(consumes<std::vector<reco::ForwardProton>>(ps.getParameter<InputTag>("tagRecoProtons"))),
302  makeProtonRecoPlots_(ps.getParameter<bool>("makeProtonRecoPlots")),
303  perLSsaving_(ps.getUntrackedParameter<bool>("perLSsaving", false)) {
304  currentLS = 0;
305  endLS = 0;
306  rpstate.clear();
307 }
308 
309 //----------------------------------------------------------------------------------------------------
310 
312 
313 //----------------------------------------------------------------------------------------------------
314 
316  // global plots
317  globalPlots.Init(ibooker);
318 
319  // loop over arms
320  for (unsigned int arm = 0; arm < 2; arm++) {
322  }
323 }
324 
325 //----------------------------------------------------------------------------------------------------
326 
330 
333 }
334 
335 //----------------------------------------------------------------------------------------------------
336 
338  Handle<CTPPSRecord> hCTPPSRecord;
339  event.getByToken(ctppsRecordToken, hCTPPSRecord);
340 
341  if (!hCTPPSRecord.isValid()) {
342  if (verbosity)
343  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeCTPPSRecord > input not available.";
344 
345  return;
346  }
347 
348  auto &rpstate = *luminosityBlockCache(event.getLuminosityBlock().index());
349  if (rpstate.empty()) {
350  rpstate.reserve(CTPPSRecord::RomanPot::Last);
351  for (uint8_t i = 0; i < CTPPSRecord::RomanPot::Last; ++i)
352  rpstate.push_back(hCTPPSRecord->status(i));
353  }
354 }
355 
356 //----------------------------------------------------------------------------------------------------
357 
359  // get event data
361  event.getByToken(tokenLocalTrackLite, hTracks);
362 
363  // check validity
364  if (!hTracks.isValid()) {
365  if (verbosity)
366  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeTracks > input not available.";
367 
368  return;
369  }
370 
371  //------------------------------
372  // collect indeces of RP with tracks, for each correlation plot
373  set<signed int> s_rp_idx_global_hor, s_rp_idx_global_vert;
374  map<unsigned int, set<signed int>> ms_rp_idx_arm;
375 
376  for (auto &tr : *hTracks) {
377  const CTPPSDetId rpId(tr.rpId());
378  const unsigned int arm = rpId.arm();
379  const unsigned int stNum = rpId.station();
380  const unsigned int rpNum = rpId.rp();
381  const unsigned int stRPNum = stNum * 10 + rpNum;
382 
383  {
384  signed int idx = -1;
385  if (stRPNum == 3)
386  idx = 0;
387  if (stRPNum == 22)
388  idx = 1;
389  if (stRPNum == 16)
390  idx = 2;
391  if (stRPNum == 23)
392  idx = 3;
393 
394  if (idx >= 0)
395  s_rp_idx_global_hor.insert(4 * arm + idx);
396  }
397 
398  {
399  signed int idx = -1;
400  if (stRPNum == 4)
401  idx = 0;
402  if (stRPNum == 5)
403  idx = 1;
404  if (stRPNum == 24)
405  idx = 2;
406  if (stRPNum == 25)
407  idx = 3;
408 
409  if (idx >= 0)
410  s_rp_idx_global_vert.insert(4 * arm + idx);
411  }
412 
413  {
414  signed int idx = -1;
415  if (stRPNum == 3)
416  idx = 0;
417  if (stRPNum == 4)
418  idx = 1;
419  if (stRPNum == 5)
420  idx = 2;
421  if (stRPNum == 22)
422  idx = 3;
423  if (stRPNum == 16)
424  idx = 4;
425  if (stRPNum == 23)
426  idx = 5;
427  if (stRPNum == 24)
428  idx = 6;
429  if (stRPNum == 25)
430  idx = 7;
431 
432  const signed int hor = ((rpNum == 2) || (rpNum == 3) || (rpNum == 6)) ? 1 : 0;
433 
434  if (idx >= 0)
435  ms_rp_idx_arm[arm].insert(idx * 10 + hor);
436  }
437  }
438 
439  //------------------------------
440  // Global Plots
441 
442  globalPlots.events_per_bx->Fill(event.bunchCrossing());
443  globalPlots.events_per_bx_short->Fill(event.bunchCrossing());
444 
445  for (const auto &idx1 : s_rp_idx_global_hor)
446  for (const auto &idx2 : s_rp_idx_global_hor)
447  globalPlots.h_trackCorr_hor->Fill(idx1, idx2);
448 
449  for (const auto &idx1 : s_rp_idx_global_vert)
450  for (const auto &idx2 : s_rp_idx_global_vert)
451  globalPlots.h_trackCorr_vert->Fill(idx1, idx2);
452 
453  //------------------------------
454  // Arm Plots
455 
456  map<unsigned int, set<unsigned int>> mTop, mHor, mBot;
457 
458  for (auto &tr : *hTracks) {
459  CTPPSDetId rpId(tr.rpId());
460  const unsigned int rpNum = rpId.rp();
461  const unsigned int armIdx = rpId.arm();
462 
463  if (rpNum == 0 || rpNum == 4)
464  mTop[armIdx].insert(rpId);
465  if (rpNum == 2 || rpNum == 3 || rpNum == 6)
466  mHor[armIdx].insert(rpId);
467  if (rpNum == 1 || rpNum == 5)
468  mBot[armIdx].insert(rpId);
469 
470  auto &ap = armPlots[rpId.arm()];
471  unsigned int rpDecId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
472 
473  // fill in reference tracking-RP plots
474  {
475  auto it = ap.trackingRPPlots.find(rpDecId);
476  if (it != ap.trackingRPPlots.end()) {
477  it->second.h_x->Fill(tr.x());
478  it->second.h_y->Fill(tr.y());
479  }
480  }
481 
482  // fill in reference timing-RP plots
483  {
484  auto it = ap.timingRPPlots.find(rpDecId);
485  if (it != ap.timingRPPlots.end()) {
486  it->second.h_x->Fill(tr.x());
487  it->second.h_time->Fill(tr.time());
488  }
489  }
490  }
491 
492  for (auto &p : armPlots) {
493  p.second.h_numRPWithTrack_top->Fill(mTop[p.first].size());
494  p.second.h_numRPWithTrack_hor->Fill(mHor[p.first].size());
495  p.second.h_numRPWithTrack_bot->Fill(mBot[p.first].size());
496  }
497 
498  //------------------------------
499  // Correlation plots
500 
501  for (const auto &ap : ms_rp_idx_arm) {
502  auto &plots = armPlots[ap.first];
503 
504  for (const auto &idx1 : ap.second) {
505  for (const auto &idx2 : ap.second) {
506  plots.h_trackCorr->Fill(idx1 / 10, idx2 / 10);
507 
508  if ((idx1 % 10) != (idx2 % 10))
509  plots.h_trackCorr_overlap->Fill(idx1 / 10, idx2 / 10);
510  }
511  }
512  }
513 }
514 
515 //----------------------------------------------------------------------------------------------------
516 
518  // get event data
520  event.getByToken(tokenRecoProtons, hRecoProtons);
521 
522  // check validity
523  if (!hRecoProtons.isValid()) {
524  if (verbosity)
525  LogProblem("CTPPSCommonDQMSource") << "ERROR in CTPPSCommonDQMSource::analyzeProtons > input not available.";
526 
527  return;
528  }
529 
530  // loop over protons
531  for (auto &p : *hRecoProtons) {
532  if (!p.validFit())
533  continue;
534 
535  signed int armIndex = -1;
536  if (p.lhcSector() == reco::ForwardProton::LHCSector::sector45)
537  armIndex = 0;
538  if (p.lhcSector() == reco::ForwardProton::LHCSector::sector56)
539  armIndex = 1;
540  if (armIndex < 0)
541  continue;
542 
543  auto &plots = armPlots[armIndex];
544 
545  plots.h_proton_xi->Fill(p.xi());
546  plots.h_proton_th_x->Fill(p.thetaX());
547  plots.h_proton_th_y->Fill(p.thetaY());
548  plots.h_proton_t->Fill(fabs(p.t()));
549  plots.h_proton_time->Fill(p.time());
550  }
551 }
552 
553 //----------------------------------------------------------------------------------------------------
554 
556  const edm::EventSetup &) const {
557  return std::make_shared<std::vector<int>>();
558 }
559 
560 //----------------------------------------------------------------------------------------------------
561 
563  auto const &rpstate = *luminosityBlockCache(iLumi.index());
564  auto currentLS = iLumi.id().luminosityBlock();
565  if (!perLSsaving_) {
566  for (std::vector<int>::size_type i = 0; i < rpstate.size(); i++)
568  }
569 }
570 
571 //----------------------------------------------------------------------------------------------------
572 
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:32
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.
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
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:128
void analyzeTracks(edm::Event const &event, edm::EventSetup const &eventSetup)
void armName(std::string &name, NameFlag flag=nFull) const
Definition: CTPPSDetId.h:92
plots related to the whole system
__shared__ Hist hist
uint32_t rp() const
Definition: CTPPSDetId.h:65
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:110
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