CMS 3D CMS Logo

DiMuonVertexValidation.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Alignment/OfflineValidation
4 // Class: DiMuonVertexValidation
5 //
11 //
12 // Original Author: Marco Musich
13 // Created: Wed, 21 Apr 2021 09:06:25 GMT
14 //
15 //
16 
17 // system include files
18 #include <memory>
19 #include <utility>
20 
21 // user include files
28 
29 // muons
33 
34 // utils
37 #include "TLorentzVector.h"
38 
39 // tracks
46 
47 // vertices
52 
53 // ROOT
54 #include "TH1F.h"
55 #include "TH2F.h"
56 
57 //#define LogDebug(X) std::cout << X <<
58 
59 //
60 // class declaration
61 //
62 
63 class DiMuonVertexValidation : public edm::one::EDAnalyzer<edm::one::SharedResources> {
64 public:
66  ~DiMuonVertexValidation() override;
67 
68  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
69 
70 private:
71  void beginJob() override;
72  void analyze(const edm::Event&, const edm::EventSetup&) override;
74  void endJob() override;
75 
76  // ----------member data ---------------------------
78 
79  const bool useReco_;
80  const bool useClosestVertex_;
81  std::vector<double> pTthresholds_;
82  float maxSVdist_;
83 
84  // plot configurations
85 
94 
95  // control plots
96 
97  TH1F* hSVProb_;
98  TH1F* hSVDist_;
99  TH1F* hSVDistSig_;
100  TH1F* hSVDist3D_;
102 
103  TH1F* hCosPhi_;
104  TH1F* hCosPhi3D_;
105  TH1F* hCosPhiInv_;
107 
108  TH1F* hInvMass_;
110 
111  TH1F* hCutFlow_;
112 
113  // 2D maps
114 
123 
124  // plots vs region
127 
129 
130  edm::EDGetTokenT<reco::TrackCollection> tracksToken_; //used to select what tracks to read from configuration file
131  edm::EDGetTokenT<reco::VertexCollection> vertexToken_; //used to select what vertices to read from configuration file
132 
133  // either on or the other!
134  edm::EDGetTokenT<reco::MuonCollection> muonsToken_; //used to select what tracks to read from configuration file
136  alcaRecoToken_; //used to select what muon tracks to read from configuration file
137 };
138 
139 //
140 // constants, enums and typedefs
141 //
142 
143 static constexpr float cmToum = 10e4;
144 static constexpr float mumass2 = 0.105658367 * 0.105658367; //mu mass squared (GeV^2/c^4)
145 
146 //
147 // static data member definitions
148 //
149 
150 //
151 // constructors and destructor
152 //
154  : useReco_(iConfig.getParameter<bool>("useReco")),
155  useClosestVertex_(iConfig.getParameter<bool>("useClosestVertex")),
156  pTthresholds_(iConfig.getParameter<std::vector<double>>("pTThresholds")),
157  maxSVdist_(iConfig.getParameter<double>("maxSVdist")),
158  CosPhiConfiguration_(iConfig.getParameter<edm::ParameterSet>("CosPhiConfig")),
159  CosPhi3DConfiguration_(iConfig.getParameter<edm::ParameterSet>("CosPhi3DConfig")),
160  VtxProbConfiguration_(iConfig.getParameter<edm::ParameterSet>("VtxProbConfig")),
161  VtxDistConfiguration_(iConfig.getParameter<edm::ParameterSet>("VtxDistConfig")),
162  VtxDist3DConfiguration_(iConfig.getParameter<edm::ParameterSet>("VtxDist3DConfig")),
163  VtxDistSigConfiguration_(iConfig.getParameter<edm::ParameterSet>("VtxDistSigConfig")),
164  VtxDist3DSigConfiguration_(iConfig.getParameter<edm::ParameterSet>("VtxDist3DSigConfig")),
165  DiMuMassConfiguration_(iConfig.getParameter<edm::ParameterSet>("DiMuMassConfig")),
166  ttbESToken_(esConsumes(edm::ESInputTag("", "TransientTrackBuilder"))),
167  vertexToken_(consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"))) {
168  if (useReco_) {
169  tracksToken_ = consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("tracks"));
170  muonsToken_ = consumes<reco::MuonCollection>(iConfig.getParameter<edm::InputTag>("muons"));
171  } else {
172  alcaRecoToken_ = consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("muonTracks"));
173  }
174 
175  usesResource(TFileService::kSharedResource);
176 
177  // sort the vector of thresholds
178  std::sort(pTthresholds_.begin(), pTthresholds_.end(), [](const double& lhs, const double& rhs) { return lhs > rhs; });
179 
180  edm::LogInfo("DiMuonVertexValidation") << __FUNCTION__;
181  for (const auto& thr : pTthresholds_) {
182  edm::LogInfo("DiMuonVertexValidation") << " Threshold: " << thr << " ";
183  }
184  edm::LogInfo("DiMuonVertexValidation") << "Max SV distance: " << maxSVdist_ << " ";
185 }
186 
188 
189 //
190 // member functions
191 //
192 
193 // ------------ method called for each event ------------
195  using namespace edm;
196 
198 
199  // the di-muon tracks
200  std::vector<const reco::Track*> myTracks;
201 
202  // if we have to start from scratch from RECO data-tier
203  if (useReco_) {
204  // select the good muons
205  std::vector<const reco::Muon*> myGoodMuonVector;
206  for (const auto& muon : iEvent.get(muonsToken_)) {
207  const reco::TrackRef t = muon.innerTrack();
208  if (!t.isNull()) {
209  if (t->quality(reco::TrackBase::highPurity)) {
210  if (t->chi2() / t->ndof() <= 2.5 && t->numberOfValidHits() >= 5 &&
211  t->hitPattern().numberOfValidPixelHits() >= 2 && t->quality(reco::TrackBase::highPurity))
212  myGoodMuonVector.emplace_back(&muon);
213  }
214  }
215  }
216 
217  LogDebug("DiMuonVertexValidation") << "myGoodMuonVector size: " << myGoodMuonVector.size() << std::endl;
218  std::sort(myGoodMuonVector.begin(), myGoodMuonVector.end(), [](const reco::Muon*& lhs, const reco::Muon*& rhs) {
219  return lhs->pt() > rhs->pt();
220  });
221 
222  // just check the ordering
223  for (const auto& muon : myGoodMuonVector) {
224  LogDebug("DiMuonVertexValidation") << "pT: " << muon->pt() << " ";
225  }
226  LogDebug("DiMuonVertexValidation") << std::endl;
227 
228  // reject if there's no Z
229  if (myGoodMuonVector.size() < 2)
230  return;
231 
233 
234  if ((myGoodMuonVector[0]->pt()) < pTthresholds_[0] || (myGoodMuonVector[1]->pt() < pTthresholds_[1]))
235  return;
236 
239 
240  if (myGoodMuonVector[0]->charge() * myGoodMuonVector[1]->charge() > 0)
241  return;
242 
243  const auto& m1 = myGoodMuonVector[1]->p4();
244  const auto& m0 = myGoodMuonVector[0]->p4();
245  const auto& mother = m0 + m1;
246 
247  float invMass = mother.M();
248  hInvMass_->Fill(invMass);
249 
250  // just copy the top two muons
251  std::vector<const reco::Muon*> theZMuonVector;
252  theZMuonVector.reserve(2);
253  theZMuonVector.emplace_back(myGoodMuonVector[1]);
254  theZMuonVector.emplace_back(myGoodMuonVector[0]);
255 
256  // do the matching of Z muons with inner tracks
257  unsigned int i = 0;
258  for (const auto& muon : theZMuonVector) {
259  i++;
260  float minD = 1000.;
261  const reco::Track* theMatch = nullptr;
262  for (const auto& track : iEvent.get(tracksToken_)) {
263  float D = ::deltaR(muon->eta(), muon->phi(), track.eta(), track.phi());
264  if (D < minD) {
265  minD = D;
266  theMatch = &track;
267  }
268  }
269  LogDebug("DiMuonVertexValidation") << "pushing new track: " << i << std::endl;
270  myTracks.emplace_back(theMatch);
271  }
272  } else {
273  // we start directly with the pre-selected ALCARECO tracks
274  for (const auto& muon : iEvent.get(alcaRecoToken_)) {
275  myTracks.emplace_back(&muon);
276  }
277  }
278 
279 #ifdef EDM_ML_DEBUG
280  for (const auto& track : myTracks) {
281  edm::LogVerbatim("DiMuonVertexValidation") << __PRETTY_FUNCTION__ << " pT: " << track->pt() << " GeV"
282  << " , pT error: " << track->ptError() << " GeV"
283  << " , eta: " << track->eta() << " , phi: " << track->phi() << std::endl;
284  }
285 #endif
286 
287  LogDebug("DiMuonVertexValidation") << "selected tracks: " << myTracks.size() << std::endl;
288 
289  const TransientTrackBuilder* theB = &iSetup.getData(ttbESToken_);
290  TransientVertex aTransientVertex;
291  std::vector<reco::TransientTrack> tks;
292 
293  if (myTracks.size() != 2)
294  return;
295 
296  const auto& t1 = myTracks[1]->momentum();
297  const auto& t0 = myTracks[0]->momentum();
298  const auto& ditrack = t1 + t0;
299 
300  const auto& tplus = myTracks[0]->charge() > 0 ? myTracks[0] : myTracks[1];
301  const auto& tminus = myTracks[0]->charge() < 0 ? myTracks[0] : myTracks[1];
302 
303  TLorentzVector p4_tplus(tplus->px(), tplus->py(), tplus->pz(), sqrt((tplus->p() * tplus->p()) + mumass2));
304  TLorentzVector p4_tminus(tminus->px(), tminus->py(), tminus->pz(), sqrt((tminus->p() * tminus->p()) + mumass2));
305 
306 #ifdef EDM_ML_DEBUG
307  // Define a lambda function to convert TLorentzVector to a string
308  auto tLorentzVectorToString = [](const TLorentzVector& vector) {
309  return std::to_string(vector.Px()) + " " + std::to_string(vector.Py()) + " " + std::to_string(vector.Pz()) + " " +
310  std::to_string(vector.E());
311  };
312 
313  edm::LogVerbatim("DiMuonVertexValidation") << "mu+" << tLorentzVectorToString(p4_tplus) << std::endl;
314  edm::LogVerbatim("DiMuonVertexValidation") << "mu-" << tLorentzVectorToString(p4_tminus) << std::endl;
315 #endif
316 
317  const auto& Zp4 = p4_tplus + p4_tminus;
318  float track_invMass = Zp4.M();
319  hTrackInvMass_->Fill(track_invMass);
320 
321  // creat the pair of TLorentVectors used to make the plos
322  std::pair<TLorentzVector, TLorentzVector> tktk_p4 = std::make_pair(p4_tplus, p4_tminus);
323 
324  // fill the z->mm mass plots
325  ZMassPlots.fillPlots(track_invMass, tktk_p4);
326  InvMassInEtaBins.fillTH1Plots(track_invMass, tktk_p4);
327 
328  math::XYZPoint ZpT(ditrack.x(), ditrack.y(), 0);
329  math::XYZPoint Zp(ditrack.x(), ditrack.y(), ditrack.z());
330 
331  for (const auto& track : myTracks) {
332  reco::TransientTrack trajectory = theB->build(track);
333  tks.push_back(trajectory);
334  }
335 
336  KalmanVertexFitter kalman(true);
337  aTransientVertex = kalman.vertex(tks);
338 
339  double SVProb = TMath::Prob(aTransientVertex.totalChiSquared(), (int)aTransientVertex.degreesOfFreedom());
340 
341  LogDebug("DiMuonVertexValidation") << " vertex prob: " << SVProb << std::endl;
342 
343  hSVProb_->Fill(SVProb);
344 
345  if (!aTransientVertex.isValid())
346  return;
347 
349 
350  // fill the VtxProb plots
351  VtxProbPlots.fillPlots(SVProb, tktk_p4);
352 
353  math::XYZPoint MainVertex(0, 0, 0);
354  const reco::Vertex* theClosestVertex = nullptr;
355  // get collection of reconstructed vertices from event
356  edm::Handle<reco::VertexCollection> vertexHandle = iEvent.getHandle(vertexToken_);
357  if (vertexHandle.isValid()) {
358  const reco::VertexCollection* vertices = vertexHandle.product();
359  theClosestVertex = this->findClosestVertex(aTransientVertex, vertices);
360  } else {
361  edm::LogWarning("DiMuonVertexMonitor") << "invalid vertex collection encountered Skipping event!";
362  return;
363  }
364 
365  reco::Vertex TheMainVertex;
366  if (!useClosestVertex_ || theClosestVertex == nullptr) {
367  // if the closest vertex is not available, or explicitly not chosen
368  TheMainVertex = vertexHandle.product()->front();
369  } else {
370  TheMainVertex = *theClosestVertex;
371  }
372 
373  MainVertex.SetXYZ(TheMainVertex.position().x(), TheMainVertex.position().y(), TheMainVertex.position().z());
374  const math::XYZPoint myVertex(
375  aTransientVertex.position().x(), aTransientVertex.position().y(), aTransientVertex.position().z());
376  const math::XYZPoint deltaVtx(
377  MainVertex.x() - myVertex.x(), MainVertex.y() - myVertex.y(), MainVertex.z() - myVertex.z());
378 
379 #ifdef EDM_ML_DEBUG
380  edm::LogVerbatim("DiMuonVertexValidation")
381  << "mm vertex position:" << aTransientVertex.position().x() << "," << aTransientVertex.position().y() << ","
382  << aTransientVertex.position().z();
383 
384  edm::LogVerbatim("DiMuonVertexValidation") << "main vertex position:" << TheMainVertex.position().x() << ","
385  << TheMainVertex.position().y() << "," << TheMainVertex.position().z();
386 #endif
387 
388  if (TheMainVertex.isValid()) {
389  // Z Vertex distance in the xy plane
390 
391  VertexDistanceXY vertTool;
392  double distance = vertTool.distance(aTransientVertex, TheMainVertex).value();
393  double dist_err = vertTool.distance(aTransientVertex, TheMainVertex).error();
394 
395  hSVDist_->Fill(distance * cmToum);
396  hSVDistSig_->Fill(distance / dist_err);
397 
398  // fill the VtxDist plots
400 
401  // fill the VtxDisSig plots
402  VtxDistSigPlots.fillPlots(distance / dist_err, tktk_p4);
403 
404  // Z Vertex distance in 3D
405 
406  VertexDistance3D vertTool3D;
407  double distance3D = vertTool3D.distance(aTransientVertex, TheMainVertex).value();
408  double dist3D_err = vertTool3D.distance(aTransientVertex, TheMainVertex).error();
409 
410  hSVDist3D_->Fill(distance3D * cmToum);
411  hSVDist3DSig_->Fill(distance3D / dist3D_err);
412 
413  // fill the VtxDist3D plots
414  VtxDist3DPlots.fillPlots(distance3D * cmToum, tktk_p4);
415 
416  // fill the VtxDisSig plots
417  VtxDist3DSigPlots.fillPlots(distance3D / dist3D_err, tktk_p4);
418 
419  LogDebug("DiMuonVertexValidation") << "distance: " << distance << "+/-" << dist_err << std::endl;
420  // cut on the PV - SV distance
421  if (distance * cmToum < maxSVdist_) {
423 
424  double cosphi = (ZpT.x() * deltaVtx.x() + ZpT.y() * deltaVtx.y()) /
425  (sqrt(ZpT.x() * ZpT.x() + ZpT.y() * ZpT.y()) *
426  sqrt(deltaVtx.x() * deltaVtx.x() + deltaVtx.y() * deltaVtx.y()));
427 
428  double cosphi3D = (Zp.x() * deltaVtx.x() + Zp.y() * deltaVtx.y() + Zp.z() * deltaVtx.z()) /
429  (sqrt(Zp.x() * Zp.x() + Zp.y() * Zp.y() + Zp.z() * Zp.z()) *
430  sqrt(deltaVtx.x() * deltaVtx.x() + deltaVtx.y() * deltaVtx.y() + deltaVtx.z() * deltaVtx.z()));
431 
432  LogDebug("DiMuonVertexValidation") << "cos(phi) = " << cosphi << std::endl;
433 
434  hCosPhi_->Fill(cosphi);
435  hCosPhi3D_->Fill(cosphi3D);
436 
437 #ifdef EDM_ML_DEBUG
438  edm::LogVerbatim("DiMuonVertexValidation")
439  << "distance " << distance * cmToum << " cosphi3D:" << cosphi3D << std::endl;
440 #endif
441 
442  // fill the cosphi plots
443  CosPhiPlots.fillPlots(cosphi, tktk_p4);
444 
445  // fill the cosphi3D plots
446  CosPhi3DPlots.fillPlots(cosphi3D, tktk_p4);
447 
448  // fill the cosphi3D plots in eta bins
449  CosPhi3DInEtaBins.fillTH1Plots(cosphi3D, tktk_p4);
450  }
451  }
452 }
453 
454 // ------------ method called once each job just before starting event loop ------------
457 
458  // clang-format off
459  TH1F::SetDefaultSumw2(kTRUE);
460  hSVProb_ = fs->make<TH1F>("VtxProb", ";#mu^{+}#mu^{-} vertex probability;N(#mu#mu pairs)", 100, 0., 1.);
461 
462  hSVDist_ = fs->make<TH1F>("VtxDist", ";PV-#mu^{+}#mu^{-} vertex xy distance [#mum];N(#mu#mu pairs)", 100, 0., 300.);
463  hSVDistSig_ = fs->make<TH1F>("VtxDistSig", ";PV-#mu^{+}#mu^{-} vertex xy distance signficance;N(#mu#mu pairs)", 100, 0., 5.);
464 
465  hSVDist3D_ = fs->make<TH1F>("VtxDist3D", ";PV-#mu^{+}#mu^{-} vertex 3D distance [#mum];N(#mu#mu pairs)", 100, 0., 300.);
466  hSVDist3DSig_ = fs->make<TH1F>("VtxDist3DSig", ";PV-#mu^{+}#mu^{-} vertex 3D distance signficance;N(#mu#mu pairs)", 100, 0., 5.);
467 
468  hInvMass_ = fs->make<TH1F>("InvMass", ";M(#mu#mu) [GeV];N(#mu#mu pairs)", 70., 50., 120.);
469  hTrackInvMass_ = fs->make<TH1F>("TkTkInvMass", ";M(tk,tk) [GeV];N(tk tk pairs)", 70., 50., 120.);
470 
471  hCosPhi_ = fs->make<TH1F>("CosPhi", ";cos(#phi_{xy});N(#mu#mu pairs)", 50, -1., 1.);
472  hCosPhi3D_ = fs->make<TH1F>("CosPhi3D", ";cos(#phi_{3D});N(#mu#mu pairs)", 50, -1., 1.);
473 
474  hCosPhiInv_ = fs->make<TH1F>("CosPhiInv", ";inverted cos(#phi_{xy});N(#mu#mu pairs)", 50, -1., 1.);
475  hCosPhiInv3D_ = fs->make<TH1F>("CosPhiInv3D", ";inverted cos(#phi_{3D});N(#mu#mu pairs)", 50, -1., 1.);
476  // clang-format on
477 
478  // 2D Maps
479 
480  TFileDirectory dirCosPhi = fs->mkdir("CosPhiPlots");
482 
483  TFileDirectory dirCosPhi3D = fs->mkdir("CosPhi3DPlots");
485 
486  TFileDirectory dirVtxProb = fs->mkdir("VtxProbPlots");
488 
489  TFileDirectory dirVtxDist = fs->mkdir("VtxDistPlots");
491 
492  TFileDirectory dirVtxDist3D = fs->mkdir("VtxDist3DPlots");
494 
495  TFileDirectory dirVtxDistSig = fs->mkdir("VtxDistSigPlots");
497 
498  TFileDirectory dirVtxDist3DSig = fs->mkdir("VtxDist3DSigPlots");
500 
501  TFileDirectory dirInvariantMass = fs->mkdir("InvariantMassPlots");
503 
504  // CosPhi3D in eta bins
505  TFileDirectory dirCosphi3DEta = fs->mkdir("CosPhi3DInEtaBins");
506  CosPhi3DInEtaBins.bookSet(dirCosphi3DEta, hCosPhi3D_);
507 
508  // Z-> mm mass in eta bins
509  TFileDirectory dirResMassEta = fs->mkdir("TkTkMassInEtaBins");
510  InvMassInEtaBins.bookSet(dirResMassEta, hTrackInvMass_);
511 
512  // cut flow
513 
514  hCutFlow_ = fs->make<TH1F>("hCutFlow", "cut flow;cut step;events left", 6, -0.5, 5.5);
515  std::string names[6] = {"Total", "Mult.", ">pT", "<eta", "hasVtx", "VtxDist"};
516  for (unsigned int i = 0; i < 6; i++) {
517  hCutFlow_->GetXaxis()->SetBinLabel(i + 1, names[i].c_str());
518  }
519 
520  myCounts.zeroAll();
521 }
522 
523 // ------------ method called once each job just after ending the event loop ------------
526 
527  hCutFlow_->SetBinContent(1, myCounts.eventsTotal);
528  hCutFlow_->SetBinContent(2, myCounts.eventsAfterMult);
529  hCutFlow_->SetBinContent(3, myCounts.eventsAfterPt);
530  hCutFlow_->SetBinContent(4, myCounts.eventsAfterEta);
531  hCutFlow_->SetBinContent(5, myCounts.eventsAfterVtx);
532  hCutFlow_->SetBinContent(6, myCounts.eventsAfterDist);
533 
534  TH1F::SetDefaultSumw2(kTRUE);
535  const unsigned int nBinsX = hCosPhi_->GetNbinsX();
536  for (unsigned int i = 1; i <= nBinsX; i++) {
537  //float binContent = hCosPhi_->GetBinContent(i);
538  float invertedBinContent = hCosPhi_->GetBinContent(nBinsX + 1 - i);
539  float invertedBinError = hCosPhi_->GetBinError(nBinsX + 1 - i);
540  hCosPhiInv_->SetBinContent(i, invertedBinContent);
541  hCosPhiInv_->SetBinError(i, invertedBinError);
542 
543  //float binContent3D = hCosPhi3D_->GetBinContent(i);
544  float invertedBinContent3D = hCosPhi3D_->GetBinContent(nBinsX + 1 - i);
545  float invertedBinError3D = hCosPhi3D_->GetBinError(nBinsX + 1 - i);
546  hCosPhiInv3D_->SetBinContent(i, invertedBinContent3D);
547  hCosPhiInv3D_->SetBinError(i, invertedBinError3D);
548  }
549 }
550 
551 // compute the closest vertex to di-lepton ------------------------------------
553  const reco::VertexCollection* vertices) const {
554  reco::Vertex* defaultVtx = nullptr;
555 
556  if (!aTransVtx.isValid())
557  return defaultVtx;
558 
559  // find the closest vertex to the secondary vertex in 3D
560  VertexDistance3D vertTool3D;
561  float minD = 9999.;
562  int closestVtxIndex = 0;
563  int counter = 0;
564  for (const auto& vtx : *vertices) {
565  double dist3D = vertTool3D.distance(aTransVtx, vtx).value();
566  if (dist3D < minD) {
567  minD = dist3D;
568  closestVtxIndex = counter;
569  }
570  counter++;
571  }
572 
573  if ((*vertices).at(closestVtxIndex).isValid()) {
574  return &(vertices->at(closestVtxIndex));
575  } else {
576  return defaultVtx;
577  }
578 }
579 
580 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
583  desc.ifValue(edm::ParameterDescription<bool>("useReco", true, true),
584  true >> edm::ParameterDescription<edm::InputTag>("muons", edm::InputTag("muons"), true) or
586  "muonTracks", edm::InputTag("ALCARECOTkAlDiMuon"), true))
587  ->setComment("If useReco is true need to specify the muon tracks, otherwise take the ALCARECO Inner tracks");
588  //desc.add<bool>("useReco",true);
589  //desc.add<edm::InputTag>("muons", edm::InputTag("muons"));
590  //desc.add<edm::InputTag>("muonTracks", edm::InputTag("ALCARECOTkAlDiMuon"));
591  desc.add<edm::InputTag>("tracks", edm::InputTag("generalTracks"));
592  desc.add<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
593  desc.add<std::vector<double>>("pTThresholds", {30., 10.});
594  desc.add<bool>("useClosestVertex", true);
595  desc.add<double>("maxSVdist", 50.);
596 
597  {
598  edm::ParameterSetDescription psDiMuMass;
599  psDiMuMass.add<std::string>("name", "DiMuMass");
600  psDiMuMass.add<std::string>("title", "M(#mu#mu)");
601  psDiMuMass.add<std::string>("yUnits", "[GeV]");
602  psDiMuMass.add<int>("NxBins", 24);
603  psDiMuMass.add<int>("NyBins", 50);
604  psDiMuMass.add<double>("ymin", 70.);
605  psDiMuMass.add<double>("ymax", 120.);
606  desc.add<edm::ParameterSetDescription>("DiMuMassConfig", psDiMuMass);
607  }
608  {
610  psCosPhi.add<std::string>("name", "CosPhi");
611  psCosPhi.add<std::string>("title", "cos(#phi_{xy})");
612  psCosPhi.add<std::string>("yUnits", "");
613  psCosPhi.add<int>("NxBins", 50);
614  psCosPhi.add<int>("NyBins", 50);
615  psCosPhi.add<double>("ymin", -1.);
616  psCosPhi.add<double>("ymax", 1.);
617  desc.add<edm::ParameterSetDescription>("CosPhiConfig", psCosPhi);
618  }
619  {
620  edm::ParameterSetDescription psCosPhi3D;
621  psCosPhi3D.add<std::string>("name", "CosPhi3D");
622  psCosPhi3D.add<std::string>("title", "cos(#phi_{3D})");
623  psCosPhi3D.add<std::string>("yUnits", "");
624  psCosPhi3D.add<int>("NxBins", 50);
625  psCosPhi3D.add<int>("NyBins", 50);
626  psCosPhi3D.add<double>("ymin", -1.);
627  psCosPhi3D.add<double>("ymax", 1.);
628  desc.add<edm::ParameterSetDescription>("CosPhi3DConfig", psCosPhi3D);
629  }
630  {
632  psVtxProb.add<std::string>("name", "VtxProb");
633  psVtxProb.add<std::string>("title", "Prob(#chi^{2}_{SV})");
634  psVtxProb.add<std::string>("yUnits", "");
635  psVtxProb.add<int>("NxBins", 50);
636  psVtxProb.add<int>("NyBins", 50);
637  psVtxProb.add<double>("ymin", 0);
638  psVtxProb.add<double>("ymax", 1.);
639  desc.add<edm::ParameterSetDescription>("VtxProbConfig", psVtxProb);
640  }
641  {
643  psVtxDist.add<std::string>("name", "VtxDist");
644  psVtxDist.add<std::string>("title", "d_{xy}(PV,SV)");
645  psVtxDist.add<std::string>("yUnits", "[#mum]");
646  psVtxDist.add<int>("NxBins", 50);
647  psVtxDist.add<int>("NyBins", 100);
648  psVtxDist.add<double>("ymin", 0);
649  psVtxDist.add<double>("ymax", 300.);
650  desc.add<edm::ParameterSetDescription>("VtxDistConfig", psVtxDist);
651  }
652  {
653  edm::ParameterSetDescription psVtxDist3D;
654  psVtxDist3D.add<std::string>("name", "VtxDist3D");
655  psVtxDist3D.add<std::string>("title", "d_{3D}(PV,SV)");
656  psVtxDist3D.add<std::string>("yUnits", "[#mum]");
657  psVtxDist3D.add<int>("NxBins", 50);
658  psVtxDist3D.add<int>("NyBins", 250);
659  psVtxDist3D.add<double>("ymin", 0);
660  psVtxDist3D.add<double>("ymax", 500.);
661  desc.add<edm::ParameterSetDescription>("VtxDist3DConfig", psVtxDist3D);
662  }
663  {
664  edm::ParameterSetDescription psVtxDistSig;
665  psVtxDistSig.add<std::string>("name", "VtxDistSig");
666  psVtxDistSig.add<std::string>("title", "d_{xy}(PV,SV)/#sigma_{dxy}(PV,SV)");
667  psVtxDistSig.add<std::string>("yUnits", "");
668  psVtxDistSig.add<int>("NxBins", 50);
669  psVtxDistSig.add<int>("NyBins", 100);
670  psVtxDistSig.add<double>("ymin", 0);
671  psVtxDistSig.add<double>("ymax", 5.);
672  desc.add<edm::ParameterSetDescription>("VtxDistSigConfig", psVtxDistSig);
673  }
674  {
675  edm::ParameterSetDescription psVtxDist3DSig;
676  psVtxDist3DSig.add<std::string>("name", "VtxDist3DSig");
677  psVtxDist3DSig.add<std::string>("title", "d_{3D}(PV,SV)/#sigma_{d3D}(PV,SV)");
678  psVtxDist3DSig.add<std::string>("yUnits", "");
679  psVtxDist3DSig.add<int>("NxBins", 50);
680  psVtxDist3DSig.add<int>("NyBins", 100);
681  psVtxDist3DSig.add<double>("ymin", 0);
682  psVtxDist3DSig.add<double>("ymax", 5.);
683  desc.add<edm::ParameterSetDescription>("VtxDist3DSigConfig", psVtxDist3DSig);
684  }
685 
686  descriptions.addWithDefaultLabel(desc);
687 }
688 
689 //define this as a plug-in
DiMuonVertexValidation(const edm::ParameterSet &)
static const std::string kSharedResource
Definition: TFileService.h:76
Log< level::Info, true > LogVerbatim
~DiMuonVertexValidation() override
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
float totalChiSquared() const
edm::ParameterSet VtxProbConfiguration_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
double pt() const final
transverse momentum
GlobalPoint position() const
Measurement1D distance(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
DiLeptonHelp::Counts myCounts
T z() const
Definition: PV3DBase.h:61
void analyze(const edm::Event &, const edm::EventSetup &) override
DiLeptonHelp::PlotsVsDiLeptonRegion InvMassInEtaBins
static constexpr float mumass2
const Point & position() const
position
Definition: Vertex.h:128
void fillTH1Plots(const float val, const std::pair< TLorentzVector, TLorentzVector > &momenta)
T const * product() const
Definition: Handle.h:70
DiLeptonHelp::PlotsVsKinematics CosPhiPlots
edm::ParameterSet DiMuMassConfiguration_
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
edm::ParameterSet VtxDist3DConfiguration_
DiLeptonHelp::PlotsVsKinematics VtxDist3DPlots
edm::ParameterSet VtxDistConfiguration_
std::vector< Vertex > VertexCollection
Definition: Vertex.h:31
float degreesOfFreedom() const
const std::string names[nVars_]
DiLeptonHelp::PlotsVsKinematics VtxDist3DSigPlots
static std::string to_string(const XMLCh *ch)
CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const override
reco::TransientTrack build(const reco::Track *p) const
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
int iEvent
Definition: GenABIO.cc:224
edm::ParameterSet VtxDist3DSigConfiguration_
void bookSet(const TFileDirectory &fs, const TH1 *histo)
bool isValid() const
T sqrt(T t)
Definition: SSEVec.h:19
DiLeptonHelp::PlotsVsKinematics VtxDistSigPlots
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
static constexpr float cmToum
edm::EDGetTokenT< reco::MuonCollection > muonsToken_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > ttbESToken_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::EDGetTokenT< reco::VertexCollection > vertexToken_
Measurement1D distance(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
Log< level::Info, false > LogInfo
edm::EDGetTokenT< reco::TrackCollection > tracksToken_
DecomposeProduct< arg, typename Div::arg > D
Definition: Factorize.h:141
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
edm::ParameterSet VtxDistSigConfiguration_
DiLeptonHelp::PlotsVsKinematics VtxProbPlots
bool isValid() const
Definition: HandleBase.h:70
double value() const
Definition: Measurement1D.h:25
const reco::Vertex * findClosestVertex(const TransientVertex aTransVtx, const reco::VertexCollection *vertices) const
edm::ParameterSet CosPhiConfiguration_
DiLeptonHelp::PlotsVsKinematics CosPhi3DPlots
fixed size matrix
HLT enums.
edm::ParameterSet CosPhi3DConfiguration_
static std::atomic< unsigned int > counter
double error() const
Definition: Measurement1D.h:27
std::vector< double > pTthresholds_
DiLeptonHelp::PlotsVsKinematics VtxDistPlots
void fillPlots(const float val, const std::pair< TLorentzVector, TLorentzVector > &momenta)
void bookFromPSet(const TFileDirectory &fs, const edm::ParameterSet &hpar)
Log< level::Warning, false > LogWarning
DiLeptonHelp::PlotsVsDiLeptonRegion CosPhi3DInEtaBins
DiLeptonHelp::PlotsVsKinematics ZMassPlots
edm::EDGetTokenT< reco::TrackCollection > alcaRecoToken_
bool isValid() const
Tells whether the vertex is valid.
Definition: Vertex.h:73
#define LogDebug(id)