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