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  // TODO: define ranges! If defined automatically, can lead to problems when histograms are merged from several instances of the module.
190  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.);
191  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.);
192  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.);
193 
194  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.);
195  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.);
196  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.);
197 }
198 
199 //----------------------------------------------------------------------------------------------------
200 
202 {
204  path.replace(0, 2, "TrackingStrip");
205  ibooker.setCurrentFolder(string("CTPPS/") + path);
206 
208 
209  h_numRPWithTrack_top = ibooker.book1D("number of top RPs with tracks", title+";number of top RPs with tracks", 5, -0.5, 4.5);
210  h_numRPWithTrack_hor = ibooker.book1D("number of hor RPs with tracks", title+";number of hor RPs with tracks", 5, -0.5, 4.5);
211  h_numRPWithTrack_bot = ibooker.book1D("number of bot RPs with tracks", title+";number of bot RPs with tracks", 5, -0.5, 4.5);
212 
213  h_trackCorr = ibooker.book2D("track RP correlation", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
214  TH2F *h_trackCorr_h = h_trackCorr->getTH2F();
215  TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
216  xa->SetBinLabel(1, "210, near, top"); ya->SetBinLabel(1, "210, near, top");
217  xa->SetBinLabel(2, "bot"); ya->SetBinLabel(2, "bot");
218  xa->SetBinLabel(3, "hor"); ya->SetBinLabel(3, "hor");
219  xa->SetBinLabel(4, "far, hor"); ya->SetBinLabel(4, "far, hor");
220  xa->SetBinLabel(5, "top"); ya->SetBinLabel(5, "top");
221  xa->SetBinLabel(6, "bot"); ya->SetBinLabel(6, "bot");
222  xa->SetBinLabel(8, "220, near, top"); ya->SetBinLabel(8, "220, near, top");
223  xa->SetBinLabel(9, "bot"); ya->SetBinLabel(9, "bot");
224  xa->SetBinLabel(10, "hor"); ya->SetBinLabel(10, "hor");
225  xa->SetBinLabel(11, "far, hor"); ya->SetBinLabel(11, "far, hor");
226  xa->SetBinLabel(12, "top"); ya->SetBinLabel(12, "top");
227  xa->SetBinLabel(13, "bot"); ya->SetBinLabel(13, "bot");
228 
229  h_trackCorr_overlap = ibooker.book2D("track RP correlation hor-vert overlaps", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
230  h_trackCorr_h = h_trackCorr_overlap->getTH2F();
231  xa = h_trackCorr_h->GetXaxis(); ya = h_trackCorr_h->GetYaxis();
232  xa->SetBinLabel(1, "210, near, top"); ya->SetBinLabel(1, "210, near, top");
233  xa->SetBinLabel(2, "bot"); ya->SetBinLabel(2, "bot");
234  xa->SetBinLabel(3, "hor"); ya->SetBinLabel(3, "hor");
235  xa->SetBinLabel(4, "far, hor"); ya->SetBinLabel(4, "far, hor");
236  xa->SetBinLabel(5, "top"); ya->SetBinLabel(5, "top");
237  xa->SetBinLabel(6, "bot"); ya->SetBinLabel(6, "bot");
238  xa->SetBinLabel(8, "220, near, top"); ya->SetBinLabel(8, "220, near, top");
239  xa->SetBinLabel(9, "bot"); ya->SetBinLabel(9, "bot");
240  xa->SetBinLabel(10, "hor"); ya->SetBinLabel(10, "hor");
241  xa->SetBinLabel(11, "far, hor"); ya->SetBinLabel(11, "far, hor");
242  xa->SetBinLabel(12, "top"); ya->SetBinLabel(12, "top");
243  xa->SetBinLabel(13, "bot"); ya->SetBinLabel(13, "bot");
244 }
245 
246 //----------------------------------------------------------------------------------------------------
247 
249 {
251  path.replace(0, 2, "TrackingStrip");
252  ibooker.setCurrentFolder(string("CTPPS/") + path);
253 }
254 
255 //----------------------------------------------------------------------------------------------------
256 //----------------------------------------------------------------------------------------------------
257 
259 {
261  path.replace(0, 2, "TrackingStrip");
262  ibooker.setCurrentFolder(string("CTPPS/") + path);
263 
265 
266  vfat_problem = ibooker.book2D("vfats with any problem", title+";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
267  vfat_missing = ibooker.book2D("vfats missing", title+";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
268  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);
269  vfat_corruption = ibooker.book2D("vfats with data corruption", title+";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
270 
271  activity = ibooker.book1D("active planes", title+";number of active planes", 11, -0.5, 10.5);
272  activity_u = ibooker.book1D("active planes U", title+";number of active U planes", 11, -0.5, 10.5);
273  activity_v = ibooker.book1D("active planes V", title+";number of active V planes", 11, -0.5, 10.5);
274 
275  activity_per_bx = ibooker.book1D("activity per BX", title+";Event.BX", 4002, -1.5, 4000. + 0.5);
276  activity_per_bx_short = ibooker.book1D("activity per BX (short)", title+";Event.BX", 102, -1.5, 100. + 0.5);
277 
278  hit_plane_hist = ibooker.book2D("activity in planes (2D)", title+";plane number;strip number", 10, -0.5, 9.5, 32, -0.5, 511.5);
279 
280  patterns_u = ibooker.book1D("recognized patterns U", title+";number of recognized U patterns", 11, -0.5, 10.5);
281  patterns_v = ibooker.book1D("recognized patterns V", title+";number of recognized V patterns", 11, -0.5, 10.5);
282 
283  h_planes_fit_u = ibooker.book1D("planes contributing to fit U", title+";number of planes contributing to U fit", 6, -0.5, 5.5);
284  h_planes_fit_v = ibooker.book1D("planes contributing to fit V", title+";number of planes contributing to V fit", 6, -0.5, 5.5);
285 
286  event_category = ibooker.book1D("event category", title+";event category", 5, -0.5, 4.5);
287  TH1F *event_category_h = event_category->getTH1F();
288  event_category_h->GetXaxis()->SetBinLabel(1, "empty");
289  event_category_h->GetXaxis()->SetBinLabel(2, "insufficient");
290  event_category_h->GetXaxis()->SetBinLabel(3, "single-track");
291  event_category_h->GetXaxis()->SetBinLabel(4, "multi-track");
292  event_category_h->GetXaxis()->SetBinLabel(5, "shower");
293 
294  trackHitsCumulativeHist = ibooker.book2D("track XY profile", title+";x (mm);y (mm)", 100, -18., +18., 100, -18., +18.);
295 
296  track_u_profile = ibooker.book1D("track profile U", title+"; U (mm)", 512, -256*66E-3, +256*66E-3);
297  track_v_profile = ibooker.book1D("track profile V", title+"; V (mm)", 512, -256*66E-3, +256*66E-3);
298 }
299 
300 //----------------------------------------------------------------------------------------------------
301 //----------------------------------------------------------------------------------------------------
302 
304 {
306  path.replace(0, 2, "TrackingStrip");
307  ibooker.setCurrentFolder(string("CTPPS/") + path);
308 
310 
311  digi_profile_cumulative = ibooker.book1D("digi profile", title+";strip number", 512, -0.5, 511.5);
312  cluster_profile_cumulative = ibooker.book1D("cluster profile", title+";cluster center", 1024, -0.25, 511.75);
313  hit_multiplicity = ibooker.book1D("hit multiplicity", title+";hits/detector/event", 6, -0.5, 5.5);
314  cluster_size = ibooker.book1D("cluster size", title+";hits per cluster", 5, 0.5, 5.5);
315 
316  efficiency_num = ibooker.book1D("efficiency num", title+";track position (mm)", 30, -15., 0.);
317  efficiency_den = ibooker.book1D("efficiency den", title+";track position (mm)", 30, -15., 0.);
318 }
319 
320 //----------------------------------------------------------------------------------------------------
321 //----------------------------------------------------------------------------------------------------
322 
324  verbosity(ps.getUntrackedParameter<unsigned int>("verbosity", 0))
325 {
326  tokenStatus = consumes<DetSetVector<TotemVFATStatus>>(ps.getParameter<edm::InputTag>("tagStatus"));
327 
328  tokenDigi = consumes< DetSetVector<TotemRPDigi> >(ps.getParameter<edm::InputTag>("tagDigi"));
329  tokenCluster = consumes< edm::DetSetVector<TotemRPCluster> >(ps.getParameter<edm::InputTag>("tagCluster"));
330  tokenRecHit = consumes< edm::DetSetVector<TotemRPRecHit> >(ps.getParameter<edm::InputTag>("tagRecHit"));
331  tokenUVPattern = consumes< DetSetVector<TotemRPUVPattern> >(ps.getParameter<edm::InputTag>("tagUVPattern"));
332  tokenLocalTrack = consumes< DetSetVector<TotemRPLocalTrack> >(ps.getParameter<edm::InputTag>("tagLocalTrack"));
333  //tokenMultiTrackColl = consumes< RPMulFittedTrackCollection >(ps.getParameter<edm::InputTag>("tagMultiTrackColl"));
334 }
335 
336 //----------------------------------------------------------------------------------------------------
337 
339 {
340 }
341 
342 //----------------------------------------------------------------------------------------------------
343 
345 {
346 }
347 
348 //----------------------------------------------------------------------------------------------------
349 
351 {
352  ibooker.cd();
353  ibooker.setCurrentFolder("CTPPS");
354 
355  // global plots
356  globalPlots.Init(ibooker);
357 
358  // temporarily disabled
359  /*
360  // initialize diagonals
361  diagonalPlots[1] = DiagonalPlots(ibooker, 1); // 45 bot - 56 top
362  diagonalPlots[2] = DiagonalPlots(ibooker, 2); // 45 top - 45 bot
363 
364  // initialize anti-diagonals
365  diagonalPlots[0] = DiagonalPlots(ibooker, 0); // 45 bot - 56 bot
366  diagonalPlots[3] = DiagonalPlots(ibooker, 3); // 45 top - 56 top
367  */
368 
369  // loop over arms
370  for (unsigned int arm = 0; arm < 2; arm++)
371  {
372  armPlots[arm] = ArmPlots(ibooker, arm);
373 
374  // loop over stations
375  for (unsigned int st = 0; st < 3; st += 2)
376  {
377  unsigned int stId = 10*arm + st;
378 
379  stationPlots[stId] = StationPlots(ibooker, stId);
380 
381  // loop over RPs
382  for (unsigned int rp = 0; rp < 6; ++rp)
383  {
384  unsigned int rpId = 10*stId + rp;
385 
386  potPlots[rpId] = PotPlots(ibooker, rpId);
387 
388  // loop over planes
389  for (unsigned int pl = 0; pl < 10; ++pl)
390  {
391  unsigned int plId = 10*rpId + pl;
392  planePlots[plId] = PlanePlots(ibooker, plId);
393  }
394  }
395  }
396  }
397 }
398 
399 //----------------------------------------------------------------------------------------------------
400 
402  edm::EventSetup const& context)
403 {
404 }
405 
406 //----------------------------------------------------------------------------------------------------
407 
409 {
410  // get event setup data
412  eventSetup.get<VeryForwardRealGeometryRecord>().get(geometry);
413 
414  // get event data
416  event.getByToken(tokenStatus, status);
417 
419  event.getByToken(tokenDigi, digi);
420 
422  event.getByToken(tokenCluster, digCluster);
423 
425  event.getByToken(tokenRecHit, hits);
426 
428  event.getByToken(tokenUVPattern, patterns);
429 
431  event.getByToken(tokenLocalTrack, tracks);
432 
433  //Handle< RPMulFittedTrackCollection > multiTracks;
434  //event.getByToken(tokenMultiTrackColl, multiTracks);
435 
436  // check validity
437  bool valid = true;
438  valid &= status.isValid();
439  valid &= digi.isValid();
440  valid &= digCluster.isValid();
441  valid &= hits.isValid();
442  valid &= patterns.isValid();
443  valid &= tracks.isValid();
444  //valid &= multiTracks.isValid();
445 
446  if (!valid)
447  {
448  if (verbosity)
449  {
450  LogProblem("TotemRPDQMSource") <<
451  "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n"
452  << " status.isValid = " << status.isValid() << "\n"
453  << " digi.isValid = " << digi.isValid() << "\n"
454  << " digCluster.isValid = " << digCluster.isValid() << "\n"
455  << " hits.isValid = " << hits.isValid() << "\n"
456  << " patterns.isValid = " << patterns.isValid() << "\n"
457  << " tracks.isValid = " << tracks.isValid();
458  //<< " multiTracks.isValid = %i\n", multiTracks.isValid()
459  }
460 
461  return;
462  }
463 
464  //------------------------------
465  // Global Plots
466 
469 
470  for (auto &ds1 : *tracks)
471  {
472  for (auto &tr1 : ds1)
473  {
474  if (! tr1.isValid())
475  continue;
476 
477  unsigned int rpId1 = ds1.detId();
478  unsigned int arm1 = rpId1 / 100;
479  unsigned int stNum1 = (rpId1 / 10) % 10;
480  unsigned int rpNum1 = rpId1 % 10;
481  if (stNum1 != 0 || (rpNum1 != 2 && rpNum1 != 3))
482  continue;
483  unsigned int idx1 = arm1*2 + rpNum1-2;
484 
485  for (auto &ds2 : *tracks)
486  {
487  for (auto &tr2 : ds2)
488  {
489  if (! tr2.isValid())
490  continue;
491 
492  unsigned int rpId2 = ds2.detId();
493  unsigned int arm2 = rpId2 / 100;
494  unsigned int stNum2 = (rpId2 / 10) % 10;
495  unsigned int rpNum2 = rpId2 % 10;
496  if (stNum2 != 0 || (rpNum2 != 2 && rpNum2 != 3))
497  continue;
498  unsigned int idx2 = arm2*2 + rpNum2-2;
499 
500  globalPlots.h_trackCorr_hor->Fill(idx1, idx2);
501  }
502  }
503  }
504  }
505 
506  //------------------------------
507  // Status Plots
508 
509  for (auto &ds : *status)
510  {
511  unsigned int decId = TotemRPDetId::rawToDecId(ds.detId());
512  unsigned int rpId = decId / 10;
513  unsigned int plNum = decId % 10;
514 
515  auto &plots = potPlots[rpId];
516 
517  for (auto &s : ds)
518  {
519  if (s.isMissing())
520  {
521  plots.vfat_problem->Fill(plNum, s.getChipPosition());
522  plots.vfat_missing->Fill(plNum, s.getChipPosition());
523  }
524 
525  if (s.isECProgressError() || s.isBCProgressError())
526  {
527  plots.vfat_problem->Fill(plNum, s.getChipPosition());
528  plots.vfat_ec_bc_error->Fill(plNum, s.getChipPosition());
529  }
530 
531  if (s.isIDMismatch() || s.isFootprintError() || s.isCRCError())
532  {
533  plots.vfat_problem->Fill(plNum, s.getChipPosition());
534  plots.vfat_corruption->Fill(plNum, s.getChipPosition());
535  }
536  }
537  }
538 
539  //------------------------------
540  // Plane Plots
541 
542  // digi profile cumulative
543  for (DetSetVector<TotemRPDigi>::const_iterator it = digi->begin(); it != digi->end(); ++it)
544  {
545  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
546  for (DetSet<TotemRPDigi>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
547  {
548  planePlots[DetId].digi_profile_cumulative->Fill(dit->getStripNumber());
549  }
550  }
551 
552  // cluster profile cumulative
553  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
554  {
555  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
556  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
557  {
558  planePlots[DetId].cluster_profile_cumulative->Fill(dit->getCenterStripPosition());
559  }
560  }
561 
562  // hit multiplicity
563  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
564  {
565  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
566  planePlots[DetId].hit_multiplicity->Fill(it->size());
567  }
568 
569  // cluster size
570  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
571  {
572  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
573  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
574  planePlots[DetId].cluster_size->Fill(dit->getNumberOfStrips());
575  }
576 
577  // plane efficiency plots
578  for (auto &ds : *tracks)
579  {
580  unsigned int rpId = ds.detId();
581 
582  for (auto &ft : ds)
583  {
584  if (!ft.isValid())
585  continue;
586 
587  double rp_z = geometry->GetRPGlobalTranslation(rpId).z();
588 
589  for (unsigned int plNum = 0; plNum < 10; ++plNum)
590  {
591  unsigned int plDecId = rpId*10 + plNum;
592  unsigned int plRawId = TotemRPDetId::decToRawId(plDecId);
593 
594  double ft_z = ft.getZ0();
595  double ft_x = ft.getX0() + ft.getTx() * (ft_z - rp_z);
596  double ft_y = ft.getY0() + ft.getTy() * (ft_z - rp_z);
597 
598  double ft_v = geometry->GlobalToLocal(plRawId, CLHEP::Hep3Vector(ft_x, ft_y, ft_z)).y();
599 
600  bool hasMatchingHit = false;
601  const auto &hit_ds_it = hits->find(plRawId);
602  if (hit_ds_it != hits->end())
603  {
604  for (const auto &h : *hit_ds_it)
605  {
606  bool match = (fabs(ft_v - h.getPosition()) < 2.*0.066);
607  if (match)
608  {
609  hasMatchingHit = true;
610  break;
611  }
612  }
613  }
614 
615  auto &pp = planePlots[plDecId];
616 
617  pp.efficiency_den->Fill(ft_v);
618  if (hasMatchingHit)
619  pp.efficiency_num->Fill(ft_v);
620  }
621  }
622  }
623 
624 
625  //------------------------------
626  // Roman Pots Plots
627 
628  // determine active planes (from RecHits and VFATStatus)
629  map<unsigned int, set<unsigned int> > planes;
630  map<unsigned int, set<unsigned int> > planes_u;
631  map<unsigned int, set<unsigned int> > planes_v;
632  for (const auto &ds : *hits)
633  {
634  if (ds.empty())
635  continue;
636 
637  unsigned int DetId = TotemRPDetId::rawToDecId(ds.detId());
638  unsigned int RPId = TotemRPDetId::rpOfDet(DetId);
639  unsigned int planeNum = DetId % 10;
640  planes[RPId].insert(planeNum);
642  planes_u[RPId].insert(planeNum);
643  else
644  planes_v[RPId].insert(planeNum);
645  }
646 
647  for (const auto &ds : *status)
648  {
649  bool activity = false;
650  for (const auto &s : ds)
651  {
652  if (s.isNumberOfClustersSpecified() && s.getNumberOfClusters() > 0)
653  {
654  activity = true;
655  break;
656  }
657  }
658 
659  if (!activity)
660  continue;
661 
662  unsigned int DetId = TotemRPDetId::rawToDecId(ds.detId());
663  unsigned int RPId = TotemRPDetId::rpOfDet(DetId);
664  unsigned int planeNum = DetId % 10;
665  planes[RPId].insert(planeNum);
667  planes_u[RPId].insert(planeNum);
668  else
669  planes_v[RPId].insert(planeNum);
670  }
671 
672  // plane activity histogram
673  for (std::map<unsigned int, PotPlots>::iterator it = potPlots.begin(); it != potPlots.end(); it++)
674  {
675  it->second.activity->Fill(planes[it->first].size());
676  it->second.activity_u->Fill(planes_u[it->first].size());
677  it->second.activity_v->Fill(planes_v[it->first].size());
678 
679  if (planes[it->first].size() >= 6)
680  {
681  it->second.activity_per_bx->Fill(event.bunchCrossing());
682  it->second.activity_per_bx_short->Fill(event.bunchCrossing());
683  }
684  }
685 
686  for (DetSetVector<TotemRPCluster>::const_iterator it = digCluster->begin(); it != digCluster->end(); it++)
687  {
688  unsigned int DetId = TotemRPDetId::rawToDecId(it->detId());
689  unsigned int RPId = TotemRPDetId::rpOfDet(DetId);
690  unsigned int planeNum = DetId % 10;
691  PotPlots &pp = potPlots[RPId];
692  for (DetSet<TotemRPCluster>::const_iterator dit = it->begin(); dit != it->end(); ++dit)
693  pp.hit_plane_hist->Fill(planeNum, dit->getCenterStripPosition());
694  }
695 
696  // recognized pattern histograms
697  for (auto &ds : *patterns)
698  {
699  unsigned int rpId = ds.detId();
700  PotPlots &pp = potPlots[rpId];
701 
702  // count U and V patterns
703  unsigned int u = 0, v = 0;
704  for (auto &p : ds)
705  {
706  if (! p.getFittable())
707  continue;
708 
709  if (p.getProjection() == TotemRPUVPattern::projU)
710  u++;
711 
712  if (p.getProjection() == TotemRPUVPattern::projV)
713  v++;
714  }
715 
716  pp.patterns_u->Fill(u);
717  pp.patterns_v->Fill(v);
718  }
719 
720  // event-category histogram
721  for (auto &it : potPlots)
722  {
723  const unsigned int &id = it.first;
724  auto &pp = it.second;
725 
726  // process hit data for this plot
727  unsigned int pl_u = planes_u[id].size();
728  unsigned int pl_v = planes_v[id].size();
729 
730  // process pattern data for this pot
731  const auto &rp_pat_it = patterns->find(id);
732 
733  unsigned int pat_u = 0, pat_v = 0;
734  if (rp_pat_it != patterns->end())
735  {
736  for (auto &p : *rp_pat_it)
737  {
738  if (! p.getFittable())
739  continue;
740 
741  if (p.getProjection() == TotemRPUVPattern::projU)
742  pat_u++;
743 
744  if (p.getProjection() == TotemRPUVPattern::projV)
745  pat_v++;
746  }
747  }
748 
749  // determine category
750  signed int category = -1;
751 
752  if (pl_u == 0 && pl_v == 0) category = 0; // empty
753 
754  if (category == -1 && pat_u + pat_v <= 1)
755  {
756  if (pl_u + pl_v < 6)
757  category = 1; // insuff
758  else
759  category = 4; // shower
760  }
761 
762  if (pat_u == 1 && pat_v == 1) category = 2; // 1-track
763 
764  if (category == -1) category = 3; // multi-track
765 
766  pp.event_category->Fill(category);
767  }
768 
769  // RP track-fit plots
770  for (auto &ds : *tracks)
771  {
772  unsigned int RPId = ds.detId();
773  PotPlots &pp = potPlots[RPId];
774 
775  for (auto &ft : ds)
776  {
777  if (!ft.isValid())
778  continue;
779 
780  // number of planes contributing to (valid) fits
781  unsigned int n_pl_in_fit_u = 0, n_pl_in_fit_v = 0;
782  for (auto &hds : ft.getHits())
783  {
784  unsigned int rawId = hds.detId();
785  unsigned int decId = TotemRPDetId::rawToDecId(rawId);
787 
788  for (auto &h : hds)
789  {
790  h.getPosition(); // just to keep compiler silent
791  if (uProj)
792  n_pl_in_fit_u++;
793  else
794  n_pl_in_fit_v++;
795  }
796  }
797 
798  pp.h_planes_fit_u->Fill(n_pl_in_fit_u);
799  pp.h_planes_fit_v->Fill(n_pl_in_fit_v);
800 
801  // mean position of U and V planes
802  double rp_x = ( geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 0))->translation().x() +
803  geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 1))->translation().x() ) / 2.;
804  double rp_y = ( geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 0))->translation().y() +
805  geometry->GetDetector(TotemRPDetId::decToRawId(RPId*10 + 1))->translation().y() ) / 2.;
806 
807  // mean read-out direction of U and V planes
808  CLHEP::Hep3Vector rod_U = geometry->LocalToGlobalDirection(TotemRPDetId::decToRawId(RPId*10 + 1), CLHEP::Hep3Vector(0., 1., 0.));
809  CLHEP::Hep3Vector rod_V = geometry->LocalToGlobalDirection(TotemRPDetId::decToRawId(RPId*10 + 0), CLHEP::Hep3Vector(0., 1., 0.));
810 
811  double x = ft.getX0() - rp_x;
812  double y = ft.getY0() - rp_y;
813 
814  pp.trackHitsCumulativeHist->Fill(x, y);
815 
816  double U = x * rod_U.x() + y * rod_U.y();
817  double V = x * rod_V.x() + y * rod_V.y();
818 
819  pp.track_u_profile->Fill(U);
820  pp.track_v_profile->Fill(V);
821  }
822  }
823 
824  //------------------------------
825  // Station Plots
826 
827 
828  //------------------------------
829  // Arm Plots
830  {
831  map<unsigned int, unsigned int> mTop, mHor, mBot;
832 
833  for (auto p : armPlots)
834  {
835  mTop[p.first] = 0;
836  mHor[p.first] = 0;
837  mBot[p.first] = 0;
838  }
839 
840  for (auto &ds : *tracks)
841  {
842  unsigned int rpId = ds.detId();
843  unsigned int armNum = rpId / 100;
844  unsigned int rpNum = rpId % 10;
845 
846  for (auto &tr : ds)
847  {
848  if (! tr.isValid())
849  continue;
850 
851  if (rpNum == 0 || rpNum == 4)
852  mTop[armNum]++;
853  if (rpNum == 2 || rpNum == 3)
854  mHor[armNum]++;
855  if (rpNum == 1 || rpNum == 5)
856  mBot[armNum]++;
857  }
858  }
859 
860  for (auto &p : armPlots)
861  {
862  p.second.h_numRPWithTrack_top->Fill(mTop[p.first]);
863  p.second.h_numRPWithTrack_hor->Fill(mHor[p.first]);
864  p.second.h_numRPWithTrack_bot->Fill(mBot[p.first]);
865  }
866 
867  // track RP correlation
868  for (auto &ds1 : *tracks)
869  {
870  for (auto &tr1 : ds1)
871  {
872  if (! tr1.isValid())
873  continue;
874 
875  unsigned int rpId1 = ds1.detId();
876  unsigned int arm1 = rpId1 / 100;
877  unsigned int stNum1 = (rpId1 / 10) % 10;
878  unsigned int rpNum1 = rpId1 % 10;
879  unsigned int idx1 = stNum1/2 * 7 + rpNum1;
880  bool hor1 = (rpNum1 == 2 || rpNum1 == 3);
881 
882  ArmPlots &ap = armPlots[arm1];
883 
884  for (auto &ds2 : *tracks)
885  {
886  for (auto &tr2 : ds2)
887  {
888  if (! tr2.isValid())
889  continue;
890 
891  unsigned int rpId2 = ds2.detId();
892  unsigned int arm2 = rpId2 / 100;
893  unsigned int stNum2 = (rpId2 / 10) % 10;
894  unsigned int rpNum2 = rpId2 % 10;
895  unsigned int idx2 = stNum2/2 * 7 + rpNum2;
896  bool hor2 = (rpNum2 == 2 || rpNum2 == 3);
897 
898  if (arm1 != arm2)
899  continue;
900 
901  ap.h_trackCorr->Fill(idx1, idx2);
902 
903  if (hor1 != hor2)
904  ap.h_trackCorr_overlap->Fill(idx1, idx2);
905  }
906  }
907  }
908  }
909  }
910 
911  //------------------------------
912  // RP-system plots
913  // TODO: this code needs
914  // * generalization for more than two RPs per arm
915  // * updating for tracks as DetSetVector
916  /*
917  for (auto &dp : diagonalPlots)
918  {
919  unsigned int id = dp.first;
920  bool top45 = id & 2;
921  bool top56 = id & 1;
922 
923  unsigned int id_45_n = (top45) ? 20 : 21;
924  unsigned int id_45_f = (top45) ? 24 : 25;
925  unsigned int id_56_n = (top56) ? 120 : 121;
926  unsigned int id_56_f = (top56) ? 124 : 125;
927 
928  bool h_45_n = (tracks->find(id_45_n) != tracks->end() && tracks->find(id_45_n)->second.IsValid());
929  bool h_45_f = (tracks->find(id_45_f) != tracks->end() && tracks->find(id_45_f)->second.IsValid());
930  bool h_56_n = (tracks->find(id_56_n) != tracks->end() && tracks->find(id_56_n)->second.IsValid());
931  bool h_56_f = (tracks->find(id_56_f) != tracks->end() && tracks->find(id_56_f)->second.IsValid());
932 
933  if (! (h_45_n && h_45_f && h_56_n && h_56_f) )
934  continue;
935 
936  double x_45_n = tracks->find(id_45_n)->second.X0(), y_45_n = tracks->find(id_45_n)->second.Y0();
937  double x_45_f = tracks->find(id_45_f)->second.X0(), y_45_f = tracks->find(id_45_f)->second.Y0();
938  double x_56_n = tracks->find(id_56_n)->second.X0(), y_56_n = tracks->find(id_56_n)->second.Y0();
939  double x_56_f = tracks->find(id_56_f)->second.X0(), y_56_f = tracks->find(id_56_f)->second.Y0();
940 
941  double dx_45 = x_45_f - x_45_n;
942  double dy_45 = y_45_f - y_45_n;
943  double dx_56 = x_56_f - x_56_n;
944  double dy_56 = y_56_f - y_56_n;
945 
946  DiagonalPlots &pl = dp.second;
947 
948  pl.h_lrc_x_d->Fill(dx_45, dx_56);
949  pl.h_lrc_y_d->Fill(dy_45, dy_56);
950 
951  pl.h_lrc_x_n->Fill(x_45_n, x_56_n);
952  pl.h_lrc_y_n->Fill(y_45_n, y_56_n);
953 
954  pl.h_lrc_x_f->Fill(x_45_f, x_56_f);
955  pl.h_lrc_y_f->Fill(y_45_f, y_56_f);
956  }
957  */
958 }
959 
960 //----------------------------------------------------------------------------------------------------
961 
963 {
964 }
965 
966 //----------------------------------------------------------------------------------------------------
967 
969 {
970 }
971 
972 //----------------------------------------------------------------------------------------------------
973 
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...
PhiMemoryImage patterns[9]
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...
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