CMS 3D CMS Logo

BtlLocalRecoValidation.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Validation/MtdValidation
4 // Class: BtlLocalRecoValidation
5 //
14 #include <string>
15 
20 
23 
30 
34 
39 
42 
44 
47 
48 #include "MTDHit.h"
49 
51 public:
53  ~BtlLocalRecoValidation() override;
54 
55  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
56 
57 private:
58  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
59 
60  void analyze(const edm::Event&, const edm::EventSetup&) override;
61 
62  bool isSameCluster(const FTLCluster&, const FTLCluster&);
63 
64  // ------------ member data ------------
65 
67  const double hitMinEnergy_;
68  const bool optionalPlots_;
70  const double hitMinAmplitude_;
71 
77 
81 
82  // --- histograms declaration
83 
85 
87 
92 
94 
95  //local position monitoring
100 
104 
113 
118 
122 
125 
127 
137 
147 
150 
153 
156 
160 
164 
168 
172 
178 
180 
181  // --- UncalibratedRecHits histograms
182 
187 
188  static constexpr int nBinsQ_ = 20;
189  static constexpr float binWidthQ_ = 30.;
190  static constexpr int nBinsQEta_ = 3;
191  static constexpr float binsQEta_[nBinsQEta_ + 1] = {0., 0.65, 1.15, 1.55};
192 
195 
196  static constexpr int nBinsEta_ = 31;
197  static constexpr float binWidthEta_ = 0.05;
198  static constexpr int nBinsEtaQ_ = 7;
199  static constexpr float binsEtaQ_[nBinsEtaQ_ + 1] = {0., 30., 60., 90., 120., 150., 360., 600.};
200 
203 };
204 
206  return clu1.id() == clu2.id() && clu1.size() == clu2.size() && clu1.x() == clu2.x() && clu1.y() == clu2.y() &&
207  clu1.time() == clu2.time();
208 }
209 
210 // ------------ constructor and destructor --------------
212  : folder_(iConfig.getParameter<std::string>("folder")),
213  hitMinEnergy_(iConfig.getParameter<double>("HitMinimumEnergy")),
214  optionalPlots_(iConfig.getParameter<bool>("optionalPlots")),
215  uncalibRecHitsPlots_(iConfig.getParameter<bool>("UncalibRecHitsPlots")),
216  hitMinAmplitude_(iConfig.getParameter<double>("HitMinimumAmplitude")),
217  mtdgeoToken_(esConsumes<MTDGeometry, MTDDigiGeometryRecord>()),
218  mtdtopoToken_(esConsumes<MTDTopology, MTDTopologyRcd>()),
219  cpeToken_(esConsumes<MTDClusterParameterEstimator, MTDCPERecord>(edm::ESInputTag("", "MTDCPEBase"))) {
220  btlRecHitsToken_ = consumes<FTLRecHitCollection>(iConfig.getParameter<edm::InputTag>("recHitsTag"));
222  consumes<FTLUncalibratedRecHitCollection>(iConfig.getParameter<edm::InputTag>("uncalibRecHitsTag"));
223  btlSimHitsToken_ = consumes<CrossingFrame<PSimHit> >(iConfig.getParameter<edm::InputTag>("simHitsTag"));
224  btlRecCluToken_ = consumes<FTLClusterCollection>(iConfig.getParameter<edm::InputTag>("recCluTag"));
225  mtdTrackingHitToken_ = consumes<MTDTrackingDetSetVector>(iConfig.getParameter<edm::InputTag>("trkHitTag"));
226 }
227 
229 
230 // ------------ method called for each event ------------
232  using namespace edm;
233  using namespace std;
234  using namespace geant_units::operators;
235 
236  auto geometryHandle = iSetup.getTransientHandle(mtdgeoToken_);
237  const MTDGeometry* geom = geometryHandle.product();
238 
239  auto topologyHandle = iSetup.getTransientHandle(mtdtopoToken_);
240  const MTDTopology* topology = topologyHandle.product();
241 
242  auto const& cpe = iSetup.getData(cpeToken_);
243 
244  auto btlRecHitsHandle = makeValid(iEvent.getHandle(btlRecHitsToken_));
245  auto btlSimHitsHandle = makeValid(iEvent.getHandle(btlSimHitsToken_));
246  auto btlRecCluHandle = makeValid(iEvent.getHandle(btlRecCluToken_));
247  auto mtdTrkHitHandle = makeValid(iEvent.getHandle(mtdTrackingHitToken_));
248  MixCollection<PSimHit> btlSimHits(btlSimHitsHandle.product());
249 
250 #ifdef EDM_ML_DEBUG
251  for (const auto& hits : *mtdTrkHitHandle) {
252  if (MTDDetId(hits.id()).mtdSubDetector() == MTDDetId::MTDType::BTL) {
253  LogDebug("BtlLocalRecoValidation") << "MTD cluster DetId " << hits.id() << " # cluster " << hits.size();
254  for (const auto& hit : hits) {
255  LogDebug("BtlLocalRecoValidation")
256  << "MTD_TRH: " << hit.localPosition().x() << "," << hit.localPosition().y() << " : "
257  << hit.localPositionError().xx() << "," << hit.localPositionError().yy() << " : " << hit.time() << " : "
258  << hit.timeError();
259  }
260  }
261  }
262 #endif
263 
264  // --- Loop over the BTL SIM hits
265  std::unordered_map<uint32_t, MTDHit> m_btlSimHits;
266  for (auto const& simHit : btlSimHits) {
267  // --- Use only hits compatible with the in-time bunch-crossing
268  if (simHit.tof() < 0 || simHit.tof() > 25.)
269  continue;
270 
271  DetId id = simHit.detUnitId();
272 
273  auto simHitIt = m_btlSimHits.emplace(id.rawId(), MTDHit()).first;
274 
275  // --- Accumulate the energy (in MeV) of SIM hits in the same detector cell
276  (simHitIt->second).energy += convertUnitsTo(0.001_MeV, simHit.energyLoss());
277 
278  // --- Get the time of the first SIM hit in the cell
279  if ((simHitIt->second).time == 0 || simHit.tof() < (simHitIt->second).time) {
280  (simHitIt->second).time = simHit.tof();
281 
282  auto hit_pos = simHit.localPosition();
283  (simHitIt->second).x = hit_pos.x();
284  (simHitIt->second).y = hit_pos.y();
285  (simHitIt->second).z = hit_pos.z();
286  }
287 
288  } // simHit loop
289 
290  // --- Loop over the BTL RECO hits
291  unsigned int n_reco_btl = 0;
292  for (const auto& recHit : *btlRecHitsHandle) {
293  BTLDetId detId = recHit.id();
295  const MTDGeomDet* thedet = geom->idToDet(geoId);
296  if (thedet == nullptr)
297  throw cms::Exception("BtlLocalRecoValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
298  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
299  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
300  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
301 
302  Local3DPoint local_point(0., 0., 0.);
303  local_point = topo.pixelToModuleLocalPoint(local_point, detId.row(topo.nrows()), detId.column(topo.nrows()));
304  const auto& global_point = thedet->toGlobal(local_point);
305 
306  meHitEnergy_->Fill(recHit.energy());
307  meHitLogEnergy_->Fill(log10(recHit.energy()));
308  meHitTime_->Fill(recHit.time());
309  meHitTimeError_->Fill(recHit.timeError());
310  meHitLongPos_->Fill(recHit.position());
311 
312  meOccupancy_->Fill(global_point.z(), global_point.phi());
313 
314  if (optionalPlots_) {
315  meLocalOccupancy_->Fill(local_point.x() + recHit.position(), local_point.y());
316  }
317  meHitXlocal_->Fill(local_point.x());
318  meHitYlocal_->Fill(local_point.y());
319  meHitZlocal_->Fill(local_point.z());
320  meHitZ_->Fill(global_point.z());
321  meHitPhi_->Fill(global_point.phi());
322  meHitEta_->Fill(global_point.eta());
323 
324  meHitTvsE_->Fill(recHit.energy(), recHit.time());
325  meHitEvsPhi_->Fill(global_point.phi(), recHit.energy());
326  meHitEvsEta_->Fill(global_point.eta(), recHit.energy());
327  meHitEvsZ_->Fill(global_point.z(), recHit.energy());
328  meHitTvsPhi_->Fill(global_point.phi(), recHit.time());
329  meHitTvsEta_->Fill(global_point.eta(), recHit.time());
330  meHitTvsZ_->Fill(global_point.z(), recHit.time());
331 
332  // Resolution histograms
333  if (m_btlSimHits.count(detId.rawId()) == 1 && m_btlSimHits[detId.rawId()].energy > hitMinEnergy_) {
334  float longpos_res = recHit.position() - convertMmToCm(m_btlSimHits[detId.rawId()].x);
335  float time_res = recHit.time() - m_btlSimHits[detId.rawId()].time;
336  float energy_res = recHit.energy() - m_btlSimHits[detId.rawId()].energy;
337 
338  Local3DPoint local_point_sim(convertMmToCm(m_btlSimHits[detId.rawId()].x),
339  convertMmToCm(m_btlSimHits[detId.rawId()].y),
340  convertMmToCm(m_btlSimHits[detId.rawId()].z));
341  local_point_sim =
342  topo.pixelToModuleLocalPoint(local_point_sim, detId.row(topo.nrows()), detId.column(topo.nrows()));
343  const auto& global_point_sim = thedet->toGlobal(local_point_sim);
344 
345  meTimeRes_->Fill(time_res);
346  meTimeResVsE_->Fill(recHit.energy(), time_res);
347  meEnergyRes_->Fill(energy_res);
348  meEnergyRelResVsE_->Fill(recHit.energy(), energy_res / recHit.energy());
349 
350  meLongPosPull_->Fill(longpos_res / recHit.positionError());
351  meLongPosPullvsEta_->Fill(std::abs(global_point_sim.eta()), longpos_res / recHit.positionError());
352  meLongPosPullvsE_->Fill(m_btlSimHits[detId.rawId()].energy, longpos_res / recHit.positionError());
353 
354  meTPullvsEta_->Fill(std::abs(global_point_sim.eta()), time_res / recHit.timeError());
355  meTPullvsE_->Fill(m_btlSimHits[detId.rawId()].energy, time_res / recHit.timeError());
356  }
357 
358  n_reco_btl++;
359 
360  } // recHit loop
361 
362  if (n_reco_btl > 0)
363  meNhits_->Fill(log10(n_reco_btl));
364 
365  // --- Loop over the BTL RECO clusters ---
366  unsigned int n_clus_btl(0);
367  for (const auto& DetSetClu : *btlRecCluHandle) {
368  for (const auto& cluster : DetSetClu) {
369  if (cluster.energy() < hitMinEnergy_)
370  continue;
371  BTLDetId cluId = cluster.id();
372  DetId detIdObject(cluId);
373  const auto& genericDet = geom->idToDetUnit(detIdObject);
374  if (genericDet == nullptr) {
375  throw cms::Exception("BtlLocalRecoValidation")
376  << "GeographicalID: " << std::hex << cluId << " is invalid!" << std::dec << std::endl;
377  }
378  n_clus_btl++;
379 
380  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(genericDet->topology());
381  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
382 
383  MTDClusterParameterEstimator::ReturnType tuple = cpe.getParameters(cluster, *genericDet);
384 
385  // --- Cluster position in the module reference frame
386  LocalPoint local_point(std::get<0>(tuple));
387  const auto& global_point = genericDet->toGlobal(local_point);
388 
389  meCluEnergy_->Fill(cluster.energy());
390  meCluTime_->Fill(cluster.time());
391  meCluTimeError_->Fill(cluster.timeError());
392  meCluPhi_->Fill(global_point.phi());
393  meCluEta_->Fill(global_point.eta());
394  meCluZvsPhi_->Fill(global_point.z(), global_point.phi());
395  meCluHits_->Fill(cluster.size());
396 
397  // --- Get the SIM hits associated to the cluster and calculate
398  // the cluster SIM energy, time and position
399 
400  double cluEneSIM = 0.;
401  double cluTimeSIM = 0.;
402  double cluLocXSIM = 0.;
403  double cluLocYSIM = 0.;
404  double cluLocZSIM = 0.;
405 
406  for (int ihit = 0; ihit < cluster.size(); ++ihit) {
407  int hit_row = cluster.minHitRow() + cluster.hitOffset()[ihit * 2];
408  int hit_col = cluster.minHitCol() + cluster.hitOffset()[ihit * 2 + 1];
409 
410  // Match the RECO hit to the corresponding SIM hit
411  for (const auto& recHit : *btlRecHitsHandle) {
412  BTLDetId hitId(recHit.id().rawId());
413 
414  if (m_btlSimHits.count(hitId.rawId()) == 0)
415  continue;
416 
417  // Check the hit position
418  if (hitId.mtdSide() != cluId.mtdSide() || hitId.mtdRR() != cluId.mtdRR() || recHit.row() != hit_row ||
419  recHit.column() != hit_col)
420  continue;
421 
422  // Check the hit energy and time
423  if (recHit.energy() != cluster.hitENERGY()[ihit] || recHit.time() != cluster.hitTIME()[ihit])
424  continue;
425 
426  // SIM hit's position in the module reference frame
427  Local3DPoint local_point_sim(convertMmToCm(m_btlSimHits[recHit.id().rawId()].x),
428  convertMmToCm(m_btlSimHits[recHit.id().rawId()].y),
429  convertMmToCm(m_btlSimHits[recHit.id().rawId()].z));
430  local_point_sim =
431  topo.pixelToModuleLocalPoint(local_point_sim, hitId.row(topo.nrows()), hitId.column(topo.nrows()));
432 
433  // Calculate the SIM cluster's position in the module reference frame
434  cluLocXSIM += local_point_sim.x() * m_btlSimHits[recHit.id().rawId()].energy;
435  cluLocYSIM += local_point_sim.y() * m_btlSimHits[recHit.id().rawId()].energy;
436  cluLocZSIM += local_point_sim.z() * m_btlSimHits[recHit.id().rawId()].energy;
437 
438  // Calculate the SIM cluster energy and time
439  cluEneSIM += m_btlSimHits[recHit.id().rawId()].energy;
440  cluTimeSIM += m_btlSimHits[recHit.id().rawId()].time * m_btlSimHits[recHit.id().rawId()].energy;
441 
442  break;
443 
444  } // recHit loop
445 
446  } // ihit loop
447 
448  // Find the MTDTrackingRecHit corresponding to the cluster
449  const MTDTrackingRecHit* comp(nullptr);
450  bool matchClu = false;
451  const auto& trkHits = (*mtdTrkHitHandle)[detIdObject];
452  for (const auto& trkHit : trkHits) {
453  if (isSameCluster(trkHit.mtdCluster(), cluster)) {
454  comp = trkHit.clone();
455  matchClu = true;
456  break;
457  }
458  }
459  if (!matchClu) {
460  edm::LogWarning("BtlLocalRecoValidation")
461  << "No valid TrackingRecHit corresponding to cluster, detId = " << detIdObject.rawId();
462  }
463 
464  // --- Fill the cluster resolution histograms
465  if (cluTimeSIM > 0. && cluEneSIM > 0.) {
466  cluTimeSIM /= cluEneSIM;
467 
468  Local3DPoint cluLocalPosSIM(cluLocXSIM / cluEneSIM, cluLocYSIM / cluEneSIM, cluLocZSIM / cluEneSIM);
469  const auto& cluGlobalPosSIM = genericDet->toGlobal(cluLocalPosSIM);
470 
471  float time_res = cluster.time() - cluTimeSIM;
472  float energy_res = cluster.energy() - cluEneSIM;
473  meCluTimeRes_->Fill(time_res);
474  meCluEnergyRes_->Fill(energy_res);
475 
476  float rho_res = global_point.perp() - cluGlobalPosSIM.perp();
477  float phi_res = global_point.phi() - cluGlobalPosSIM.phi();
478 
479  meCluRhoRes_->Fill(rho_res);
480  meCluPhiRes_->Fill(phi_res);
481 
482  float xlocal_res = local_point.x() - cluLocalPosSIM.x();
483  float ylocal_res = local_point.y() - cluLocalPosSIM.y();
484 
485  float z_res = global_point.z() - cluGlobalPosSIM.z();
486 
487  meCluZRes_->Fill(z_res);
488 
489  if (matchClu && comp != nullptr) {
490  meCluLocalXRes_->Fill(xlocal_res);
491 
492  if (global_point.z() > 0) {
493  meCluLocalYResZGlobPlus_->Fill(ylocal_res);
494  meCluLocalYPullZGlobPlus_->Fill(ylocal_res / std::sqrt(comp->localPositionError().yy()));
495  } else {
496  meCluLocalYResZGlobMinus_->Fill(ylocal_res);
497  meCluLocalYPullZGlobMinus_->Fill(ylocal_res / std::sqrt(comp->localPositionError().yy()));
498  }
499  if (optionalPlots_) {
500  if (cluster.size() == 1) { // single-crystal clusters
501  meCluSingCrystalLocalYRes_->Fill(ylocal_res);
502  if (global_point.z() > 0) {
504  } else {
506  }
507  } // end of single-crystal clusters
508  else {
509  if (cluster.size() > 1) { // multi-crystal clusters
510  meCluMultiCrystalLocalYRes_->Fill(ylocal_res);
511  if (global_point.z() > 0) {
513  } else {
515  }
516  }
517  } // end of multi-crystal clusters
518 
519  if (abs(global_point.eta()) < 0.3) {
520  meCluCentralLocalYRes_->Fill(ylocal_res);
521  if (global_point.z() > 0) {
523  } else {
525  }
526 
527  } else {
528  if (abs(global_point.eta()) > 1) {
529  meCluForwardLocalYRes_->Fill(ylocal_res);
530  if (global_point.z() > 0) {
531  meCluForwardPlusLocalYRes_->Fill(ylocal_res);
532  } else {
533  meCluForwardMinusLocalYRes_->Fill(ylocal_res);
534  }
535  }
536  }
537 
538  meCluYXLocal_->Fill(local_point.x(), local_point.y());
539  meCluYXLocalSim_->Fill(cluLocalPosSIM.x(), cluLocalPosSIM.y());
540 
541  } //end of optional plots
542 
543  meCluLocalXPull_->Fill(xlocal_res / std::sqrt(comp->localPositionError().xx()));
544  meCluZPull_->Fill(z_res / std::sqrt(comp->globalPositionError().czz()));
545  meCluXLocalErr_->Fill(std::sqrt(comp->localPositionError().xx()));
546  meCluYLocalErr_->Fill(std::sqrt(comp->localPositionError().yy()));
547  }
548 
549  meCluEnergyvsEta_->Fill(std::abs(cluGlobalPosSIM.eta()), cluster.energy());
550  meCluHitsvsEta_->Fill(std::abs(cluGlobalPosSIM.eta()), cluster.size());
551 
552  meCluTResvsEta_->Fill(std::abs(cluGlobalPosSIM.eta()), time_res);
553  meCluTResvsE_->Fill(cluEneSIM, time_res);
554 
555  meCluTPullvsEta_->Fill(std::abs(cluGlobalPosSIM.eta()), time_res / cluster.timeError());
556  meCluTPullvsE_->Fill(cluEneSIM, time_res / cluster.timeError());
557 
558  } // if ( cluTimeSIM > 0. && cluEneSIM > 0. )
559  else {
560  meUnmatchedCluEnergy_->Fill(std::log10(cluster.energy()));
561  }
562 
563  } // cluster loop
564 
565  } // DetSetClu loop
566 
567  if (n_clus_btl > 0)
568  meNclusters_->Fill(log10(n_clus_btl));
569 
570  // --- This is to count the number of processed events, needed in the harvesting step
571  meNevents_->Fill(0.5);
572 
573  // --- Loop over the BTL Uncalibrated RECO hits
574  auto btlUncalibRecHitsHandle = makeValid(iEvent.getHandle(btlUncalibRecHitsToken_));
575 
576  for (const auto& uRecHit : *btlUncalibRecHitsHandle) {
577  BTLDetId detId = uRecHit.id();
578 
579  // --- Skip UncalibratedRecHits not matched to SimHits
580  if (m_btlSimHits.count(detId.rawId()) != 1)
581  continue;
582 
583  // --- Combine the information from the left and right BTL cell sides
584 
585  float nHits = 0.;
586  float hit_amplitude = 0.;
587  float hit_time = 0.;
588 
589  // left side:
590  if (uRecHit.amplitude().first > 0.) {
591  hit_amplitude += uRecHit.amplitude().first;
592  hit_time += uRecHit.time().first;
593  nHits += 1.;
594  }
595  // right side:
596  if (uRecHit.amplitude().second > 0.) {
597  hit_amplitude += uRecHit.amplitude().second;
598  hit_time += uRecHit.time().second;
599  nHits += 1.;
600  }
601 
602  hit_amplitude /= nHits;
603  hit_time /= nHits;
604 
605  // --- Fill the histograms
606 
607  if (hit_amplitude < hitMinAmplitude_)
608  continue;
609 
610  meUncEneRVsX_->Fill(uRecHit.position(), uRecHit.amplitude().first - hit_amplitude);
611  meUncEneLVsX_->Fill(uRecHit.position(), uRecHit.amplitude().second - hit_amplitude);
612 
613  meUncTimeRVsX_->Fill(uRecHit.position(), uRecHit.time().first - hit_time);
614  meUncTimeLVsX_->Fill(uRecHit.position(), uRecHit.time().second - hit_time);
615 
616  if (uncalibRecHitsPlots_) {
618  const MTDGeomDet* thedet = geom->idToDet(geoId);
619  if (thedet == nullptr)
620  throw cms::Exception("BtlLocalRecoValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
621  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
622  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
623  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
624 
625  Local3DPoint local_point(0., 0., 0.);
626  local_point = topo.pixelToModuleLocalPoint(local_point, detId.row(topo.nrows()), detId.column(topo.nrows()));
627  const auto& global_point = thedet->toGlobal(local_point);
628 
629  float time_res = hit_time - m_btlSimHits[detId.rawId()].time;
630 
631  // amplitude histograms
632 
633  int qBin = (int)(hit_amplitude / binWidthQ_);
634  if (qBin > nBinsQ_ - 1)
635  qBin = nBinsQ_ - 1;
636 
637  meTimeResQ_[qBin]->Fill(time_res);
638 
639  int etaBin = 0;
640  for (int ibin = 1; ibin < nBinsQEta_; ++ibin)
641  if (fabs(global_point.eta()) >= binsQEta_[ibin] && fabs(global_point.eta()) < binsQEta_[ibin + 1])
642  etaBin = ibin;
643 
644  meTimeResQvsEta_[qBin][etaBin]->Fill(time_res);
645 
646  // eta histograms
647 
648  etaBin = (int)(fabs(global_point.eta()) / binWidthEta_);
649  if (etaBin > nBinsEta_ - 1)
650  etaBin = nBinsEta_ - 1;
651 
652  meTimeResEta_[etaBin]->Fill(time_res);
653 
654  qBin = 0;
655  for (int ibin = 1; ibin < nBinsEtaQ_; ++ibin)
656  if (hit_amplitude >= binsEtaQ_[ibin] && hit_amplitude < binsEtaQ_[ibin + 1])
657  qBin = ibin;
658 
659  meTimeResEtavsQ_[etaBin][qBin]->Fill(time_res);
660  }
661  } // uRecHit loop}
662 }
663 
664 // ------------ method for histogram booking ------------
666  edm::Run const& run,
667  edm::EventSetup const& iSetup) {
668  ibook.setCurrentFolder(folder_);
669 
670  // --- histograms booking
671 
672  meNevents_ = ibook.book1D("BtlNevents", "Number of events", 1, 0., 1.);
673 
674  meNhits_ = ibook.book1D("BtlNhits", "Number of BTL RECO hits;log_{10}(N_{RECO})", 100, 0., 5.25);
675 
676  meHitEnergy_ = ibook.book1D("BtlHitEnergy", "BTL RECO hits energy;E_{RECO} [MeV]", 100, 0., 20.);
677  meHitLogEnergy_ = ibook.book1D("BtlHitLogEnergy", "BTL RECO hits energy;log_{10}(E_{RECO} [MeV])", 16, -0.1, 1.5);
678  meHitTime_ = ibook.book1D("BtlHitTime", "BTL RECO hits ToA;ToA_{RECO} [ns]", 100, 0., 25.);
679  meHitTimeError_ = ibook.book1D("BtlHitTimeError", "BTL RECO hits ToA error;#sigma^{ToA}_{RECO} [ns]", 50, 0., 0.1);
680  meOccupancy_ = ibook.book2D(
681  "BtlOccupancy", "BTL RECO hits occupancy;Z_{RECO} [cm]; #phi_{RECO} [rad]", 65, -260., 260., 126, -3.2, 3.2);
682  if (optionalPlots_) {
683  meLocalOccupancy_ = ibook.book2D(
684  "BtlLocalOccupancy", "BTL RECO hits local occupancy;X_{RECO} [cm]; Y_{RECO} [cm]", 100, 10., 10., 60, -3., 3.);
685  }
686  meHitXlocal_ = ibook.book1D("BtlHitXlocal", "BTL RECO local X;X_{RECO}^{LOC} [cm]", 100, -10., 10.);
687  meHitYlocal_ = ibook.book1D("BtlHitYlocal", "BTL RECO local Y;Y_{RECO}^{LOC} [cm]", 60, -3, 3);
688  meHitZlocal_ = ibook.book1D("BtlHitZlocal", "BTL RECO local z;z_{RECO}^{LOC} [cm]", 8, -0.4, 0.4);
689  meHitZ_ = ibook.book1D("BtlHitZ", "BTL RECO hits Z;Z_{RECO} [cm]", 100, -260., 260.);
690  meHitPhi_ = ibook.book1D("BtlHitPhi", "BTL RECO hits #phi;#phi_{RECO} [rad]", 126, -3.2, 3.2);
691  meHitEta_ = ibook.book1D("BtlHitEta", "BTL RECO hits #eta;#eta_{RECO}", 100, -1.55, 1.55);
692  meHitTvsE_ =
693  ibook.bookProfile("BtlHitTvsE", "BTL RECO ToA vs energy;E_{RECO} [MeV];ToA_{RECO} [ns]", 50, 0., 20., 0., 100.);
694  meHitEvsPhi_ = ibook.bookProfile(
695  "BtlHitEvsPhi", "BTL RECO energy vs #phi;#phi_{RECO} [rad];E_{RECO} [MeV]", 50, -3.2, 3.2, 0., 100.);
696  meHitEvsEta_ = ibook.bookProfile(
697  "BtlHitEvsEta", "BTL RECO energy vs #eta;#eta_{RECO};E_{RECO} [MeV]", 50, -1.55, 1.55, 0., 100.);
698  meHitEvsZ_ =
699  ibook.bookProfile("BtlHitEvsZ", "BTL RECO energy vs Z;Z_{RECO} [cm];E_{RECO} [MeV]", 50, -260., 260., 0., 100.);
700  meHitTvsPhi_ = ibook.bookProfile(
701  "BtlHitTvsPhi", "BTL RECO ToA vs #phi;#phi_{RECO} [rad];ToA_{RECO} [ns]", 50, -3.2, 3.2, 0., 100.);
702  meHitTvsEta_ =
703  ibook.bookProfile("BtlHitTvsEta", "BTL RECO ToA vs #eta;#eta_{RECO};ToA_{RECO} [ns]", 50, -1.6, 1.6, 0., 100.);
704  meHitTvsZ_ =
705  ibook.bookProfile("BtlHitTvsZ", "BTL RECO ToA vs Z;Z_{RECO} [cm];ToA_{RECO} [ns]", 50, -260., 260., 0., 100.);
706  meHitLongPos_ = ibook.book1D("BtlLongPos", "BTL RECO hits longitudinal position;long. pos._{RECO}", 50, -5, 5);
707  meTimeRes_ = ibook.book1D("BtlTimeRes", "BTL time resolution;T_{RECO}-T_{SIM}", 100, -0.5, 0.5);
708  meTimeResVsE_ = ibook.bookProfile(
709  "BtlTimeResvsE", "BTL time resolution vs hit energy;E_{RECO} [MeV];T_{RECO}-T_{SIM}", 50, 0., 20., -0.5, 0.5, "S");
710  meEnergyRes_ = ibook.book1D("BtlEnergyRes", "BTL energy resolution;E_{RECO}-E_{SIM}", 100, -0.5, 0.5);
711  meEnergyRelResVsE_ = ibook.bookProfile("BtlEnergyRelResvsE",
712  "BTL relative energy resolution vs hit energy;E_{RECO} [MeV];E_{RECO}-E_{SIM}",
713  50,
714  0.,
715  20.,
716  -0.15,
717  0.15,
718  "S");
719  meLongPosPull_ = ibook.book1D("BtlLongPosPull",
720  "BTL longitudinal position pull;X^{loc}_{RECO}-X^{loc}_{SIM}/#sigma_{xloc_{RECO}}",
721  100,
722  -5.,
723  5.);
725  "BtlLongposPullvsE",
726  "BTL longitudinal position pull vs E;E_{SIM} [MeV];X^{loc}_{RECO}-X^{loc}_{SIM}/#sigma_{xloc_{RECO}}",
727  20,
728  0.,
729  20.,
730  -5.,
731  5.,
732  "S");
734  "BtlLongposPullvsEta",
735  "BTL longitudinal position pull vs #eta;|#eta_{RECO}|;X^{loc}_{RECO}-X^{loc}_{SIM}/#sigma_{xloc_{RECO}}",
736  32,
737  0,
738  1.55,
739  -5.,
740  5.,
741  "S");
742  meTPullvsE_ = ibook.bookProfile(
743  "BtlTPullvsE", "BTL time pull vs E;E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}", 20, 0., 20., -5., 5., "S");
744  meTPullvsEta_ = ibook.bookProfile("BtlTPullvsEta",
745  "BTL time pull vs #eta;|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
746  30,
747  0,
748  1.55,
749  -5.,
750  5.,
751  "S");
752 
753  meNclusters_ = ibook.book1D("BtlNclusters", "Number of BTL RECO clusters;log_{10}(N_{RECO})", 100, 0., 5.25);
754  meCluTime_ = ibook.book1D("BtlCluTime", "BTL cluster time ToA;ToA [ns]", 250, 0, 25);
755  meCluTimeError_ = ibook.book1D("BtlCluTimeError", "BTL cluster time error;#sigma_{t} [ns]", 100, 0, 0.1);
756  meCluEnergy_ = ibook.book1D("BtlCluEnergy", "BTL cluster energy;E_{RECO} [MeV]", 100, 0, 20);
757  meCluPhi_ = ibook.book1D("BtlCluPhi", "BTL cluster #phi;#phi_{RECO} [rad]", 144, -3.2, 3.2);
758  meCluEta_ = ibook.book1D("BtlCluEta", "BTL cluster #eta;#eta_{RECO}", 100, -1.55, 1.55);
759  meCluHits_ = ibook.book1D("BtlCluHitNumber", "BTL hits per cluster; Cluster size", 10, 0, 10);
760  meCluZvsPhi_ = ibook.book2D(
761  "BtlOccupancy", "BTL cluster Z vs #phi;Z_{RECO} [cm]; #phi_{RECO} [rad]", 144, -260., 260., 50, -3.2, 3.2);
763  "BtlCluEnergyVsEta", "BTL cluster energy vs #eta; |#eta_{RECO}|; E_{RECO} [cm]", 30, 0., 1.55, 0., 20., "S");
765  "BtlCluHitsVsEta", "BTL hits per cluster vs #eta; |#eta_{RECO}|;Cluster size", 30, 0., 1.55, 0., 10., "S");
766 
767  meCluTimeRes_ = ibook.book1D("BtlCluTimeRes", "BTL cluster time resolution;T_{RECO}-T_{SIM} [ns]", 100, -0.5, 0.5);
769  ibook.book1D("BtlCluEnergyRes", "BTL cluster energy resolution;E_{RECO}-E_{SIM} [MeV]", 100, -0.5, 0.5);
770  meCluTResvsE_ = ibook.bookProfile("BtlCluTResvsE",
771  "BTL cluster time resolution vs E;E_{SIM} [MeV];(T_{RECO}-T_{SIM}) [ns]",
772  20,
773  0.,
774  20.,
775  -0.5,
776  0.5,
777  "S");
778  meCluTResvsEta_ = ibook.bookProfile("BtlCluTResvsEta",
779  "BTL cluster time resolution vs #eta;|#eta_{RECO}|;(T_{RECO}-T_{SIM}) [ns]",
780  30,
781  0,
782  1.55,
783  -0.5,
784  0.5,
785  "S");
786  meCluTPullvsE_ = ibook.bookProfile("BtlCluTPullvsE",
787  "BTL cluster time pull vs E;E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
788  20,
789  0.,
790  20.,
791  -5.,
792  5.,
793  "S");
795  ibook.bookProfile("BtlCluTPullvsEta",
796  "BTL cluster time pull vs #eta;|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
797  30,
798  0,
799  1.55,
800  -5.,
801  5.,
802  "S");
803  meCluRhoRes_ =
804  ibook.book1D("BtlCluRhoRes", "BTL cluster #rho resolution;#rho_{RECO}-#rho_{SIM} [cm]", 100, -0.5, 0.5);
805  meCluPhiRes_ =
806  ibook.book1D("BtlCluPhiRes", "BTL cluster #phi resolution;#phi_{RECO}-#phi_{SIM} [rad]", 100, -0.03, 0.03);
807  meCluZRes_ = ibook.book1D("BtlCluZRes", "BTL cluster Z resolution;Z_{RECO}-Z_{SIM} [cm]", 100, -0.2, 0.2);
809  ibook.book1D("BtlCluLocalXRes", "BTL cluster local X resolution;X_{RECO}-X_{SIM} [cm]", 100, -3.1, 3.1);
811  "BtlCluLocalYResZGlobPlus", "BTL cluster local Y resolution (glob Z > 0);Y_{RECO}-Y_{SIM} [cm]", 100, -0.2, 0.2);
813  "BtlCluLocalYResZGlobMinus", "BTL cluster local Y resolution (glob Z < 0);Y_{RECO}-Y_{SIM} [cm]", 100, -0.2, 0.2);
814  if (optionalPlots_) {
816  ibook.book1D("BtlCluSingCrystalLocalYRes",
817  "BTL cluster local Y resolution (single Crystal clusters);Y_{RECO}-Y_{SIM} [cm]",
818  100,
819  -0.2,
820  0.2);
822  ibook.book1D("BtlCluSingCrystalLocalYResZGlobPlus",
823  "BTL cluster local Y resolution (single Crystal clusters, Z glob > 0);Y_{RECO}-Y_{SIM} [cm]",
824  100,
825  -0.2,
826  0.2);
828  ibook.book1D("BtlCluSingCrystalLocalYResZGlobMinus",
829  "BTL cluster local Y resolution (single Crystal clusters, Z glob < 0);Y_{RECO}-Y_{SIM} [cm]",
830  100,
831  -0.2,
832  0.2);
834  ibook.book1D("BtlCluMultiCrystalLocalYRes",
835  "BTL cluster local Y resolution (Multi-Crystal clusters);Y_{RECO}-Y_{SIM} [cm]",
836  100,
837  -0.2,
838  0.2);
840  ibook.book1D("BtlCluMultiCrystalLocalYResZGlobPlus",
841  "BTL cluster local Y resolution (Multi-Crystal clusters, Z glob > 0);Y_{RECO}-Y_{SIM} [cm]",
842  100,
843  -0.2,
844  0.2);
846  ibook.book1D("BtlCluMultiCrystalLocalYResZGlobMinus",
847  "BTL cluster local Y resolution (Multi-Crystal clusters, Z glob < 0);Y_{RECO}-Y_{SIM} [cm]",
848  100,
849  -0.2,
850  0.2);
851  meCluCentralLocalYRes_ = ibook.book1D("BtlCluCentralLocalYRes",
852  "BTL cluster local Y resolution (central region);Y_{RECO}-Y_{SIM} [cm]",
853  100,
854  -0.2,
855  0.2);
857  ibook.book1D("BtlCluCentralLocalYResZGlobPlus",
858  "BTL cluster local Y resolution (central region, Z glob > 0);Y_{RECO}-Y_{SIM} [cm]",
859  100,
860  -0.2,
861  0.2);
863  ibook.book1D("BtlCluCentralLocalYResZGlobMinus",
864  "BTL cluster local Y resolution (central region, Z glob < 0);Y_{RECO}-Y_{SIM} [cm]",
865  100,
866  -0.2,
867  0.2);
868  meCluForwardLocalYRes_ = ibook.book1D("BtlCluForwardLocalYRes",
869  "BTL cluster local Y resolution (forward region);Y_{RECO}-Y_{SIM} [cm]",
870  100,
871  -0.2,
872  0.2);
874  ibook.book1D("BtlCluForwardPlusLocalYRes",
875  "BTL cluster local Y resolution (forward region, Z glob > 0);Y_{RECO}-Y_{SIM} [cm]",
876  100,
877  -0.2,
878  0.2);
880  ibook.book1D("BtlCluForwardMinusLocalYRes",
881  "BTL cluster local Y resolution (forward region, Z glob < 0);Y_{RECO}-Y_{SIM} [cm]",
882  100,
883  -0.2,
884  0.2);
885  }
887  "BtlCluLocalYPullZGlobPlus", "BTL cluster local Y pull (glob Z > 0);Y_{RECO}-Y_{SIM}/sigmaY_[RECO]", 100, -5., 5.);
888  meCluLocalYPullZGlobMinus_ = ibook.book1D("BtlCluLocalYPullZGlobMinus",
889  "BTL cluster local Y pull (glob Z < 0);Y_{RECO}-Y_{SIM}/sigmaY_[RECO]",
890  100,
891  -5.,
892  5.);
893 
895  ibook.book1D("BtlCluLocalXPull", "BTL cluster local X pull;X_{RECO}-X_{SIM}/sigmaX_[RECO]", 100, -5., 5.);
896 
897  meCluZPull_ = ibook.book1D("BtlCluZPull", "BTL cluster Z pull;Z_{RECO}-Z_{SIM}/sigmaZ_[RECO]", 100, -5., 5.);
898  meCluXLocalErr_ = ibook.book1D("BtlCluXLocalErr", "BTL cluster X local error;sigmaX_{RECO,loc} [cm]", 20, 0., 2.);
899  meCluYLocalErr_ = ibook.book1D("BtlCluYLocalErr", "BTL cluster Y local error;sigmaY_{RECO,loc} [cm]", 20, 0., 0.4);
900  if (optionalPlots_) {
901  meCluYXLocal_ = ibook.book2D("BtlCluYXLocal",
902  "BTL cluster local Y vs X;X^{local}_{RECO} [cm];Y^{local}_{RECO} [cm]",
903  200,
904  -9.5,
905  9.5,
906  200,
907  -2.8,
908  2.8);
909  meCluYXLocalSim_ = ibook.book2D("BtlCluYXLocalSim",
910  "BTL cluster local Y vs X;X^{local}_{SIM} [cm];Y^{local}_{SIM} [cm]",
911  200,
912  -9.5,
913  9.5,
914  200,
915  -2.8,
916  2.8);
917  }
919  ibook.book1D("BtlUnmatchedCluEnergy", "BTL unmatched cluster log10(energy);log10(E_{RECO} [MeV])", 5, -3, 2);
920 
921  // --- UncalibratedRecHits histograms
922 
923  meUncEneLVsX_ = ibook.bookProfile("BTLUncEneLVsX",
924  "BTL uncalibrated hit amplitude left - average vs X;X [cm];Delta(Q_{left}) [pC]",
925  20,
926  -5.,
927  5.,
928  -640.,
929  640.,
930  "S");
931  meUncEneRVsX_ = ibook.bookProfile("BTLUncEneRVsX",
932  "BTL uncalibrated hit amplitude right - average vs X;X [cm];Delta(Q_{right}) [pC]",
933  20,
934  -5.,
935  5.,
936  -640.,
937  640.,
938  "S");
939 
940  meUncTimeLVsX_ = ibook.bookProfile("BTLUncTimeLVsX",
941  "BTL uncalibrated hit time left - average vs X;X [cm];Delta(T_{left}) [MeV]",
942  20,
943  -5.,
944  5.,
945  -25.,
946  25.,
947  "S");
948  meUncTimeRVsX_ = ibook.bookProfile("BTLUncTimeRVsX",
949  "BTL uncalibrated hit time right - average vs X;X [cm];Delta(T_{right}) [MeV]",
950  20,
951  -5.,
952  5.,
953  -25.,
954  25.,
955  "S");
956 
957  if (uncalibRecHitsPlots_) {
958  for (unsigned int ihistoQ = 0; ihistoQ < nBinsQ_; ++ihistoQ) {
959  std::string hname = Form("TimeResQ_%d", ihistoQ);
960  std::string htitle = Form("BTL time resolution (Q bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoQ);
961  meTimeResQ_[ihistoQ] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
962 
963  for (unsigned int ihistoEta = 0; ihistoEta < nBinsQEta_; ++ihistoEta) {
964  hname = Form("TimeResQvsEta_%d_%d", ihistoQ, ihistoEta);
965  htitle = Form("BTL time resolution (Q bin = %d, |#eta| bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoQ, ihistoEta);
966  meTimeResQvsEta_[ihistoQ][ihistoEta] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
967 
968  } // ihistoEta loop
969 
970  } // ihistoQ loop
971 
972  for (unsigned int ihistoEta = 0; ihistoEta < nBinsEta_; ++ihistoEta) {
973  std::string hname = Form("TimeResEta_%d", ihistoEta);
974  std::string htitle = Form("BTL time resolution (|#eta| bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoEta);
975  meTimeResEta_[ihistoEta] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
976 
977  for (unsigned int ihistoQ = 0; ihistoQ < nBinsEtaQ_; ++ihistoQ) {
978  hname = Form("TimeResEtavsQ_%d_%d", ihistoEta, ihistoQ);
979  htitle = Form("BTL time resolution (|#eta| bin = %d, Q bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoEta, ihistoQ);
980  meTimeResEtavsQ_[ihistoEta][ihistoQ] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
981 
982  } // ihistoQ loop
983 
984  } // ihistoEta loop
985  }
986 }
987 
988 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
991 
992  desc.add<std::string>("folder", "MTD/BTL/LocalReco");
993  desc.add<edm::InputTag>("recHitsTag", edm::InputTag("mtdRecHits", "FTLBarrel"));
994  desc.add<edm::InputTag>("uncalibRecHitsTag", edm::InputTag("mtdUncalibratedRecHits", "FTLBarrel"));
995  desc.add<edm::InputTag>("simHitsTag", edm::InputTag("mix", "g4SimHitsFastTimerHitsBarrel"));
996  desc.add<edm::InputTag>("recCluTag", edm::InputTag("mtdClusters", "FTLBarrel"));
997  desc.add<edm::InputTag>("trkHitTag", edm::InputTag("mtdTrackingRecHits"));
998  desc.add<double>("HitMinimumEnergy", 1.); // [MeV]
999  desc.add<bool>("optionalPlots", false);
1000  desc.add<bool>("UncalibRecHitsPlots", false);
1001  desc.add<double>("HitMinimumAmplitude", 30.); // [pC]
1002 
1003  descriptions.add("btlLocalRecoValid", desc);
1004 }
1005 
uint8_t geoId(const VFATFrame &frame)
retrieve the GEO information for this channel
MonitorElement * meCluForwardMinusLocalYRes_
int getMTDTopologyMode() const
Definition: MTDTopology.h:27
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
int row(unsigned nrows=kCrystalsPerModuleV2) const
Definition: BTLDetId.h:93
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
std::string folder_
float x() const
Definition: FTLCluster.h:120
int size() const
Definition: FTLCluster.h:153
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
const edm::ESGetToken< MTDTopology, MTDTopologyRcd > mtdtopoToken_
MonitorElement * meCluSingCrystalLocalYResZGlobMinus_
T z() const
Definition: PV3DBase.h:61
virtual const Topology & topology() const
Definition: GeomDet.cc:67
virtual const PixelTopology & specificTopology() const
MonitorElement * meCluLocalYResZGlobMinus_
MonitorElement * meCluSingCrystalLocalYRes_
const edm::ESGetToken< MTDClusterParameterEstimator, MTDCPERecord > cpeToken_
MonitorElement * meCluCentralLocalYResZGlobPlus_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
MonitorElement * meCluForwardLocalYRes_
int mtdSide() const
Definition: MTDDetId.h:59
Definition: MTDHit.h:4
static constexpr float binWidthQ_
MonitorElement * meCluCentralLocalYResZGlobMinus_
MonitorElement * meCluMultiCrystalLocalYRes_
MonitorElement * meUnmatchedCluEnergy_
static constexpr int nBinsEtaQ_
LocalPoint pixelToModuleLocalPoint(const LocalPoint &plp, int row, int col) const
edm::EDGetTokenT< MTDTrackingDetSetVector > mtdTrackingHitToken_
MonitorElement * meCluMultiCrystalLocalYResZGlobMinus_
MonitorElement * meLongPosPullvsEta_
Detector identifier base class for the MIP Timing Layer.
Definition: MTDDetId.h:21
MonitorElement * meCluForwardPlusLocalYRes_
constexpr NumType convertUnitsTo(double desiredUnits, NumType val)
Definition: GeantUnits.h:73
bool isSameCluster(const FTLCluster &, const FTLCluster &)
void Fill(long long x)
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
float y() const
Definition: FTLCluster.h:125
int iEvent
Definition: GenABIO.cc:224
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:399
MonitorElement * meCluLocalYResZGlobPlus_
static constexpr float binWidthEta_
T sqrt(T t)
Definition: SSEVec.h:19
MonitorElement * meCluSingCrystalLocalYResZGlobPlus_
edm::EDGetTokenT< FTLClusterCollection > btlRecCluToken_
static constexpr float binsQEta_[nBinsQEta_+1]
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int mtdRR() const
Definition: MTDDetId.h:64
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static constexpr int nBinsQEta_
int nrows() const override
MonitorElement * meLocalOccupancy_
MonitorElement * meTimeResEta_[nBinsEta_]
MonitorElement * meCluCentralLocalYRes_
int column(unsigned nrows=kCrystalsPerModuleV2) const
Definition: BTLDetId.h:98
BtlLocalRecoValidation(const edm::ParameterSet &)
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
edm::EDGetTokenT< FTLUncalibratedRecHitCollection > btlUncalibRecHitsToken_
const edm::ESGetToken< MTDGeometry, MTDDigiGeometryRecord > mtdgeoToken_
Definition: DetId.h:17
const DetId & id() const
Definition: FTLCluster.h:190
constexpr NumType convertMmToCm(NumType millimeters)
Definition: angle_units.h:44
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
edm::EDGetTokenT< FTLRecHitCollection > btlRecHitsToken_
A 2D TrackerRecHit with time and time error information.
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 add(std::string const &label, ParameterSetDescription const &psetDescription)
void analyze(const edm::Event &, const edm::EventSetup &) override
static constexpr int nBinsQ_
MonitorElement * meCluLocalYPullZGlobMinus_
MonitorElement * meTimeResQvsEta_[nBinsQ_][nBinsQEta_]
static constexpr float binsEtaQ_[nBinsEtaQ_+1]
MonitorElement * meCluLocalYPullZGlobPlus_
HLT enums.
MonitorElement * meTimeResEtavsQ_[nBinsEta_][nBinsEtaQ_]
Detector identifier class for the Barrel Timing Layer. The crystal count must start from 0...
Definition: BTLDetId.h:19
MonitorElement * meCluMultiCrystalLocalYResZGlobPlus_
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:141
static constexpr int nBinsEta_
float time() const
Definition: FTLCluster.h:142
BTLDetId::CrysLayout crysLayoutFromTopoMode(const int &topoMode)
Log< level::Warning, false > LogWarning
auto makeValid(const U &iOtherHandleType) noexcept(false)
Definition: ValidHandle.h:52
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
edm::EDGetTokenT< CrossingFrame< PSimHit > > btlSimHitsToken_
MonitorElement * meTimeResQ_[nBinsQ_]
std::tuple< LocalPoint, LocalError, TimeValue, TimeValueError > ReturnType
BTLDetId geographicalId(CrysLayout lay) const
Definition: BTLDetId.cc:3
Definition: Run.h:45
#define LogDebug(id)