CMS 3D CMS Logo

PatZToMuMuAnalyzer.cc
Go to the documentation of this file.
1 #include <map>
2 #include <string>
3 
4 #include "TH1D.h"
5 #include "TH2D.h"
6 
13 
32 class PatZToMuMuAnalyzer : public edm::one::EDAnalyzer<edm::one::SharedResources> {
33 public:
37 
39  explicit PatZToMuMuAnalyzer(const edm::ParameterSet& cfg);
41  ~PatZToMuMuAnalyzer() override {}
42 
43 private:
45  void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
46 
48  double mass(const math::XYZVector& t1, const math::XYZVector& t2) const;
50  bool booked(const std::string histName) const { return hists_.find(histName) != hists_.end(); };
52  void fill(const std::string histName, double value) const {
53  if (booked(histName))
54  hists_.find(histName)->second->Fill(value);
55  };
57  void fill(std::string hists, const reco::TrackRef& t1, const reco::TrackRef& t2) const;
58 
63  double shift_;
65  std::map<std::string, TH1D*> hists_;
66 };
67 
68 inline double PatZToMuMuAnalyzer::mass(const Vector& t1, const Vector& t2) const {
69  return (LorentzVector(shift_ * t1.x(), shift_ * t1.y(), t1.z(), sqrt((0.1057 * 0.1057) + t1.mag2())) +
70  LorentzVector(shift_ * t2.x(), shift_ * t2.y(), t2.z(), sqrt((0.1057 * 0.1057) + t2.mag2())))
71  .mass();
72 }
73 
76 
78  : muonsToken_(consumes<edm::View<pat::Muon> >(cfg.getParameter<edm::InputTag>("muons"))),
79  shift_(cfg.getParameter<double>("shift")) {
80  usesResource(TFileService::kSharedResource);
81 
82  edm::Service<TFileService> fileService;
83 
84  // mass plot around Z peak from global tracks
85  hists_["globalMass"] = fileService->make<TH1D>("globalMass", "Mass_{Z} (global) (GeV)", 90, 30., 120.);
86  // eta from global tracks
87  hists_["globalEta"] = fileService->make<TH1D>("globalEta", "#eta (global)", 48, -2.4, 2.4);
88  // pt from global tracks
89  hists_["globalPt"] = fileService->make<TH1D>("globalPt", "p_{T} (global) (GeV)", 100, 0., 100.);
90  // mass plot around Z peak from inner tracks
91  hists_["innerMass"] = fileService->make<TH1D>("innerMass", "Mass_{Z} (inner) (GeV)", 90, 30., 120.);
92  // eta from inner tracks
93  hists_["innerEta"] = fileService->make<TH1D>("innerEta", "#eta (inner)", 48, -2.4, 2.4);
94  // pt from inner tracks
95  hists_["innerPt"] = fileService->make<TH1D>("innerPt", "p_{T} (inner) (GeV)", 100, 0., 100.);
96  // mass plot around Z peak from outer tracks
97  hists_["outerMass"] = fileService->make<TH1D>("outerMass", "Mass_{Z} (outer) (GeV)", 90, 30., 120.);
98  // eta from outer tracks
99  hists_["outerEta"] = fileService->make<TH1D>("outerEta", "#eta (outer)", 48, -2.4, 2.4);
100  // pt from outer tracks
101  hists_["outerPt"] = fileService->make<TH1D>("outerPt", "p_{T} (outer) (GeV)", 100, 0., 100.);
102  // delta pt between global and outer track
103  hists_["deltaPt"] = fileService->make<TH1D>("deltaPt", "#Delta p_{T} (GeV)", 100, -20., 20.);
104  // delta eta between global and outer track
105  hists_["deltaEta"] = fileService->make<TH1D>("deltaEta", "#Delta #eta", 100, -0.2, 0.2);
106  // delta phi between global and outer track
107  hists_["deltaPhi"] = fileService->make<TH1D>("deltaPhi", "#Delta #phi", 100, -0.2, 0.2);
108 }
109 
111  if (t1.isAvailable()) {
112  // fill pt from global track for first muon
113  fill(std::string(hists).append("Pt"), t1->pt());
114  // fill pt from global track for second muon
115  fill(std::string(hists).append("Eta"), t1->eta());
116  }
117  if (t2.isAvailable()) {
118  // fill eta from global track for first muon
119  fill(std::string(hists).append("Pt"), t2->pt());
120  // fill eta from global track for second muon
121  fill(std::string(hists).append("Eta"), t2->eta());
122  }
123  if (t1.isAvailable() && t2.isAvailable()) {
124  // fill invariant mass of the Z boson candidate
125  fill(std::string(hists).append("Mass"), mass(t1->momentum(), t2->momentum()));
126  }
127 }
128 
130  // pat candidate collection
132  event.getByToken(muonsToken_, muons);
133 
134  // Fill some basic muon quantities as
135  // reconstructed from inner and outer
136  // tack
137  for (edm::View<pat::Muon>::const_iterator mu1 = muons->begin(); mu1 != muons->end(); ++mu1) {
138  for (edm::View<pat::Muon>::const_iterator mu2 = muons->begin(); mu2 != muons->end(); ++mu2) {
139  if (mu2 > mu1) { // prevent double conting
140  if (mu1->charge() * mu2->charge() < 0) { // check only muon pairs of unequal charge
141  fill(std::string("inner"), mu1->innerTrack(), mu2->innerTrack());
142  fill(std::string("outer"), mu1->outerTrack(), mu2->outerTrack());
143  fill(std::string("global"), mu1->globalTrack(), mu2->globalTrack());
144 
145  if (mu1->isGlobalMuon()) {
146  fill("deltaPt", mu1->outerTrack()->pt() - mu1->globalTrack()->pt());
147  fill("deltaEta", mu1->outerTrack()->eta() - mu1->globalTrack()->eta());
148  fill("deltaPhi", mu1->outerTrack()->phi() - mu1->globalTrack()->phi());
149  }
150  if (mu2->isGlobalMuon()) {
151  fill("deltaPt", mu2->outerTrack()->pt() - mu2->globalTrack()->pt());
152  fill("deltaEta", mu2->outerTrack()->eta() - mu2->globalTrack()->eta());
153  fill("deltaPhi", mu2->outerTrack()->phi() - mu2->globalTrack()->phi());
154  }
155  }
156  }
157  }
158  }
159 }
160 
static const std::string kSharedResource
Definition: TFileService.h:76
math::XYZVector Vector
typedef&#39;s to simplify get functions
void fill(const std::string histName, double value) const
fill histogram if it had been booked before
double mass(const math::XYZVector &t1, const math::XYZVector &t2) const
calculate the mass of the Z boson from the tracker momenta by hand
muons
the two sets of parameters below are mutually exclusive, depending if RECO or ALCARECO is used the us...
Definition: DiMuonV_cfg.py:214
Definition: HeavyIon.h:7
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
Definition: Muon.py:1
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
everything that needs to be done during the event loop
T sqrt(T t)
Definition: SSEVec.h:23
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Definition: value.py:1
Module to analyze the performance of muon reconstruction on the example of Z->mumu events...
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
bool booked(const std::string histName) const
check if histogram was booked
~PatZToMuMuAnalyzer() override
default destructor
HLT enums.
PatZToMuMuAnalyzer(const edm::ParameterSet &cfg)
default constructor
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:88
std::map< std::string, TH1D * > hists_
management of 1d histograms
edm::EDGetTokenT< edm::View< pat::Muon > > muonsToken_
input for muons
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
math::XYZTLorentzVector LorentzVector
Definition: event.py:1