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