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