CMS 3D CMS Logo

MtdTracksValidation.cc
Go to the documentation of this file.
1 #include <string>
2 
8 
11 
18 
24 
28 
36 
47 
58 
61 
68 
71 #include "HepMC/GenRanges.h"
72 #include "CLHEP/Units/PhysicalConstants.h"
73 #include "MTDHit.h"
74 
76 public:
77  explicit MtdTracksValidation(const edm::ParameterSet&);
78  ~MtdTracksValidation() override;
79 
80  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
81 
82 private:
83  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
84 
85  void analyze(const edm::Event&, const edm::EventSetup&) override;
86 
87  const std::pair<bool, bool> checkAcceptance(
88  const reco::Track&, const edm::Event&, const edm::EventSetup&, size_t&, float&, float&, float&, float&);
89 
90  const bool mvaGenSel(const HepMC::GenParticle&, const float&);
91  const bool mvaTPSel(const TrackingParticle&);
92  const bool mvaRecSel(const reco::TrackBase&, const reco::Vertex&, const double&, const double&);
93  const bool mvaGenRecMatch(const HepMC::GenParticle&, const double&, const reco::TrackBase&, const bool&);
95 
96  const unsigned long int uniqueId(const uint32_t x, const EncodedEventId& y) {
97  const uint64_t a = static_cast<uint64_t>(x);
98  const uint64_t b = static_cast<uint64_t>(y.rawId());
99 
100  if (x < y.rawId())
101  return (b << 32) | a;
102  else
103  return (a << 32) | b;
104  }
105 
106  bool isETL(const double eta) const { return (std::abs(eta) > trackMinEtlEta_) && (std::abs(eta) < trackMaxEtlEta_); }
107 
108  // ------------ member data ------------
109 
111  const float trackMinPt_;
112  const float trackMaxBtlEta_;
113  const float trackMinEtlEta_;
114  const float trackMaxEtlEta_;
115 
116  static constexpr double etacutGEN_ = 4.; // |eta| < 4;
117  static constexpr double etacutREC_ = 3.; // |eta| < 3;
118  static constexpr double pTcut_ = 0.7; // PT > 0.7 GeV
119  static constexpr double deltaZcut_ = 0.1; // dz separation 1 mm
120  static constexpr double deltaPTcut_ = 0.05; // dPT < 5%
121  static constexpr double deltaDRcut_ = 0.03; // DeltaR separation
122  static constexpr double depositBTLthreshold_ = 1; // threshold for energy deposit in BTL cell [MeV]
123  static constexpr double depositETLthreshold_ = 0.001; // threshold for energy deposit in ETL cell [MeV]
124  static constexpr double rBTL_ = 110.0;
125  static constexpr double zETL_ = 290.0;
126  static constexpr double etaMatchCut_ = 0.05;
127  static constexpr double cluDRradius_ = 0.05; // to cluster rechits around extrapolated track
128 
130 
133 
137 
146 
149 
159 
166 
175 
187 
199 
225 
231 };
232 
233 // ------------ constructor and destructor --------------
235  : folder_(iConfig.getParameter<std::string>("folder")),
236  trackMinPt_(iConfig.getParameter<double>("trackMinimumPt")),
237  trackMaxBtlEta_(iConfig.getParameter<double>("trackMaximumBtlEta")),
238  trackMinEtlEta_(iConfig.getParameter<double>("trackMinimumEtlEta")),
239  trackMaxEtlEta_(iConfig.getParameter<double>("trackMaximumEtlEta")),
240  optionalPlots_(iConfig.getUntrackedParameter<bool>("optionalPlots")) {
241  GenRecTrackToken_ = consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("inputTagG"));
242  RecTrackToken_ = consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("inputTagT"));
243  RecVertexToken_ = consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("inputTagV"));
244  HepMCProductToken_ = consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("inputTagH"));
246  consumes<TrackingParticleCollection>(iConfig.getParameter<edm::InputTag>("SimTag"));
248  consumes<reco::SimToRecoCollection>(iConfig.getParameter<edm::InputTag>("TPtoRecoTrackAssoc"));
250  consumes<reco::RecoToSimCollection>(iConfig.getParameter<edm::InputTag>("TPtoRecoTrackAssoc"));
251  btlSimHitsToken_ = consumes<CrossingFrame<PSimHit>>(iConfig.getParameter<edm::InputTag>("btlSimHits"));
252  etlSimHitsToken_ = consumes<CrossingFrame<PSimHit>>(iConfig.getParameter<edm::InputTag>("etlSimHits"));
253  btlRecHitsToken_ = consumes<FTLRecHitCollection>(iConfig.getParameter<edm::InputTag>("btlRecHits"));
254  etlRecHitsToken_ = consumes<FTLRecHitCollection>(iConfig.getParameter<edm::InputTag>("etlRecHits"));
255  trackAssocToken_ = consumes<edm::ValueMap<int>>(iConfig.getParameter<edm::InputTag>("trackAssocSrc"));
256  pathLengthToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("pathLengthSrc"));
257  tmtdToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("tmtd"));
258  SigmatmtdToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("sigmatmtd"));
259  t0SrcToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("t0Src"));
260  Sigmat0SrcToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("sigmat0Src"));
261  t0PidToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("t0PID"));
262  Sigmat0PidToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("sigmat0PID"));
263  t0SafePidToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("t0SafePID"));
264  Sigmat0SafePidToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("sigmat0SafePID"));
265  trackMVAQualToken_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("trackMVAQual"));
266  mtdgeoToken_ = esConsumes<MTDGeometry, MTDDigiGeometryRecord>();
267  mtdtopoToken_ = esConsumes<MTDTopology, MTDTopologyRcd>();
268  mtdlayerToken_ = esConsumes<MTDDetLayerGeometry, MTDRecoGeometryRecord>();
269  magfieldToken_ = esConsumes<MagneticField, IdealMagneticFieldRecord>();
270  builderToken_ = esConsumes<TransientTrackBuilder, TransientTrackRecord>(edm::ESInputTag("", "TransientTrackBuilder"));
271  particleTableToken_ = esConsumes<HepPDT::ParticleDataTable, edm::DefaultRecord>();
272 }
273 
275 
276 // ------------ method called for each event ------------
278  using namespace edm;
279  using namespace geant_units::operators;
280  using namespace std;
281 
282  auto GenRecTrackHandle = makeValid(iEvent.getHandle(GenRecTrackToken_));
283  auto RecVertexHandle = makeValid(iEvent.getHandle(RecVertexToken_));
284 
285  std::unordered_map<uint32_t, MTDHit> m_btlHits;
286  std::unordered_map<uint32_t, MTDHit> m_etlHits;
287  std::unordered_map<uint32_t, std::set<unsigned long int>> m_btlTrkPerCell;
288  std::unordered_map<uint32_t, std::set<unsigned long int>> m_etlTrkPerCell;
289  std::map<TrackingParticleRef, std::vector<uint32_t>> m_tp2detid;
290 
291  const auto& tMtd = iEvent.get(tmtdToken_);
292  const auto& SigmatMtd = iEvent.get(SigmatmtdToken_);
293  const auto& t0Src = iEvent.get(t0SrcToken_);
294  const auto& Sigmat0Src = iEvent.get(Sigmat0SrcToken_);
295  const auto& t0Pid = iEvent.get(t0PidToken_);
296  const auto& Sigmat0Pid = iEvent.get(Sigmat0PidToken_);
297  const auto& t0Safe = iEvent.get(t0SafePidToken_);
298  const auto& Sigmat0Safe = iEvent.get(Sigmat0SafePidToken_);
299  const auto& mtdQualMVA = iEvent.get(trackMVAQualToken_);
300  const auto& trackAssoc = iEvent.get(trackAssocToken_);
301  const auto& pathLength = iEvent.get(pathLengthToken_);
302 
303  const auto& primRecoVtx = *(RecVertexHandle.product()->begin());
304 
305  // generator level information (HepMC format)
306  auto GenEventHandle = makeValid(iEvent.getHandle(HepMCProductToken_));
307  const HepMC::GenEvent* mc = GenEventHandle->GetEvent();
308  double zsim = convertMmToCm((*(mc->vertices_begin()))->position().z());
309  double tsim = (*(mc->vertices_begin()))->position().t() * CLHEP::mm / CLHEP::c_light;
310 
311  auto pdt = iSetup.getHandle(particleTableToken_);
312  const HepPDT::ParticleDataTable* pdTable = pdt.product();
313 
314  auto simToRecoH = makeValid(iEvent.getHandle(simToRecoAssociationToken_));
315  s2r_ = simToRecoH.product();
316 
317  auto recoToSimH = makeValid(iEvent.getHandle(recoToSimAssociationToken_));
318  r2s_ = recoToSimH.product();
319 
320  //Fill maps with simhits accumulated per DetId
321 
322  auto btlSimHitsHandle = makeValid(iEvent.getHandle(btlSimHitsToken_));
323  MixCollection<PSimHit> btlSimHits(btlSimHitsHandle.product());
324  for (auto const& simHit : btlSimHits) {
325  if (simHit.tof() < 0 || simHit.tof() > 25.)
326  continue;
327  DetId id = simHit.detUnitId();
328  auto const thisHId = uniqueId(simHit.trackId(), simHit.eventId());
329  m_btlTrkPerCell[id.rawId()].insert(thisHId);
330  auto simHitIt = m_btlHits.emplace(id.rawId(), MTDHit()).first;
331  // --- Accumulate the energy (in MeV) of SIM hits in the same detector cell
332  (simHitIt->second).energy += convertUnitsTo(0.001_MeV, simHit.energyLoss());
333  }
334 
335  auto etlSimHitsHandle = makeValid(iEvent.getHandle(etlSimHitsToken_));
336  MixCollection<PSimHit> etlSimHits(etlSimHitsHandle.product());
337  for (auto const& simHit : etlSimHits) {
338  if (simHit.tof() < 0 || simHit.tof() > 25.) {
339  continue;
340  }
341  DetId id = simHit.detUnitId();
342  auto const thisHId = uniqueId(simHit.trackId(), simHit.eventId());
343  m_etlTrkPerCell[id.rawId()].insert(thisHId);
344  auto simHitIt = m_etlHits.emplace(id.rawId(), MTDHit()).first;
345  // --- Accumulate the energy (in MeV) of SIM hits in the same detector cell
346  (simHitIt->second).energy += convertUnitsTo(0.001_MeV, simHit.energyLoss());
347  }
348 
349  //Fill map of DetId per ref to TP
350 
351  auto tpHandle = makeValid(iEvent.getHandle(trackingParticleCollectionToken_));
352  TrackingParticleCollection tpColl = *(tpHandle.product());
353  size_t tpindex(0);
354  for (auto tp = tpColl.begin(); tp != tpColl.end(); tp++, ++tpindex) {
356  if (tp->eventId().bunchCrossing() == 0 && tp->eventId().event() == 0) {
357  if (!mvaTPSel(*tp))
358  continue;
359  for (const auto& simTrk : tp->g4Tracks()) {
360  auto const thisTId = uniqueId(simTrk.trackId(), simTrk.eventId());
361  for (auto const& cell : m_btlTrkPerCell) {
362  if (m_btlHits[cell.first].energy < depositBTLthreshold_) {
363  continue;
364  }
365  for (auto const& simtrack : cell.second) {
366  if (thisTId == simtrack) {
367  m_tp2detid[tpref].emplace_back(cell.first);
368  break;
369  }
370  }
371  }
372  for (auto const& cell : m_etlTrkPerCell) {
373  if (m_etlHits[cell.first].energy < depositETLthreshold_) {
374  continue;
375  }
376  for (auto const& simtrack : cell.second) {
377  if (thisTId == simtrack) {
378  m_tp2detid[tpref].emplace_back(cell.first);
379  break;
380  }
381  }
382  }
383  }
384  }
385  }
386 
387  unsigned int index = 0;
388 
389  // flag to select events with reco vertex close to true simulated primary vertex, or PV fake (particle guns)
390  const bool isGoodVtx = std::abs(primRecoVtx.z() - zsim) < deltaZcut_ || primRecoVtx.isFake();
391 
392  // --- Loop over all RECO tracks ---
393  for (const auto& trackGen : *GenRecTrackHandle) {
394  const reco::TrackRef trackref(iEvent.getHandle(GenRecTrackToken_), index);
395  index++;
396 
397  if (trackAssoc[trackref] == -1) {
398  LogInfo("mtdTracks") << "Extended track not associated";
399  continue;
400  }
401 
402  const reco::TrackRef mtdTrackref = reco::TrackRef(iEvent.getHandle(RecTrackToken_), trackAssoc[trackref]);
403  const reco::Track& track = *mtdTrackref;
404 
405  bool isBTL = false;
406  bool isETL = false;
407  bool twoETLdiscs = false;
408  bool noCrack = std::abs(trackGen.eta()) < trackMaxBtlEta_ || std::abs(trackGen.eta()) > trackMinEtlEta_;
409 
410  if (track.pt() >= trackMinPt_ && std::abs(track.eta()) <= trackMaxEtlEta_) {
411  meTracktmtd_->Fill(tMtd[trackref]);
412  if (std::round(SigmatMtd[trackref] - Sigmat0Pid[trackref]) != 0) {
413  LogWarning("mtdTracks")
414  << "TimeError associated to refitted track is different from TimeError stored in tofPID "
415  "sigmat0 ValueMap: this should not happen";
416  }
417 
418  meTrackt0Src_->Fill(t0Src[trackref]);
419  meTrackSigmat0Src_->Fill(Sigmat0Src[trackref]);
420 
421  meTrackt0Pid_->Fill(t0Pid[trackref]);
422  meTrackSigmat0Pid_->Fill(Sigmat0Pid[trackref]);
423  meTrackt0SafePid_->Fill(t0Safe[trackref]);
424  meTrackSigmat0SafePid_->Fill(Sigmat0Safe[trackref]);
425  meTrackMVAQual_->Fill(mtdQualMVA[trackref]);
426 
427  meTrackPathLenghtvsEta_->Fill(std::abs(track.eta()), pathLength[trackref]);
428 
429  if (std::abs(track.eta()) < trackMaxBtlEta_) {
430  // --- all BTL tracks (with and without hit in MTD) ---
434 
435  bool MTDBtl = false;
436  int numMTDBtlvalidhits = 0;
437  for (const auto hit : track.recHits()) {
438  if (hit->isValid() == false)
439  continue;
440  MTDDetId Hit = hit->geographicalId();
441  if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 1)) {
442  MTDBtl = true;
443  numMTDBtlvalidhits++;
444  }
445  }
446  meTrackNumHits_->Fill(numMTDBtlvalidhits);
447 
448  // --- keeping only tracks with last hit in MTD ---
449  if (MTDBtl == true) {
450  isBTL = true;
455  meBTLTrackPtRes_->Fill((trackGen.pt() - track.pt()) / trackGen.pt());
456  }
457  if (isBTL && Sigmat0Safe[trackref] < 0.) {
458  meTrackNumHitsNT_->Fill(numMTDBtlvalidhits);
459  }
460  } //loop over (geometrical) BTL tracks
461 
462  else {
463  // --- all ETL tracks (with and without hit in MTD) ---
464  if ((track.eta() < -trackMinEtlEta_) && (track.eta() > -trackMaxEtlEta_)) {
465  meETLTrackEffEtaTot_[0]->Fill(track.eta());
466  meETLTrackEffPhiTot_[0]->Fill(track.phi());
467  meETLTrackEffPtTot_[0]->Fill(track.pt());
468  }
469 
470  if ((track.eta() > trackMinEtlEta_) && (track.eta() < trackMaxEtlEta_)) {
471  meETLTrackEffEtaTot_[1]->Fill(track.eta());
472  meETLTrackEffPhiTot_[1]->Fill(track.phi());
473  meETLTrackEffPtTot_[1]->Fill(track.pt());
474  }
475 
476  bool MTDEtlZnegD1 = false;
477  bool MTDEtlZnegD2 = false;
478  bool MTDEtlZposD1 = false;
479  bool MTDEtlZposD2 = false;
480  int numMTDEtlvalidhits = 0;
481  for (const auto hit : track.recHits()) {
482  if (hit->isValid() == false)
483  continue;
484  MTDDetId Hit = hit->geographicalId();
485  if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 2)) {
486  isETL = true;
487  ETLDetId ETLHit = hit->geographicalId();
488 
489  if ((ETLHit.zside() == -1) && (ETLHit.nDisc() == 1)) {
490  MTDEtlZnegD1 = true;
492  meETLTrackPtRes_->Fill((trackGen.pt() - track.pt()) / trackGen.pt());
493  numMTDEtlvalidhits++;
494  }
495  if ((ETLHit.zside() == -1) && (ETLHit.nDisc() == 2)) {
496  MTDEtlZnegD2 = true;
498  meETLTrackPtRes_->Fill((trackGen.pt() - track.pt()) / trackGen.pt());
499  numMTDEtlvalidhits++;
500  }
501  if ((ETLHit.zside() == 1) && (ETLHit.nDisc() == 1)) {
502  MTDEtlZposD1 = true;
504  meETLTrackPtRes_->Fill((trackGen.pt() - track.pt()) / trackGen.pt());
505  numMTDEtlvalidhits++;
506  }
507  if ((ETLHit.zside() == 1) && (ETLHit.nDisc() == 2)) {
508  MTDEtlZposD2 = true;
510  meETLTrackPtRes_->Fill((trackGen.pt() - track.pt()) / trackGen.pt());
511  numMTDEtlvalidhits++;
512  }
513  }
514  }
515  meTrackNumHits_->Fill(-numMTDEtlvalidhits);
516  if (isETL && Sigmat0Safe[trackref] < 0.) {
517  meTrackNumHitsNT_->Fill(-numMTDEtlvalidhits);
518  }
519 
520  // --- keeping only tracks with last hit in MTD ---
521  if ((track.eta() < -trackMinEtlEta_) && (track.eta() > -trackMaxEtlEta_)) {
522  twoETLdiscs = (MTDEtlZnegD1 == true) && (MTDEtlZnegD2 == true);
523  if ((MTDEtlZnegD1 == true) || (MTDEtlZnegD2 == true)) {
524  meETLTrackEffEtaMtd_[0]->Fill(track.eta());
525  meETLTrackEffPhiMtd_[0]->Fill(track.phi());
526  meETLTrackEffPtMtd_[0]->Fill(track.pt());
527  if (twoETLdiscs) {
528  meETLTrackEffEta2Mtd_[0]->Fill(track.eta());
529  meETLTrackEffPhi2Mtd_[0]->Fill(track.phi());
530  meETLTrackEffPt2Mtd_[0]->Fill(track.pt());
531  }
532  }
533  }
534  if ((track.eta() > trackMinEtlEta_) && (track.eta() < trackMaxEtlEta_)) {
535  twoETLdiscs = (MTDEtlZposD1 == true) && (MTDEtlZposD2 == true);
536  if ((MTDEtlZposD1 == true) || (MTDEtlZposD2 == true)) {
537  meETLTrackEffEtaMtd_[1]->Fill(track.eta());
538  meETLTrackEffPhiMtd_[1]->Fill(track.phi());
539  meETLTrackEffPtMtd_[1]->Fill(track.pt());
540  if (twoETLdiscs) {
541  meETLTrackEffEta2Mtd_[1]->Fill(track.eta());
542  meETLTrackEffPhi2Mtd_[1]->Fill(track.phi());
543  meETLTrackEffPt2Mtd_[1]->Fill(track.pt());
544  }
545  }
546  }
547  }
548 
549  // TrackingParticle based matching
550 
551  const reco::TrackBaseRef trkrefb(trackref);
552  auto tp_info = getMatchedTP(trkrefb);
553 
554  meTrackPtTot_->Fill(trackGen.pt());
555  meTrackEtaTot_->Fill(std::abs(trackGen.eta()));
556  if (tp_info != nullptr && mvaTPSel(**tp_info)) {
557  const bool withMTD = (m_tp2detid.find(*tp_info) != m_tp2detid.end());
558  if (noCrack) {
559  meTrackMatchedTPEffPtTot_->Fill(trackGen.pt());
560  if (withMTD) {
561  meTrackMatchedTPmtdEffPtTot_->Fill(trackGen.pt());
562  }
563  }
564  meTrackMatchedTPEffEtaTot_->Fill(std::abs(trackGen.eta()));
565  if (withMTD) {
566  meTrackMatchedTPmtdEffEtaTot_->Fill(std::abs(trackGen.eta()));
567  }
568  if (isBTL || isETL) {
569  if (noCrack) {
570  meTrackMatchedTPEffPtMtd_->Fill(trackGen.pt());
571  if (isBTL || twoETLdiscs) {
572  meTrackMatchedTPEffPtEtl2Mtd_->Fill(trackGen.pt());
573  }
574  if (withMTD) {
575  meTrackMatchedTPmtdEffPtMtd_->Fill(trackGen.pt());
576  }
577  }
578  meTrackMatchedTPEffEtaMtd_->Fill(std::abs(trackGen.eta()));
579  if (isBTL || twoETLdiscs) {
580  meTrackMatchedTPEffEtaEtl2Mtd_->Fill(std::abs(trackGen.eta()));
581  }
582  if (withMTD) {
583  meTrackMatchedTPmtdEffEtaMtd_->Fill(std::abs(trackGen.eta()));
584  }
585  }
586 
587  if (optionalPlots_) {
588  size_t nlayers(0);
589  float extrho(0.);
590  float exteta(0.);
591  float extphi(0.);
592  float selvar(0.);
593  auto accept = checkAcceptance(trackGen, iEvent, iSetup, nlayers, extrho, exteta, extphi, selvar);
594  if (accept.first && std::abs(exteta) < trackMaxBtlEta_) {
596  meExtraBTLeneInCone_->Fill(selvar);
597  }
598  if (accept.second) {
599  if (std::abs(exteta) < trackMaxBtlEta_) {
601  }
602  if (noCrack) {
603  meExtraPtMtd_->Fill(trackGen.pt());
604  if (nlayers == 2) {
605  meExtraPtEtl2Mtd_->Fill(trackGen.pt());
606  }
607  }
608  meExtraEtaMtd_->Fill(std::abs(trackGen.eta()));
609  if (nlayers == 2) {
610  meExtraEtaEtl2Mtd_->Fill(trackGen.eta());
611  }
612  if (accept.first && accept.second && !isBTL) {
613  edm::LogInfo("MtdTracksValidation")
614  << "MtdTracksValidation: extender fail in " << iEvent.id().run() << " " << iEvent.id().event()
615  << " pt= " << trackGen.pt() << " eta= " << trackGen.eta();
616  meExtraBTLfailExtenderEta_->Fill(std::abs(trackGen.eta()));
617  if (noCrack) {
618  meExtraBTLfailExtenderPt_->Fill(trackGen.pt());
619  }
620  }
621  }
622  }
623 
624  } // TP matching
625  }
626 
627  if (isGoodVtx) {
628  const bool vtxFake = primRecoVtx.isFake();
629 
630  if (mvaRecSel(trackGen, primRecoVtx, t0Safe[trackref], Sigmat0Safe[trackref])) {
631  // reco-gen matching used for MVA quality flag
632 
633  if (noCrack) {
634  meMVATrackEffPtTot_->Fill(trackGen.pt());
635  }
636  meMVATrackEffEtaTot_->Fill(std::abs(trackGen.eta()));
637 
638  double dZ = trackGen.vz() - zsim;
639  double dT(-9999.);
640  double pullT(-9999.);
641  if (Sigmat0Safe[trackref] != -1.) {
642  dT = t0Safe[trackref] - tsim;
643  pullT = dT / Sigmat0Safe[trackref];
644  }
645  for (const auto& genP : mc->particle_range()) {
646  // select status 1 genParticles and match them to the reconstructed track
647 
648  float charge = pdTable->particle(HepPDT::ParticleID(genP->pdg_id())) != nullptr
649  ? pdTable->particle(HepPDT::ParticleID(genP->pdg_id()))->charge()
650  : 0.f;
651  if (mvaGenSel(*genP, charge)) {
652  if (mvaGenRecMatch(*genP, zsim, trackGen, vtxFake)) {
654  if (noCrack) {
655  meMVATrackMatchedEffPtTot_->Fill(trackGen.pt());
656  }
657  meMVATrackMatchedEffEtaTot_->Fill(std::abs(trackGen.eta()));
658  if (isBTL || isETL) {
659  meMVATrackResTot_->Fill(dT);
660  meMVATrackPullTot_->Fill(pullT);
661  if (noCrack) {
662  meMVATrackMatchedEffPtMtd_->Fill(trackGen.pt());
663  }
664  meMVATrackMatchedEffEtaMtd_->Fill(std::abs(trackGen.eta()));
665  }
666  break;
667  }
668  }
669  }
670  }
671  } // MC truth matich analysis for good PV
672  } //RECO tracks loop
673 }
674 
675 const std::pair<bool, bool> MtdTracksValidation::checkAcceptance(const reco::Track& track,
676  const edm::Event& iEvent,
677  edm::EventSetup const& iSetup,
678  size_t& nlayers,
679  float& extrho,
680  float& exteta,
681  float& extphi,
682  float& selvar) {
683  bool isMatched(false);
684  nlayers = 0;
685  extrho = 0.;
686  exteta = -999.;
687  extphi = -999.;
688  selvar = 0.;
689 
690  auto geometryHandle = iSetup.getTransientHandle(mtdgeoToken_);
691  const MTDGeometry* geom = geometryHandle.product();
692  auto topologyHandle = iSetup.getTransientHandle(mtdtopoToken_);
693  const MTDTopology* topology = topologyHandle.product();
694 
695  auto layerHandle = iSetup.getTransientHandle(mtdlayerToken_);
696  const MTDDetLayerGeometry* layerGeo = layerHandle.product();
697 
698  auto magfieldHandle = iSetup.getTransientHandle(magfieldToken_);
699  const MagneticField* mfield = magfieldHandle.product();
700 
701  auto ttrackBuilder = iSetup.getTransientHandle(builderToken_);
702 
703  auto tTrack = ttrackBuilder->build(track);
704  TrajectoryStateOnSurface tsos = tTrack.outermostMeasurementState();
705  float theMaxChi2 = 500.;
706  float theNSigma = 10.;
707  std::unique_ptr<MeasurementEstimator> theEstimator =
708  std::make_unique<Chi2MeasurementEstimator>(theMaxChi2, theNSigma);
710 
711  auto btlRecHitsHandle = makeValid(iEvent.getHandle(btlRecHitsToken_));
712  auto etlRecHitsHandle = makeValid(iEvent.getHandle(etlRecHitsToken_));
713 
714  edm::LogVerbatim("MtdTracksValidation")
715  << "MtdTracksValidation: extrapolating track, pt= " << track.pt() << " eta= " << track.eta();
716 
717  //try BTL
718  bool inBTL = false;
719  float eneSum(0.);
720  const std::vector<const DetLayer*>& layersBTL = layerGeo->allBTLLayers();
721  for (const DetLayer* ilay : layersBTL) {
722  std::pair<bool, TrajectoryStateOnSurface> comp = ilay->compatible(tsos, prop, *theEstimator);
723  if (!comp.first)
724  continue;
725  if (!inBTL) {
726  inBTL = true;
727  extrho = comp.second.globalPosition().perp();
728  exteta = comp.second.globalPosition().eta();
729  extphi = comp.second.globalPosition().phi();
730  edm::LogVerbatim("MtdTracksValidation") << "MtdTracksValidation: extrapolation at BTL surface, rho= " << extrho
731  << " eta= " << exteta << " phi= " << extphi;
732  }
733  std::vector<DetLayer::DetWithState> compDets = ilay->compatibleDets(tsos, prop, *theEstimator);
734  for (const auto& detWithState : compDets) {
735  const auto& det = detWithState.first;
736 
737  // loop on compatible rechits and check energy in a fixed size cone around the extrapolation point
738 
739  edm::LogVerbatim("MtdTracksValidation")
740  << "MtdTracksValidation: DetId= " << det->geographicalId().rawId()
741  << " gp= " << detWithState.second.globalPosition().x() << " " << detWithState.second.globalPosition().y()
742  << " " << detWithState.second.globalPosition().z() << " rho= " << detWithState.second.globalPosition().perp()
743  << " eta= " << detWithState.second.globalPosition().eta()
744  << " phi= " << detWithState.second.globalPosition().phi();
745 
746  for (const auto& recHit : *btlRecHitsHandle) {
747  BTLDetId detId = recHit.id();
748  DetId geoId = detId.geographicalId(MTDTopologyMode::crysLayoutFromTopoMode(topology->getMTDTopologyMode()));
749  const MTDGeomDet* thedet = geom->idToDet(geoId);
750  if (thedet == nullptr)
751  throw cms::Exception("MtdTracksValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
752  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
753  if (geoId == det->geographicalId()) {
754  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
755  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
756 
757  Local3DPoint local_point(0., 0., 0.);
758  local_point = topo.pixelToModuleLocalPoint(local_point, detId.row(topo.nrows()), detId.column(topo.nrows()));
759  const auto& global_point = thedet->toGlobal(local_point);
760  edm::LogVerbatim("MtdTracksValidation")
761  << "MtdTracksValidation: Hit id= " << detId.rawId() << " ene= " << recHit.energy()
762  << " dr= " << reco::deltaR(global_point, detWithState.second.globalPosition());
763  if (reco::deltaR(global_point, detWithState.second.globalPosition()) < cluDRradius_) {
764  eneSum += recHit.energy();
765  //extrho = detWithState.second.globalPosition().perp();
766  //exteta = detWithState.second.globalPosition().eta();
767  //extphi = detWithState.second.globalPosition().phi();
768  }
769  }
770  }
771  }
772  if (eneSum > depositBTLthreshold_) {
773  nlayers++;
774  selvar = eneSum;
775  isMatched = true;
776  edm::LogVerbatim("MtdTracksValidation")
777  << "MtdTracksValidation: BTL matched, energy= " << eneSum << " #layers= " << nlayers;
778  }
779  }
780  if (inBTL) {
781  return std::make_pair(inBTL, isMatched);
782  }
783 
784  //try ETL
785  bool inETL = false;
786  const std::vector<const DetLayer*>& layersETL = layerGeo->allETLLayers();
787  for (const DetLayer* ilay : layersETL) {
788  size_t hcount(0);
789  const BoundDisk& disk = static_cast<const MTDSectorForwardDoubleLayer*>(ilay)->specificSurface();
790  const double diskZ = disk.position().z();
791  if (tsos.globalPosition().z() * diskZ < 0)
792  continue; // only propagate to the disk that's on the same side
793  std::pair<bool, TrajectoryStateOnSurface> comp = ilay->compatible(tsos, prop, *theEstimator);
794  if (!comp.first)
795  continue;
796  if (!inETL) {
797  inETL = true;
798  extrho = comp.second.globalPosition().perp();
799  exteta = comp.second.globalPosition().eta();
800  extphi = comp.second.globalPosition().phi();
801  }
802  edm::LogVerbatim("MtdTracksValidation") << "MtdTracksValidation: extrapolation at ETL surface, rho= " << extrho
803  << " eta= " << exteta << " phi= " << extphi;
804  std::vector<DetLayer::DetWithState> compDets = ilay->compatibleDets(tsos, prop, *theEstimator);
805  for (const auto& detWithState : compDets) {
806  const auto& det = detWithState.first;
807 
808  // loop on compatible rechits and check hits in a fixed size cone around the extrapolation point
809 
810  edm::LogVerbatim("MtdTracksValidation")
811  << "MtdTracksValidation: DetId= " << det->geographicalId().rawId()
812  << " gp= " << detWithState.second.globalPosition().x() << " " << detWithState.second.globalPosition().y()
813  << " " << detWithState.second.globalPosition().z() << " rho= " << detWithState.second.globalPosition().perp()
814  << " eta= " << detWithState.second.globalPosition().eta()
815  << " phi= " << detWithState.second.globalPosition().phi();
816 
817  for (const auto& recHit : *etlRecHitsHandle) {
818  ETLDetId detId = recHit.id();
819  DetId geoId = detId.geographicalId();
820  const MTDGeomDet* thedet = geom->idToDet(geoId);
821  if (thedet == nullptr)
822  throw cms::Exception("MtdTracksValidation") << "GeographicalID: " << std::hex << geoId.rawId() << " ("
823  << detId.rawId() << ") is invalid!" << std::dec << std::endl;
824  if (geoId == det->geographicalId()) {
825  const ProxyMTDTopology& topoproxy = static_cast<const ProxyMTDTopology&>(thedet->topology());
826  const RectangularMTDTopology& topo = static_cast<const RectangularMTDTopology&>(topoproxy.specificTopology());
827 
828  Local3DPoint local_point(topo.localX(recHit.row()), topo.localY(recHit.column()), 0.);
829  const auto& global_point = thedet->toGlobal(local_point);
830  edm::LogVerbatim("MtdTracksValidation")
831  << "MtdTracksValidation: Hit id= " << detId.rawId() << " time= " << recHit.time()
832  << " dr= " << reco::deltaR(global_point, detWithState.second.globalPosition());
833  if (reco::deltaR(global_point, detWithState.second.globalPosition()) < cluDRradius_) {
834  hcount++;
835  if (hcount == 1) {
836  //extrho = detWithState.second.globalPosition().perp();
837  //exteta = detWithState.second.globalPosition().eta();
838  //extphi = detWithState.second.globalPosition().phi();
839  }
840  }
841  }
842  }
843  }
844  if (hcount > 0) {
845  nlayers++;
846  selvar = (float)hcount;
847  isMatched = true;
848  edm::LogVerbatim("MtdTracksValidation")
849  << "MtdTracksValidation: ETL matched, counts= " << hcount << " #layers= " << nlayers;
850  }
851  }
852 
853  if (!inBTL && !inETL) {
854  edm::LogVerbatim("MtdTracksValidation")
855  << "MtdTracksValidation: track not extrapolating to MTD: pt= " << track.pt() << " eta= " << track.eta()
856  << " phi= " << track.phi() << " vz= " << track.vz()
857  << " vxy= " << std::sqrt(track.vx() * track.vx() + track.vy() * track.vy());
858  }
859  return std::make_pair(inETL, isMatched);
860 }
861 
862 // ------------ method for histogram booking ------------
864  ibook.setCurrentFolder(folder_);
865 
866  // histogram booking
867  meBTLTrackRPTime_ = ibook.book1D("TrackBTLRPTime", "Track t0 with respect to R.P.;t0 [ns]", 100, -1, 3);
868  meBTLTrackEffEtaTot_ = ibook.book1D("TrackBTLEffEtaTot", "Track efficiency vs eta (Tot);#eta_{RECO}", 100, -1.6, 1.6);
870  ibook.book1D("TrackBTLEffPhiTot", "Track efficiency vs phi (Tot);#phi_{RECO} [rad]", 100, -3.2, 3.2);
871  meBTLTrackEffPtTot_ = ibook.book1D("TrackBTLEffPtTot", "Track efficiency vs pt (Tot);pt_{RECO} [GeV]", 50, 0, 10);
872  meBTLTrackEffEtaMtd_ = ibook.book1D("TrackBTLEffEtaMtd", "Track efficiency vs eta (Mtd);#eta_{RECO}", 100, -1.6, 1.6);
874  ibook.book1D("TrackBTLEffPhiMtd", "Track efficiency vs phi (Mtd);#phi_{RECO} [rad]", 100, -3.2, 3.2);
875  meBTLTrackEffPtMtd_ = ibook.book1D("TrackBTLEffPtMtd", "Track efficiency vs pt (Mtd);pt_{RECO} [GeV]", 50, 0, 10);
877  ibook.book1D("TrackBTLPtRes", "Track pT resolution ;pT_{Gentrack}-pT_{MTDtrack}/pT_{Gentrack} ", 100, -0.1, 0.1);
878  meETLTrackRPTime_ = ibook.book1D("TrackETLRPTime", "Track t0 with respect to R.P.;t0 [ns]", 100, -1, 3);
880  ibook.book1D("TrackETLEffEtaTotZneg", "Track efficiency vs eta (Tot) (-Z);#eta_{RECO}", 100, -3.2, -1.4);
882  ibook.book1D("TrackETLEffEtaTotZpos", "Track efficiency vs eta (Tot) (+Z);#eta_{RECO}", 100, 1.4, 3.2);
884  ibook.book1D("TrackETLEffPhiTotZneg", "Track efficiency vs phi (Tot) (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
886  ibook.book1D("TrackETLEffPhiTotZpos", "Track efficiency vs phi (Tot) (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
888  ibook.book1D("TrackETLEffPtTotZneg", "Track efficiency vs pt (Tot) (-Z);pt_{RECO} [GeV]", 50, 0, 10);
890  ibook.book1D("TrackETLEffPtTotZpos", "Track efficiency vs pt (Tot) (+Z);pt_{RECO} [GeV]", 50, 0, 10);
892  ibook.book1D("TrackETLEffEtaMtdZneg", "Track efficiency vs eta (Mtd) (-Z);#eta_{RECO}", 100, -3.2, -1.4);
894  ibook.book1D("TrackETLEffEtaMtdZpos", "Track efficiency vs eta (Mtd) (+Z);#eta_{RECO}", 100, 1.4, 3.2);
896  ibook.book1D("TrackETLEffPhiMtdZneg", "Track efficiency vs phi (Mtd) (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
898  ibook.book1D("TrackETLEffPhiMtdZpos", "Track efficiency vs phi (Mtd) (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
900  ibook.book1D("TrackETLEffPtMtdZneg", "Track efficiency vs pt (Mtd) (-Z);pt_{RECO} [GeV]", 50, 0, 10);
902  ibook.book1D("TrackETLEffPtMtdZpos", "Track efficiency vs pt (Mtd) (+Z);pt_{RECO} [GeV]", 50, 0, 10);
904  ibook.book1D("TrackETLEffEta2MtdZneg", "Track efficiency vs eta (Mtd 2 hit) (-Z);#eta_{RECO}", 100, -3.2, -1.4);
906  ibook.book1D("TrackETLEffEta2MtdZpos", "Track efficiency vs eta (Mtd 2 hit) (+Z);#eta_{RECO}", 100, 1.4, 3.2);
907  meETLTrackEffPhi2Mtd_[0] = ibook.book1D(
908  "TrackETLEffPhi2MtdZneg", "Track efficiency vs phi (Mtd 2 hit) (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
909  meETLTrackEffPhi2Mtd_[1] = ibook.book1D(
910  "TrackETLEffPhi2MtdZpos", "Track efficiency vs phi (Mtd 2 hit) (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
912  ibook.book1D("TrackETLEffPt2MtdZneg", "Track efficiency vs pt (Mtd 2 hit) (-Z);pt_{RECO} [GeV]", 50, 0, 10);
914  ibook.book1D("TrackETLEffPt2MtdZpos", "Track efficiency vs pt (Mtd 2 hit) (+Z);pt_{RECO} [GeV]", 50, 0, 10);
916  ibook.book1D("TrackETLPtRes", "Track pT resolution;pT_{Gentrack}-pT_{MTDtrack}/pT_{Gentrack} ", 100, -0.1, 0.1);
917 
918  meTracktmtd_ = ibook.book1D("Tracktmtd", "Track time from TrackExtenderWithMTD;tmtd [ns]", 150, 1, 16);
919  meTrackt0Src_ = ibook.book1D("Trackt0Src", "Track time from TrackExtenderWithMTD;t0Src [ns]", 100, -1.5, 1.5);
921  ibook.book1D("TrackSigmat0Src", "Time Error from TrackExtenderWithMTD; #sigma_{t0Src} [ns]", 100, 0, 0.1);
922 
923  meTrackt0Pid_ = ibook.book1D("Trackt0Pid", "Track t0 as stored in TofPid;t0 [ns]", 100, -1, 1);
924  meTrackSigmat0Pid_ = ibook.book1D("TrackSigmat0Pid", "Sigmat0 as stored in TofPid; #sigma_{t0} [ns]", 100, 0, 0.1);
925  meTrackt0SafePid_ = ibook.book1D("Trackt0SafePID", "Track t0 Safe as stored in TofPid;t0 [ns]", 100, -1, 1);
927  ibook.book1D("TrackSigmat0SafePID", "Sigmat0 Safe as stored in TofPid; #sigma_{t0} [ns]", 100, 0, 0.1);
928  meTrackNumHits_ = ibook.book1D("TrackNumHits", "Number of valid MTD hits per track ; Number of hits", 10, -5, 5);
929  meTrackNumHitsNT_ = ibook.book1D(
930  "TrackNumHitsNT", "Number of valid MTD hits per track no time associated; Number of hits", 10, -5, 5);
931  meTrackMVAQual_ = ibook.book1D("TrackMVAQual", "Track MVA Quality as stored in Value Map ; MVAQual", 100, 0, 1);
933  "TrackPathLenghtvsEta", "MTD Track pathlength vs MTD track Eta;|#eta|;Pathlength", 100, 0, 3.2, 100.0, 400.0, "S");
934 
935  meMVATrackEffPtTot_ = ibook.book1D("MVAEffPtTot", "Pt of tracks associated to LV; track pt [GeV] ", 110, 0., 11.);
937  ibook.book1D("MVAMatchedEffPtTot", "Pt of tracks associated to LV matched to GEN; track pt [GeV] ", 110, 0., 11.);
939  "MVAMatchedEffPtMtd", "Pt of tracks associated to LV matched to GEN with time; track pt [GeV] ", 110, 0., 11.);
940 
941  if (optionalPlots_) {
942  meExtraPtMtd_ = ibook.book1D("ExtraPtMtd", "Pt of tracks extrapolated to hits; track pt [GeV] ", 110, 0., 11.);
943  meExtraPtEtl2Mtd_ = ibook.book1D(
944  "ExtraPtEtl2Mtd", "Pt of tracks extrapolated to hits, 2 ETL layers; track pt [GeV] ", 110, 0., 11.);
945  }
946 
947  meTrackPtTot_ = ibook.book1D("TrackPtTot", "Pt of tracks ; track pt [GeV] ", 110, 0., 11.);
949  ibook.book1D("MatchedTPEffPtTot", "Pt of tracks matched to TP; track pt [GeV] ", 110, 0., 11.);
951  ibook.book1D("MatchedTPEffPtMtd", "Pt of tracks matched to TP with time; track pt [GeV] ", 110, 0., 11.);
953  "MatchedTPEffPtEtl2Mtd", "Pt of tracks matched to TP with time, 2 ETL hits; track pt [GeV] ", 110, 0., 11.);
954 
956  ibook.book1D("MatchedTPmtdEffPtTot", "Pt of tracks matched to TP-mtd hit; track pt [GeV] ", 110, 0., 11.);
958  "MatchedTPmtdEffPtMtd", "Pt of tracks matched to TP-mtd hit with time; track pt [GeV] ", 110, 0., 11.);
959 
960  meMVATrackEffEtaTot_ = ibook.book1D("MVAEffEtaTot", "Eta of tracks associated to LV; track eta ", 66, 0., 3.3);
962  ibook.book1D("MVAMatchedEffEtaTot", "Eta of tracks associated to LV matched to GEN; track eta ", 66, 0., 3.3);
964  "MVAMatchedEffEtaMtd", "Eta of tracks associated to LV matched to GEN with time; track eta ", 66, 0., 3.3);
965 
966  if (optionalPlots_) {
967  meExtraEtaMtd_ = ibook.book1D("ExtraEtaMtd", "Eta of tracks extrapolated to hits; track eta ", 66, 0., 3.3);
969  ibook.book1D("ExtraEtaEtl2Mtd", "Eta of tracks extrapolated to hits, 2 ETL layers; track eta ", 66, 0., 3.3);
970  }
971 
972  meTrackEtaTot_ = ibook.book1D("TrackEtaTot", "Eta of tracks ; track eta ", 66, 0., 3.3);
974  ibook.book1D("MatchedTPEffEtaTot", "Eta of tracks matched to TP; track eta ", 66, 0., 3.3);
975  meMVATrackEffEtaTot_ = ibook.book1D("MVAEffEtaTot", "Eta of tracks ; track eta ", 66, 0., 3.3);
977  ibook.book1D("MatchedTPEffEtaMtd", "Eta of tracks matched to TP with time; track eta ", 66, 0., 3.3);
979  "MatchedTPEffEtaEtl2Mtd", "Eta of tracks matched to TP with time, 2 ETL hits; track eta ", 66, 0., 3.3);
980 
982  ibook.book1D("MatchedTPmtdEffEtaTot", "Eta of tracks matched to TP-mtd hit; track eta ", 66, 0., 3.3);
984  ibook.book1D("MatchedTPmtdEffEtaMtd", "Eta of tracks matched to TP-mtd hit with time; track eta ", 66, 0., 3.3);
985 
986  meMVATrackResTot_ = ibook.book1D(
987  "MVATrackRes", "t_{rec} - t_{sim} for LV associated tracks; t_{rec} - t_{sim} [ns] ", 120, -0.15, 0.15);
989  ibook.book1D("MVATrackPull", "Pull for associated tracks; (t_{rec}-t_{sim})/#sigma_{t}", 50, -5., 5.);
991  "MVATrackZposResTot", "Z_{PCA} - Z_{sim} for associated tracks;Z_{PCA} - Z_{sim} [cm] ", 100, -0.1, 0.1);
992 
993  if (optionalPlots_) {
995  ibook.book1D("ExtraPhiAtBTL", "Phi at BTL surface of extrapolated tracks; phi [deg]", 720, -180., 180.);
997  ibook.book1D("ExtraPhiAtBTLmatched",
998  "Phi at BTL surface of extrapolated tracksi matched with BTL hits; phi [deg]",
999  720,
1000  -180.,
1001  180.);
1002  meExtraBTLeneInCone_ = ibook.book1D(
1003  "ExtraBTLeneInCone", "BTL reconstructed energy in cone arounnd extrapolated track; E [MeV]", 100, 0., 50.);
1005  ibook.book1D("ExtraBTLfailExtenderEta",
1006  "Eta of tracks extrapolated to BTL with no track extender match to hits; track eta",
1007  66,
1008  0.,
1009  3.3);
1010  ;
1012  ibook.book1D("ExtraBTLfailExtenderPt",
1013  "Pt of tracks extrapolated to BTL with no track extender match to hits; track pt [GeV] ",
1014  110,
1015  0.,
1016  11.);
1017  }
1018 }
1019 
1020 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
1021 
1024 
1025  desc.add<std::string>("folder", "MTD/Tracks");
1026  desc.add<edm::InputTag>("inputTagG", edm::InputTag("generalTracks"));
1027  desc.add<edm::InputTag>("inputTagT", edm::InputTag("trackExtenderWithMTD"));
1028  desc.add<edm::InputTag>("inputTagV", edm::InputTag("offlinePrimaryVertices4D"));
1029  desc.add<edm::InputTag>("inputTagH", edm::InputTag("generatorSmeared"));
1030  desc.add<edm::InputTag>("SimTag", edm::InputTag("mix", "MergedTrackTruth"));
1031  desc.add<edm::InputTag>("TPtoRecoTrackAssoc", edm::InputTag("trackingParticleRecoTrackAsssociation"));
1032  desc.add<edm::InputTag>("btlSimHits", edm::InputTag("mix", "g4SimHitsFastTimerHitsBarrel"));
1033  desc.add<edm::InputTag>("etlSimHits", edm::InputTag("mix", "g4SimHitsFastTimerHitsEndcap"));
1034  desc.add<edm::InputTag>("btlRecHits", edm::InputTag("mtdRecHits", "FTLBarrel"));
1035  desc.add<edm::InputTag>("etlRecHits", edm::InputTag("mtdRecHits", "FTLEndcap"));
1036  desc.add<edm::InputTag>("tmtd", edm::InputTag("trackExtenderWithMTD:generalTracktmtd"));
1037  desc.add<edm::InputTag>("sigmatmtd", edm::InputTag("trackExtenderWithMTD:generalTracksigmatmtd"));
1038  desc.add<edm::InputTag>("t0Src", edm::InputTag("trackExtenderWithMTD:generalTrackt0"));
1039  desc.add<edm::InputTag>("sigmat0Src", edm::InputTag("trackExtenderWithMTD:generalTracksigmat0"));
1040  desc.add<edm::InputTag>("trackAssocSrc", edm::InputTag("trackExtenderWithMTD:generalTrackassoc"))
1041  ->setComment("Association between General and MTD Extended tracks");
1042  desc.add<edm::InputTag>("pathLengthSrc", edm::InputTag("trackExtenderWithMTD:generalTrackPathLength"));
1043  desc.add<edm::InputTag>("t0SafePID", edm::InputTag("tofPID:t0safe"));
1044  desc.add<edm::InputTag>("sigmat0SafePID", edm::InputTag("tofPID:sigmat0safe"));
1045  desc.add<edm::InputTag>("sigmat0PID", edm::InputTag("tofPID:sigmat0"));
1046  desc.add<edm::InputTag>("t0PID", edm::InputTag("tofPID:t0"));
1047  desc.add<edm::InputTag>("trackMVAQual", edm::InputTag("mtdTrackQualityMVA:mtdQualMVA"));
1048  desc.add<double>("trackMinimumPt", 0.7); // [GeV]
1049  desc.add<double>("trackMaximumBtlEta", 1.5);
1050  desc.add<double>("trackMinimumEtlEta", 1.6);
1051  desc.add<double>("trackMaximumEtlEta", 3.);
1052  desc.addUntracked<bool>("optionalPlots", true);
1053 
1054  descriptions.add("mtdTracksValid", desc);
1055 }
1056 
1058  bool match = false;
1059  if (gp.status() != 1) {
1060  return match;
1061  }
1062  match = charge != 0.f && gp.momentum().perp() > pTcut_ && std::abs(gp.momentum().eta()) < etacutGEN_;
1063  return match;
1064 }
1065 
1067  bool match = false;
1068  if (tp.status() != 1) {
1069  return match;
1070  }
1071  auto x_pv = tp.parentVertex()->position().x();
1072  auto y_pv = tp.parentVertex()->position().y();
1073  auto z_pv = tp.parentVertex()->position().z();
1074 
1075  auto r_pv = std::sqrt(x_pv * x_pv + y_pv * y_pv);
1076 
1077  match = tp.charge() != 0 && tp.pt() > pTcut_ && std::abs(tp.eta()) < etacutGEN_ && r_pv < rBTL_ && z_pv < zETL_;
1078  return match;
1079 }
1080 
1082  const reco::Vertex& vtx,
1083  const double& t0,
1084  const double& st0) {
1085  bool match = false;
1086  match = trk.pt() > pTcut_ && std::abs(trk.eta()) < etacutREC_ &&
1087  (std::abs(trk.vz() - vtx.z()) <= deltaZcut_ || vtx.isFake());
1088  if (st0 > 0.) {
1089  match = match && std::abs(t0 - vtx.t()) < 3. * st0;
1090  }
1091  return match;
1092 }
1093 
1095  const double& zsim,
1096  const reco::TrackBase& trk,
1097  const bool& vtxFake) {
1098  bool match = false;
1099  double dR = reco::deltaR(genP.momentum(), trk.momentum());
1100  double genPT = genP.momentum().perp();
1101  match = std::abs(genPT - trk.pt()) < trk.pt() * deltaPTcut_ && dR < deltaDRcut_ &&
1102  (std::abs(trk.vz() - zsim) < deltaZcut_ || vtxFake);
1103  return match;
1104 }
1105 
1107  auto found = r2s_->find(recoTrack);
1108 
1109  // reco track not matched to any TP
1110  if (found == r2s_->end())
1111  return nullptr;
1112 
1113  //matched TP equal to any TP associated to in time events
1114  for (const auto& tp : found->val) {
1115  if (tp.first->eventId().bunchCrossing() == 0)
1116  return &tp.first;
1117  }
1118 
1119  // reco track not matched to any TP from vertex
1120  return nullptr;
1121 }
1122 
MonitorElement * meETLTrackEffEtaTot_[2]
edm::EDGetTokenT< edm::ValueMap< int > > trackAssocToken_
static constexpr double etacutGEN_
Log< level::Info, true > LogVerbatim
MonitorElement * meTrackMatchedTPEffEtaMtd_
MonitorElement * meBTLTrackEffPhiMtd_
int getMTDTopologyMode() const
Definition: MTDTopology.h:27
edm::EDGetTokenT< edm::ValueMap< float > > trackMVAQualToken_
edm::EDGetTokenT< edm::ValueMap< float > > pathLengthToken_
MonitorElement * meExtraBTLfailExtenderEta_
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
MonitorElement * meMVATrackResTot_
MonitorElement * meTrackNumHits_
MonitorElement * meTrackt0Pid_
static constexpr double pTcut_
const std::pair< bool, bool > checkAcceptance(const reco::Track &, const edm::Event &, const edm::EventSetup &, size_t &, float &, float &, float &, float &)
MonitorElement * meETLTrackRPTime_
edm::EDGetTokenT< edm::ValueMap< float > > t0SafePidToken_
std::string folder_
edm::EDGetTokenT< edm::ValueMap< float > > t0SrcToken_
static constexpr double rBTL_
edm::ESGetToken< MTDTopology, MTDTopologyRcd > mtdtopoToken_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
const std::string folder_
edm::EDGetTokenT< edm::HepMCProduct > HepMCProductToken_
HepPDT::ParticleDataTable ParticleDataTable
T z() const
Definition: PV3DBase.h:61
MonitorElement * meMVATrackMatchedEffEtaMtd_
const bool mvaRecSel(const reco::TrackBase &, const reco::Vertex &, const double &, const double &)
virtual const Topology & topology() const
Definition: GeomDet.cc:67
edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > builderToken_
constexpr NumType convertRadToDeg(NumType radians)
Definition: angle_units.h:21
virtual const PixelTopology & specificTopology() const
static constexpr double etacutREC_
static constexpr double deltaPTcut_
MonitorElement * meBTLTrackPtRes_
edm::EDGetTokenT< std::vector< reco::Vertex > > RecVertexToken_
MonitorElement * meETLTrackEffPtTot_[2]
MonitorElement * meBTLTrackEffEtaMtd_
MonitorElement * meETLTrackEffPhi2Mtd_[2]
Definition: MTDHit.h:4
edm::EDGetTokenT< edm::ValueMap< float > > tmtdToken_
MonitorElement * meExtraBTLeneInCone_
MonitorElement * meMVATrackMatchedEffPtTot_
MonitorElement * meMVATrackEffPtTot_
MonitorElement * meExtraEtaMtd_
MonitorElement * meExtraBTLfailExtenderPt_
MonitorElement * meMVATrackEffEtaTot_
const reco::SimToRecoCollection * s2r_
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:31
const unsigned long int uniqueId(const uint32_t x, const EncodedEventId &y)
LocalPoint pixelToModuleLocalPoint(const LocalPoint &plp, int row, int col) const
MonitorElement * meTrackMatchedTPmtdEffEtaTot_
static constexpr double cluDRradius_
const reco::RecoToSimCollection * r2s_
const edm::Ref< std::vector< TrackingParticle > > * getMatchedTP(const reco::TrackBaseRef &)
const_iterator find(const key_type &k) const
find element with specified reference key
const bool mvaGenSel(const HepMC::GenParticle &, const float &)
Detector identifier base class for the MIP Timing Layer.
Definition: MTDDetId.h:21
const bool mvaTPSel(const TrackingParticle &)
constexpr NumType convertUnitsTo(double desiredUnits, NumType val)
Definition: GeantUnits.h:73
edm::EDGetTokenT< reco::TrackCollection > GenRecTrackToken_
MonitorElement * meETLTrackEffPhiMtd_[2]
const_iterator end() const
last iterator over the map (read only)
void Fill(long long x)
double pt() const
track transverse momentum
Definition: TrackBase.h:637
edm::EDGetTokenT< reco::TrackCollection > RecTrackToken_
MonitorElement * meExtraEtaEtl2Mtd_
MonitorElement * meBTLTrackEffPhiTot_
edm::ESGetToken< MTDDetLayerGeometry, MTDRecoGeometryRecord > mtdlayerToken_
int iEvent
Definition: GenABIO.cc:224
GlobalPoint globalPosition() const
MonitorElement * meTrackMatchedTPmtdEffEtaMtd_
MonitorElement * meTrackMatchedTPEffEtaTot_
float localX(const float mpX) const override
edm::EDGetTokenT< FTLRecHitCollection > etlRecHitsToken_
MonitorElement * meBTLTrackRPTime_
double vz() const
z coordinate of the reference point on track
Definition: TrackBase.h:661
MonitorElement * meETLTrackEffEta2Mtd_[2]
static constexpr double depositBTLthreshold_
MonitorElement * meETLTrackPtRes_
MonitorElement * meETLTrackEffPt2Mtd_[2]
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 * meTrackt0SafePid_
T sqrt(T t)
Definition: SSEVec.h:19
MonitorElement * meBTLTrackEffEtaTot_
static constexpr double deltaZcut_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool isETL(const double eta) const
bool isMatched(TrackingRecHit const &hit)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
int nrows() const override
MonitorElement * meMVATrackMatchedEffEtaTot_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< edm::ValueMap< float > > t0PidToken_
MonitorElement * meTrackMatchedTPEffPtEtl2Mtd_
MonitorElement * meTrackMatchedTPmtdEffPtMtd_
edm::EDGetTokenT< FTLRecHitCollection > btlRecHitsToken_
MonitorElement * meTrackMVAQual_
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
MonitorElement * meETLTrackEffPhiTot_[2]
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
const std::vector< const DetLayer * > & allBTLLayers() const
return the BTL DetLayers (barrel), inside-out
edm::EDGetTokenT< edm::ValueMap< float > > SigmatmtdToken_
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
edm::EDGetTokenT< TrackingParticleCollection > trackingParticleCollectionToken_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
MonitorElement * meTrackNumHitsNT_
Log< level::Info, false > LogInfo
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
Definition: DetId.h:17
constexpr NumType convertMmToCm(NumType millimeters)
Definition: angle_units.h:44
edm::EDGetTokenT< reco::SimToRecoCollection > simToRecoAssociationToken_
MonitorElement * meTrackEtaTot_
static constexpr double etaMatchCut_
static constexpr double zETL_
static constexpr double depositETLthreshold_
MonitorElement * meTrackMatchedTPEffEtaEtl2Mtd_
unsigned long long uint64_t
Definition: Time.h:13
MonitorElement * meMVATrackPullTot_
MonitorElement * meTrackMatchedTPEffPtMtd_
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
void analyze(const edm::Event &, const edm::EventSetup &) override
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
double b
Definition: hdecay.h:120
edm::EDGetTokenT< CrossingFrame< PSimHit > > etlSimHitsToken_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
MonitorElement * meTrackSigmat0SafePid_
MonitorElement * meETLTrackEffEtaMtd_[2]
int zside() const
Definition: MTDDetId.h:61
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:664
MonitorElement * meTrackSigmat0Pid_
edm::EDGetTokenT< CrossingFrame< PSimHit > > btlSimHitsToken_
MonitorElement * meTrackMatchedTPmtdEffPtTot_
MonitorElement * meBTLTrackEffPtMtd_
MonitorElement * meTrackt0Src_
edm::EDGetTokenT< edm::ValueMap< float > > Sigmat0PidToken_
static constexpr double deltaDRcut_
MonitorElement * meTracktmtd_
MonitorElement * meBTLTrackEffPtTot_
MonitorElement * meTrackPathLenghtvsEta_
MonitorElement * meTrackMatchedTPEffPtTot_
Detector identifier class for the Endcap Timing Layer.
Definition: ETLDetId.h:15
HLT enums.
int nDisc() const
Definition: ETLDetId.h:124
double a
Definition: hdecay.h:121
const bool mvaGenRecMatch(const HepMC::GenParticle &, const double &, const reco::TrackBase &, const bool &)
Detector identifier class for the Barrel Timing Layer. The crystal count must start from 0...
Definition: BTLDetId.h:19
MonitorElement * meExtraPtMtd_
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:141
MonitorElement * meExtraPhiAtBTLmatched_
edm::EDGetTokenT< reco::RecoToSimCollection > recoToSimAssociationToken_
Monte Carlo truth information used for tracking validation.
edm::EDGetTokenT< edm::ValueMap< float > > Sigmat0SrcToken_
MonitorElement * meETLTrackEffPtMtd_[2]
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
MonitorElement * meExtraPtEtl2Mtd_
BTLDetId::CrysLayout crysLayoutFromTopoMode(const int &topoMode)
edm::ESGetToken< MTDGeometry, MTDDigiGeometryRecord > mtdgeoToken_
std::vector< TrackingParticle > TrackingParticleCollection
MonitorElement * meTrackPtTot_
MonitorElement * meMVATrackZposResTot_
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
MonitorElement * meMVATrackMatchedEffPtMtd_
MonitorElement * meTrackSigmat0Src_
const std::vector< const DetLayer * > & allETLLayers() const
return the ETL DetLayers (endcap), -Z to +Z
Definition: Run.h:45
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magfieldToken_
edm::EDGetTokenT< edm::ValueMap< float > > Sigmat0SafePidToken_
MtdTracksValidation(const edm::ParameterSet &)
edm::ESGetToken< HepPDT::ParticleDataTable, edm::DefaultRecord > particleTableToken_
MonitorElement * meExtraPhiAtBTL_