test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
108 void PatZToMuMuAnalyzer::fill(std::string hists, const reco::TrackRef& t1, const reco::TrackRef& t2) const
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 
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
math::XYZVector Vector
typedef&#39;s to simplify get functions
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
bool isAvailable() const
Definition: Ref.h:276
bool booked(const std::string histName) const
check if histogram was booked
U second(std::pair< T, U > const &p)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
virtual 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:48
~PatZToMuMuAnalyzer()
default destructor
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::map< std::string, TH1D * > hists_
management of 1d histograms
Module to analyze the performance of muon reconstruction on the example of Z-&gt;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
PatZToMuMuAnalyzer(const edm::ParameterSet &cfg)
default constructor
tuple muons
Definition: patZpeak.py:38
edm::EDGetTokenT< edm::View< pat::Muon > > muonsToken_
input for muons
math::XYZTLorentzVector LorentzVector
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")