CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
29 
33 
38 
41 
43 
44 struct MTDHit {
45  float energy;
46  float time;
47  float x_local;
48  float y_local;
49  float z_local;
50 };
51 
53 public:
55  ~BtlLocalRecoValidation() override;
56 
57  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
58 
59 private:
60  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
61 
62  void analyze(const edm::Event&, const edm::EventSetup&) override;
63 
64  // ------------ member data ------------
65 
67  const double hitMinEnergy_;
68  const bool LocalPosDebug_;
70  const double hitMinAmplitude_;
71 
76 
79 
80  // --- histograms declaration
81 
83 
87 
89 
90  //local position monitoring
95 
101 
111 
114 
118 
121 
129 
141 
142  // --- UncalibratedRecHits histograms
143 
144  static constexpr int nBinsQ_ = 20;
145  static constexpr float binWidthQ_ = 30.;
146  static constexpr int nBinsQEta_ = 3;
147  static constexpr float binsQEta_[nBinsQEta_ + 1] = {0., 0.65, 1.15, 1.55};
148 
151 
152  static constexpr int nBinsEta_ = 31;
153  static constexpr float binWidthEta_ = 0.05;
154  static constexpr int nBinsEtaQ_ = 7;
155  static constexpr float binsEtaQ_[nBinsEtaQ_ + 1] = {0., 30., 60., 90., 120., 150., 360., 600.};
156 
159 };
160 
161 // ------------ constructor and destructor --------------
163  : folder_(iConfig.getParameter<std::string>("folder")),
164  hitMinEnergy_(iConfig.getParameter<double>("HitMinimumEnergy")),
165  LocalPosDebug_(iConfig.getParameter<bool>("LocalPositionDebug")),
166  uncalibRecHitsPlots_(iConfig.getParameter<bool>("UncalibRecHitsPlots")),
167  hitMinAmplitude_(iConfig.getParameter<double>("HitMinimumAmplitude")) {
168  btlRecHitsToken_ = consumes<FTLRecHitCollection>(iConfig.getParameter<edm::InputTag>("recHitsTag"));
171  consumes<FTLUncalibratedRecHitCollection>(iConfig.getParameter<edm::InputTag>("uncalibRecHitsTag"));
172  btlSimHitsToken_ = consumes<CrossingFrame<PSimHit> >(iConfig.getParameter<edm::InputTag>("simHitsTag"));
173  btlRecCluToken_ = consumes<FTLClusterCollection>(iConfig.getParameter<edm::InputTag>("recCluTag"));
174 
175  mtdgeoToken_ = esConsumes<MTDGeometry, MTDDigiGeometryRecord>();
176  mtdtopoToken_ = esConsumes<MTDTopology, MTDTopologyRcd>();
177 }
178 
180 
181 // ------------ method called for each event ------------
183  using namespace edm;
184  using namespace std;
185  using namespace geant_units::operators;
186 
187  auto geometryHandle = iSetup.getTransientHandle(mtdgeoToken_);
188  const MTDGeometry* geom = geometryHandle.product();
189 
190  auto topologyHandle = iSetup.getTransientHandle(mtdtopoToken_);
191  const MTDTopology* topology = topologyHandle.product();
192 
193  auto btlRecHitsHandle = makeValid(iEvent.getHandle(btlRecHitsToken_));
194  auto btlSimHitsHandle = makeValid(iEvent.getHandle(btlSimHitsToken_));
195  auto btlRecCluHandle = makeValid(iEvent.getHandle(btlRecCluToken_));
196  MixCollection<PSimHit> btlSimHits(btlSimHitsHandle.product());
197 
198  // --- Loop over the BTL SIM hits
199  std::unordered_map<uint32_t, MTDHit> m_btlSimHits;
200  for (auto const& simHit : btlSimHits) {
201  // --- Use only hits compatible with the in-time bunch-crossing
202  if (simHit.tof() < 0 || simHit.tof() > 25.)
203  continue;
204 
205  DetId id = simHit.detUnitId();
206 
207  auto simHitIt = m_btlSimHits.emplace(id.rawId(), MTDHit()).first;
208 
209  // --- Accumulate the energy (in MeV) of SIM hits in the same detector cell
210  (simHitIt->second).energy += convertUnitsTo(0.001_MeV, simHit.energyLoss());
211 
212  // --- Get the time of the first SIM hit in the cell
213  if ((simHitIt->second).time == 0 || simHit.tof() < (simHitIt->second).time) {
214  (simHitIt->second).time = simHit.tof();
215 
216  auto hit_pos = simHit.entryPoint();
217  (simHitIt->second).x_local = hit_pos.x();
218  (simHitIt->second).y_local = hit_pos.y();
219  (simHitIt->second).z_local = hit_pos.z();
220  }
221 
222  } // simHit loop
223 
224  // --- Loop over the BTL RECO hits
225  unsigned int n_reco_btl = 0;
226  for (const auto& recHit : *btlRecHitsHandle) {
227  BTLDetId detId = recHit.id();
228  DetId geoId = detId.geographicalId(MTDTopologyMode::crysLayoutFromTopoMode(topology->getMTDTopologyMode()));
229  const MTDGeomDet* thedet = geom->idToDet(geoId);
230  if (thedet == nullptr)
231  throw cms::Exception("BtlLocalRecoValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
232  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
233  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
234  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
235 
236  Local3DPoint local_point(0., 0., 0.);
237  local_point = topo.pixelToModuleLocalPoint(local_point, detId.row(topo.nrows()), detId.column(topo.nrows()));
238  const auto& global_point = thedet->toGlobal(local_point);
239 
240  meHitEnergy_->Fill(recHit.energy());
241  meHitTime_->Fill(recHit.time());
242  meHitTimeError_->Fill(recHit.timeError());
243  meHitLongPos_->Fill(recHit.position());
244  meHitLongPosErr_->Fill(recHit.positionError());
245 
246  meOccupancy_->Fill(global_point.z(), global_point.phi());
247 
248  if (LocalPosDebug_) {
249  meLocalOccupancy_->Fill(local_point.x() + recHit.position(), local_point.y());
250  meHitXlocal_->Fill(local_point.x());
251  meHitYlocal_->Fill(local_point.y());
252  meHitZlocal_->Fill(local_point.z());
253  }
254  meHitX_->Fill(global_point.x());
255  meHitY_->Fill(global_point.y());
256  meHitZ_->Fill(global_point.z());
257  meHitPhi_->Fill(global_point.phi());
258  meHitEta_->Fill(global_point.eta());
259 
260  meHitTvsE_->Fill(recHit.energy(), recHit.time());
261  meHitEvsPhi_->Fill(global_point.phi(), recHit.energy());
262  meHitEvsEta_->Fill(global_point.eta(), recHit.energy());
263  meHitEvsZ_->Fill(global_point.z(), recHit.energy());
264  meHitTvsPhi_->Fill(global_point.phi(), recHit.time());
265  meHitTvsEta_->Fill(global_point.eta(), recHit.time());
266  meHitTvsZ_->Fill(global_point.z(), recHit.time());
267 
268  // Resolution histograms
269  if (m_btlSimHits.count(detId.rawId()) == 1 && m_btlSimHits[detId.rawId()].energy > hitMinEnergy_) {
270  float longpos_res = recHit.position() - convertMmToCm(m_btlSimHits[detId.rawId()].x_local);
271  float time_res = recHit.time() - m_btlSimHits[detId.rawId()].time;
272  float energy_res = recHit.energy() - m_btlSimHits[detId.rawId()].energy;
273 
274  Local3DPoint local_point_sim(convertMmToCm(m_btlSimHits[detId.rawId()].x_local),
275  convertMmToCm(m_btlSimHits[detId.rawId()].y_local),
276  convertMmToCm(m_btlSimHits[detId.rawId()].z_local));
277  local_point_sim =
278  topo.pixelToModuleLocalPoint(local_point_sim, detId.row(topo.nrows()), detId.column(topo.nrows()));
279  const auto& global_point_sim = thedet->toGlobal(local_point_sim);
280 
281  meTimeRes_->Fill(time_res);
282  meEnergyRes_->Fill(energy_res);
283 
284  meLongPosPull_->Fill(longpos_res / recHit.positionError());
285  meLongPosPullvsEta_->Fill(std::abs(global_point_sim.eta()), longpos_res / recHit.positionError());
286  meLongPosPullvsE_->Fill(m_btlSimHits[detId.rawId()].energy, longpos_res / recHit.positionError());
287 
288  meTPullvsEta_->Fill(std::abs(global_point_sim.eta()), time_res / recHit.timeError());
289  meTPullvsE_->Fill(m_btlSimHits[detId.rawId()].energy, time_res / recHit.timeError());
290  }
291 
292  n_reco_btl++;
293 
294  } // recHit loop
295 
296  if (n_reco_btl > 0)
297  meNhits_->Fill(log10(n_reco_btl));
298 
299  // --- Loop over the BTL RECO clusters ---
300  for (const auto& DetSetClu : *btlRecCluHandle) {
301  for (const auto& cluster : DetSetClu) {
302  if (cluster.energy() < hitMinEnergy_)
303  continue;
304  BTLDetId cluId = cluster.id();
305  DetId detIdObject(cluId);
306  const auto& genericDet = geom->idToDetUnit(detIdObject);
307  if (genericDet == nullptr) {
308  throw cms::Exception("BtlLocalRecoValidation")
309  << "GeographicalID: " << std::hex << cluId << " is invalid!" << std::dec << std::endl;
310  }
311 
312  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(genericDet->topology());
313  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
314 
315  // --- Cluster position in the module reference frame
316  Local3DPoint local_point(topo.localX(cluster.x()), topo.localY(cluster.y()), 0.);
317  const auto& global_point = genericDet->toGlobal(local_point);
318 
319  meCluEnergy_->Fill(cluster.energy());
320  meCluTime_->Fill(cluster.time());
321  meCluTimeError_->Fill(cluster.timeError());
322  meCluPhi_->Fill(global_point.phi());
323  meCluEta_->Fill(global_point.eta());
324  meCluZvsPhi_->Fill(global_point.z(), global_point.phi());
325  meCluHits_->Fill(cluster.size());
326 
327  // --- Get the SIM hits associated to the cluster and calculate
328  // the cluster SIM energy, time and position
329 
330  double cluEneSIM = 0.;
331  double cluTimeSIM = 0.;
332  double cluLocXSIM = 0.;
333  double cluLocYSIM = 0.;
334  double cluLocZSIM = 0.;
335 
336  for (int ihit = 0; ihit < cluster.size(); ++ihit) {
337  int hit_row = cluster.minHitRow() + cluster.hitOffset()[ihit * 2];
338  int hit_col = cluster.minHitCol() + cluster.hitOffset()[ihit * 2 + 1];
339 
340  // Match the RECO hit to the corresponding SIM hit
341  for (const auto& recHit : *btlRecHitsHandle) {
342  BTLDetId hitId(recHit.id().rawId());
343 
344  if (m_btlSimHits.count(hitId.rawId()) == 0)
345  continue;
346 
347  // Check the hit position
348  if (hitId.mtdSide() != cluId.mtdSide() || hitId.mtdRR() != cluId.mtdRR() || recHit.row() != hit_row ||
349  recHit.column() != hit_col)
350  continue;
351 
352  // Check the hit energy and time
353  if (recHit.energy() != cluster.hitENERGY()[ihit] || recHit.time() != cluster.hitTIME()[ihit])
354  continue;
355 
356  // SIM hit's position in the module reference frame
357  Local3DPoint local_point_sim(convertMmToCm(m_btlSimHits[recHit.id().rawId()].x_local),
358  convertMmToCm(m_btlSimHits[recHit.id().rawId()].y_local),
359  convertMmToCm(m_btlSimHits[recHit.id().rawId()].z_local));
360  local_point_sim =
361  topo.pixelToModuleLocalPoint(local_point_sim, hitId.row(topo.nrows()), hitId.column(topo.nrows()));
362 
363  // Calculate the SIM cluster's position in the module reference frame
364  cluLocXSIM += local_point_sim.x() * m_btlSimHits[recHit.id().rawId()].energy;
365  cluLocYSIM += local_point_sim.y() * m_btlSimHits[recHit.id().rawId()].energy;
366  cluLocZSIM += local_point_sim.z() * m_btlSimHits[recHit.id().rawId()].energy;
367 
368  // Calculate the SIM cluster energy and time
369  cluEneSIM += m_btlSimHits[recHit.id().rawId()].energy;
370  cluTimeSIM += m_btlSimHits[recHit.id().rawId()].time * m_btlSimHits[recHit.id().rawId()].energy;
371 
372  } // recHit loop
373 
374  } // ihit loop
375 
376  // --- Fill the cluster resolution histograms
377  if (cluTimeSIM > 0. && cluEneSIM > 0.) {
378  cluTimeSIM /= cluEneSIM;
379 
380  Local3DPoint cluLocalPosSIM(cluLocXSIM / cluEneSIM, cluLocYSIM / cluEneSIM, cluLocZSIM / cluEneSIM);
381  const auto& cluGlobalPosSIM = genericDet->toGlobal(cluLocalPosSIM);
382 
383  float time_res = cluster.time() - cluTimeSIM;
384  float energy_res = cluster.energy() - cluEneSIM;
385  meCluTimeRes_->Fill(time_res);
386  meCluEnergyRes_->Fill(energy_res);
387 
388  float rho_res = global_point.perp() - cluGlobalPosSIM.perp();
389  float phi_res = global_point.phi() - cluGlobalPosSIM.phi();
390 
391  meCluRhoRes_->Fill(rho_res);
392  meCluPhiRes_->Fill(phi_res);
393 
394  if (LocalPosDebug_) {
395  float x_res = global_point.x() - cluGlobalPosSIM.x();
396  float y_res = global_point.y() - cluGlobalPosSIM.y();
397  float z_res = global_point.z() - cluGlobalPosSIM.z();
398 
399  meCluXRes_->Fill(x_res);
400  meCluYRes_->Fill(y_res);
401  meCluZRes_->Fill(z_res);
402 
403  meCluYXLocal_->Fill(local_point.x(), local_point.y());
404  meCluYXLocalSim_->Fill(cluLocalPosSIM.x(), cluLocalPosSIM.y());
405  }
406 
407  meCluTPullvsEta_->Fill(std::abs(cluGlobalPosSIM.eta()), time_res / cluster.timeError());
408  meCluTPullvsE_->Fill(cluEneSIM, time_res / cluster.timeError());
409 
410  } // if ( cluTimeSIM > 0. && cluEneSIM > 0. )
411 
412  } // cluster loop
413 
414  } // DetSetClu loop
415 
416  // --- Loop over the BTL Uncalibrated RECO hits
417  if (uncalibRecHitsPlots_) {
418  auto btlUncalibRecHitsHandle = makeValid(iEvent.getHandle(btlUncalibRecHitsToken_));
419 
420  for (const auto& uRecHit : *btlUncalibRecHitsHandle) {
421  BTLDetId detId = uRecHit.id();
422 
423  // --- Skip UncalibratedRecHits not matched to SimHits
424  if (m_btlSimHits.count(detId.rawId()) != 1)
425  continue;
426 
427  DetId geoId = detId.geographicalId(MTDTopologyMode::crysLayoutFromTopoMode(topology->getMTDTopologyMode()));
428  const MTDGeomDet* thedet = geom->idToDet(geoId);
429  if (thedet == nullptr)
430  throw cms::Exception("BtlLocalRecoValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
431  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
432  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
433  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
434 
435  Local3DPoint local_point(0., 0., 0.);
436  local_point = topo.pixelToModuleLocalPoint(local_point, detId.row(topo.nrows()), detId.column(topo.nrows()));
437  const auto& global_point = thedet->toGlobal(local_point);
438 
439  // --- Combine the information from the left and right BTL cell sides
440 
441  float nHits = 0.;
442  float hit_amplitude = 0.;
443  float hit_time = 0.;
444 
445  // left side:
446  if (uRecHit.amplitude().first > 0.) {
447  hit_amplitude += uRecHit.amplitude().first;
448  hit_time += uRecHit.time().first;
449  nHits += 1.;
450  }
451  // right side:
452  if (uRecHit.amplitude().second > 0.) {
453  hit_amplitude += uRecHit.amplitude().second;
454  hit_time += uRecHit.time().second;
455  nHits += 1.;
456  }
457 
458  hit_amplitude /= nHits;
459  hit_time /= nHits;
460 
461  // --- Fill the histograms
462 
463  if (hit_amplitude < hitMinAmplitude_)
464  continue;
465 
466  float time_res = hit_time - m_btlSimHits[detId.rawId()].time;
467 
468  // amplitude histograms
469 
470  int qBin = (int)(hit_amplitude / binWidthQ_);
471  if (qBin > nBinsQ_ - 1)
472  qBin = nBinsQ_ - 1;
473 
474  meTimeResQ_[qBin]->Fill(time_res);
475 
476  int etaBin = 0;
477  for (int ibin = 1; ibin < nBinsQEta_; ++ibin)
478  if (fabs(global_point.eta()) >= binsQEta_[ibin] && fabs(global_point.eta()) < binsQEta_[ibin + 1])
479  etaBin = ibin;
480 
481  meTimeResQvsEta_[qBin][etaBin]->Fill(time_res);
482 
483  // eta histograms
484 
485  etaBin = (int)(fabs(global_point.eta()) / binWidthEta_);
486  if (etaBin > nBinsEta_ - 1)
487  etaBin = nBinsEta_ - 1;
488 
489  meTimeResEta_[etaBin]->Fill(time_res);
490 
491  qBin = 0;
492  for (int ibin = 1; ibin < nBinsEtaQ_; ++ibin)
493  if (hit_amplitude >= binsEtaQ_[ibin] && hit_amplitude < binsEtaQ_[ibin + 1])
494  qBin = ibin;
495 
496  meTimeResEtavsQ_[etaBin][qBin]->Fill(time_res);
497 
498  } // uRecHit loop
499  }
500 }
501 
502 // ------------ method for histogram booking ------------
504  edm::Run const& run,
505  edm::EventSetup const& iSetup) {
506  ibook.setCurrentFolder(folder_);
507 
508  // --- histograms booking
509 
510  meNhits_ = ibook.book1D("BtlNhits", "Number of BTL RECO hits;log_{10}(N_{RECO})", 100, 0., 5.25);
511 
512  meHitEnergy_ = ibook.book1D("BtlHitEnergy", "BTL RECO hits energy;E_{RECO} [MeV]", 100, 0., 20.);
513  meHitTime_ = ibook.book1D("BtlHitTime", "BTL RECO hits ToA;ToA_{RECO} [ns]", 100, 0., 25.);
514  meHitTimeError_ = ibook.book1D("BtlHitTimeError", "BTL RECO hits ToA error;#sigma^{ToA}_{RECO} [ns]", 50, 0., 0.1);
515  meOccupancy_ = ibook.book2D(
516  "BtlOccupancy", "BTL RECO hits occupancy;Z_{RECO} [cm]; #phi_{RECO} [rad]", 65, -260., 260., 126, -3.2, 3.2);
517  if (LocalPosDebug_) {
518  meLocalOccupancy_ = ibook.book2D(
519  "BtlLocalOccupancy", "BTL RECO hits local occupancy;X_{RECO} [cm]; Y_{RECO} [cm]", 100, 10., 10., 60, -3., 3.);
520  meHitXlocal_ = ibook.book1D("BtlHitXlocal", "BTL RECO local X;X_{RECO}^{LOC} [cm]", 100, -10., 10.);
521  meHitYlocal_ = ibook.book1D("BtlHitYlocal", "BTL RECO local Y;Y_{RECO}^{LOC} [cm]", 60, -3, 3);
522  meHitZlocal_ = ibook.book1D("BtlHitZlocal", "BTL RECO local z;z_{RECO}^{LOC} [cm]", 10, -1, 1);
523  }
524  meHitX_ = ibook.book1D("BtlHitX", "BTL RECO hits X;X_{RECO} [cm]", 60, -120., 120.);
525  meHitY_ = ibook.book1D("BtlHitY", "BTL RECO hits Y;Y_{RECO} [cm]", 60, -120., 120.);
526  meHitZ_ = ibook.book1D("BtlHitZ", "BTL RECO hits Z;Z_{RECO} [cm]", 100, -260., 260.);
527  meHitPhi_ = ibook.book1D("BtlHitPhi", "BTL RECO hits #phi;#phi_{RECO} [rad]", 126, -3.2, 3.2);
528  meHitEta_ = ibook.book1D("BtlHitEta", "BTL RECO hits #eta;#eta_{RECO}", 100, -1.55, 1.55);
529  meHitTvsE_ =
530  ibook.bookProfile("BtlHitTvsE", "BTL RECO ToA vs energy;E_{RECO} [MeV];ToA_{RECO} [ns]", 50, 0., 20., 0., 100.);
531  meHitEvsPhi_ = ibook.bookProfile(
532  "BtlHitEvsPhi", "BTL RECO energy vs #phi;#phi_{RECO} [rad];E_{RECO} [MeV]", 50, -3.2, 3.2, 0., 100.);
533  meHitEvsEta_ = ibook.bookProfile(
534  "BtlHitEvsEta", "BTL RECO energy vs #eta;#eta_{RECO};E_{RECO} [MeV]", 50, -1.55, 1.55, 0., 100.);
535  meHitEvsZ_ =
536  ibook.bookProfile("BtlHitEvsZ", "BTL RECO energy vs Z;Z_{RECO} [cm];E_{RECO} [MeV]", 50, -260., 260., 0., 100.);
537  meHitTvsPhi_ = ibook.bookProfile(
538  "BtlHitTvsPhi", "BTL RECO ToA vs #phi;#phi_{RECO} [rad];ToA_{RECO} [ns]", 50, -3.2, 3.2, 0., 100.);
539  meHitTvsEta_ =
540  ibook.bookProfile("BtlHitTvsEta", "BTL RECO ToA vs #eta;#eta_{RECO};ToA_{RECO} [ns]", 50, -1.6, 1.6, 0., 100.);
541  meHitTvsZ_ =
542  ibook.bookProfile("BtlHitTvsZ", "BTL RECO ToA vs Z;Z_{RECO} [cm];ToA_{RECO} [ns]", 50, -260., 260., 0., 100.);
543  meHitLongPos_ = ibook.book1D("BtlLongPos", "BTL RECO hits longitudinal position;long. pos._{RECO}", 100, -10, 10);
545  ibook.book1D("BtlLongPosErr", "BTL RECO hits longitudinal position error; long. pos. error_{RECO}", 100, -1, 1);
546  meTimeRes_ = ibook.book1D("BtlTimeRes", "BTL time resolution;T_{RECO}-T_{SIM}", 100, -0.5, 0.5);
547  meEnergyRes_ = ibook.book1D("BtlEnergyRes", "BTL energy resolution;E_{RECO}-E_{SIM}", 100, -0.5, 0.5);
548  meLongPosPull_ = ibook.book1D("BtlLongPosPull",
549  "BTL longitudinal position pull;X^{loc}_{RECO}-X^{loc}_{SIM}/#sigma_{xloc_{RECO}}",
550  100,
551  -5.,
552  5.);
554  "BtlLongposPullvsE",
555  "BTL longitudinal position pull vs E;E_{SIM} [MeV];X^{loc}_{RECO}-X^{loc}_{SIM}/#sigma_{xloc_{RECO}}",
556  20,
557  0.,
558  20.,
559  -5.,
560  5.,
561  "S");
563  "BtlLongposPullvsEta",
564  "BTL longitudinal position pull vs #eta;|#eta_{RECO}|;X^{loc}_{RECO}-X^{loc}_{SIM}/#sigma_{xloc_{RECO}}",
565  32,
566  0,
567  1.55,
568  -5.,
569  5.,
570  "S");
571  meTPullvsE_ = ibook.bookProfile(
572  "BtlTPullvsE", "BTL time pull vs E;E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}", 20, 0., 20., -5., 5., "S");
573  meTPullvsEta_ = ibook.bookProfile("BtlTPullvsEta",
574  "BTL time pull vs #eta;|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
575  30,
576  0,
577  1.55,
578  -5.,
579  5.,
580  "S");
581  meCluTime_ = ibook.book1D("BtlCluTime", "BTL cluster time ToA;ToA [ns]", 250, 0, 25);
582  meCluTimeError_ = ibook.book1D("BtlCluTimeError", "BTL cluster time error;#sigma_{t} [ns]", 100, 0, 0.1);
583  meCluEnergy_ = ibook.book1D("BtlCluEnergy", "BTL cluster energy;E_{RECO} [MeV]", 100, 0, 20);
584  meCluPhi_ = ibook.book1D("BtlCluPhi", "BTL cluster #phi;#phi_{RECO} [rad]", 144, -3.2, 3.2);
585  meCluEta_ = ibook.book1D("BtlCluEta", "BTL cluster #eta;#eta_{RECO}", 100, -1.55, 1.55);
586  meCluHits_ = ibook.book1D("BtlCluHitNumber", "BTL hits per cluster; Cluster size", 10, 0, 10);
587  meCluZvsPhi_ = ibook.book2D(
588  "BtlOccupancy", "BTL cluster Z vs #phi;Z_{RECO} [cm]; #phi_{RECO} [rad]", 144, -260., 260., 50, -3.2, 3.2);
589 
590  meCluTimeRes_ = ibook.book1D("BtlCluTimeRes", "BTL cluster time resolution;T_{RECO}-T_{SIM} [ns]", 100, -0.5, 0.5);
592  ibook.book1D("BtlCluEnergyRes", "BTL cluster energy resolution;E_{RECO}-E_{SIM} [MeV]", 100, -0.5, 0.5);
593  meCluTPullvsE_ = ibook.bookProfile("BtlCluTPullvsE",
594  "BTL cluster time pull vs E;E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
595  20,
596  0.,
597  20.,
598  -5.,
599  5.,
600  "S");
602  ibook.bookProfile("BtlCluTPullvsEta",
603  "BTL cluster time pull vs #eta;|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
604  30,
605  0,
606  1.55,
607  -5.,
608  5.,
609  "S");
610  meCluRhoRes_ =
611  ibook.book1D("BtlCluRhoRes", "BTL cluster #rho resolution;#rho_{RECO}-#rho_{SIM} [cm]", 100, -0.5, 0.5);
612  meCluPhiRes_ =
613  ibook.book1D("BtlCluPhiRes", "BTL cluster #phi resolution;#phi_{RECO}-#phi_{SIM} [rad]", 100, -0.03, 0.03);
614  if (LocalPosDebug_) {
615  meCluXRes_ = ibook.book1D("BtlCluXRes", "BTL cluster X resolution;X_{RECO}-X_{SIM} [cm]", 100, -3.1, 3.1);
616  meCluYRes_ = ibook.book1D("BtlCluYRes", "BTL cluster Y resolution;Y_{RECO}-Y_{SIM} [cm]", 100, -3.1, 3.1);
617  meCluZRes_ = ibook.book1D("BtlCluZRes", "BTL cluster Z resolution;Z_{RECO}-Z_{SIM} [cm]", 100, -0.2, 0.2);
618  meCluYXLocal_ = ibook.book2D("BtlCluYXLocal",
619  "BTL cluster local Y vs X;X^{local}_{RECO} [cm];Y^{local}_{RECO} [cm]",
620  200,
621  -9.5,
622  9.5,
623  200,
624  -2.8,
625  2.8);
626  meCluYXLocalSim_ = ibook.book2D("BtlCluYXLocalSim",
627  "BTL cluster local Y vs X;X^{local}_{SIM} [cm];Y^{local}_{SIM} [cm]",
628  200,
629  -9.5,
630  9.5,
631  200,
632  -2.8,
633  2.8);
634  }
635 
636  // --- UncalibratedRecHits histograms
637 
638  if (uncalibRecHitsPlots_) {
639  for (unsigned int ihistoQ = 0; ihistoQ < nBinsQ_; ++ihistoQ) {
640  std::string hname = Form("TimeResQ_%d", ihistoQ);
641  std::string htitle = Form("BTL time resolution (Q bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoQ);
642  meTimeResQ_[ihistoQ] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
643 
644  for (unsigned int ihistoEta = 0; ihistoEta < nBinsQEta_; ++ihistoEta) {
645  hname = Form("TimeResQvsEta_%d_%d", ihistoQ, ihistoEta);
646  htitle = Form("BTL time resolution (Q bin = %d, |#eta| bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoQ, ihistoEta);
647  meTimeResQvsEta_[ihistoQ][ihistoEta] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
648 
649  } // ihistoEta loop
650 
651  } // ihistoQ loop
652 
653  for (unsigned int ihistoEta = 0; ihistoEta < nBinsEta_; ++ihistoEta) {
654  std::string hname = Form("TimeResEta_%d", ihistoEta);
655  std::string htitle = Form("BTL time resolution (|#eta| bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoEta);
656  meTimeResEta_[ihistoEta] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
657 
658  for (unsigned int ihistoQ = 0; ihistoQ < nBinsEtaQ_; ++ihistoQ) {
659  hname = Form("TimeResEtavsQ_%d_%d", ihistoEta, ihistoQ);
660  htitle = Form("BTL time resolution (|#eta| bin = %d, Q bin = %d);T_{RECO} - T_{SIM} [ns]", ihistoEta, ihistoQ);
661  meTimeResEtavsQ_[ihistoEta][ihistoQ] = ibook.book1D(hname, htitle, 200, -0.3, 0.7);
662 
663  } // ihistoQ loop
664 
665  } // ihistoEta loop
666  }
667 }
668 
669 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
672 
673  desc.add<std::string>("folder", "MTD/BTL/LocalReco");
674  desc.add<edm::InputTag>("recHitsTag", edm::InputTag("mtdRecHits", "FTLBarrel"));
675  desc.add<edm::InputTag>("uncalibRecHitsTag", edm::InputTag("mtdUncalibratedRecHits", "FTLBarrel"));
676  desc.add<edm::InputTag>("simHitsTag", edm::InputTag("mix", "g4SimHitsFastTimerHitsBarrel"));
677  desc.add<edm::InputTag>("recCluTag", edm::InputTag("mtdClusters", "FTLBarrel"));
678  desc.add<double>("HitMinimumEnergy", 1.); // [MeV]
679  desc.add<bool>("LocalPositionDebug", false);
680  desc.add<bool>("UncalibRecHitsPlots", false);
681  desc.add<double>("HitMinimumAmplitude", 30.); // [pC]
682 
683  descriptions.add("btlLocalReco", desc);
684 }
685 
edm::ESGetToken< MTDGeometry, MTDDigiGeometryRecord > mtdgeoToken_
std::string folder_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
virtual const Topology & topology() const
Definition: GeomDet.cc:67
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
T y() const
Definition: PV3DBase.h:60
static constexpr float binWidthQ_
static constexpr int nBinsEtaQ_
MonitorElement * meLongPosPullvsEta_
constexpr NumType convertUnitsTo(double desiredUnits, NumType val)
Definition: GeantUnits.h:100
void Fill(long long x)
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Definition: Event.h:563
int iEvent
Definition: GenABIO.cc:224
BTLDetId geographicalId(CrysLayout lay) const
Definition: BTLDetId.cc:171
float localX(const float mpX) const override
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:322
static constexpr float binWidthEta_
T z() const
Definition: PV3DBase.h:61
edm::EDGetTokenT< FTLClusterCollection > btlRecCluToken_
static constexpr float binsQEta_[nBinsQEta_+1]
virtual const PixelTopology & specificTopology() const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static constexpr int nBinsQEta_
int nrows() const override
edm::ESGetToken< MTDTopology, MTDTopologyRcd > mtdtopoToken_
MonitorElement * meLocalOccupancy_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
LocalPoint pixelToModuleLocalPoint(const LocalPoint &plp, int row, int col) const
MonitorElement * meTimeResEta_[nBinsEta_]
int mtdRR() const
Definition: MTDDetId.h:64
float localY(const float mpY) const override
BtlLocalRecoValidation(const edm::ParameterSet &)
edm::EDGetTokenT< FTLUncalibratedRecHitCollection > btlUncalibRecHitsToken_
int mtdSide() const
Definition: MTDDetId.h:59
Definition: DetId.h:17
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< FTLRecHitCollection > btlRecHitsToken_
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:177
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void add(std::string const &label, ParameterSetDescription const &psetDescription)
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t nHits
void analyze(const edm::Event &, const edm::EventSetup &) override
static constexpr int nBinsQ_
MonitorElement * meTimeResQvsEta_[nBinsQ_][nBinsQEta_]
static constexpr float binsEtaQ_[nBinsEtaQ_+1]
MonitorElement * meTimeResEtavsQ_[nBinsEta_][nBinsEtaQ_]
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:168
Detector identifier class for the Barrel Timing Layer. The crystal count must start from 0...
Definition: BTLDetId.h:18
constexpr NumType convertMmToCm(NumType millimeters)
Definition: GeantUnits.h:63
int column(unsigned nrows=16) const
Definition: BTLDetId.h:110
static constexpr int nBinsEta_
BTLDetId::CrysLayout crysLayoutFromTopoMode(const int &topoMode)
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
edm::EDGetTokenT< CrossingFrame< PSimHit > > btlSimHitsToken_
T x() const
Definition: PV3DBase.h:59
MonitorElement * meTimeResQ_[nBinsQ_]
int etaBin(const l1t::HGCalMulticluster *cl)
Definition: Run.h:45
int row(unsigned nrows=16) const
Definition: BTLDetId.h:105