00001 #include <map>
00002 #include <string>
00003
00004 #include "TH1D.h"
00005 #include "TH2D.h"
00006
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "FWCore/Utilities/interface/InputTag.h"
00009 #include "FWCore/Framework/interface/EDAnalyzer.h"
00010 #include "FWCore/Framework/interface/Frameworkfwd.h"
00011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00012 #include "DataFormats/PatCandidates/interface/Muon.h"
00013
00033 class PatZToMuMuAnalyzer : public edm::EDAnalyzer {
00034
00035 public:
00037 typedef math::XYZVector Vector;
00038 typedef math::XYZTLorentzVector LorentzVector;
00039
00041 explicit PatZToMuMuAnalyzer(const edm::ParameterSet& cfg);
00043 ~PatZToMuMuAnalyzer(){};
00044
00045 private:
00047 virtual void analyze(const edm::Event& event, const edm::EventSetup& setup);
00048
00050 double mass(const math::XYZVector& t1, const math::XYZVector& t2) const;
00052 bool booked(const std::string histName) const { return hists_.find(histName.c_str())!=hists_.end(); };
00054 void fill(const std::string histName, double value) const { if(booked(histName.c_str())) hists_.find(histName.c_str())->second->Fill(value); };
00056 void fill(std::string hists, const reco::TrackRef& t1, const reco::TrackRef& t2) const;
00057
00059 edm::InputTag muons_;
00062 double shift_;
00064 std::map< std::string, TH1D* > hists_;
00065 };
00066
00067 inline double
00068 PatZToMuMuAnalyzer::mass(const Vector& t1, const Vector& t2) const
00069 {
00070 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();
00071 }
00072
00073 #include "FWCore/ServiceRegistry/interface/Service.h"
00074 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00075
00076 PatZToMuMuAnalyzer::PatZToMuMuAnalyzer(const edm::ParameterSet& cfg):
00077 muons_(cfg.getParameter< edm::InputTag >("muons")),
00078 shift_(cfg.getParameter< double >("shift"))
00079 {
00080 edm::Service< TFileService > fileService;
00081
00082
00083 hists_[ "globalMass"] = fileService->make< TH1D >( "globalMass" , "Mass_{Z} (global) (GeV)", 90, 30., 120.);
00084
00085 hists_[ "globalEta" ] = fileService->make< TH1D >( "globalEta" , "#eta (global)" , 48, -2.4, 2.4);
00086
00087 hists_[ "globalPt" ] = fileService->make< TH1D >( "globalPt" , "p_{T} (global) (GeV)" , 100, 0., 100.);
00088
00089 hists_[ "innerMass" ] = fileService->make< TH1D >( "innerMass" , "Mass_{Z} (inner) (GeV)" , 90, 30., 120.);
00090
00091 hists_[ "innerEta" ] = fileService->make< TH1D >( "innerEta" , "#eta (inner)" , 48, -2.4, 2.4);
00092
00093 hists_[ "innerPt" ] = fileService->make< TH1D >( "innerPt" , "p_{T} (inner) (GeV)" , 100, 0., 100.);
00094
00095 hists_[ "outerMass" ] = fileService->make< TH1D >( "outerMass" , "Mass_{Z} (outer) (GeV)" , 90, 30., 120.);
00096
00097 hists_[ "outerEta" ] = fileService->make< TH1D >( "outerEta" , "#eta (outer)" , 48, -2.4, 2.4);
00098
00099 hists_[ "outerPt" ] = fileService->make< TH1D >( "outerPt" , "p_{T} (outer) (GeV)" , 100, 0., 100.);
00100
00101 hists_[ "deltaPt" ] = fileService->make< TH1D >( "deltaPt" , "#Delta p_{T} (GeV)" , 100, -20., 20.);
00102
00103 hists_[ "deltaEta" ] = fileService->make< TH1D >( "deltaEta" , "#Delta #eta" , 100, -0.2, 0.2);
00104
00105 hists_[ "deltaPhi" ] = fileService->make< TH1D >( "deltaPhi" , "#Delta #phi" , 100, -0.2, 0.2);
00106 }
00107
00108 void PatZToMuMuAnalyzer::fill(std::string hists, const reco::TrackRef& t1, const reco::TrackRef& t2) const
00109 {
00110 if( t1.isAvailable() ){
00111
00112 fill( std::string(hists).append("Pt") , t1->pt() );
00113
00114 fill( std::string(hists).append("Eta"), t1->eta() );
00115 }
00116 if( t2.isAvailable() ){
00117
00118 fill( std::string(hists).append("Pt") , t2->pt() );
00119
00120 fill( std::string(hists).append("Eta"), t2->eta() );
00121 }
00122 if( t1.isAvailable() && t2.isAvailable() ){
00123
00124 fill( std::string(hists).append("Mass"), mass(t1->momentum(), t2->momentum()));
00125 }
00126 }
00127
00128 void PatZToMuMuAnalyzer::analyze(const edm::Event& event, const edm::EventSetup& setup)
00129 {
00130
00131 edm::Handle< edm::View<pat::Muon> > muons;
00132 event.getByLabel(muons_, muons);
00133
00134
00135
00136
00137 for(edm::View<pat::Muon>::const_iterator mu1=muons->begin(); mu1!=muons->end(); ++mu1){
00138 for(edm::View<pat::Muon>::const_iterator mu2=muons->begin(); mu2!=muons->end(); ++mu2){
00139 if(mu2>mu1){
00140 if( mu1->charge()*mu2->charge()<0 ){
00141 fill(std::string("inner" ), mu1->innerTrack (), mu2->innerTrack ());
00142 fill(std::string("outer" ), mu1->outerTrack (), mu2->outerTrack ());
00143 fill(std::string("global"), mu1->globalTrack(), mu2->globalTrack());
00144
00145 if(mu1->isGlobalMuon()){
00146 fill("deltaPt" , mu1->outerTrack()->pt ()-mu1->globalTrack()->pt ());
00147 fill("deltaEta", mu1->outerTrack()->eta()-mu1->globalTrack()->eta());
00148 fill("deltaPhi", mu1->outerTrack()->phi()-mu1->globalTrack()->phi());
00149 }
00150 if(mu2->isGlobalMuon()){
00151 fill("deltaPt" , mu2->outerTrack()->pt ()-mu2->globalTrack()->pt ());
00152 fill("deltaEta", mu2->outerTrack()->eta()-mu2->globalTrack()->eta());
00153 fill("deltaPhi", mu2->outerTrack()->phi()-mu2->globalTrack()->phi());
00154 }
00155 }
00156 }
00157 }
00158 }
00159 }
00160
00161 #include "FWCore/Framework/interface/MakerMacros.h"
00162 DEFINE_FWK_MODULE( PatZToMuMuAnalyzer );