CMS 3D CMS Logo

TotemRPDQMSource.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 * Rafał Leszko (rafal.leszko@gmail.com)
7 *
8 ****************************************************************************/
9 
16 
19 
28 
32 
33 #include <string>
34 
35 //----------------------------------------------------------------------------------------------------
36 
38 public:
40  ~TotemRPDQMSource() override;
41 
42 protected:
43  void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
44  void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override;
45 
46 private:
47  unsigned int verbosity;
48 
55 
57  struct PotPlots {
58  MonitorElement *vfat_problem = nullptr, *vfat_missing = nullptr, *vfat_ec_bc_error = nullptr,
59  *vfat_corruption = nullptr;
60 
61  MonitorElement *activity = nullptr, *activity_u = nullptr, *activity_v = nullptr;
64  MonitorElement *patterns_u = nullptr, *patterns_v = nullptr;
71 
72  PotPlots() {}
73  PotPlots(DQMStore::IBooker &ibooker, unsigned int id);
74  };
75 
76  std::map<unsigned int, PotPlots> potPlots;
77 
79  struct PlanePlots {
80  MonitorElement *digi_profile_cumulative = nullptr;
81  MonitorElement *cluster_profile_cumulative = nullptr;
82  MonitorElement *hit_multiplicity = nullptr;
83  MonitorElement *cluster_size = nullptr;
84  MonitorElement *efficiency_num = nullptr, *efficiency_den = nullptr;
85 
87  PlanePlots(DQMStore::IBooker &ibooker, unsigned int id);
88  };
89 
90  std::map<unsigned int, PlanePlots> planePlots;
91 };
92 
93 //----------------------------------------------------------------------------------------------------
94 //----------------------------------------------------------------------------------------------------
95 
96 using namespace std;
97 using namespace edm;
98 
99 //----------------------------------------------------------------------------------------------------
100 
101 TotemRPDQMSource::PotPlots::PotPlots(DQMStore::IBooker &ibooker, unsigned int id) {
102  string path;
104  ibooker.setCurrentFolder(path);
105 
106  string title;
108 
109  vfat_problem = ibooker.book2D("vfats with any problem", title + ";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
110  vfat_missing = ibooker.book2D("vfats missing", title + ";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
112  ibooker.book2D("vfats with EC or BC error", title + ";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
114  ibooker.book2D("vfats with data corruption", title + ";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
115 
116  activity = ibooker.book1D("active planes", title + ";number of active planes", 11, -0.5, 10.5);
117  activity_u = ibooker.book1D("active planes U", title + ";number of active U planes", 11, -0.5, 10.5);
118  activity_v = ibooker.book1D("active planes V", title + ";number of active V planes", 11, -0.5, 10.5);
119 
120  activity_per_bx = ibooker.book1D("activity per BX", title + ";Event.BX", 4002, -1.5, 4000. + 0.5);
121  activity_per_bx_short = ibooker.book1D("activity per BX (short)", title + ";Event.BX", 102, -1.5, 100. + 0.5);
122 
124  ibooker.book2D("activity in planes (2D)", title + ";plane number;strip number", 10, -0.5, 9.5, 32, -0.5, 511.5);
125 
126  patterns_u = ibooker.book1D("recognized patterns U", title + ";number of recognized U patterns", 11, -0.5, 10.5);
127  patterns_v = ibooker.book1D("recognized patterns V", title + ";number of recognized V patterns", 11, -0.5, 10.5);
128 
130  ibooker.book1D("planes contributing to fit U", title + ";number of planes contributing to U fit", 6, -0.5, 5.5);
132  ibooker.book1D("planes contributing to fit V", title + ";number of planes contributing to V fit", 6, -0.5, 5.5);
133 
134  event_category = ibooker.book1D("event category", title + ";event category", 5, -0.5, 4.5);
135  TH1F *event_category_h = event_category->getTH1F();
136  event_category_h->GetXaxis()->SetBinLabel(1, "empty");
137  event_category_h->GetXaxis()->SetBinLabel(2, "insufficient");
138  event_category_h->GetXaxis()->SetBinLabel(3, "single-track");
139  event_category_h->GetXaxis()->SetBinLabel(4, "multi-track");
140  event_category_h->GetXaxis()->SetBinLabel(5, "shower");
141 
143  ibooker.book2D("track XY profile", title + ";x (mm);y (mm)", 100, -18., +18., 100, -18., +18.);
144 
145  track_u_profile = ibooker.book1D("track profile U", title + "; U (mm)", 512, -256 * 66E-3, +256 * 66E-3);
146  track_v_profile = ibooker.book1D("track profile V", title + "; V (mm)", 512, -256 * 66E-3, +256 * 66E-3);
147 
148  triggerSectorUVCorrelation_all = ibooker.book2D(
149  "trigger sector UV correlation (no cond)", title + ";V sector;U sector", 16, -0.5, 15.5, 16, -0.5, 15.5);
150  triggerSectorUVCorrelation_mult2 = ibooker.book2D(
151  "trigger sector UV correlation (max mult 2)", title + ";V sector;U sector", 16, -0.5, 15.5, 16, -0.5, 15.5);
152  triggerSectorUVCorrelation_track = ibooker.book2D(
153  "trigger sector UV correlation (track)", title + ";V sector;U sector", 16, -0.5, 15.5, 16, -0.5, 15.5);
154 }
155 
156 //----------------------------------------------------------------------------------------------------
157 
158 TotemRPDQMSource::PlanePlots::PlanePlots(DQMStore::IBooker &ibooker, unsigned int id) {
159  string path;
161  ibooker.setCurrentFolder(path);
162 
163  string title;
165 
166  digi_profile_cumulative = ibooker.book1D("digi profile", title + ";strip number", 512, -0.5, 511.5);
167  cluster_profile_cumulative = ibooker.book1D("cluster profile", title + ";cluster center", 1024, -0.25, 511.75);
168  hit_multiplicity = ibooker.book1D("hit multiplicity", title + ";hits/detector/event", 6, -0.5, 5.5);
169  cluster_size = ibooker.book1D("cluster size", title + ";hits per cluster", 5, 0.5, 5.5);
170 
171  efficiency_num = ibooker.book1D("efficiency num", title + ";track position (mm)", 30, -15., 0.);
172  efficiency_den = ibooker.book1D("efficiency den", title + ";track position (mm)", 30, -15., 0.);
173 }
174 
175 //----------------------------------------------------------------------------------------------------
176 //----------------------------------------------------------------------------------------------------
177 
179  : verbosity(ps.getUntrackedParameter<unsigned int>("verbosity", 0)) {
180  tokenStatus = consumes<DetSetVector<TotemVFATStatus>>(ps.getParameter<edm::InputTag>("tagStatus"));
181 
182  tokenDigi = consumes<DetSetVector<TotemRPDigi>>(ps.getParameter<edm::InputTag>("tagDigi"));
183  tokenCluster = consumes<edm::DetSetVector<TotemRPCluster>>(ps.getParameter<edm::InputTag>("tagCluster"));
184  tokenRecHit = consumes<edm::DetSetVector<TotemRPRecHit>>(ps.getParameter<edm::InputTag>("tagRecHit"));
185  tokenUVPattern = consumes<DetSetVector<TotemRPUVPattern>>(ps.getParameter<edm::InputTag>("tagUVPattern"));
186  tokenLocalTrack = consumes<DetSetVector<TotemRPLocalTrack>>(ps.getParameter<edm::InputTag>("tagLocalTrack"));
187 }
188 
189 //----------------------------------------------------------------------------------------------------
190 
192 
193 //----------------------------------------------------------------------------------------------------
194 
195 void TotemRPDQMSource::bookHistograms(DQMStore::IBooker &ibooker, edm::Run const &, edm::EventSetup const &) {
196  ibooker.cd();
197  ibooker.setCurrentFolder("CTPPS");
198 
199  // loop over arms
200  for (unsigned int arm : {0, 1}) {
201  // loop over RPs
202  for (unsigned int st_rp : {2, 3, 4, 5, 24, 25}) {
203  const unsigned int st = st_rp / 10;
204  const unsigned int rp = st_rp % 10;
205 
206  TotemRPDetId rpId(arm, st, rp);
207  potPlots[rpId] = PotPlots(ibooker, rpId);
208 
209  // loop over planes
210  for (unsigned int pl = 0; pl < 10; ++pl) {
211  TotemRPDetId plId(arm, st, rp, pl);
212  planePlots[plId] = PlanePlots(ibooker, plId);
213  }
214  }
215  }
216 }
217 
218 //----------------------------------------------------------------------------------------------------
219 
221  // get event setup data
223  eventSetup.get<VeryForwardRealGeometryRecord>().get(geometry);
224 
225  // get event data
227  event.getByToken(tokenStatus, status);
228 
230  event.getByToken(tokenDigi, digi);
231 
233  event.getByToken(tokenCluster, digCluster);
234 
236  event.getByToken(tokenRecHit, hits);
237 
239  event.getByToken(tokenUVPattern, patterns);
240 
242  event.getByToken(tokenLocalTrack, tracks);
243 
244  // check validity
245  bool valid = true;
246  valid &= status.isValid();
247  valid &= digi.isValid();
248  valid &= digCluster.isValid();
249  valid &= hits.isValid();
250  valid &= patterns.isValid();
251  valid &= tracks.isValid();
252 
253  if (!valid) {
254  if (verbosity) {
255  LogProblem("TotemRPDQMSource")
256  << "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n"
257  << " status.isValid = " << status.isValid() << "\n"
258  << " digi.isValid = " << digi.isValid() << "\n"
259  << " digCluster.isValid = " << digCluster.isValid() << "\n"
260  << " hits.isValid = " << hits.isValid() << "\n"
261  << " patterns.isValid = " << patterns.isValid() << "\n"
262  << " tracks.isValid = " << tracks.isValid();
263  }
264 
265  return;
266  }
267 
268  //------------------------------
269  // Status Plots
270 
271  for (auto &ds : *status) {
272  TotemRPDetId detId(ds.detId());
273  unsigned int plNum = detId.plane();
274  CTPPSDetId rpId = detId.rpId();
275 
276  auto it = potPlots.find(rpId);
277  if (it == potPlots.end())
278  continue;
279  auto &plots = it->second;
280 
281  for (auto &s : ds) {
282  if (s.isMissing()) {
283  plots.vfat_problem->Fill(plNum, s.chipPosition());
284  plots.vfat_missing->Fill(plNum, s.chipPosition());
285  }
286 
287  if (s.isECProgressError() || s.isBCProgressError()) {
288  plots.vfat_problem->Fill(plNum, s.chipPosition());
289  plots.vfat_ec_bc_error->Fill(plNum, s.chipPosition());
290  }
291 
292  if (s.isIDMismatch() || s.isFootprintError() || s.isCRCError()) {
293  plots.vfat_problem->Fill(plNum, s.chipPosition());
294  plots.vfat_corruption->Fill(plNum, s.chipPosition());
295  }
296  }
297  }
298 
299  //------------------------------
300  // Plane Plots
301 
302  // digi profile cumulative
303  for (DetSetVector<TotemRPDigi>::const_iterator it = digi->begin(); it != digi->end(); ++it) {
304  TotemRPDetId detId(it->detId());
305 
306  auto plIt = planePlots.find(detId);
307  if (plIt == planePlots.end())
308  continue;
309  auto &plots = plIt->second;
310 
311  for (DetSet<TotemRPDigi>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
312  plots.digi_profile_cumulative->Fill(dit->stripNumber());
313  }
314 
315  // cluster plots
316  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++) {
317  TotemRPDetId detId(it->detId());
318 
319  auto plIt = planePlots.find(detId);
320  if (plIt == planePlots.end())
321  continue;
322  auto &plots = plIt->second;
323 
324  // hit multiplicity
325  plots.hit_multiplicity->Fill(it->size());
326 
327  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit) {
328  // profile cumulative
329  plots.cluster_profile_cumulative->Fill(dit->centerStripPosition());
330 
331  // cluster size
332  plots.cluster_size->Fill(dit->numberOfStrips());
333  }
334  }
335 
336  // plane efficiency plots
337  for (auto &ds : *tracks) {
338  CTPPSDetId rpId(ds.detId());
339 
340  for (auto &ft : ds) {
341  if (!ft.isValid())
342  continue;
343 
344  double rp_z = geometry->rpTranslation(rpId).z();
345 
346  for (unsigned int plNum = 0; plNum < 10; ++plNum) {
347  TotemRPDetId plId = rpId;
348  plId.setPlane(plNum);
349 
350  auto plIt = planePlots.find(plId);
351  if (plIt == planePlots.end())
352  continue;
353  auto &plots = plIt->second;
354 
355  double ft_z = ft.z0();
356  double ft_x = ft.x0() + ft.tx() * (ft_z - rp_z);
357  double ft_y = ft.y0() + ft.ty() * (ft_z - rp_z);
358 
359  double ft_v = geometry->globalToLocal(plId, CLHEP::Hep3Vector(ft_x, ft_y, ft_z)).y();
360 
361  bool hasMatchingHit = false;
362  const auto &hit_ds_it = hits->find(plId);
363  if (hit_ds_it != hits->end()) {
364  for (const auto &h : *hit_ds_it) {
365  bool match = (fabs(ft_v - h.position()) < 2. * 0.066);
366  if (match) {
367  hasMatchingHit = true;
368  break;
369  }
370  }
371  }
372 
373  plots.efficiency_den->Fill(ft_v);
374  if (hasMatchingHit)
375  plots.efficiency_num->Fill(ft_v);
376  }
377  }
378  }
379 
380  //------------------------------
381  // Roman Pots Plots
382 
383  // determine active planes (from RecHits and VFATStatus)
384  map<unsigned int, set<unsigned int>> planes;
385  map<unsigned int, set<unsigned int>> planes_u;
386  map<unsigned int, set<unsigned int>> planes_v;
387  for (const auto &ds : *hits) {
388  if (ds.empty())
389  continue;
390 
391  TotemRPDetId detId(ds.detId());
392  unsigned int planeNum = detId.plane();
393  CTPPSDetId rpId = detId.rpId();
394 
395  planes[rpId].insert(planeNum);
396  if (detId.isStripsCoordinateUDirection())
397  planes_u[rpId].insert(planeNum);
398  else
399  planes_v[rpId].insert(planeNum);
400  }
401 
402  for (const auto &ds : *status) {
403  bool activity = false;
404  for (const auto &s : ds) {
405  if (s.isNumberOfClustersSpecified() && s.numberOfClusters() > 0) {
406  activity = true;
407  break;
408  }
409  }
410 
411  if (!activity)
412  continue;
413 
414  TotemRPDetId detId(ds.detId());
415  unsigned int planeNum = detId.plane();
416  CTPPSDetId rpId = detId.rpId();
417 
418  planes[rpId].insert(planeNum);
419  if (detId.isStripsCoordinateUDirection())
420  planes_u[rpId].insert(planeNum);
421  else
422  planes_v[rpId].insert(planeNum);
423  }
424 
425  // plane activity histogram
426  for (std::map<unsigned int, PotPlots>::iterator it = potPlots.begin(); it != potPlots.end(); it++) {
427  it->second.activity->Fill(planes[it->first].size());
428  it->second.activity_u->Fill(planes_u[it->first].size());
429  it->second.activity_v->Fill(planes_v[it->first].size());
430 
431  if (planes[it->first].size() >= 6) {
432  it->second.activity_per_bx->Fill(event.bunchCrossing());
433  it->second.activity_per_bx_short->Fill(event.bunchCrossing());
434  }
435  }
436 
437  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++) {
438  TotemRPDetId detId(it->detId());
439  unsigned int planeNum = detId.plane();
440  CTPPSDetId rpId = detId.rpId();
441 
442  auto plIt = potPlots.find(rpId);
443  if (plIt == potPlots.end())
444  continue;
445  auto &plots = plIt->second;
446 
447  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
448  plots.hit_plane_hist->Fill(planeNum, dit->centerStripPosition());
449  }
450 
451  // recognized pattern histograms
452  for (auto &ds : *patterns) {
453  CTPPSDetId rpId(ds.detId());
454 
455  auto plIt = potPlots.find(rpId);
456  if (plIt == potPlots.end())
457  continue;
458  auto &plots = plIt->second;
459 
460  // count U and V patterns
461  unsigned int u = 0, v = 0;
462  for (auto &p : ds) {
463  if (!p.fittable())
464  continue;
465 
466  if (p.projection() == TotemRPUVPattern::projU)
467  u++;
468 
469  if (p.projection() == TotemRPUVPattern::projV)
470  v++;
471  }
472 
473  plots.patterns_u->Fill(u);
474  plots.patterns_v->Fill(v);
475  }
476 
477  // event-category histogram
478  for (auto &it : potPlots) {
479  TotemRPDetId rpId(it.first);
480  auto &pp = it.second;
481 
482  // process hit data for this plot
483  unsigned int pl_u = planes_u[rpId].size();
484  unsigned int pl_v = planes_v[rpId].size();
485 
486  // process pattern data for this pot
487  const auto &rp_pat_it = patterns->find(rpId);
488 
489  unsigned int pat_u = 0, pat_v = 0;
490  if (rp_pat_it != patterns->end()) {
491  for (auto &p : *rp_pat_it) {
492  if (!p.fittable())
493  continue;
494 
495  if (p.projection() == TotemRPUVPattern::projU)
496  pat_u++;
497 
498  if (p.projection() == TotemRPUVPattern::projV)
499  pat_v++;
500  }
501  }
502 
503  // determine category
504  signed int category = -1;
505 
506  if (pl_u == 0 && pl_v == 0)
507  category = 0; // empty
508 
509  if (category == -1 && pat_u + pat_v <= 1) {
510  if (pl_u + pl_v < 6)
511  category = 1; // insuff
512  else
513  category = 4; // shower
514  }
515 
516  if (pat_u == 1 && pat_v == 1)
517  category = 2; // 1-track
518 
519  if (category == -1)
520  category = 3; // multi-track
521 
522  pp.event_category->Fill(category);
523  }
524 
525  // RP track-fit plots
526  set<unsigned int> rps_with_tracks;
527 
528  for (auto &ds : *tracks) {
529  CTPPSDetId rpId(ds.detId());
530 
531  rps_with_tracks.insert(rpId);
532 
533  auto plIt = potPlots.find(rpId);
534  if (plIt == potPlots.end())
535  continue;
536  auto &plots = plIt->second;
537 
538  for (auto &ft : ds) {
539  if (!ft.isValid())
540  continue;
541 
542  // number of planes contributing to (valid) fits
543  unsigned int n_pl_in_fit_u = 0, n_pl_in_fit_v = 0;
544  for (auto &hds : ft.hits()) {
545  TotemRPDetId plId(hds.detId());
546  bool uProj = plId.isStripsCoordinateUDirection();
547 
548  for (auto &h : hds) {
549  h.position(); // just to keep compiler silent
550  if (uProj)
551  n_pl_in_fit_u++;
552  else
553  n_pl_in_fit_v++;
554  }
555  }
556 
557  plots.h_planes_fit_u->Fill(n_pl_in_fit_u);
558  plots.h_planes_fit_v->Fill(n_pl_in_fit_v);
559 
560  // mean position of U and V planes
561  TotemRPDetId plId_V(rpId);
562  plId_V.setPlane(0);
563  TotemRPDetId plId_U(rpId);
564  plId_U.setPlane(1);
565 
566  double rp_x = (geometry->sensor(plId_V)->translation().x() + geometry->sensor(plId_U)->translation().x()) / 2.;
567  double rp_y = (geometry->sensor(plId_V)->translation().y() + geometry->sensor(plId_U)->translation().y()) / 2.;
568 
569  // mean read-out direction of U and V planes
570  CLHEP::Hep3Vector rod_U = geometry->localToGlobalDirection(plId_U, CLHEP::Hep3Vector(0., 1., 0.));
571  CLHEP::Hep3Vector rod_V = geometry->localToGlobalDirection(plId_V, CLHEP::Hep3Vector(0., 1., 0.));
572 
573  double x = ft.x0() - rp_x;
574  double y = ft.y0() - rp_y;
575 
576  plots.trackHitsCumulativeHist->Fill(x, y);
577 
578  double U = x * rod_U.x() + y * rod_U.y();
579  double V = x * rod_V.x() + y * rod_V.y();
580 
581  plots.track_u_profile->Fill(U);
582  plots.track_v_profile->Fill(V);
583  }
584  }
585 
586  // restore trigger-sector map from digis
587  map<unsigned int, map<unsigned int, map<unsigned int, unsigned int>>>
588  triggerSectorMap; // [rpId, U/V flag, sector] --> number of planes
589  for (const auto &dp : *digi) {
590  TotemRPDetId plId(dp.detId());
591  CTPPSDetId rpId = plId.rpId();
592  unsigned int uvFlag = (plId.isStripsCoordinateUDirection()) ? 0 : 1;
593 
594  set<unsigned int> sectors;
595  for (const auto &d : dp) {
596  unsigned int sector = d.stripNumber() / 32;
597  sectors.insert(sector);
598  }
599 
600  for (const auto &sector : sectors)
601  triggerSectorMap[rpId][uvFlag][sector]++;
602  }
603 
604  for (auto &rpp : triggerSectorMap) {
605  const unsigned int rpId = rpp.first;
606 
607  // trigger sector is counted as active if at least 3 planes report activity
608 
609  set<unsigned int> triggerSectorsU;
610  for (const auto sp : rpp.second[0]) {
611  if (sp.second >= 3)
612  triggerSectorsU.insert(sp.first);
613  }
614 
615  set<unsigned int> triggerSectorsV;
616  for (const auto sp : rpp.second[1]) {
617  if (sp.second >= 3)
618  triggerSectorsV.insert(sp.first);
619  }
620 
621  auto plIt = potPlots.find(rpId);
622  if (plIt == potPlots.end())
623  continue;
624  auto &plots = plIt->second;
625 
626  const bool high_mult = (triggerSectorsU.size() > 2 && triggerSectorsV.size() > 2);
627 
628  const bool has_track = (rps_with_tracks.find(rpId) != rps_with_tracks.end());
629 
630  for (const auto &secU : triggerSectorsU) {
631  for (const auto &secV : triggerSectorsV) {
632  plots.triggerSectorUVCorrelation_all->Fill(secV, secU);
633 
634  if (!high_mult)
635  plots.triggerSectorUVCorrelation_mult2->Fill(secV, secU);
636 
637  if (has_track)
638  plots.triggerSectorUVCorrelation_track->Fill(secV, secU);
639  }
640  }
641  }
642 }
643 
644 //----------------------------------------------------------------------------------------------------
645 
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
MonitorElement * event_category
T getParameter(std::string const &) const
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
MonitorElement * triggerSectorUVCorrelation_all
Translation translation() const
Definition: DetGeomDesc.h:65
MonitorElement * vfat_corruption
MonitorElement * h_planes_fit_u
virtual TH1F * getTH1F() const
MonitorElement * activity_per_bx
MonitorElement * triggerSectorUVCorrelation_track
int bunchCrossing() const
Definition: EventBase.h:64
uint32_t plane() const
Definition: TotemRPDetId.h:46
MonitorElement * track_u_profile
bool isStripsCoordinateUDirection() const
Definition: TotemRPDetId.h:66
Event setup record containing the real (actual) geometry information.
CTPPSDetId rpId() const
Definition: CTPPSDetId.h:78
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus
plots related to one RP plane
std::map< unsigned int, PlanePlots > planePlots
unsigned int verbosity
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
CLHEP::Hep3Vector rpTranslation(unsigned int id) const
~TotemRPDQMSource() override
plots related to one RP
void rpName(std::string &name, NameFlag flag=nFull) const
Definition: CTPPSDetId.h:128
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:50
bool isValid() const
Definition: HandleBase.h:70
d
Definition: ztail.py:151
MonitorElement * track_v_profile
MonitorElement * hit_plane_hist
const DetGeomDesc * sensor(unsigned int id) const
returns geometry of a detector performs necessary checks, returns NULL if fails
edm::EDGetTokenT< edm::DetSetVector< TotemRPUVPattern > > tokenUVPattern
CLHEP::Hep3Vector localToGlobalDirection(unsigned int id, const CLHEP::Hep3Vector &) const
void setPlane(uint32_t det)
Definition: TotemRPDetId.h:48
edm::EDGetTokenT< edm::DetSetVector< TotemRPCluster > > tokenCluster
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
TotemRPDQMSource(const edm::ParameterSet &ps)
MonitorElement * vfat_ec_bc_error
edm::EDGetTokenT< edm::DetSetVector< TotemRPRecHit > > tokenRecHit
edm::EDGetTokenT< edm::DetSetVector< TotemRPLocalTrack > > tokenLocalTrack
ESHandle< TrackerGeometry > geometry
MonitorElement * triggerSectorUVCorrelation_mult2
HLT enums.
T get() const
Definition: EventSetup.h:73
std::map< unsigned int, PotPlots > potPlots
void planeName(std::string &name, NameFlag flag=nFull) const
Definition: TotemRPDetId.h:79
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
collection_type::const_iterator const_iterator
Definition: DetSet.h:32
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
MonitorElement * h_planes_fit_v
CLHEP::Hep3Vector globalToLocal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
MonitorElement * activity_per_bx_short
edm::EDGetTokenT< edm::DetSetVector< TotemRPDigi > > tokenDigi
Definition: event.py:1
Definition: Run.h:45
MonitorElement * trackHitsCumulativeHist