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 
34 
35  public:
39 
41  explicit PatZToMuMuAnalyzer(const edm::ParameterSet& cfg);
44 
45  private:
47  virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
48 
50  double mass(const math::XYZVector& t1, const math::XYZVector& t2) const;
52  bool booked(const std::string histName) const { return hists_.find(histName.c_str())!=hists_.end(); };
54  void fill(const std::string histName, double value) const { if(booked(histName.c_str())) hists_.find(histName.c_str())->second->Fill(value); };
56  void fill(std::string hists, const reco::TrackRef& t1, const reco::TrackRef& t2) const;
57 
62  double shift_;
64  std::map< std::string, TH1D* > hists_;
65 };
66 
67 inline double
68 PatZToMuMuAnalyzer::mass(const Vector& t1, const Vector& t2) const
69 {
70  return (LorentzVector(shift_*t1.x(), shift_*t1.y(), t1.z(), sqrt((0.1057*0.1057)+t1.mag2())) + LorentzVector(shift_*t2.x(), shift_*t2.y(), t2.z(), sqrt((0.1057*0.1057)+t2.mag2()))).mass();
71 }
72 
75 
77  muonsToken_(consumes<edm::View<pat::Muon> >(cfg.getParameter< edm::InputTag >("muons"))),
78  shift_(cfg.getParameter< double >("shift"))
79 {
81 
82  // mass plot around Z peak from global tracks
83  hists_[ "globalMass"] = fileService->make< TH1D >( "globalMass" , "Mass_{Z} (global) (GeV)", 90, 30., 120.);
84  // eta from global tracks
85  hists_[ "globalEta" ] = fileService->make< TH1D >( "globalEta" , "#eta (global)" , 48, -2.4, 2.4);
86  // pt from global tracks
87  hists_[ "globalPt" ] = fileService->make< TH1D >( "globalPt" , "p_{T} (global) (GeV)" , 100, 0., 100.);
88  // mass plot around Z peak from inner tracks
89  hists_[ "innerMass" ] = fileService->make< TH1D >( "innerMass" , "Mass_{Z} (inner) (GeV)" , 90, 30., 120.);
90  // eta from inner tracks
91  hists_[ "innerEta" ] = fileService->make< TH1D >( "innerEta" , "#eta (inner)" , 48, -2.4, 2.4);
92  // pt from inner tracks
93  hists_[ "innerPt" ] = fileService->make< TH1D >( "innerPt" , "p_{T} (inner) (GeV)" , 100, 0., 100.);
94  // mass plot around Z peak from outer tracks
95  hists_[ "outerMass" ] = fileService->make< TH1D >( "outerMass" , "Mass_{Z} (outer) (GeV)" , 90, 30., 120.);
96  // eta from outer tracks
97  hists_[ "outerEta" ] = fileService->make< TH1D >( "outerEta" , "#eta (outer)" , 48, -2.4, 2.4);
98  // pt from outer tracks
99  hists_[ "outerPt" ] = fileService->make< TH1D >( "outerPt" , "p_{T} (outer) (GeV)" , 100, 0., 100.);
100  // delta pt between global and outer track
101  hists_[ "deltaPt" ] = fileService->make< TH1D >( "deltaPt" , "#Delta p_{T} (GeV)" , 100, -20., 20.);
102  // delta eta between global and outer track
103  hists_[ "deltaEta" ] = fileService->make< TH1D >( "deltaEta" , "#Delta #eta" , 100, -0.2, 0.2);
104  // delta phi between global and outer track
105  hists_[ "deltaPhi" ] = fileService->make< TH1D >( "deltaPhi" , "#Delta #phi" , 100, -0.2, 0.2);
106 }
107 
109 {
110  if( t1.isAvailable() ){
111  // fill pt from global track for first muon
112  fill( std::string(hists).append("Pt") , t1->pt() );
113  // fill pt from global track for second muon
114  fill( std::string(hists).append("Eta"), t1->eta() );
115  }
116  if( t2.isAvailable() ){
117  // fill eta from global track for first muon
118  fill( std::string(hists).append("Pt") , t2->pt() );
119  // fill eta from global track for second muon
120  fill( std::string(hists).append("Eta"), t2->eta() );
121  }
122  if( t1.isAvailable() && t2.isAvailable() ){
123  // fill invariant mass of the Z boson candidate
124  fill( std::string(hists).append("Mass"), mass(t1->momentum(), t2->momentum()));
125  }
126 }
127 
129 {
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 
bool isAvailable() const
Definition: Ref.h:576
math::XYZVector Vector
typedef&#39;s to simplify get functions
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:1
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
bool booked(const std::string histName) const
check if histogram was booked
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
Definition: HeavyIon.h:7
U second(std::pair< T, U > const &p)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
Definition: Muon.py:1
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup) override
everything that needs to be done during the event loop
auto const T2 &decltype(t1.eta()) t2
Definition: deltaR.h:16
T sqrt(T t)
Definition: SSEVec.h:18
Definition: value.py:1
~PatZToMuMuAnalyzer()
default destructor
std::map< std::string, TH1D * > hists_
management of 1d histograms
Module to analyze the performance of muon reconstruction on the example of Z->mumu events...
edm::Service< TFileService > fileService
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
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
HLT enums.
PatZToMuMuAnalyzer(const edm::ParameterSet &cfg)
default constructor
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
edm::EDGetTokenT< edm::View< pat::Muon > > muonsToken_
input for muons
math::XYZTLorentzVector LorentzVector
Definition: event.py:1