CMS 3D CMS Logo

EtlLocalRecoValidation.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Validation/MtdValidation
4 // Class: EtlLocalRecoValidation
5 //
14 #include <string>
15 
20 
23 
30 
34 
41 
44 
45 #include "MTDHit.h"
46 
48 public:
50  ~EtlLocalRecoValidation() override;
51 
52  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
53 
54 private:
55  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
56 
57  void analyze(const edm::Event&, const edm::EventSetup&) override;
58 
59  bool isSameCluster(const FTLCluster&, const FTLCluster&);
60 
61  // ------------ member data ------------
62 
64  const float hitMinEnergy1Dis_;
65  const float hitMinEnergy2Dis_;
66  const bool optionalPlots_;
68  const double hitMinAmplitude_;
69 
75 
79 
80  // --- histograms declaration
81 
86 
88 
92 
98 
104 
112 
117 
131 
133 
134  // --- UncalibratedRecHits histograms
135 
136  static constexpr int nBinsQ_ = 20;
137  static constexpr float binWidthQ_ = 1.3; // in MIP units
138 
140 
141  static constexpr int nBinsEta_ = 26;
142  static constexpr float binWidthEta_ = 0.05;
143  static constexpr float etaMin_ = 1.65;
144 
146 };
147 
149  return clu1.id() == clu2.id() && clu1.size() == clu2.size() && clu1.x() == clu2.x() && clu1.y() == clu2.y() &&
150  clu1.time() == clu2.time();
151 }
152 
153 // ------------ constructor and destructor --------------
155  : folder_(iConfig.getParameter<std::string>("folder")),
156  hitMinEnergy1Dis_(iConfig.getParameter<double>("hitMinimumEnergy1Dis")),
157  hitMinEnergy2Dis_(iConfig.getParameter<double>("hitMinimumEnergy2Dis")),
158  optionalPlots_(iConfig.getParameter<bool>("optionalPlots")),
159  uncalibRecHitsPlots_(iConfig.getParameter<bool>("UncalibRecHitsPlots")),
160  hitMinAmplitude_(iConfig.getParameter<double>("HitMinimumAmplitude")),
161  mtdgeoToken_(esConsumes<MTDGeometry, MTDDigiGeometryRecord>()),
162  mtdtopoToken_(esConsumes<MTDTopology, MTDTopologyRcd>()),
163  cpeToken_(esConsumes<MTDClusterParameterEstimator, MTDCPERecord>(edm::ESInputTag("", "MTDCPEBase"))) {
164  etlRecHitsToken_ = consumes<FTLRecHitCollection>(iConfig.getParameter<edm::InputTag>("recHitsTag"));
167  consumes<FTLUncalibratedRecHitCollection>(iConfig.getParameter<edm::InputTag>("uncalibRecHitsTag"));
168  etlSimHitsToken_ = consumes<CrossingFrame<PSimHit> >(iConfig.getParameter<edm::InputTag>("simHitsTag"));
169  etlRecCluToken_ = consumes<FTLClusterCollection>(iConfig.getParameter<edm::InputTag>("recCluTag"));
170  mtdTrackingHitToken_ = consumes<MTDTrackingDetSetVector>(iConfig.getParameter<edm::InputTag>("trkHitTag"));
171 }
172 
174 
175 // ------------ method called for each event ------------
177  using namespace edm;
178  using namespace std;
179  using namespace geant_units::operators;
180 
181  auto geometryHandle = iSetup.getTransientHandle(mtdgeoToken_);
182  const MTDGeometry* geom = geometryHandle.product();
183 
184  auto topologyHandle = iSetup.getTransientHandle(mtdtopoToken_);
185  const MTDTopology* topology = topologyHandle.product();
186 
187  auto const& cpe = iSetup.getData(cpeToken_);
188 
189  bool topo1Dis = false;
190  bool topo2Dis = false;
192  topo1Dis = true;
193  } else {
194  topo2Dis = true;
195  }
196 
197  auto etlRecHitsHandle = makeValid(iEvent.getHandle(etlRecHitsToken_));
198  auto etlSimHitsHandle = makeValid(iEvent.getHandle(etlSimHitsToken_));
199  auto etlRecCluHandle = makeValid(iEvent.getHandle(etlRecCluToken_));
200  auto mtdTrkHitHandle = makeValid(iEvent.getHandle(mtdTrackingHitToken_));
201  MixCollection<PSimHit> etlSimHits(etlSimHitsHandle.product());
202 
203 #ifdef EDM_ML_DEBUG
204  for (const auto& hits : *mtdTrkHitHandle) {
205  if (MTDDetId(hits.id()).mtdSubDetector() == MTDDetId::MTDType::ETL) {
206  LogDebug("EtlLocalRecoValidation") << "MTD cluster DetId " << hits.id() << " # cluster " << hits.size();
207  for (const auto& hit : hits) {
208  LogDebug("EtlLocalRecoValidation")
209  << "MTD_TRH: " << hit.localPosition().x() << "," << hit.localPosition().y() << " : "
210  << hit.localPositionError().xx() << "," << hit.localPositionError().yy() << " : " << hit.time() << " : "
211  << hit.timeError();
212  }
213  }
214  }
215 #endif
216 
217  // --- Loop over the ETL SIM hits
218  std::unordered_map<uint32_t, MTDHit> m_etlSimHits[4];
219  for (auto const& simHit : etlSimHits) {
220  // --- Use only hits compatible with the in-time bunch-crossing
221  if (simHit.tof() < 0 || simHit.tof() > 25.)
222  continue;
223 
224  ETLDetId id = simHit.detUnitId();
225 
226  int idet = -1;
227 
228  if ((id.zside() == -1) && (id.nDisc() == 1))
229  idet = 0;
230  else if ((id.zside() == -1) && (id.nDisc() == 2))
231  idet = 1;
232  else if ((id.zside() == 1) && (id.nDisc() == 1))
233  idet = 2;
234  else if ((id.zside() == 1) && (id.nDisc() == 2))
235  idet = 3;
236  else
237  continue;
238 
239  auto simHitIt = m_etlSimHits[idet].emplace(id.rawId(), MTDHit()).first;
240 
241  // --- Accumulate the energy (in MeV) of SIM hits in the same detector cell
242  (simHitIt->second).energy += convertUnitsTo(0.001_MeV, simHit.energyLoss());
243 
244  // --- Get the time of the first SIM hit in the cell
245  if ((simHitIt->second).time == 0 || simHit.tof() < (simHitIt->second).time) {
246  (simHitIt->second).time = simHit.tof();
247 
248  auto hit_pos = simHit.localPosition();
249  (simHitIt->second).x = hit_pos.x();
250  (simHitIt->second).y = hit_pos.y();
251  (simHitIt->second).z = hit_pos.z();
252  }
253 
254  } // simHit loop
255 
256  // --- Loop over the ELT RECO hits
257  unsigned int n_reco_etl[4] = {0, 0, 0, 0};
258  for (const auto& recHit : *etlRecHitsHandle) {
259  double weight = 1.0;
260  ETLDetId detId = recHit.id();
261  DetId geoId = detId.geographicalId();
262  const MTDGeomDet* thedet = geom->idToDet(geoId);
263  if (thedet == nullptr)
264  throw cms::Exception("EtlLocalRecoValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
265  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
266  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
267  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
268 
269  Local3DPoint local_point(topo.localX(recHit.row()), topo.localY(recHit.column()), 0.);
270  const auto& global_point = thedet->toGlobal(local_point);
271 
272  int idet = 999;
273 
274  if (topo1Dis) {
275  if (detId.zside() == -1) {
276  idet = 0;
277  } else if (detId.zside() == 1) {
278  idet = 2;
279  } else {
280  continue;
281  }
282  }
283 
284  if (topo2Dis) {
285  if (detId.discSide() == 1) {
286  weight = -weight;
287  }
288  if ((detId.zside() == -1) && (detId.nDisc() == 1)) {
289  idet = 0;
290  } else if ((detId.zside() == -1) && (detId.nDisc() == 2)) {
291  idet = 1;
292  } else if ((detId.zside() == 1) && (detId.nDisc() == 1)) {
293  idet = 2;
294  } else if ((detId.zside() == 1) && (detId.nDisc() == 2)) {
295  idet = 3;
296  } else {
297  continue;
298  }
299  }
300 
301  // --- Fill the histograms
302 
303  meHitEnergy_[idet]->Fill(recHit.energy());
304  meHitTime_[idet]->Fill(recHit.time());
305  meHitTimeError_[idet]->Fill(recHit.timeError());
306 
307  meOccupancy_[idet]->Fill(global_point.x(), global_point.y(), weight);
308 
309  if (optionalPlots_) {
310  if ((idet == 0) || (idet == 1)) {
311  meLocalOccupancy_[0]->Fill(local_point.x(), local_point.y());
312  meHitXlocal_[0]->Fill(local_point.x());
313  meHitYlocal_[0]->Fill(local_point.y());
314  }
315  if ((idet == 2) || (idet == 3)) {
316  meLocalOccupancy_[1]->Fill(local_point.x(), local_point.y());
317  meHitXlocal_[1]->Fill(local_point.x());
318  meHitYlocal_[1]->Fill(local_point.y());
319  }
320  }
321  meHitX_[idet]->Fill(global_point.x());
322  meHitY_[idet]->Fill(global_point.y());
323  meHitZ_[idet]->Fill(global_point.z());
324  meHitPhi_[idet]->Fill(global_point.phi());
325  meHitEta_[idet]->Fill(global_point.eta());
326  meHitTvsE_[idet]->Fill(recHit.energy(), recHit.time());
327  meHitEvsPhi_[idet]->Fill(global_point.phi(), recHit.energy());
328  meHitEvsEta_[idet]->Fill(global_point.eta(), recHit.energy());
329  meHitTvsPhi_[idet]->Fill(global_point.phi(), recHit.time());
330  meHitTvsEta_[idet]->Fill(global_point.eta(), recHit.time());
331 
332  // Resolution histograms
333  if (m_etlSimHits[idet].count(detId.rawId()) == 1) {
334  if ((topo1Dis && m_etlSimHits[idet][detId.rawId()].energy > hitMinEnergy1Dis_) ||
335  (topo2Dis && m_etlSimHits[idet][detId.rawId()].energy > hitMinEnergy2Dis_)) {
336  float time_res = recHit.time() - m_etlSimHits[idet][detId.rawId()].time;
337  float energy_res = recHit.energy() - m_etlSimHits[idet][detId.rawId()].energy;
338 
339  meTimeRes_->Fill(time_res);
340  meEnergyRes_->Fill(energy_res);
341 
342  meTPullvsEta_->Fill(std::abs(global_point.eta()), time_res / recHit.timeError());
343  meTPullvsE_->Fill(m_etlSimHits[idet][detId.rawId()].energy, time_res / recHit.timeError());
344  }
345  }
346 
347  n_reco_etl[idet]++;
348  } // recHit loop
349 
350  if (topo1Dis) {
351  meNhits_[0]->Fill(n_reco_etl[0]);
352  meNhits_[2]->Fill(n_reco_etl[2]);
353  }
354 
355  if (topo2Dis) {
356  for (int i = 0; i < 4; i++) {
357  meNhits_[i]->Fill(n_reco_etl[i]);
358  }
359  }
360 
361  // --- Loop over the ETL RECO clusters ---
362  for (const auto& DetSetClu : *etlRecCluHandle) {
363  for (const auto& cluster : DetSetClu) {
364  double weight = 1.0;
365  if (topo1Dis) {
366  if (cluster.energy() < hitMinEnergy1Dis_)
367  continue;
368  }
369  if (topo2Dis) {
370  if (cluster.energy() < hitMinEnergy2Dis_)
371  continue;
372  }
373  ETLDetId cluId = cluster.id();
374  DetId detIdObject(cluId);
375  const auto& genericDet = geom->idToDetUnit(detIdObject);
376  if (genericDet == nullptr) {
377  throw cms::Exception("EtlLocalRecoValidation")
378  << "GeographicalID: " << std::hex << cluId << " is invalid!" << std::dec << std::endl;
379  }
380 
381  MTDClusterParameterEstimator::ReturnType tuple = cpe.getParameters(cluster, *genericDet);
382 
383  // --- Cluster position in the module reference frame
384  LocalPoint local_point(std::get<0>(tuple));
385  const auto& global_point = genericDet->toGlobal(local_point);
386 
387  int idet = 999;
388 
389  if (topo1Dis) {
390  if (cluId.zside() == -1) {
391  idet = 0;
392  } else if (cluId.zside() == 1) {
393  idet = 2;
394  } else {
395  continue;
396  }
397  }
398 
399  if (topo2Dis) {
400  if (cluId.discSide() == 1) {
401  weight = -weight;
402  }
403  if ((cluId.zside() == -1) && (cluId.nDisc() == 1)) {
404  idet = 0;
405  } else if ((cluId.zside() == -1) && (cluId.nDisc() == 2)) {
406  idet = 1;
407  } else if ((cluId.zside() == 1) && (cluId.nDisc() == 1)) {
408  idet = 2;
409  } else if ((cluId.zside() == 1) && (cluId.nDisc() == 2)) {
410  idet = 3;
411  } else {
412  continue;
413  }
414  }
415 
416  meCluEnergy_[idet]->Fill(cluster.energy());
417  meCluTime_[idet]->Fill(cluster.time());
418  meCluTimeError_[idet]->Fill(cluster.timeError());
419  meCluPhi_[idet]->Fill(global_point.phi());
420  meCluEta_[idet]->Fill(global_point.eta());
421  meCluOccupancy_[idet]->Fill(global_point.x(), global_point.y(), weight);
422  meCluHits_[idet]->Fill(cluster.size());
423 
424  // --- Get the SIM hits associated to the cluster and calculate
425  // the cluster SIM energy, time and position
426 
427  double cluEneSIM = 0.;
428  double cluTimeSIM = 0.;
429  double cluLocXSIM = 0.;
430  double cluLocYSIM = 0.;
431  double cluLocZSIM = 0.;
432 
433  for (int ihit = 0; ihit < cluster.size(); ++ihit) {
434  int hit_row = cluster.minHitRow() + cluster.hitOffset()[ihit * 2];
435  int hit_col = cluster.minHitCol() + cluster.hitOffset()[ihit * 2 + 1];
436 
437  // Match the RECO hit to the corresponding SIM hit
438  for (const auto& recHit : *etlRecHitsHandle) {
439  ETLDetId hitId(recHit.id().rawId());
440 
441  if (m_etlSimHits[idet].count(hitId.rawId()) == 0)
442  continue;
443 
444  // Check the hit position
445  if (hitId.zside() != cluId.zside() || hitId.mtdRR() != cluId.mtdRR() || hitId.module() != cluId.module() ||
446  recHit.row() != hit_row || recHit.column() != hit_col)
447  continue;
448 
449  // Check the hit energy and time
450  if (recHit.energy() != cluster.hitENERGY()[ihit] || recHit.time() != cluster.hitTIME()[ihit])
451  continue;
452 
453  // SIM hit's position in the module reference frame
454  Local3DPoint local_point_sim(convertMmToCm(m_etlSimHits[idet][recHit.id().rawId()].x),
455  convertMmToCm(m_etlSimHits[idet][recHit.id().rawId()].y),
456  convertMmToCm(m_etlSimHits[idet][recHit.id().rawId()].z));
457 
458  // Calculate the SIM cluster's position in the module reference frame
459  cluLocXSIM += local_point_sim.x() * m_etlSimHits[idet][recHit.id().rawId()].energy;
460  cluLocYSIM += local_point_sim.y() * m_etlSimHits[idet][recHit.id().rawId()].energy;
461  cluLocZSIM += local_point_sim.z() * m_etlSimHits[idet][recHit.id().rawId()].energy;
462 
463  // Calculate the SIM cluster energy and time
464  cluEneSIM += m_etlSimHits[idet][recHit.id().rawId()].energy;
465  cluTimeSIM += m_etlSimHits[idet][recHit.id().rawId()].time * m_etlSimHits[idet][recHit.id().rawId()].energy;
466 
467  break;
468 
469  } // recHit loop
470 
471  } // ihit loop
472 
473  // Find the MTDTrackingRecHit corresponding to the cluster
474  MTDTrackingRecHit* comp(nullptr);
475  bool matchClu = false;
476  const auto& trkHits = (*mtdTrkHitHandle)[detIdObject];
477  for (const auto& trkHit : trkHits) {
478  if (isSameCluster(trkHit.mtdCluster(), cluster)) {
479  comp = trkHit.clone();
480  matchClu = true;
481  break;
482  }
483  }
484  if (!matchClu) {
485  edm::LogWarning("BtlLocalRecoValidation")
486  << "No valid TrackingRecHit corresponding to cluster, detId = " << detIdObject.rawId();
487  }
488 
489  // --- Fill the cluster resolution histograms
490  int iside = (cluId.zside() == -1 ? 0 : 1);
491  if (cluTimeSIM > 0. && cluEneSIM > 0.) {
492  cluTimeSIM /= cluEneSIM;
493 
494  Local3DPoint cluLocalPosSIM(cluLocXSIM / cluEneSIM, cluLocYSIM / cluEneSIM, cluLocZSIM / cluEneSIM);
495  const auto& cluGlobalPosSIM = genericDet->toGlobal(cluLocalPosSIM);
496 
497  float time_res = cluster.time() - cluTimeSIM;
498  float energy_res = cluster.energy() - cluEneSIM;
499  float x_res = global_point.x() - cluGlobalPosSIM.x();
500  float y_res = global_point.y() - cluGlobalPosSIM.y();
501  float z_res = global_point.z() - cluGlobalPosSIM.z();
502 
503  meCluTimeRes_[iside]->Fill(time_res);
504  meCluEnergyRes_[iside]->Fill(energy_res);
505  meCluXRes_[iside]->Fill(x_res);
506  meCluYRes_[iside]->Fill(y_res);
507  meCluZRes_[iside]->Fill(z_res);
508 
509  meCluTPullvsEta_[iside]->Fill(cluGlobalPosSIM.eta(), time_res / cluster.timeError());
510  meCluTPullvsE_[iside]->Fill(cluEneSIM, time_res / cluster.timeError());
511 
512  if (optionalPlots_) {
513  if (matchClu && comp != nullptr) {
514  meCluXPull_[iside]->Fill(x_res / std::sqrt(comp->globalPositionError().cxx()));
515  meCluYPull_[iside]->Fill(y_res / std::sqrt(comp->globalPositionError().cyy()));
516  meCluXLocalErr_[iside]->Fill(std::sqrt(comp->localPositionError().xx()));
517  meCluYLocalErr_[iside]->Fill(std::sqrt(comp->localPositionError().yy()));
518  }
519  meCluYXLocal_[iside]->Fill(local_point.x(), local_point.y());
520  meCluYXLocalSim_[iside]->Fill(cluLocalPosSIM.x(), cluLocalPosSIM.y());
521  }
522 
523  } // if ( cluTimeSIM > 0. && cluEneSIM > 0. )
524  else {
525  meUnmatchedCluEnergy_[iside]->Fill(std::log10(cluster.energy()));
526  }
527 
528  } // cluster loop
529 
530  } // DetSetClu loop
531 
532  // --- Loop over the ETL Uncalibrated RECO hits
533  if (uncalibRecHitsPlots_) {
534  auto etlUncalibRecHitsHandle = makeValid(iEvent.getHandle(etlUncalibRecHitsToken_));
535 
536  for (const auto& uRecHit : *etlUncalibRecHitsHandle) {
537  ETLDetId detId = uRecHit.id();
538 
539  int idet = detId.zside() + detId.nDisc();
540 
541  // --- Skip UncalibratedRecHits not matched to SimHits
542  if (m_etlSimHits[idet].count(detId.rawId()) != 1)
543  continue;
544 
545  DetId geoId = detId.geographicalId();
546  const MTDGeomDet* thedet = geom->idToDet(geoId);
547  if (thedet == nullptr)
548  throw cms::Exception("EtlLocalRecoValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
549  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
550 
551  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
552  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
553 
554  Local3DPoint local_point(topo.localX(uRecHit.row()), topo.localY(uRecHit.column()), 0.);
555  const auto& global_point = thedet->toGlobal(local_point);
556 
557  // --- Fill the histograms
558 
559  if (uRecHit.amplitude().first < hitMinAmplitude_)
560  continue;
561 
562  float time_res = uRecHit.time().first - m_etlSimHits[idet][detId.rawId()].time;
563 
564  int iside = (detId.zside() == -1 ? 0 : 1);
565 
566  // amplitude histograms
567 
568  int qBin = (int)(uRecHit.amplitude().first / binWidthQ_);
569  if (qBin > nBinsQ_ - 1)
570  qBin = nBinsQ_ - 1;
571 
572  meTimeResQ_[iside][qBin]->Fill(time_res);
573 
574  // eta histograms
575 
576  int etaBin = (int)((fabs(global_point.eta()) - etaMin_) / binWidthEta_);
577  if (etaBin < 0)
578  etaBin = 0;
579  else if (etaBin > nBinsEta_ - 1)
580  etaBin = nBinsEta_ - 1;
581 
582  meTimeResEta_[iside][etaBin]->Fill(time_res);
583 
584  } // uRecHit loop
585  }
586 }
587 
588 // ------------ method for histogram booking ------------
590  edm::Run const& run,
591  edm::EventSetup const& iSetup) {
592  ibook.setCurrentFolder(folder_);
593 
594  // --- histograms booking
595 
596  meNhits_[0] = ibook.book1D(
597  "EtlNhitsZnegD1", "Number of ETL RECO hits (-Z, Single(topo1D)/First(topo2D) disk);N_{RECO}", 100, 0., 5000.);
598  meNhits_[1] = ibook.book1D("EtlNhitsZnegD2", "Number of ETL RECO hits (-Z, Second disk);N_{RECO}", 100, 0., 5000.);
599  meNhits_[2] = ibook.book1D(
600  "EtlNhitsZposD1", "Number of ETL RECO hits (+Z, Single(topo1D)/First(topo2D) disk);N_{RECO}", 100, 0., 5000.);
601  meNhits_[3] = ibook.book1D("EtlNhitsZposD2", "Number of ETL RECO hits (+Z, Second disk);N_{RECO}", 100, 0., 5000.);
602  meHitEnergy_[0] = ibook.book1D(
603  "EtlHitEnergyZnegD1", "ETL RECO hits energy (-Z, Single(topo1D)/First(topo2D) disk);E_{RECO} [MeV]", 100, 0., 3.);
604  meHitEnergy_[1] =
605  ibook.book1D("EtlHitEnergyZnegD2", "ETL RECO hits energy (-Z, Second disk);E_{RECO} [MeV]", 100, 0., 3.);
606  meHitEnergy_[2] = ibook.book1D(
607  "EtlHitEnergyZposD1", "ETL RECO hits energy (+Z, Single(topo1D)/First(topo2D) disk);E_{RECO} [MeV]", 100, 0., 3.);
608  meHitEnergy_[3] =
609  ibook.book1D("EtlHitEnergyZposD2", "ETL RECO hits energy (+Z, Second disk);E_{RECO} [MeV]", 100, 0., 3.);
610  meHitTime_[0] = ibook.book1D(
611  "EtlHitTimeZnegD1", "ETL RECO hits ToA (-Z, Single(topo1D)/First(topo2D) disk);ToA_{RECO} [ns]", 100, 0., 25.);
612  meHitTime_[1] = ibook.book1D("EtlHitTimeZnegD2", "ETL RECO hits ToA (-Z, Second disk);ToA_{RECO} [ns]", 100, 0., 25.);
613  meHitTime_[2] = ibook.book1D(
614  "EtlHitTimeZposD1", "ETL RECO hits ToA (+Z, Single(topo1D)/First(topo2D) disk);ToA_{RECO} [ns]", 100, 0., 25.);
615  meHitTime_[3] = ibook.book1D("EtlHitTimeZposD2", "ETL RECO hits ToA (+Z, Second disk);ToA_{RECO} [ns]", 100, 0., 25.);
616  meHitTimeError_[0] =
617  ibook.book1D("EtlHitTimeErrorZnegD1",
618  "ETL RECO hits ToA error (-Z, Single(topo1D)/First(topo2D) disk);#sigma^{ToA}_{RECO} [ns]",
619  50,
620  0.,
621  0.1);
622  meHitTimeError_[1] = ibook.book1D(
623  "EtlHitTimeErrorZnegD2", "ETL RECO hits ToA error(-Z, Second disk);#sigma^{ToA}_{RECO} [ns]", 50, 0., 0.1);
624  meHitTimeError_[2] =
625  ibook.book1D("EtlHitTimeErrorZposD1",
626  "ETL RECO hits ToA error (+Z, Single(topo1D)/First(topo2D) disk);#sigma^{ToA}_{RECO} [ns]",
627  50,
628  0.,
629  0.1);
630  meHitTimeError_[3] = ibook.book1D(
631  "EtlHitTimeErrorZposD2", "ETL RECO hits ToA error(+Z, Second disk);#sigma^{ToA}_{RECO} [ns]", 50, 0., 0.1);
632 
633  meOccupancy_[0] =
634  ibook.book2D("EtlOccupancyZnegD1",
635  "ETL RECO hits occupancy (-Z, Single(topo1D)/First(topo2D) disk);X_{RECO} [cm];Y_{RECO} [cm]",
636  135,
637  -135.,
638  135.,
639  135,
640  -135.,
641  135.);
642  meOccupancy_[1] = ibook.book2D("EtlOccupancyZnegD2",
643  "ETL RECO hits occupancy (-Z, Second disk);X_{RECO} [cm];Y_{RECO} [cm]",
644  135,
645  -135.,
646  135.,
647  135,
648  -135.,
649  135.);
650  meOccupancy_[2] =
651  ibook.book2D("EtlOccupancyZposD1",
652  "ETL RECO hits occupancy (+Z, Single(topo1D)/First(topo2D) disk);X_{RECO} [cm];Y_{RECO} [cm]",
653  135,
654  -135.,
655  135.,
656  135,
657  -135.,
658  135.);
659  meOccupancy_[3] = ibook.book2D("EtlOccupancyZposD2",
660  "ETL RECO hits occupancy (+Z, Second disk);X_{RECO} [cm];Y_{RECO} [cm]",
661  135,
662  -135.,
663  135.,
664  135,
665  -135.,
666  135.);
667  if (optionalPlots_) {
668  meLocalOccupancy_[0] = ibook.book2D("EtlLocalOccupancyZneg",
669  "ETL RECO hits local occupancy (-Z);X_{RECO} [cm];Y_{RECO} [cm]",
670  100,
671  -2.2,
672  2.2,
673  50,
674  -1.1,
675  1.1);
676  meLocalOccupancy_[1] = ibook.book2D("EtlLocalOccupancyZpos",
677  "ETL RECO hits local occupancy (+Z);X_{RECO} [cm];Y_{RECO} [cm]",
678  100,
679  -2.2,
680  2.2,
681  50,
682  -1.1,
683  1.1);
684  meHitXlocal_[0] = ibook.book1D("EtlHitXlocalZneg", "ETL RECO local X (-Z);X_{RECO}^{LOC} [cm]", 100, -2.2, 2.2);
685  meHitXlocal_[1] = ibook.book1D("EtlHitXlocalZpos", "ETL RECO local X (+Z);X_{RECO}^{LOC} [cm]", 100, -2.2, 2.2);
686  meHitYlocal_[0] = ibook.book1D("EtlHitYlocalZneg", "ETL RECO local Y (-Z);Y_{RECO}^{LOC} [cm]", 50, -1.1, 1.1);
687  meHitYlocal_[1] = ibook.book1D("EtlHitYlocalZpos", "ETL RECO local Y (-Z);Y_{RECO}^{LOC} [cm]", 50, -1.1, 1.1);
688  }
689  meHitX_[0] = ibook.book1D(
690  "EtlHitXZnegD1", "ETL RECO hits X (-Z, Single(topo1D)/First(topo2D) Disk);X_{RECO} [cm]", 100, -130., 130.);
691  meHitX_[1] = ibook.book1D("EtlHitXZnegD2", "ETL RECO hits X (-Z, Second Disk);X_{RECO} [cm]", 100, -130., 130.);
692  meHitX_[2] = ibook.book1D(
693  "EtlHitXZposD1", "ETL RECO hits X (+Z, Single(topo1D)/First(topo2D) Disk);X_{RECO} [cm]", 100, -130., 130.);
694  meHitX_[3] = ibook.book1D("EtlHitXZposD2", "ETL RECO hits X (+Z, Second Disk);X_{RECO} [cm]", 100, -130., 130.);
695  meHitY_[0] = ibook.book1D(
696  "EtlHitYZnegD1", "ETL RECO hits Y (-Z, Single(topo1D)/First(topo2D) Disk);Y_{RECO} [cm]", 100, -130., 130.);
697  meHitY_[1] = ibook.book1D("EtlHitYZnegD2", "ETL RECO hits Y (-Z, Second Disk);Y_{RECO} [cm]", 100, -130., 130.);
698  meHitY_[2] = ibook.book1D(
699  "EtlHitYZposD1", "ETL RECO hits Y (+Z, Single(topo1D)/First(topo2D) Disk);Y_{RECO} [cm]", 100, -130., 130.);
700  meHitY_[3] = ibook.book1D("EtlHitYZposD2", "ETL RECO hits Y (+Z, Second Disk);Y_{RECO} [cm]", 100, -130., 130.);
701  meHitZ_[0] = ibook.book1D(
702  "EtlHitZZnegD1", "ETL RECO hits Z (-Z, Single(topo1D)/First(topo2D) Disk);Z_{RECO} [cm]", 100, -302., -298.);
703  meHitZ_[1] = ibook.book1D("EtlHitZZnegD2", "ETL RECO hits Z (-Z, Second Disk);Z_{RECO} [cm]", 100, -304., -300.);
704  meHitZ_[2] = ibook.book1D(
705  "EtlHitZZposD1", "ETL RECO hits Z (+Z, Single(topo1D)/First(topo2D) Disk);Z_{RECO} [cm]", 100, 298., 302.);
706  meHitZ_[3] = ibook.book1D("EtlHitZZposD2", "ETL RECO hits Z (+Z, Second Disk);Z_{RECO} [cm]", 100, 300., 304.);
707  meHitPhi_[0] = ibook.book1D(
708  "EtlHitPhiZnegD1", "ETL RECO hits #phi (-Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad]", 100, -3.2, 3.2);
709  meHitPhi_[1] =
710  ibook.book1D("EtlHitPhiZnegD2", "ETL RECO hits #phi (-Z, Second Disk);#phi_{RECO} [rad]", 100, -3.2, 3.2);
711  meHitPhi_[2] = ibook.book1D(
712  "EtlHitPhiZposD1", "ETL RECO hits #phi (+Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad]", 100, -3.2, 3.2);
713  meHitPhi_[3] =
714  ibook.book1D("EtlHitPhiZposD2", "ETL RECO hits #phi (+Z, Second Disk);#phi_{RECO} [rad]", 100, -3.2, 3.2);
715  meHitEta_[0] = ibook.book1D(
716  "EtlHitEtaZnegD1", "ETL RECO hits #eta (-Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO}", 100, -3.2, -1.56);
717  meHitEta_[1] = ibook.book1D("EtlHitEtaZnegD2", "ETL RECO hits #eta (-Z, Second Disk);#eta_{RECO}", 100, -3.2, -1.56);
718  meHitEta_[2] = ibook.book1D(
719  "EtlHitEtaZposD1", "ETL RECO hits #eta (+Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO}", 100, 1.56, 3.2);
720  meHitEta_[3] = ibook.book1D("EtlHitEtaZposD2", "ETL RECO hits #eta (+Z, Second Disk);#eta_{RECO}", 100, 1.56, 3.2);
721  meTimeRes_ = ibook.book1D("EtlTimeRes", "ETL time resolution;T_{RECO}-T_{SIM}", 100, -0.5, 0.5);
722  meEnergyRes_ = ibook.book1D("EtlEnergyRes", "ETL energy resolution;E_{RECO}-E_{SIM}", 100, -0.5, 0.5);
723  meHitTvsE_[0] = ibook.bookProfile(
724  "EtlHitTvsEZnegD1",
725  "ETL RECO time vs energy (-Z, Single(topo1D)/First(topo2D) Disk);E_{RECO} [MeV];ToA_{RECO} [ns]",
726  50,
727  0.,
728  2.,
729  0.,
730  100.);
731  meHitTvsE_[1] = ibook.bookProfile("EtlHitTvsEZnegD2",
732  "ETL RECO time vs energy (-Z, Second Disk);E_{RECO} [MeV];ToA_{RECO} [ns]",
733  50,
734  0.,
735  2.,
736  0.,
737  100.);
738  meHitTvsE_[2] = ibook.bookProfile(
739  "EtlHitTvsEZposD1",
740  "ETL RECO time vs energy (+Z, Single(topo1D)/First(topo2D) Disk);E_{RECO} [MeV];ToA_{RECO} [ns]",
741  50,
742  0.,
743  2.,
744  0.,
745  100.);
746  meHitTvsE_[3] = ibook.bookProfile("EtlHitTvsEZposD2",
747  "ETL RECO time vs energy (+Z, Second Disk);E_{RECO} [MeV];ToA_{RECO} [ns]",
748  50,
749  0.,
750  2.,
751  0.,
752  100.);
753  meHitEvsPhi_[0] = ibook.bookProfile(
754  "EtlHitEvsPhiZnegD1",
755  "ETL RECO energy vs #phi (-Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad];E_{RECO} [MeV]",
756  50,
757  -3.2,
758  3.2,
759  0.,
760  100.);
761  meHitEvsPhi_[1] = ibook.bookProfile("EtlHitEvsPhiZnegD2",
762  "ETL RECO energy vs #phi (-Z, Second Disk);#phi_{RECO} [rad];E_{RECO} [MeV]",
763  50,
764  -3.2,
765  3.2,
766  0.,
767  100.);
768  meHitEvsPhi_[2] = ibook.bookProfile(
769  "EtlHitEvsPhiZposD1",
770  "ETL RECO energy vs #phi (+Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad];E_{RECO} [MeV]",
771  50,
772  -3.2,
773  3.2,
774  0.,
775  100.);
776  meHitEvsPhi_[3] = ibook.bookProfile("EtlHitEvsPhiZposD2",
777  "ETL RECO energy vs #phi (+Z, Second Disk);#phi_{RECO} [rad];E_{RECO} [MeV]",
778  50,
779  -3.2,
780  3.2,
781  0.,
782  100.);
783  meHitEvsEta_[0] =
784  ibook.bookProfile("EtlHitEvsEtaZnegD1",
785  "ETL RECO energy vs #eta (-Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO};E_{RECO} [MeV]",
786  50,
787  -3.2,
788  -1.56,
789  0.,
790  100.);
791  meHitEvsEta_[1] = ibook.bookProfile("EtlHitEvsEtaZnegD2",
792  "ETL RECO energy vs #eta (-Z, Second Disk);#eta_{RECO};E_{RECO} [MeV]",
793  50,
794  -3.2,
795  -1.56,
796  0.,
797  100.);
798  meHitEvsEta_[2] =
799  ibook.bookProfile("EtlHitEvsEtaZposD1",
800  "ETL RECO energy vs #eta (+Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO};E_{RECO} [MeV]",
801  50,
802  1.56,
803  3.2,
804  0.,
805  100.);
806  meHitEvsEta_[3] = ibook.bookProfile("EtlHitEvsEtaZposD2",
807  "ETL RECO energy vs #eta (+Z, Second Disk);#eta_{RECO};E_{RECO} [MeV]",
808  50,
809  1.56,
810  3.2,
811  0.,
812  100.);
813  meHitTvsPhi_[0] = ibook.bookProfile(
814  "EtlHitTvsPhiZnegD1",
815  "ETL RECO time vs #phi (-Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad];ToA_{RECO} [ns]",
816  50,
817  -3.2,
818  3.2,
819  0.,
820  100.);
821  meHitTvsPhi_[1] = ibook.bookProfile("EtlHitTvsPhiZnegD2",
822  "ETL RECO time vs #phi (-Z, Second Disk);#phi_{RECO} [rad];ToA_{RECO} [ns]",
823  50,
824  -3.2,
825  3.2,
826  0.,
827  100.);
828  meHitTvsPhi_[2] = ibook.bookProfile(
829  "EtlHitTvsPhiZposD1",
830  "ETL RECO time vs #phi (+Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad];ToA_{RECO} [ns]",
831  50,
832  -3.2,
833  3.2,
834  0.,
835  100.);
836  meHitTvsPhi_[3] = ibook.bookProfile("EtlHitTvsPhiZposD2",
837  "ETL RECO time vs #phi (+Z, Second Disk);#phi_{RECO} [rad];ToA_{RECO} [ns]",
838  50,
839  -3.2,
840  3.2,
841  0.,
842  100.);
843  meHitTvsEta_[0] =
844  ibook.bookProfile("EtlHitTvsEtaZnegD1",
845  "ETL RECO time vs #eta (-Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO};ToA_{RECO} [ns]",
846  50,
847  -3.2,
848  -1.56,
849  0.,
850  100.);
851  meHitTvsEta_[1] = ibook.bookProfile("EtlHitTvsEtaZnegD2",
852  "ETL RECO time vs #eta (-Z, Second Disk);#eta_{RECO};ToA_{RECO} [ns]",
853  50,
854  -3.2,
855  -1.56,
856  0.,
857  100.);
858  meHitTvsEta_[2] =
859  ibook.bookProfile("EtlHitTvsEtaZposD1",
860  "ETL RECO time vs #eta (+Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO};ToA_{RECO} [ns]",
861  50,
862  1.56,
863  3.2,
864  0.,
865  100.);
866  meHitTvsEta_[3] = ibook.bookProfile("EtlHitTvsEtaZposD2",
867  "ETL RECO time vs #eta (+Z, Second Disk);#eta_{RECO};ToA_{RECO} [ns]",
868  50,
869  1.56,
870  3.2,
871  0.,
872  100.);
873  meTPullvsE_ = ibook.bookProfile(
874  "EtlTPullvsE", "ETL time pull vs E;E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}", 20, 0., 2., -5., 5., "S");
875  meTPullvsEta_ = ibook.bookProfile("EtlTPullvsEta",
876  "ETL time pull vs #eta;|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
877  26,
878  1.65,
879  3.0,
880  -5.,
881  5.,
882  "S");
883  meCluTime_[0] =
884  ibook.book1D("EtlCluTimeZnegD1", "ETL cluster ToA (-Z, Single(topo1D)/First(topo2D) Disk);ToA [ns]", 250, 0, 25);
885  meCluTime_[1] = ibook.book1D("EtlCluTimeZnegD2", "ETL cluster ToA (-Z, Second Disk);ToA [ns]", 250, 0, 25);
886  meCluTime_[2] =
887  ibook.book1D("EtlCluTimeZposD1", "ETL cluster ToA (+Z, Single(topo1D)/First(topo2D) Disk);ToA [ns]", 250, 0, 25);
888  meCluTime_[3] = ibook.book1D("EtlCluTimeZposD2", "ETL cluster ToA (+Z, Second Disk);ToA [ns]", 250, 0, 25);
889  meCluTimeError_[0] = ibook.book1D("EtlCluTimeErrosZnegD1",
890  "ETL cluster time error (-Z, Single(topo1D)/First(topo2D) Disk);#sigma_{t} [ns]",
891  100,
892  0,
893  0.1);
894  meCluTimeError_[1] =
895  ibook.book1D("EtlCluTimeErrorZnegD2", "ETL cluster time error (-Z, Second Disk);#sigma_{t} [ns]", 100, 0, 0.1);
896  meCluTimeError_[2] = ibook.book1D("EtlCluTimeErrorZposD1",
897  "ETL cluster time error (+Z, Single(topo1D)/First(topo2D) Disk);#sigma_{t} [ns]",
898  100,
899  0,
900  0.1);
901  meCluTimeError_[3] =
902  ibook.book1D("EtlCluTimeErrorZposD2", "ETL cluster time error (+Z, Second Disk);#sigma_{t} [ns]", 100, 0, 0.1);
903  meCluEnergy_[0] = ibook.book1D(
904  "EtlCluEnergyZnegD1", "ETL cluster energy (-Z, Single(topo1D)/First(topo2D) Disk);E_{RECO} [MeV]", 100, 0, 10);
905  meCluEnergy_[1] =
906  ibook.book1D("EtlCluEnergyZnegD2", "ETL cluster energy (-Z, Second Disk);E_{RECO} [MeV]", 100, 0, 10);
907  meCluEnergy_[2] = ibook.book1D(
908  "EtlCluEnergyZposD1", "ETL cluster energy (+Z, Single(topo1D)/First(topo2D) Disk);E_{RECO} [MeV]", 100, 0, 10);
909  meCluEnergy_[3] =
910  ibook.book1D("EtlCluEnergyZposD2", "ETL cluster energy (+Z, Second Disk);E_{RECO} [MeV]", 100, 0, 10);
911  meCluPhi_[0] = ibook.book1D(
912  "EtlCluPhiZnegD1", "ETL cluster #phi (-Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad]", 126, -3.2, 3.2);
913  meCluPhi_[1] =
914  ibook.book1D("EtlCluPhiZnegD2", "ETL cluster #phi (-Z, Second Disk);#phi_{RECO} [rad]", 126, -3.2, 3.2);
915  meCluPhi_[2] = ibook.book1D(
916  "EtlCluPhiZposD1", "ETL cluster #phi (+Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad]", 126, -3.2, 3.2);
917  meCluPhi_[3] =
918  ibook.book1D("EtlCluPhiZposD2", "ETL cluster #phi (+Z, Second Disk);#phi_{RECO} [rad]", 126, -3.2, 3.2);
919  meCluEta_[0] = ibook.book1D(
920  "EtlCluEtaZnegD1", "ETL cluster #eta (-Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO}", 100, -3.2, -1.4);
921  meCluEta_[1] = ibook.book1D("EtlCluEtaZnegD2", "ETL cluster #eta (-Z, Second Disk);#eta_{RECO}", 100, -3.2, -1.4);
922  meCluEta_[2] = ibook.book1D(
923  "EtlCluEtaZposD1", "ETL cluster #eta (+Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO}", 100, 1.4, 3.2);
924  meCluEta_[3] = ibook.book1D("EtlCluEtaZposD2", "ETL cluster #eta (+Z, Second Disk);#eta_{RECO}", 100, 1.4, 3.2);
925  meCluHits_[0] = ibook.book1D(
926  "EtlCluHitNumberZnegD1", "ETL hits per cluster (-Z, Single(topo1D)/First(topo2D) Disk);Cluster size", 10, 0, 10);
927  meCluHits_[1] =
928  ibook.book1D("EtlCluHitNumberZnegD2", "ETL hits per cluster (-Z, Second Disk);Cluster size", 10, 0, 10);
929  meCluHits_[2] = ibook.book1D(
930  "EtlCluHitNumberZposD1", "ETL hits per cluster (+Z, Single(topo1D)/First(topo2D) Disk);Cluster size", 10, 0, 10);
931  meCluHits_[3] =
932  ibook.book1D("EtlCluHitNumberZposD2", "ETL hits per cluster (+Z, Second Disk);Cluster size", 10, 0, 10);
933  meCluOccupancy_[0] =
934  ibook.book2D("EtlCluOccupancyZnegD1",
935  "ETL cluster X vs Y (-Z, Single(topo1D)/First(topo2D) Disk);X_{RECO} [cm]; Y_{RECO} [cm]",
936  100,
937  -150.,
938  150.,
939  100,
940  -150,
941  150);
942  meCluOccupancy_[1] = ibook.book2D("EtlCluOccupancyZnegD2",
943  "ETL cluster X vs Y (-Z, Second Disk);X_{RECO} [cm]; Y_{RECO} [cm]",
944  100,
945  -150.,
946  150.,
947  100,
948  -150,
949  150);
950  meCluOccupancy_[2] =
951  ibook.book2D("EtlCluOccupancyZposD1",
952  "ETL cluster X vs Y (+Z, Single(topo1D)/First(topo2D) Disk);X_{RECO} [cm]; Y_{RECO} [cm]",
953  100,
954  -150.,
955  150.,
956  100,
957  -150,
958  150);
959  meCluOccupancy_[3] = ibook.book2D("EtlCluOccupancyZposD2",
960  "ETL cluster X vs Y (+Z, Second Disk);X_{RECO} [cm]; Y_{RECO} [cm]",
961  100,
962  -150.,
963  150.,
964  100,
965  -150,
966  150);
967 
968  meCluTimeRes_[0] =
969  ibook.book1D("EtlCluTimeResZneg", "ETL cluster time resolution (-Z);T_{RECO}-T_{SIM} [ns]", 100, -0.5, 0.5);
970  meCluTimeRes_[1] =
971  ibook.book1D("EtlCluTimeResZpos", "ETL cluster time resolution (+Z);T_{RECO}-T_{SIM} [MeV]", 100, -0.5, 0.5);
972  meCluEnergyRes_[0] =
973  ibook.book1D("EtlCluEnergyResZneg", "ETL cluster energy resolution (-Z);E_{RECO}-E_{SIM}", 100, -0.5, 0.5);
974  meCluEnergyRes_[1] =
975  ibook.book1D("EtlCluEnergyResZpos", "ETL cluster energy resolution (+Z);E_{RECO}-E_{SIM}", 100, -0.5, 0.5);
976 
977  meCluTPullvsE_[0] =
978  ibook.bookProfile("EtlCluTPullvsEZneg",
979  "ETL cluster time pull vs E (-Z);E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
980  25,
981  0.,
982  0.5,
983  -5.,
984  5.,
985  "S");
986  meCluTPullvsE_[1] =
987  ibook.bookProfile("EtlCluTPullvsEZpos",
988  "ETL cluster time pull vs E (+Z);E_{SIM} [MeV];(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
989  25,
990  0.,
991  0.5,
992  -5.,
993  5.,
994  "S");
995  meCluTPullvsEta_[0] =
996  ibook.bookProfile("EtlCluTPullvsEtaZneg",
997  "ETL cluster time pull vs #eta (-Z);|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
998  30,
999  -3.,
1000  -1.65,
1001  -5.,
1002  5.,
1003  "S");
1004  meCluTPullvsEta_[1] =
1005  ibook.bookProfile("EtlCluTPullvsEtaZpos",
1006  "ETL cluster time pull vs #eta (+Z);|#eta_{RECO}|;(T_{RECO}-T_{SIM})/#sigma_{T_{RECO}}",
1007  30,
1008  1.65,
1009  3.,
1010  -5.,
1011  5.,
1012  "S");
1013  meCluXRes_[0] = ibook.book1D("EtlCluXResZneg", "ETL cluster X resolution (-Z);X_{RECO}-X_{SIM} [cm]", 100, -0.1, 0.1);
1014  meCluXRes_[1] = ibook.book1D("EtlCluXResZpos", "ETL cluster X resolution (+Z);X_{RECO}-X_{SIM} [cm]", 100, -0.1, 0.1);
1015  meCluYRes_[0] = ibook.book1D("EtlCluYResZneg", "ETL cluster Y resolution (-Z);Y_{RECO}-Y_{SIM} [cm]", 100, -0.1, 0.1);
1016  meCluYRes_[1] = ibook.book1D("EtlCluYResZpos", "ETL cluster Y resolution (+Z);Y_{RECO}-Y_{SIM} [cm]", 100, -0.1, 0.1);
1017  meCluZRes_[0] =
1018  ibook.book1D("EtlCluZResZneg", "ETL cluster Z resolution (-Z);Z_{RECO}-Z_{SIM} [cm]", 100, -0.003, 0.003);
1019  meCluZRes_[1] =
1020  ibook.book1D("EtlCluZResZpos", "ETL cluster Z resolution (+Z);Z_{RECO}-Z_{SIM} [cm]", 100, -0.003, 0.003);
1021  if (optionalPlots_) {
1022  meCluXPull_[0] =
1023  ibook.book1D("EtlCluXPullZneg", "ETL cluster X pull (-Z);X_{RECO}-X_{SIM}/sigmaX_[RECO] [cm]", 100, -5., 5.);
1024  meCluXPull_[1] =
1025  ibook.book1D("EtlCluXPullZpos", "ETL cluster X pull (+Z);X_{RECO}-X_{SIM}/sigmaX_[RECO] [cm]", 100, -5., 5.);
1026  meCluYPull_[0] =
1027  ibook.book1D("EtlCluYPullZneg", "ETL cluster Y pull (-Z);Y_{RECO}-Y_{SIM}/sigmaY_[RECO] [cm]", 100, -5., 5.);
1028  meCluYPull_[1] =
1029  ibook.book1D("EtlCluYPullZpos", "ETL cluster Y pull (+Z);Y_{RECO}-Y_{SIM}/sigmaY_[RECO] [cm]", 100, -5., 5.);
1030  meCluYXLocal_[0] = ibook.book2D("EtlCluYXLocalZneg",
1031  "ETL cluster local Y vs X (-Z);X^{local}_{RECO} [cm];Y^{local}_{RECO} [cm]",
1032  100,
1033  -2.2,
1034  2.2,
1035  100,
1036  -1.1,
1037  1.1);
1038  meCluYXLocal_[1] = ibook.book2D("EtlCluYXLocalZpos",
1039  "ETL cluster local Y vs X (+Z);X^{local}_{RECO} [cm];Y^{local}_{RECO} [cm]",
1040  100,
1041  -2.2,
1042  2.2,
1043  100,
1044  -1.1,
1045  1.1);
1046  meCluYXLocalSim_[0] = ibook.book2D("EtlCluYXLocalSimZneg",
1047  "ETL cluster local Y vs X (-Z);X^{local}_{SIM} [cm];Y^{local}_{SIM} [cm]",
1048  200,
1049  -2.2,
1050  2.2,
1051  200,
1052  -1.1,
1053  1.1);
1054  meCluYXLocalSim_[1] = ibook.book2D("EtlCluYXLocalSimZpos",
1055  "ETL cluster local Y vs X (+Z);X^{local}_{SIM} [cm];Y^{local}_{SIM} [cm]",
1056  200,
1057  -2.2,
1058  2.2,
1059  200,
1060  -1.1,
1061  1.1);
1062  meCluXLocalErr_[0] =
1063  ibook.book1D("EtlCluXLocalErrNeg", "ETL cluster X local error (-Z);sigmaX_{RECO,loc} [cm]", 50, 0., 0.2);
1064  meCluXLocalErr_[1] =
1065  ibook.book1D("EtlCluXLocalErrPos", "ETL cluster X local error (+Z);sigmaX_{RECO,loc} [cm]", 50, 0., 0.2);
1066  meCluYLocalErr_[0] =
1067  ibook.book1D("EtlCluYLocalErrNeg", "ETL cluster Y local error (-Z);sigmaY_{RECO,loc} [cm]", 50., 0., 0.2);
1068  meCluYLocalErr_[1] =
1069  ibook.book1D("EtlCluYLocalErrPos", "ETL cluster Y local error (+Z);sigmaY_{RECO,loc} [cm]", 50, 0., 0.2);
1070  }
1071  meUnmatchedCluEnergy_[0] = ibook.book1D(
1072  "EtlUnmatchedCluEnergyNeg", "ETL unmatched cluster log10(energy) (-Z);log10(E_{RECO} [MeV])", 5, -3, 2);
1073  meUnmatchedCluEnergy_[1] = ibook.book1D(
1074  "EtlUnmatchedCluEnergyPos", "ETL unmatched cluster log10(energy) (+Z);log10(E_{RECO} [MeV])", 5, -3, 2);
1075 
1076  // --- UncalibratedRecHits histograms
1077 
1078  if (uncalibRecHitsPlots_) {
1079  const std::string det_name[2] = {"ETL-", "ETL+"};
1080  for (unsigned int iside = 0; iside < 2; ++iside) {
1081  for (unsigned int ihistoQ = 0; ihistoQ < nBinsQ_; ++ihistoQ) {
1082  std::string hname = Form("TimeResQ_%d_%d", iside, ihistoQ);
1083  std::string htitle =
1084  Form("%s time resolution (Q bin = %d);T_{RECO} - T_{SIM} [ns]", det_name[iside].data(), ihistoQ);
1085  meTimeResQ_[iside][ihistoQ] = ibook.book1D(hname, htitle, 200, -0.5, 0.5);
1086 
1087  } // ihistoQ loop
1088 
1089  for (unsigned int ihistoEta = 0; ihistoEta < nBinsEta_; ++ihistoEta) {
1090  std::string hname = Form("TimeResEta_%d_%d", iside, ihistoEta);
1091  std::string htitle =
1092  Form("%s time resolution (|#eta| bin = %d);T_{RECO} - T_{SIM} [ns]", det_name[iside].data(), ihistoEta);
1093  meTimeResEta_[iside][ihistoEta] = ibook.book1D(hname, htitle, 200, -0.5, 0.5);
1094 
1095  } // ihistoEta loop
1096  }
1097  }
1098 }
1099 
1100 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
1103 
1104  desc.add<std::string>("folder", "MTD/ETL/LocalReco");
1105  desc.add<edm::InputTag>("recHitsTag", edm::InputTag("mtdRecHits", "FTLEndcap"));
1106  desc.add<edm::InputTag>("uncalibRecHitsTag", edm::InputTag("mtdUncalibratedRecHits", "FTLEndcap"));
1107  desc.add<edm::InputTag>("simHitsTag", edm::InputTag("mix", "g4SimHitsFastTimerHitsEndcap"));
1108  desc.add<edm::InputTag>("recCluTag", edm::InputTag("mtdClusters", "FTLEndcap"));
1109  desc.add<edm::InputTag>("trkHitTag", edm::InputTag("mtdTrackingRecHits"));
1110  desc.add<double>("hitMinimumEnergy1Dis", 1.); // [MeV]
1111  desc.add<double>("hitMinimumEnergy2Dis", 0.001); // [MeV]
1112  desc.add<bool>("optionalPlots", false);
1113  desc.add<bool>("UncalibRecHitsPlots", false);
1114  desc.add<double>("HitMinimumAmplitude", 0.33); // [MIP]
1115 
1116  descriptions.add("etlLocalRecoValid", desc);
1117 }
1118 
uint8_t geoId(const VFATFrame &frame)
retrieve the GEO information for this channel
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
edm::EDGetTokenT< FTLUncalibratedRecHitCollection > etlUncalibRecHitsToken_
edm::EDGetTokenT< CrossingFrame< PSimHit > > etlSimHitsToken_
std::string folder_
float x() const
Definition: FTLCluster.h:120
int size() const
Definition: FTLCluster.h:141
MonitorElement * meCluXRes_[2]
bool isSameCluster(const FTLCluster &, const FTLCluster &)
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
MonitorElement * meHitTime_[4]
T z() const
Definition: PV3DBase.h:61
const edm::ESGetToken< MTDClusterParameterEstimator, MTDCPERecord > cpeToken_
virtual const Topology & topology() const
Definition: GeomDet.cc:67
MonitorElement * meOccupancy_[4]
MonitorElement * meCluYLocalErr_[2]
MonitorElement * meCluTPullvsEta_[2]
virtual const PixelTopology & specificTopology() const
MonitorElement * meCluTimeError_[4]
static constexpr float etaMin_
MonitorElement * meCluOccupancy_[4]
MonitorElement * meCluTime_[4]
MonitorElement * meNhits_[4]
Definition: MTDHit.h:4
Definition: weight.py:1
MonitorElement * meUnmatchedCluEnergy_[2]
MonitorElement * meTimeResEta_[2][nBinsEta_]
int zside(DetId const &)
MonitorElement * meHitTvsE_[4]
MonitorElement * meCluEnergy_[4]
ETLDetId geographicalId() const
Definition: ETLDetId.h:110
Detector identifier base class for the MIP Timing Layer.
Definition: MTDDetId.h:21
constexpr NumType convertUnitsTo(double desiredUnits, NumType val)
Definition: GeantUnits.h:73
EtlLocalRecoValidation(const edm::ParameterSet &)
void Fill(long long x)
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
MonitorElement * meHitEvsEta_[4]
float y() const
Definition: FTLCluster.h:125
MonitorElement * meHitTvsEta_[4]
MonitorElement * meCluTimeRes_[2]
int iEvent
Definition: GenABIO.cc:224
MonitorElement * meCluHits_[4]
MonitorElement * meHitPhi_[4]
float localX(const float mpX) const override
edm::EDGetTokenT< FTLRecHitCollection > etlRecHitsToken_
MonitorElement * meHitEta_[4]
edm::EDGetTokenT< MTDTrackingDetSetVector > mtdTrackingHitToken_
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
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
T sqrt(T t)
Definition: SSEVec.h:19
MonitorElement * meCluXPull_[2]
const edm::ESGetToken< MTDGeometry, MTDDigiGeometryRecord > mtdgeoToken_
int module() const
Definition: ETLDetId.h:105
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MonitorElement * meHitTimeError_[4]
static constexpr int nBinsEta_
int mtdRR() const
Definition: MTDDetId.h:64
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
bool getData(T &iHolder) const
Definition: EventSetup.h:122
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
ETLDetId::EtlLayout etlLayoutFromTopoMode(const int &topoMode)
float localY(const float mpY) const override
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
MonitorElement * meHitYlocal_[2]
Definition: DetId.h:17
const DetId & id() const
Definition: FTLCluster.h:178
MonitorElement * meTimeResQ_[2][nBinsQ_]
MonitorElement * meCluZRes_[2]
constexpr NumType convertMmToCm(NumType millimeters)
Definition: angle_units.h:44
MonitorElement * meLocalOccupancy_[2]
int discSide() const
Definition: ETLDetId.h:119
const edm::ESGetToken< MTDTopology, MTDTopologyRcd > mtdtopoToken_
MonitorElement * meCluYXLocal_[2]
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
MonitorElement * meCluYXLocalSim_[2]
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)
int zside() const
Definition: MTDDetId.h:61
static constexpr float binWidthEta_
Detector identifier class for the Endcap Timing Layer.
Definition: ETLDetId.h:15
void analyze(const edm::Event &, const edm::EventSetup &) override
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
int nDisc() const
Definition: ETLDetId.h:124
edm::EDGetTokenT< FTLClusterCollection > etlRecCluToken_
MonitorElement * meHitTvsPhi_[4]
MonitorElement * meCluXLocalErr_[2]
MonitorElement * meHitEvsPhi_[4]
MonitorElement * meCluYPull_[2]
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:162
static constexpr float binWidthQ_
float time() const
Definition: FTLCluster.h:130
MonitorElement * meCluTPullvsE_[2]
MonitorElement * meHitEnergy_[4]
MonitorElement * meHitXlocal_[2]
Log< level::Warning, false > LogWarning
MonitorElement * meCluYRes_[2]
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
std::tuple< LocalPoint, LocalError, TimeValue, TimeValueError > ReturnType
static constexpr int nBinsQ_
Definition: Run.h:45
#define LogDebug(id)
MonitorElement * meCluEnergyRes_[2]