test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 //#include "RecoTotemRP/RPRecoDataFormats/interface/RPMulFittedTrackCollection.h"
30 
34 
35 #include <string>
36 
37 //----------------------------------------------------------------------------------------------------
38 
40 {
41  public:
43  virtual ~TotemRPDQMSource();
44 
45  protected:
46  void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override;
47  void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
48  void analyze(edm::Event const& e, edm::EventSetup const& eSetup);
50  void endLuminosityBlock(edm::LuminosityBlock const& lumi, edm::EventSetup const& eSetup);
51  void endRun(edm::Run const& run, edm::EventSetup const& eSetup);
52 
53  private:
54  unsigned int verbosity;
55 
62  //edm::EDGetTokenT< RPMulFittedTrackCollection > tokenMultiTrackColl;
63 
65  struct GlobalPlots
66  {
69 
70  void Init(DQMStore::IBooker &ibooker);
71  };
72 
74 
77  {
78  int id;
79 
82 
84 
85  DiagonalPlots(DQMStore::IBooker &ibooker, int _id);
86  };
87 
88  std::map<unsigned int, DiagonalPlots> diagonalPlots;
89 
91  struct ArmPlots
92  {
93  int id;
94 
97 
99 
100  ArmPlots(DQMStore::IBooker &ibooker, int _id);
101  };
102 
103  std::map<unsigned int, ArmPlots> armPlots;
104 
107  {
109  StationPlots(DQMStore::IBooker &ibooker, int _id);
110  };
111 
112  std::map<unsigned int, StationPlots> stationPlots;
113 
115  struct PotPlots
116  {
118 
127 
128  PotPlots() {}
129  PotPlots(DQMStore::IBooker &ibooker, unsigned int id);
130  };
131 
132  std::map<unsigned int, PotPlots> potPlots;
133 
135  struct PlanePlots
136  {
142 
144  PlanePlots(DQMStore::IBooker &ibooker, unsigned int id);
145  };
146 
147  std::map<unsigned int, PlanePlots> planePlots;
148 };
149 
150 //----------------------------------------------------------------------------------------------------
151 //----------------------------------------------------------------------------------------------------
152 
153 using namespace std;
154 using namespace edm;
155 
156 //----------------------------------------------------------------------------------------------------
157 
159 {
160  events_per_bx = ibooker.book1D("events per BX", "rp;Event.BX", 4002, -1.5, 4000. + 0.5);
161  events_per_bx_short = ibooker.book1D("events per BX (short)", "rp;Event.BX", 102, -1.5, 100. + 0.5);
162 
163  h_trackCorr_hor = ibooker.book2D("track correlation RP-210-hor", "rp, 210, hor", 4, -0.5, 3.5, 4, -0.5, 3.5);
164  TH2F *hist = h_trackCorr_hor->getTH2F();
165  TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
166  xa->SetBinLabel(1, "45, 210, near"); ya->SetBinLabel(1, "45, 210, near");
167  xa->SetBinLabel(2, "45, 210, far"); ya->SetBinLabel(2, "45, 210, far");
168  xa->SetBinLabel(3, "56, 210, near"); ya->SetBinLabel(3, "56, 210, near");
169  xa->SetBinLabel(4, "56, 210, far"); ya->SetBinLabel(4, "56, 210, far");
170 }
171 
172 //----------------------------------------------------------------------------------------------------
173 
175 {
176  bool top45 = id & 2;
177  bool top56 = id & 1;
178  bool diag = (top45 != top56);
179 
180  char name[50];
181  sprintf(name, "%s 45%s - 56%s",
182  (diag) ? "diagonal" : "antidiagonal",
183  (top45) ? "top" : "bot",
184  (top56) ? "top" : "bot"
185  );
186 
187  ibooker.setCurrentFolder(string("CTPPS/TrackingStrip/") + name);
188 
189  h_lrc_x_d = ibooker.book2D("dx left vs right", string(name) + " : dx left vs. right, histogram;#Delta x_{45};#Delta x_{56}", 50, 0., 0., 50, 0., 0.);
190  h_lrc_x_n = ibooker.book2D("xn left vs right", string(name) + " : xn left vs. right, histogram;x^{N}_{45};x^{N}_{56}", 50, 0., 0., 50, 0., 0.);
191  h_lrc_x_f = ibooker.book2D("xf left vs right", string(name) + " : xf left vs. right, histogram;x^{F}_{45};x^{F}_{56}", 50, 0., 0., 50, 0., 0.);
192 
193  h_lrc_y_d = ibooker.book2D("dy left vs right", string(name) + " : dy left vs. right, histogram;#Delta y_{45};#Delta y_{56}", 50, 0., 0., 50, 0., 0.);
194  h_lrc_y_n = ibooker.book2D("yn left vs right", string(name) + " : yn left vs. right, histogram;y^{N}_{45};y^{N}_{56}", 50, 0., 0., 50, 0., 0.);
195  h_lrc_y_f = ibooker.book2D("yf left vs right", string(name) + " : yf left vs. right, histogram;y^{F}_{45};y^{F}_{56}", 50, 0., 0., 50, 0., 0.);
196 }
197 
198 //----------------------------------------------------------------------------------------------------
199 
201 {
203  path.replace(0, 2, "TrackingStrip");
204  ibooker.setCurrentFolder(string("CTPPS/") + path);
205 
207 
208  h_numRPWithTrack_top = ibooker.book1D("number of top RPs with tracks", title+";number of top RPs with tracks", 5, -0.5, 4.5);
209  h_numRPWithTrack_hor = ibooker.book1D("number of hor RPs with tracks", title+";number of hor RPs with tracks", 5, -0.5, 4.5);
210  h_numRPWithTrack_bot = ibooker.book1D("number of bot RPs with tracks", title+";number of bot RPs with tracks", 5, -0.5, 4.5);
211 
212  h_trackCorr = ibooker.book2D("track RP correlation", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
213  TH2F *h_trackCorr_h = h_trackCorr->getTH2F();
214  TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
215  xa->SetBinLabel(1, "210, near, top"); ya->SetBinLabel(1, "210, near, top");
216  xa->SetBinLabel(2, "bot"); ya->SetBinLabel(2, "bot");
217  xa->SetBinLabel(3, "hor"); ya->SetBinLabel(3, "hor");
218  xa->SetBinLabel(4, "far, hor"); ya->SetBinLabel(4, "far, hor");
219  xa->SetBinLabel(5, "top"); ya->SetBinLabel(5, "top");
220  xa->SetBinLabel(6, "bot"); ya->SetBinLabel(6, "bot");
221  xa->SetBinLabel(8, "220, near, top"); ya->SetBinLabel(8, "220, near, top");
222  xa->SetBinLabel(9, "bot"); ya->SetBinLabel(9, "bot");
223  xa->SetBinLabel(10, "hor"); ya->SetBinLabel(10, "hor");
224  xa->SetBinLabel(11, "far, hor"); ya->SetBinLabel(11, "far, hor");
225  xa->SetBinLabel(12, "top"); ya->SetBinLabel(12, "top");
226  xa->SetBinLabel(13, "bot"); ya->SetBinLabel(13, "bot");
227 
228  h_trackCorr_overlap = ibooker.book2D("track RP correlation hor-vert overlaps", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
229  h_trackCorr_h = h_trackCorr_overlap->getTH2F();
230  xa = h_trackCorr_h->GetXaxis(); ya = h_trackCorr_h->GetYaxis();
231  xa->SetBinLabel(1, "210, near, top"); ya->SetBinLabel(1, "210, near, top");
232  xa->SetBinLabel(2, "bot"); ya->SetBinLabel(2, "bot");
233  xa->SetBinLabel(3, "hor"); ya->SetBinLabel(3, "hor");
234  xa->SetBinLabel(4, "far, hor"); ya->SetBinLabel(4, "far, hor");
235  xa->SetBinLabel(5, "top"); ya->SetBinLabel(5, "top");
236  xa->SetBinLabel(6, "bot"); ya->SetBinLabel(6, "bot");
237  xa->SetBinLabel(8, "220, near, top"); ya->SetBinLabel(8, "220, near, top");
238  xa->SetBinLabel(9, "bot"); ya->SetBinLabel(9, "bot");
239  xa->SetBinLabel(10, "hor"); ya->SetBinLabel(10, "hor");
240  xa->SetBinLabel(11, "far, hor"); ya->SetBinLabel(11, "far, hor");
241  xa->SetBinLabel(12, "top"); ya->SetBinLabel(12, "top");
242  xa->SetBinLabel(13, "bot"); ya->SetBinLabel(13, "bot");
243 }
244 
245 //----------------------------------------------------------------------------------------------------
246 
248 {
250  path.replace(0, 2, "TrackingStrip");
251  ibooker.setCurrentFolder(string("CTPPS/") + path);
252 }
253 
254 //----------------------------------------------------------------------------------------------------
255 //----------------------------------------------------------------------------------------------------
256 
258 {
260  path.replace(0, 2, "TrackingStrip");
261  ibooker.setCurrentFolder(string("CTPPS/") + path);
262 
264 
265  vfat_problem = ibooker.book2D("vfats with any problem", title+";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
266  vfat_missing = ibooker.book2D("vfats missing", title+";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
267  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);
268  vfat_corruption = ibooker.book2D("vfats with data corruption", title+";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
269 
270  activity = ibooker.book1D("active planes", title+";number of active planes", 11, -0.5, 10.5);
271  activity_u = ibooker.book1D("active planes U", title+";number of active U planes", 11, -0.5, 10.5);
272  activity_v = ibooker.book1D("active planes V", title+";number of active V planes", 11, -0.5, 10.5);
273 
274  activity_per_bx = ibooker.book1D("activity per BX", title+";Event.BX", 4002, -1.5, 4000. + 0.5);
275  activity_per_bx_short = ibooker.book1D("activity per BX (short)", title+";Event.BX", 102, -1.5, 100. + 0.5);
276 
277  hit_plane_hist = ibooker.book2D("activity in planes (2D)", title+";plane number;strip number", 10, -0.5, 9.5, 32, -0.5, 511.5);
278 
279  patterns_u = ibooker.book1D("recognized patterns U", title+";number of recognized U patterns", 11, -0.5, 10.5);
280  patterns_v = ibooker.book1D("recognized patterns V", title+";number of recognized V patterns", 11, -0.5, 10.5);
281 
282  h_planes_fit_u = ibooker.book1D("planes contributing to fit U", title+";number of planes contributing to U fit", 6, -0.5, 5.5);
283  h_planes_fit_v = ibooker.book1D("planes contributing to fit V", title+";number of planes contributing to V fit", 6, -0.5, 5.5);
284 
285  event_category = ibooker.book1D("event category", title+";event category", 5, -0.5, 4.5);
286  TH1F *event_category_h = event_category->getTH1F();
287  event_category_h->GetXaxis()->SetBinLabel(1, "empty");
288  event_category_h->GetXaxis()->SetBinLabel(2, "insufficient");
289  event_category_h->GetXaxis()->SetBinLabel(3, "single-track");
290  event_category_h->GetXaxis()->SetBinLabel(4, "multi-track");
291  event_category_h->GetXaxis()->SetBinLabel(5, "shower");
292 
293  trackHitsCumulativeHist = ibooker.book2D("track XY profile", title+";x (mm);y (mm)", 100, -18., +18., 100, -18., +18.);
294 
295  track_u_profile = ibooker.book1D("track profile U", title+"; U (mm)", 512, -256*66E-3, +256*66E-3);
296  track_v_profile = ibooker.book1D("track profile V", title+"; V (mm)", 512, -256*66E-3, +256*66E-3);
297 }
298 
299 //----------------------------------------------------------------------------------------------------
300 //----------------------------------------------------------------------------------------------------
301 
303 {
305  path.replace(0, 2, "TrackingStrip");
306  ibooker.setCurrentFolder(string("CTPPS/") + path);
307 
309 
310  digi_profile_cumulative = ibooker.book1D("digi profile", title+";strip number", 512, -0.5, 511.5);
311  cluster_profile_cumulative = ibooker.book1D("cluster profile", title+";cluster center", 1024, -0.25, 511.75);
312  hit_multiplicity = ibooker.book1D("hit multiplicity", title+";hits/detector/event", 6, -0.5, 5.5);
313  cluster_size = ibooker.book1D("cluster size", title+";hits per cluster", 5, 0.5, 5.5);
314 
315  efficiency_num = ibooker.book1D("efficiency num", title+";track position (mm)", 30, -15., 0.);
316  efficiency_den = ibooker.book1D("efficiency den", title+";track position (mm)", 30, -15., 0.);
317 }
318 
319 //----------------------------------------------------------------------------------------------------
320 //----------------------------------------------------------------------------------------------------
321 
323  verbosity(ps.getUntrackedParameter<unsigned int>("verbosity", 0))
324 {
325  tokenStatus = consumes<DetSetVector<TotemVFATStatus>>(ps.getParameter<edm::InputTag>("tagStatus"));
326 
327  tokenDigi = consumes< DetSetVector<TotemRPDigi> >(ps.getParameter<edm::InputTag>("tagDigi"));
328  tokenCluster = consumes< edm::DetSetVector<TotemRPCluster> >(ps.getParameter<edm::InputTag>("tagCluster"));
329  tokenRecHit = consumes< edm::DetSetVector<TotemRPRecHit> >(ps.getParameter<edm::InputTag>("tagRecHit"));
330  tokenUVPattern = consumes< DetSetVector<TotemRPUVPattern> >(ps.getParameter<edm::InputTag>("tagUVPattern"));
331  tokenLocalTrack = consumes< DetSetVector<TotemRPLocalTrack> >(ps.getParameter<edm::InputTag>("tagLocalTrack"));
332  //tokenMultiTrackColl = consumes< RPMulFittedTrackCollection >(ps.getParameter<edm::InputTag>("tagMultiTrackColl"));
333 }
334 
335 //----------------------------------------------------------------------------------------------------
336 
338 {
339 }
340 
341 //----------------------------------------------------------------------------------------------------
342 
344 {
345 }
346 
347 //----------------------------------------------------------------------------------------------------
348 
350 {
351  ibooker.cd();
352  ibooker.setCurrentFolder("CTPPS");
353 
354  // global plots
355  globalPlots.Init(ibooker);
356 
357  // temporarily disabled
358  /*
359  // initialize diagonals
360  diagonalPlots[1] = DiagonalPlots(ibooker, 1); // 45 bot - 56 top
361  diagonalPlots[2] = DiagonalPlots(ibooker, 2); // 45 top - 45 bot
362 
363  // initialize anti-diagonals
364  diagonalPlots[0] = DiagonalPlots(ibooker, 0); // 45 bot - 56 bot
365  diagonalPlots[3] = DiagonalPlots(ibooker, 3); // 45 top - 56 top
366  */
367 
368  // loop over arms
369  for (unsigned int arm = 0; arm < 2; arm++)
370  {
371  armPlots[arm] = ArmPlots(ibooker, arm);
372 
373  // loop over stations
374  for (unsigned int st = 0; st < 3; st += 2)
375  {
376  unsigned int stId = 10*arm + st;
377 
378  stationPlots[stId] = StationPlots(ibooker, stId);
379 
380  // loop over RPs
381  for (unsigned int rp = 0; rp < 6; ++rp)
382  {
383  unsigned int rpId = 10*stId + rp;
384 
385  potPlots[rpId] = PotPlots(ibooker, rpId);
386 
387  // loop over planes
388  for (unsigned int pl = 0; pl < 10; ++pl)
389  {
390  unsigned int plId = 10*rpId + pl;
391  planePlots[plId] = PlanePlots(ibooker, plId);
392  }
393  }
394  }
395  }
396 }
397 
398 //----------------------------------------------------------------------------------------------------
399 
401  edm::EventSetup const& context)
402 {
403 }
404 
405 //----------------------------------------------------------------------------------------------------
406 
408 {
409  // get event setup data
411  eventSetup.get<VeryForwardRealGeometryRecord>().get(geometry);
412 
413  // get event data
415  event.getByToken(tokenStatus, status);
416 
418  event.getByToken(tokenDigi, digi);
419 
421  event.getByToken(tokenCluster, digCluster);
422 
424  event.getByToken(tokenRecHit, hits);
425 
427  event.getByToken(tokenUVPattern, patterns);
428 
430  event.getByToken(tokenLocalTrack, tracks);
431 
432  //Handle< RPMulFittedTrackCollection > multiTracks;
433  //event.getByToken(tokenMultiTrackColl, multiTracks);
434 
435  // check validity
436  bool valid = true;
437  valid &= status.isValid();
438  valid &= digi.isValid();
439  valid &= digCluster.isValid();
440  valid &= hits.isValid();
441  valid &= patterns.isValid();
442  valid &= tracks.isValid();
443  //valid &= multiTracks.isValid();
444 
445  if (!valid)
446  {
447  if (verbosity)
448  {
449  LogProblem("TotemRPDQMSource") <<
450  "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n"
451  << " status.isValid = " << status.isValid() << "\n"
452  << " digi.isValid = " << digi.isValid() << "\n"
453  << " digCluster.isValid = " << digCluster.isValid() << "\n"
454  << " hits.isValid = " << hits.isValid() << "\n"
455  << " patterns.isValid = " << patterns.isValid() << "\n"
456  << " tracks.isValid = " << tracks.isValid();
457  //<< " multiTracks.isValid = %i\n", multiTracks.isValid()
458  }
459 
460  return;
461  }
462 
463  //------------------------------
464  // Global Plots
465 
468 
469  for (auto &ds1 : *tracks)
470  {
471  for (auto &tr1 : ds1)
472  {
473  if (! tr1.isValid())
474  continue;
475 
476  unsigned int rpId1 = ds1.detId();
477  unsigned int arm1 = rpId1 / 100;
478  unsigned int stNum1 = (rpId1 / 10) % 10;
479  unsigned int rpNum1 = rpId1 % 10;
480  if (stNum1 != 0 || (rpNum1 != 2 && rpNum1 != 3))
481  continue;
482  unsigned int idx1 = arm1*2 + rpNum1-2;
483 
484  for (auto &ds2 : *tracks)
485  {
486  for (auto &tr2 : ds2)
487  {
488  if (! tr2.isValid())
489  continue;
490 
491  unsigned int rpId2 = ds2.detId();
492  unsigned int arm2 = rpId2 / 100;
493  unsigned int stNum2 = (rpId2 / 10) % 10;
494  unsigned int rpNum2 = rpId2 % 10;
495  if (stNum2 != 0 || (rpNum2 != 2 && rpNum2 != 3))
496  continue;
497  unsigned int idx2 = arm2*2 + rpNum2-2;
498 
499  globalPlots.h_trackCorr_hor->Fill(idx1, idx2);
500  }
501  }
502  }
503  }
504 
505  //------------------------------
506  // Status Plots
507 
508  for (auto &ds : *status)
509  {
510  unsigned int decId = TotemRPDetId::rawToDecId(ds.detId());
511  unsigned int rpId = decId / 10;
512  unsigned int plNum = decId % 10;
513 
514  auto &plots = potPlots[rpId];
515 
516  for (auto &s : ds)
517  {
518  if (s.isMissing())
519  {
520  plots.vfat_problem->Fill(plNum, s.getChipPosition());
521  plots.vfat_missing->Fill(plNum, s.getChipPosition());
522  }
523 
524  if (s.isECProgressError() || s.isBCProgressError())
525  {
526  plots.vfat_problem->Fill(plNum, s.getChipPosition());
527  plots.vfat_ec_bc_error->Fill(plNum, s.getChipPosition());
528  }
529 
530  if (s.isIDMismatch() || s.isFootprintError() || s.isCRCError())
531  {
532  plots.vfat_problem->Fill(plNum, s.getChipPosition());
533  plots.vfat_corruption->Fill(plNum, s.getChipPosition());
534  }
535  }
536  }
537 
538  //------------------------------
539  // Plane Plots
540 
541  // digi profile cumulative
542  for (DetSetVector<TotemRPDigi>::const_iterator it = digi->begin(); it != digi->end(); ++it)
543  {
544  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
545  for (DetSet<TotemRPDigi>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
546  {
547  planePlots[DetId].digi_profile_cumulative->Fill(dit->getStripNumber());
548  }
549  }
550 
551  // cluster profile cumulative
552  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
553  {
554  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
555  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
556  {
557  planePlots[DetId].cluster_profile_cumulative->Fill(dit->getCenterStripPosition());
558  }
559  }
560 
561  // hit multiplicity
562  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
563  {
564  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
565  planePlots[DetId].hit_multiplicity->Fill(it->size());
566  }
567 
568  // cluster size
569  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
570  {
571  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
572  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
573  planePlots[DetId].cluster_size->Fill(dit->getNumberOfStrips());
574  }
575 
576  // plane efficiency plots
577  for (auto &ds : *tracks)
578  {
579  unsigned int rpId = ds.detId();
580 
581  for (auto &ft : ds)
582  {
583  if (!ft.isValid())
584  continue;
585 
586  double rp_z = geometry->GetRPGlobalTranslation(rpId).z();
587 
588  for (unsigned int plNum = 0; plNum < 10; ++plNum)
589  {
590  unsigned int plDecId = rpId*10 + plNum;
591  unsigned int plRawId = TotemRPDetId::decToRawId(plDecId);
592 
593  double ft_z = ft.getZ0();
594  double ft_x = ft.getX0() + ft.getTx() * (ft_z - rp_z);
595  double ft_y = ft.getY0() + ft.getTy() * (ft_z - rp_z);
596 
597  double ft_v = geometry->GlobalToLocal(plRawId, CLHEP::Hep3Vector(ft_x, ft_y, ft_z)).y();
598 
599  bool hasMatchingHit = false;
600  const auto &hit_ds_it = hits->find(plRawId);
601  if (hit_ds_it != hits->end())
602  {
603  for (const auto &h : *hit_ds_it)
604  {
605  bool match = (fabs(ft_v - h.getPosition()) < 2.*0.066);
606  if (match)
607  {
608  hasMatchingHit = true;
609  break;
610  }
611  }
612  }
613 
614  auto &pp = planePlots[plDecId];
615 
616  pp.efficiency_den->Fill(ft_v);
617  if (hasMatchingHit)
618  pp.efficiency_num->Fill(ft_v);
619  }
620  }
621  }
622 
623 
624  //------------------------------
625  // Roman Pots Plots
626 
627  // determine active planes (from RecHits and VFATStatus)
628  map<unsigned int, set<unsigned int> > planes;
629  map<unsigned int, set<unsigned int> > planes_u;
630  map<unsigned int, set<unsigned int> > planes_v;
631  for (const auto &ds : *hits)
632  {
633  if (ds.empty())
634  continue;
635 
636  unsigned int DetId = TotemRPDetId::rawToDecId(ds.detId());
637  unsigned int RPId = TotemRPDetId::rpOfDet(DetId);
638  unsigned int planeNum = DetId % 10;
639  planes[RPId].insert(planeNum);
641  planes_u[RPId].insert(planeNum);
642  else
643  planes_v[RPId].insert(planeNum);
644  }
645 
646  for (const auto &ds : *status)
647  {
648  bool activity = false;
649  for (const auto &s : ds)
650  {
651  if (s.isNumberOfClustersSpecified() && s.getNumberOfClusters() > 0)
652  {
653  activity = true;
654  break;
655  }
656  }
657 
658  if (!activity)
659  continue;
660 
661  unsigned int DetId = TotemRPDetId::rawToDecId(ds.detId());
662  unsigned int RPId = TotemRPDetId::rpOfDet(DetId);
663  unsigned int planeNum = DetId % 10;
664  planes[RPId].insert(planeNum);
666  planes_u[RPId].insert(planeNum);
667  else
668  planes_v[RPId].insert(planeNum);
669  }
670 
671  // plane activity histogram
672  for (std::map<unsigned int, PotPlots>::iterator it = potPlots.begin(); it != potPlots.end(); it++)
673  {
674  it->second.activity->Fill(planes[it->first].size());
675  it->second.activity_u->Fill(planes_u[it->first].size());
676  it->second.activity_v->Fill(planes_v[it->first].size());
677 
678  if (planes[it->first].size() >= 6)
679  {
680  it->second.activity_per_bx->Fill(event.bunchCrossing());
681  it->second.activity_per_bx_short->Fill(event.bunchCrossing());
682  }
683  }
684 
685  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
686  {
687  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
688  unsigned int RPId = TotemRPDetId::rpOfDet(DetId);
689  unsigned int planeNum = DetId % 10;
690  PotPlots &pp = potPlots[RPId];
691  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
692  pp.hit_plane_hist->Fill(planeNum, dit->getCenterStripPosition());
693  }
694 
695  // recognized pattern histograms
696  for (auto &ds : *patterns)
697  {
698  unsigned int rpId = ds.detId();
699  PotPlots &pp = potPlots[rpId];
700 
701  // count U and V patterns
702  unsigned int u = 0, v = 0;
703  for (auto &p : ds)
704  {
705  if (! p.getFittable())
706  continue;
707 
708  if (p.getProjection() == TotemRPUVPattern::projU)
709  u++;
710 
711  if (p.getProjection() == TotemRPUVPattern::projV)
712  v++;
713  }
714 
715  pp.patterns_u->Fill(u);
716  pp.patterns_v->Fill(v);
717  }
718 
719  // event-category histogram
720  for (auto &it : potPlots)
721  {
722  const unsigned int &id = it.first;
723  auto &pp = it.second;
724 
725  // process hit data for this plot
726  unsigned int pl_u = planes_u[id].size();
727  unsigned int pl_v = planes_v[id].size();
728 
729  // process pattern data for this pot
730  const auto &rp_pat_it = patterns->find(id);
731 
732  unsigned int pat_u = 0, pat_v = 0;
733  if (rp_pat_it != patterns->end())
734  {
735  for (auto &p : *rp_pat_it)
736  {
737  if (! p.getFittable())
738  continue;
739 
740  if (p.getProjection() == TotemRPUVPattern::projU)
741  pat_u++;
742 
743  if (p.getProjection() == TotemRPUVPattern::projV)
744  pat_v++;
745  }
746  }
747 
748  // determine category
749  signed int category = -1;
750 
751  if (pl_u == 0 && pl_v == 0) category = 0; // empty
752 
753  if (category == -1 && pat_u + pat_v <= 1)
754  {
755  if (pl_u + pl_v < 6)
756  category = 1; // insuff
757  else
758  category = 4; // shower
759  }
760 
761  if (pat_u == 1 && pat_v == 1) category = 2; // 1-track
762 
763  if (category == -1) category = 3; // multi-track
764 
765  pp.event_category->Fill(category);
766  }
767 
768  // RP track-fit plots
769  for (auto &ds : *tracks)
770  {
771  unsigned int RPId = ds.detId();
772  PotPlots &pp = potPlots[RPId];
773 
774  for (auto &ft : ds)
775  {
776  if (!ft.isValid())
777  continue;
778 
779  // number of planes contributing to (valid) fits
780  unsigned int n_pl_in_fit_u = 0, n_pl_in_fit_v = 0;
781  for (auto &hds : ft.getHits())
782  {
783  unsigned int rawId = hds.detId();
784  unsigned int decId = TotemRPDetId::rawToDecId(rawId);
786 
787  for (auto &h : hds)
788  {
789  h.getPosition(); // just to keep compiler silent
790  if (uProj)
791  n_pl_in_fit_u++;
792  else
793  n_pl_in_fit_v++;
794  }
795  }
796 
797  pp.h_planes_fit_u->Fill(n_pl_in_fit_u);
798  pp.h_planes_fit_v->Fill(n_pl_in_fit_v);
799 
800  // mean position of U and V planes
801  double rp_x = ( geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 0))->translation().x() +
802  geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 1))->translation().x() ) / 2.;
803  double rp_y = ( geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 0))->translation().y() +
804  geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 1))->translation().y() ) / 2.;
805 
806  // mean read-out direction of U and V planes
807  CLHEP::Hep3Vector rod_U = geometry->LocalToGlobalDirection(TotemRPDetId::decToRawId(RPId*10 + 1), CLHEP::Hep3Vector(0., 1., 0.));
808  CLHEP::Hep3Vector rod_V = geometry->LocalToGlobalDirection(TotemRPDetId::decToRawId(RPId*10 + 0), CLHEP::Hep3Vector(0., 1., 0.));
809 
810  double x = ft.getX0() - rp_x;
811  double y = ft.getY0() - rp_y;
812 
813  pp.trackHitsCumulativeHist->Fill(x, y);
814 
815  double U = x * rod_U.x() + y * rod_U.y();
816  double V = x * rod_V.x() + y * rod_V.y();
817 
818  pp.track_u_profile->Fill(U);
819  pp.track_v_profile->Fill(V);
820  }
821  }
822 
823  //------------------------------
824  // Station Plots
825 
826 
827  //------------------------------
828  // Arm Plots
829  {
830  map<unsigned int, unsigned int> mTop, mHor, mBot;
831 
832  for (auto p : armPlots)
833  {
834  mTop[p.first] = 0;
835  mHor[p.first] = 0;
836  mBot[p.first] = 0;
837  }
838 
839  for (auto &ds : *tracks)
840  {
841  unsigned int rpId = ds.detId();
842  unsigned int armNum = rpId / 100;
843  unsigned int rpNum = rpId % 10;
844 
845  for (auto &tr : ds)
846  {
847  if (! tr.isValid())
848  continue;
849 
850  if (rpNum == 0 || rpNum == 4)
851  mTop[armNum]++;
852  if (rpNum == 2 || rpNum == 3)
853  mHor[armNum]++;
854  if (rpNum == 1 || rpNum == 5)
855  mBot[armNum]++;
856  }
857  }
858 
859  for (auto &p : armPlots)
860  {
861  p.second.h_numRPWithTrack_top->Fill(mTop[p.first]);
862  p.second.h_numRPWithTrack_hor->Fill(mHor[p.first]);
863  p.second.h_numRPWithTrack_bot->Fill(mBot[p.first]);
864  }
865 
866  // track RP correlation
867  for (auto &ds1 : *tracks)
868  {
869  for (auto &tr1 : ds1)
870  {
871  if (! tr1.isValid())
872  continue;
873 
874  unsigned int rpId1 = ds1.detId();
875  unsigned int arm1 = rpId1 / 100;
876  unsigned int stNum1 = (rpId1 / 10) % 10;
877  unsigned int rpNum1 = rpId1 % 10;
878  unsigned int idx1 = stNum1/2 * 7 + rpNum1;
879  bool hor1 = (rpNum1 == 2 || rpNum1 == 3);
880 
881  ArmPlots &ap = armPlots[arm1];
882 
883  for (auto &ds2 : *tracks)
884  {
885  for (auto &tr2 : ds2)
886  {
887  if (! tr2.isValid())
888  continue;
889 
890  unsigned int rpId2 = ds2.detId();
891  unsigned int arm2 = rpId2 / 100;
892  unsigned int stNum2 = (rpId2 / 10) % 10;
893  unsigned int rpNum2 = rpId2 % 10;
894  unsigned int idx2 = stNum2/2 * 7 + rpNum2;
895  bool hor2 = (rpNum2 == 2 || rpNum2 == 3);
896 
897  if (arm1 != arm2)
898  continue;
899 
900  ap.h_trackCorr->Fill(idx1, idx2);
901 
902  if (hor1 != hor2)
903  ap.h_trackCorr_overlap->Fill(idx1, idx2);
904  }
905  }
906  }
907  }
908  }
909 
910  //------------------------------
911  // RP-system plots
912  // TODO: this code needs
913  // * generalization for more than two RPs per arm
914  // * updating for tracks as DetSetVector
915  /*
916  for (auto &dp : diagonalPlots)
917  {
918  unsigned int id = dp.first;
919  bool top45 = id & 2;
920  bool top56 = id & 1;
921 
922  unsigned int id_45_n = (top45) ? 20 : 21;
923  unsigned int id_45_f = (top45) ? 24 : 25;
924  unsigned int id_56_n = (top56) ? 120 : 121;
925  unsigned int id_56_f = (top56) ? 124 : 125;
926 
927  bool h_45_n = (tracks->find(id_45_n) != tracks->end() && tracks->find(id_45_n)->second.IsValid());
928  bool h_45_f = (tracks->find(id_45_f) != tracks->end() && tracks->find(id_45_f)->second.IsValid());
929  bool h_56_n = (tracks->find(id_56_n) != tracks->end() && tracks->find(id_56_n)->second.IsValid());
930  bool h_56_f = (tracks->find(id_56_f) != tracks->end() && tracks->find(id_56_f)->second.IsValid());
931 
932  if (! (h_45_n && h_45_f && h_56_n && h_56_f) )
933  continue;
934 
935  double x_45_n = tracks->find(id_45_n)->second.X0(), y_45_n = tracks->find(id_45_n)->second.Y0();
936  double x_45_f = tracks->find(id_45_f)->second.X0(), y_45_f = tracks->find(id_45_f)->second.Y0();
937  double x_56_n = tracks->find(id_56_n)->second.X0(), y_56_n = tracks->find(id_56_n)->second.Y0();
938  double x_56_f = tracks->find(id_56_f)->second.X0(), y_56_f = tracks->find(id_56_f)->second.Y0();
939 
940  double dx_45 = x_45_f - x_45_n;
941  double dy_45 = y_45_f - y_45_n;
942  double dx_56 = x_56_f - x_56_n;
943  double dy_56 = y_56_f - y_56_n;
944 
945  DiagonalPlots &pl = dp.second;
946 
947  pl.h_lrc_x_d->Fill(dx_45, dx_56);
948  pl.h_lrc_y_d->Fill(dy_45, dy_56);
949 
950  pl.h_lrc_x_n->Fill(x_45_n, x_56_n);
951  pl.h_lrc_y_n->Fill(y_45_n, y_56_n);
952 
953  pl.h_lrc_x_f->Fill(x_45_f, x_56_f);
954  pl.h_lrc_y_f->Fill(y_45_f, y_56_f);
955  }
956  */
957 }
958 
959 //----------------------------------------------------------------------------------------------------
960 
962 {
963 }
964 
965 //----------------------------------------------------------------------------------------------------
966 
968 {
969 }
970 
971 //----------------------------------------------------------------------------------------------------
972 
T getParameter(std::string const &) const
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
GlobalPlots globalPlots
MonitorElement * cluster_profile_cumulative
static std::string rpName(unsigned int id, NameFlag flag=nFull)
returns official name of a RP characterized by &#39;&#39;id&#39;&#39;; if &#39;&#39;full&#39;&#39; is true, name of station is prefix...
void Init(DQMStore::IBooker &ibooker)
MonitorElement * h_trackCorr_overlap
MonitorElement * vfat_corruption
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
static unsigned int rpOfDet(unsigned int i)
returns ID of RP for given detector ID &#39;&#39;i&#39;&#39;
Definition: TotemRPDetId.h:141
tuple pp
Definition: createTree.py:15
static std::string planeName(unsigned int id, NameFlag flag=nFull)
returns official name of a plane characterized by &#39;&#39;id&#39;&#39;; if &#39;&#39;full&#39;&#39; is true, name of RP is prefixed...
void cd(void)
Definition: DQMStore.cc:268
void beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
tuple lumi
Definition: fjr2json.py:35
MonitorElement * activity_per_bx
std::map< unsigned int, ArmPlots > armPlots
void analyze(edm::Event const &e, edm::EventSetup const &eSetup)
int bunchCrossing() const
Definition: EventBase.h:65
static unsigned int rawToDecId(unsigned int raw)
fast conversion Raw to Decimal ID
Definition: TotemRPDetId.h:120
#define NULL
Definition: scimark2.h:8
plots related to one arm
MonitorElement * track_u_profile
bool isStripsCoordinateUDirection() const
Definition: TotemRPDetId.h:95
edm::EDGetTokenT< edm::DetSetVector< TotemRPDigi > > tokenDigi
Event setup record containing the real (actual) geometry information.
MonitorElement * h_numRPWithTrack_top
static std::string stationName(unsigned int id, NameFlag flag=nFull)
returns official name of a station characterized by &#39;&#39;id&#39;&#39;; if &#39;&#39;full&#39;&#39; is true, name of arm is prefi...
const PhiMemoryImage patterns[9]
void Fill(long long x)
plots related to one RP plane
std::map< unsigned int, PlanePlots > planePlots
MonitorElement * h_numRPWithTrack_hor
edm::EDGetTokenT< edm::DetSetVector< TotemRPRecHit > > tokenRecHit
unsigned int verbosity
plots related to one (anti)diagonal
virtual ~TotemRPDQMSource()
edm::EDGetTokenT< edm::DetSetVector< TotemRPUVPattern > > tokenUVPattern
plots related to one RP
MonitorElement * h_numRPWithTrack_bot
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool isValid() const
Definition: HandleBase.h:75
MonitorElement * events_per_bx_short
MonitorElement * track_v_profile
void endLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup)
plots related to one station
iterator begin()
Definition: DetSet.h:59
edm::EDGetTokenT< edm::DetSetVector< TotemRPCluster > > tokenCluster
Definition: DetId.h:18
std::map< unsigned int, StationPlots > stationPlots
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:276
void endRun(edm::Run const &run, edm::EventSetup const &eSetup)
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
tuple tracks
Definition: testEve_cfg.py:39
const T & get() const
Definition: EventSetup.h:56
TH1F * getTH1F(void) const
TotemRPDQMSource(const edm::ParameterSet &ps)
MonitorElement * vfat_ec_bc_error
ESHandle< TrackerGeometry > geometry
static std::string armName(unsigned int id, NameFlag flag=nFull)
returns official name of an arm characterized by &#39;&#39;id&#39;&#39;; if &#39;&#39;full&#39;&#39; is true, prefix rp_ added ...
Definition: TotemRPDetId.cc:92
std::map< unsigned int, PotPlots > potPlots
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
plots related to the whole system
std::map< unsigned int, DiagonalPlots > diagonalPlots
TH2F * getTH2F(void) const
MonitorElement * digi_profile_cumulative
edm::EDGetTokenT< edm::DetSetVector< TotemRPLocalTrack > > tokenLocalTrack
static unsigned int decToRawId(unsigned int dec)
fast conversion Decimal to Raw ID
Definition: TotemRPDetId.h:129
MonitorElement * activity_per_bx_short
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus
Definition: Run.h:43
tuple status
Definition: mps_update.py:57
MonitorElement * trackHitsCumulativeHist