00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "DataFormats/Common/interface/AssociationVector.h"
00012 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00013 #include "DataFormats/Candidate/interface/CandMatchMap.h"
00014 #include "FWCore/Framework/interface/EDAnalyzer.h"
00015 #include "DataFormats/Candidate/interface/Candidate.h"
00016 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00018 #include "FWCore/Framework/interface/Event.h"
00019 #include "FWCore/Framework/interface/EventSetup.h"
00020 #include "FWCore/Utilities/interface/InputTag.h"
00021 #include "DataFormats/Candidate/interface/OverlapChecker.h"
00022 #include "TH1.h"
00023 #include <vector>
00024 using namespace edm;
00025 using namespace std;
00026 using namespace reco;
00027
00028 class ZMuMuEfficiency : public edm::EDAnalyzer {
00029 public:
00030 ZMuMuEfficiency(const edm::ParameterSet& pset);
00031 private:
00032 virtual void analyze(const edm::Event& event, const edm::EventSetup& setup);
00033 bool check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00034 float getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00035 float getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00036 float getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00037 Particle::LorentzVector getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00038 virtual void endJob();
00039
00040 edm::InputTag zMuMu_, zMuMuMatchMap_;
00041 edm::InputTag zMuTrack_, zMuTrackMatchMap_;
00042 edm::InputTag zMuStandAlone_, zMuStandAloneMatchMap_;
00043 edm::InputTag muons_, muonMatchMap_, muonIso_;
00044 edm::InputTag tracks_, trackIso_;
00045 edm::InputTag standAlone_, standAloneIso_;
00046 edm::InputTag genParticles_;
00047
00048 double zMassMin_, zMassMax_, ptmin_, etamax_, isomax_;
00049 unsigned int nbinsPt_, nbinsEta_;
00050 reco::CandidateBaseRef globalMuonCandRef_, trackMuonCandRef_, standAloneMuonCandRef_;
00051 OverlapChecker overlap_;
00052
00053
00054 TH1D *h_etaStandAlone_, *h_etaMuonOverlappedToStandAlone_;
00055 TH1D *h_ptStandAlone_, *h_ptMuonOverlappedToStandAlone_;
00056
00057
00058 TH1D *h_etaTrack_, *h_etaMuonOverlappedToTrack_;
00059 TH1D *h_ptTrack_, *h_ptMuonOverlappedToTrack_;
00060
00061
00062 TH1D *h_nZMCfound_;
00063 TH1D *h_ZetaGen_, *h_ZptGen_, *h_ZmassGen_;
00064 TH1D *h_muetaGen_, *h_muptGen_, *h_muIsoGen_;
00065 TH1D *h_dimuonPtGen_, *h_dimuonMassGen_, *h_dimuonEtaGen_;
00066 TH1D *h_ZetaGenPassed_, *h_ZptGenPassed_, *h_ZmassGenPassed_;
00067 TH1D *h_muetaGenPassed_, *h_muptGenPassed_, *h_muIsoGenPassed_;
00068 TH1D *h_dimuonPtGenPassed_, *h_dimuonMassGenPassed_, *h_dimuonEtaGenPassed_;
00069
00070 TH1D *h_DELTA_ZMuMuMassReco_dimuonMassGen_, *h_DELTA_ZMuStaMassReco_dimuonMassGen_, *h_DELTA_ZMuTrackMassReco_dimuonMassGen_;
00071
00072 int numberOfEventsWithZMuMufound, numberOfEventsWithZMuStafound;
00073 int numberOfMatchedZMuSta_,numberOfMatchedSelectedZMuSta_;
00074 int numberOfMatchedZMuMu_, numberOfMatchedSelectedZMuMu_;
00075 int numberOfOverlappedStandAlone_, numberOfOverlappedTracks_, numberOfMatchedZMuTrack_notOverlapped;
00076 int numberOfMatchedZMuTrack_exclusive ,numberOfMatchedSelectedZMuTrack_exclusive;
00077 int numberOfMatchedZMuTrack_matchedZMuMu, numberOfMatchedZMuTrack_matchedSelectedZMuMu ;
00078 int totalNumberOfevents, totalNumberOfZfound, totalNumberOfZPassed;
00079 int noMCmatching, ZMuTrack_exclusive_1match, ZMuTrack_exclusive_morematch;
00080 int ZMuTrackselected_exclusive_1match, ZMuTrackselected_exclusive_morematch;
00081 int ZMuTrack_ZMuMu_1match, ZMuTrack_ZMuMu_2match, ZMuTrack_ZMuMu_morematch;
00082
00083 int n_zMuMufound_genZsele, n_zMuStafound_genZsele, n_zMuTrkfound_genZsele;
00084 };
00085
00086 #include "FWCore/ServiceRegistry/interface/Service.h"
00087 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00088 #include "DataFormats/Common/interface/Handle.h"
00089 #include "DataFormats/Candidate/interface/Particle.h"
00090 #include "DataFormats/Candidate/interface/Candidate.h"
00091 #include "DataFormats/Common/interface/ValueMap.h"
00092 #include "DataFormats/Candidate/interface/CandAssociation.h"
00093 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00094 #include <iostream>
00095 #include <iterator>
00096 #include <cmath>
00097 using namespace std;
00098 using namespace reco;
00099 using namespace edm;
00100
00101
00102 typedef edm::ValueMap<float> IsolationCollection;
00103
00104 ZMuMuEfficiency::ZMuMuEfficiency(const ParameterSet& pset) :
00105 zMuMu_(pset.getParameter<InputTag>("zMuMu")),
00106 zMuMuMatchMap_(pset.getParameter<InputTag>("zMuMuMatchMap")),
00107 zMuTrack_(pset.getParameter<InputTag>("zMuTrack")),
00108 zMuTrackMatchMap_(pset.getParameter<InputTag>("zMuTrackMatchMap")),
00109 zMuStandAlone_(pset.getParameter<InputTag>("zMuStandAlone")),
00110 zMuStandAloneMatchMap_(pset.getParameter<InputTag>("zMuStandAloneMatchMap")),
00111 muons_(pset.getParameter<InputTag>("muons")),
00112 muonMatchMap_(pset.getParameter<InputTag>("muonMatchMap")),
00113 muonIso_(pset.getParameter<InputTag>("muonIso")),
00114 tracks_(pset.getParameter<InputTag>("tracks")),
00115 trackIso_(pset.getParameter<InputTag>("trackIso")),
00116 standAlone_(pset.getParameter<InputTag>("standAlone")),
00117 standAloneIso_(pset.getParameter<InputTag>("standAloneIso")),
00118 genParticles_(pset.getParameter<InputTag>( "genParticles" ) ),
00119
00120 zMassMin_(pset.getUntrackedParameter<double>("zMassMin")),
00121 zMassMax_(pset.getUntrackedParameter<double>("zMassMax")),
00122 ptmin_(pset.getUntrackedParameter<double>("ptmin")),
00123 etamax_(pset.getUntrackedParameter<double>("etamax")),
00124 isomax_(pset.getUntrackedParameter<double>("isomax")),
00125 nbinsPt_(pset.getUntrackedParameter<unsigned int>("nbinsPt")),
00126 nbinsEta_(pset.getUntrackedParameter<unsigned int>("nbinsEta")) {
00127 Service<TFileService> fs;
00128 TFileDirectory trackEffDir = fs->mkdir("TrackEfficiency");
00129
00130
00131 h_etaStandAlone_ = trackEffDir.make<TH1D>("StandAloneMuonEta",
00132 "StandAlone #eta for Z -> #mu + standalone",
00133 nbinsEta_, -etamax_, etamax_);
00134 h_etaMuonOverlappedToStandAlone_ = trackEffDir.make<TH1D>("MuonOverlappedToStandAloneEta",
00135 "Global muon overlapped to standAlone #eta for Z -> #mu + sa",
00136 nbinsEta_, -etamax_, etamax_);
00137 h_ptStandAlone_ = trackEffDir.make<TH1D>("StandAloneMuonPt",
00138 "StandAlone p_{t} for Z -> #mu + standalone",
00139 nbinsPt_, ptmin_, 100);
00140 h_ptMuonOverlappedToStandAlone_ = trackEffDir.make<TH1D>("MuonOverlappedToStandAlonePt",
00141 "Global muon overlapped to standAlone p_{t} for Z -> #mu + sa",
00142 nbinsPt_, ptmin_, 100);
00143
00144
00145
00146 TFileDirectory standaloneEffDir = fs->mkdir("StandaloneEfficiency");
00147 h_etaTrack_ = standaloneEffDir.make<TH1D>("TrackMuonEta",
00148 "Track #eta for Z -> #mu + track",
00149 nbinsEta_, -etamax_, etamax_);
00150 h_etaMuonOverlappedToTrack_ = standaloneEffDir.make<TH1D>("MuonOverlappedToTrackEta",
00151 "Global muon overlapped to track #eta for Z -> #mu + tk",
00152 nbinsEta_, -etamax_, etamax_);
00153 h_ptTrack_ = standaloneEffDir.make<TH1D>("TrackMuonPt",
00154 "Track p_{t} for Z -> #mu + track",
00155 nbinsPt_, ptmin_, 100);
00156 h_ptMuonOverlappedToTrack_ = standaloneEffDir.make<TH1D>("MuonOverlappedToTrackPt",
00157 "Global muon overlapped to track p_{t} for Z -> #mu + tk",
00158 nbinsPt_, ptmin_, 100);
00159
00160
00161
00162 TFileDirectory invMassResolutionDir = fs->mkdir("invriantMassResolution");
00163 h_DELTA_ZMuMuMassReco_dimuonMassGen_ = invMassResolutionDir.make<TH1D>("zMuMu_invMassResolution","zMuMu invariant Mass Resolution",50,-25,25);
00164 h_DELTA_ZMuStaMassReco_dimuonMassGen_ = invMassResolutionDir.make<TH1D>("zMuSta_invMassResolution","zMuSta invariant Mass Resolution",50,-25,25);
00165 h_DELTA_ZMuTrackMassReco_dimuonMassGen_ = invMassResolutionDir.make<TH1D>("zMuTrack_invMassResolution","zMuTrack invariant Mass Resolution",50,-25,25);
00166
00167
00168
00169 TFileDirectory genParticleDir = fs->mkdir("genParticle");
00170 h_nZMCfound_ = genParticleDir.make<TH1D>("NumberOfgeneratedZeta","n. of generated Z per event",4,-.5,3.5);
00171 h_ZetaGen_ = genParticleDir.make<TH1D>("generatedZeta","#eta of generated Z",100,-5.,5.);
00172 h_ZptGen_ = genParticleDir.make<TH1D>("generatedZpt","pt of generated Z",100,0.,200.);
00173 h_ZmassGen_ = genParticleDir.make<TH1D>("generatedZmass","mass of generated Z",100,0.,200.);
00174 h_muetaGen_ = genParticleDir.make<TH1D>("generatedMuonEta","#eta of generated muons from Z decay",100,-5.,5.);
00175 h_muptGen_ = genParticleDir.make<TH1D>("generatedMuonpt","pt of generated muons from Z decay",100,0.,200.);
00176 h_dimuonEtaGen_ = genParticleDir.make<TH1D>("generatedDimuonEta","#eta of generated dimuon",100,-5.,5.);
00177 h_dimuonPtGen_ = genParticleDir.make<TH1D>("generatedDimuonPt","pt of generated dimuon",100,0.,200.);
00178 h_dimuonMassGen_ = genParticleDir.make<TH1D>("generatedDimuonMass","mass of generated dimuon",100,0.,200.);
00179 h_ZetaGenPassed_ = genParticleDir.make<TH1D>("generatedZeta_passed","#eta of generated Z after cuts",100,-5.,5.);
00180 h_ZptGenPassed_ = genParticleDir.make<TH1D>("generatedZpt_passed","pt of generated Z after cuts",100,0.,200.);
00181 h_ZmassGenPassed_ = genParticleDir.make<TH1D>("generatedZmass_passed","mass of generated Z after cuts",100,0.,200.);
00182 h_muetaGenPassed_ = genParticleDir.make<TH1D>("generatedMuonEta_passed","#eta of generated muons from Z decay after cuts",100,-5.,5.);
00183 h_muptGenPassed_ = genParticleDir.make<TH1D>("generatedMuonpt_passed","pt of generated muons from Z decay after cuts",100,0.,200.);
00184 h_dimuonEtaGenPassed_ = genParticleDir.make<TH1D>("generatedDimuonEta_passed","#eta of generated dimuon after cuts",100,-5.,5.);
00185 h_dimuonPtGenPassed_ = genParticleDir.make<TH1D>("generatedDimuonPt_passed","pt of generated dimuon after cuts",100,0.,200.);
00186 h_dimuonMassGenPassed_ = genParticleDir.make<TH1D>("generatedDimuonMass_passed","mass of generated dimuon after cuts",100,0.,200.);
00187
00188
00189 numberOfEventsWithZMuMufound = 0;
00190 numberOfEventsWithZMuStafound = 0;
00191 numberOfMatchedZMuMu_ = 0;
00192 numberOfMatchedSelectedZMuMu_ = 0;
00193 numberOfMatchedZMuSta_ = 0;
00194 numberOfMatchedSelectedZMuSta_ = 0;
00195 numberOfMatchedZMuTrack_matchedZMuMu = 0;
00196 numberOfMatchedZMuTrack_matchedSelectedZMuMu = 0;
00197 numberOfMatchedZMuTrack_exclusive = 0;
00198 numberOfMatchedSelectedZMuTrack_exclusive = 0;
00199 numberOfOverlappedStandAlone_ = 0;
00200 numberOfOverlappedTracks_ = 0;
00201 numberOfMatchedZMuTrack_notOverlapped = 0;
00202 noMCmatching = 0;
00203 ZMuTrack_exclusive_1match = 0;
00204 ZMuTrack_exclusive_morematch = 0;
00205 ZMuTrackselected_exclusive_1match = 0;
00206 ZMuTrackselected_exclusive_morematch = 0;
00207 ZMuTrack_ZMuMu_1match = 0;
00208 ZMuTrack_ZMuMu_2match = 0;
00209 ZMuTrack_ZMuMu_morematch = 0;
00210
00211 n_zMuMufound_genZsele = 0;
00212 n_zMuStafound_genZsele = 0;
00213 n_zMuTrkfound_genZsele = 0;
00214
00215
00216 totalNumberOfevents = 0;
00217 totalNumberOfZfound = 0;
00218 totalNumberOfZPassed = 0;
00219
00220 }
00221
00222 void ZMuMuEfficiency::analyze(const Event& event, const EventSetup& setup) {
00223 Handle<CandidateView> zMuMu;
00224 Handle<GenParticleMatch> zMuMuMatchMap;
00225 Handle<CandidateView> zMuTrack;
00226 Handle<GenParticleMatch> zMuTrackMatchMap;
00227 Handle<CandidateView> zMuStandAlone;
00228 Handle<GenParticleMatch> zMuStandAloneMatchMap;
00229 Handle<CandidateView> muons;
00230 Handle<GenParticleMatch> muonMatchMap;
00231 Handle<IsolationCollection> muonIso;
00232 Handle<CandidateView> tracks;
00233 Handle<IsolationCollection> trackIso;
00234 Handle<CandidateView> standAlone;
00235 Handle<IsolationCollection> standAloneIso;
00236 Handle<GenParticleCollection> genParticles;
00237
00238 event.getByLabel(zMuMu_, zMuMu);
00239 event.getByLabel(zMuTrack_, zMuTrack);
00240 event.getByLabel(zMuStandAlone_, zMuStandAlone);
00241 event.getByLabel(muons_, muons);
00242 event.getByLabel(tracks_, tracks);
00243 event.getByLabel(standAlone_, standAlone);
00244 event.getByLabel(genParticles_, genParticles);
00245
00246 cout << "********* zMuMu size : " << zMuMu->size() << endl;
00247 cout << "********* zMuStandAlone size : " << zMuStandAlone->size() << endl;
00248 cout << "********* zMuTrack size : " << zMuTrack->size() << endl;
00249 cout << "********* muons size : " << muons->size()<< endl;
00250 cout << "********* standAlone size : " << standAlone->size()<< endl;
00251 cout << "********* tracks size : " << tracks->size()<< endl;
00252 cout << "********* generated size : " << genParticles->size()<< endl;
00253
00254
00255
00256
00257 int nZMCfound = 0;
00258 totalNumberOfevents++;
00259 int ngen = genParticles->size();
00260 bool ZMuMuMatchedfound = false;
00261 bool ZMuMuMatchedSelectedfound = false;
00262 bool ZMuStaMatchedfound = false;
00263 bool ZMuStaMatchedSelectedfound = false;
00264 int ZMuTrackMatchedfound = 0;
00265 int ZMuTrackMatchedSelected_exclusivefound = 0;
00266
00267 double dimuonMassGen = 0;
00268
00269 for (int i=0; i<ngen; i++) {
00270 const Candidate &genCand = (*genParticles)[i];
00271
00272
00273
00274 if((genCand.pdgId() == 23)&&(genCand.status() == 3)) {
00275 if(genCand.numberOfDaughters() == 3) {
00276 const Candidate * dauGen0 = genCand.daughter(0);
00277 const Candidate * dauGen1 = genCand.daughter(1);
00278 const Candidate * dauGen2 = genCand.daughter(2);
00279 if (check_ifZmumu(dauGen0, dauGen1, dauGen2)) {
00280 totalNumberOfZfound++;
00281 nZMCfound++;
00282 bool checkpt = false;
00283 bool checketa = false;
00284 bool checkmass = false;
00285 float mupluspt, muminuspt, mupluseta, muminuseta, muplusphi, muminusphi;
00286 mupluspt = getParticlePt(-13,dauGen0,dauGen1,dauGen2);
00287 muminuspt = getParticlePt(13,dauGen0,dauGen1,dauGen2);
00288 mupluseta = getParticleEta(-13,dauGen0,dauGen1,dauGen2);
00289 muminuseta = getParticleEta(13,dauGen0,dauGen1,dauGen2);
00290 muplusphi = getParticlePhi(-13,dauGen0,dauGen1,dauGen2);
00291 muminusphi = getParticlePhi(13,dauGen0,dauGen1,dauGen2);
00292 Particle::LorentzVector pZ(0, 0, 0, 0);
00293 Particle::LorentzVector muplusp4 = getParticleP4(-13,dauGen0,dauGen1,dauGen2);
00294 Particle::LorentzVector muminusp4 = getParticleP4(13,dauGen0,dauGen1,dauGen2);
00295 pZ = muplusp4 + muminusp4;
00296 double dimuon_pt = sqrt(pZ.x()*pZ.x()+pZ.y()*pZ.y());
00297 double tan_theta_half = tan(atan(dimuon_pt/pZ.z())/2.);
00298 double dimuon_eta = 0.;
00299 if (tan_theta_half>0) dimuon_eta = -log(tan(tan_theta_half));
00300 if (tan_theta_half<=0) dimuon_eta = log(tan(-tan_theta_half));
00301
00302 dimuonMassGen = pZ.mass();
00303
00304 h_ZmassGen_->Fill(genCand.mass());
00305 h_ZetaGen_->Fill(genCand.eta());
00306 h_ZptGen_->Fill(genCand.pt());
00307 h_dimuonMassGen_->Fill(pZ.mass());
00308 h_dimuonEtaGen_->Fill(dimuon_eta);
00309 h_dimuonPtGen_->Fill(dimuon_pt);
00310 h_muetaGen_->Fill(mupluseta);
00311 h_muetaGen_->Fill(muminuseta);
00312 h_muptGen_->Fill(mupluspt);
00313 h_muptGen_->Fill(muminuspt);
00314
00315
00316
00317
00318
00319
00320
00321
00322 if (mupluspt > ptmin_ && muminuspt > ptmin_) checkpt = true;
00323 if (mupluseta < etamax_ && muminuseta < etamax_) checketa = true;
00324 if (genCand.mass()>zMassMin_ && genCand.mass()<zMassMax_) checkmass = true;
00325 if (checkpt && checketa && checkmass) {
00326 totalNumberOfZPassed++;
00327 h_ZmassGenPassed_->Fill(genCand.mass());
00328 h_ZetaGenPassed_->Fill(genCand.eta());
00329 h_ZptGenPassed_->Fill(genCand.pt());
00330 h_dimuonMassGenPassed_->Fill(pZ.mass());
00331 h_dimuonEtaGenPassed_->Fill(dimuon_eta);
00332 h_dimuonPtGenPassed_->Fill(dimuon_pt);
00333 h_muetaGenPassed_->Fill(mupluseta);
00334 h_muetaGenPassed_->Fill(muminuseta);
00335 h_muptGenPassed_->Fill(mupluspt);
00336 h_muptGenPassed_->Fill(muminuspt);
00337
00338 if (zMuMu->size() > 0 ) {
00339 n_zMuMufound_genZsele++;
00340 }
00341 else if (zMuStandAlone->size() > 0 ) {
00342 n_zMuStafound_genZsele++;
00343 }
00344 else {
00345 n_zMuTrkfound_genZsele++;
00346 }
00347
00348 }
00349 }
00350
00351 }
00352 }
00353 }
00354 h_nZMCfound_->Fill(nZMCfound);
00355
00356
00357
00358 if (zMuMu->size() > 0 ) {
00359 numberOfEventsWithZMuMufound++;
00360 event.getByLabel(zMuMuMatchMap_, zMuMuMatchMap);
00361 event.getByLabel(muonIso_, muonIso);
00362 event.getByLabel(standAloneIso_, standAloneIso);
00363 event.getByLabel(muonMatchMap_, muonMatchMap);
00364 for(unsigned int i = 0; i < zMuMu->size(); ++i) {
00365 const Candidate & zMuMuCand = (*zMuMu)[i];
00366 CandidateBaseRef zMuMuCandRef = zMuMu->refAt(i);
00367 bool isMatched = false;
00368 GenParticleRef zMuMuMatch = (*zMuMuMatchMap)[zMuMuCandRef];
00369
00370 if(zMuMuMatch.isNonnull()) {
00371 isMatched = true;
00372 numberOfMatchedZMuMu_++;
00373 }
00374 CandidateBaseRef dau0 = zMuMuCand.daughter(0)->masterClone();
00375 CandidateBaseRef dau1 = zMuMuCand.daughter(1)->masterClone();
00376 if (isMatched) ZMuMuMatchedfound = true;
00377
00378
00379 if((dau0->pt() > ptmin_) && (dau1->pt() > ptmin_) &&
00380 (fabs(dau0->eta()) < etamax_) && (fabs(dau1->eta()) < etamax_) &&
00381 (zMuMuCand.mass() > zMassMin_) && (zMuMuCand.mass() < zMassMax_) &&
00382 (isMatched)) {
00383
00384 const double globalMuonIsolation0 = (*muonIso)[dau0];
00385 const double globalMuonIsolation1 = (*muonIso)[dau1];
00386 if((globalMuonIsolation0 < isomax_) && (globalMuonIsolation1 < isomax_)) {
00387 ZMuMuMatchedSelectedfound = true;
00388 numberOfMatchedSelectedZMuMu_++;
00389 h_etaStandAlone_->Fill(dau0->eta());
00390 h_etaStandAlone_->Fill(dau1->eta());
00391 h_etaMuonOverlappedToStandAlone_->Fill(dau0->eta());
00392 h_etaMuonOverlappedToStandAlone_->Fill(dau1->eta());
00393 h_ptStandAlone_->Fill(dau0->pt());
00394 h_ptStandAlone_->Fill(dau1->pt());
00395 h_ptMuonOverlappedToStandAlone_->Fill(dau0->pt());
00396 h_ptMuonOverlappedToStandAlone_->Fill(dau1->pt());
00397
00398 h_etaTrack_->Fill(dau0->eta());
00399 h_etaTrack_->Fill(dau1->eta());
00400 h_etaMuonOverlappedToTrack_->Fill(dau0->eta());
00401 h_etaMuonOverlappedToTrack_->Fill(dau1->eta());
00402 h_ptTrack_->Fill(dau0->pt());
00403 h_ptTrack_->Fill(dau1->pt());
00404 h_ptMuonOverlappedToTrack_->Fill(dau0->pt());
00405 h_ptMuonOverlappedToTrack_->Fill(dau1->pt());
00406
00407 h_DELTA_ZMuMuMassReco_dimuonMassGen_->Fill(zMuMuCand.mass()-dimuonMassGen);
00408
00409 for(unsigned int j = 0; j < muons->size() ; ++j) {
00410 CandidateBaseRef muCandRef = muons->refAt(j);
00411 GenParticleRef muonMatch = (*muonMatchMap)[muCandRef];
00412
00413 }
00414 }
00415 }
00416 }
00417 }
00418
00419 if (zMuStandAlone->size() > 0) {
00420 numberOfEventsWithZMuStafound++;
00421 event.getByLabel(zMuStandAloneMatchMap_, zMuStandAloneMatchMap);
00422 event.getByLabel(muonIso_, muonIso);
00423 event.getByLabel(standAloneIso_, standAloneIso);
00424 event.getByLabel(muonMatchMap_, muonMatchMap);
00425 for(unsigned int i = 0; i < zMuStandAlone->size(); ++i) {
00426 const Candidate & zMuStaCand = (*zMuStandAlone)[i];
00427 CandidateBaseRef zMuStaCandRef = zMuStandAlone->refAt(i);
00428 bool isMatched = false;
00429 GenParticleRef zMuStaMatch = (*zMuStandAloneMatchMap)[zMuStaCandRef];
00430 if(zMuStaMatch.isNonnull()) {
00431 isMatched = true;
00432 ZMuStaMatchedfound = true;
00433 numberOfMatchedZMuSta_++;
00434 }
00435 CandidateBaseRef dau0 = zMuStaCand.daughter(0)->masterClone();
00436 CandidateBaseRef dau1 = zMuStaCand.daughter(1)->masterClone();
00437
00438
00439 if((dau0->pt() > ptmin_) && (dau1->pt() > ptmin_) &&
00440 (fabs(dau0->eta()) < etamax_) && (fabs(dau1->eta()) < etamax_) &&
00441 (zMuStaCand.mass() > zMassMin_) && (zMuStaCand.mass() < zMassMax_) &&
00442 (isMatched)) {
00443 CandidateBaseRef standAloneMuonCandRef_, globalMuonCandRef_;
00444 if(dau0->isGlobalMuon()) {
00445 standAloneMuonCandRef_ = dau1;
00446 globalMuonCandRef_ = dau0;
00447 }
00448 if(dau1->isGlobalMuon()) {
00449 standAloneMuonCandRef_ = dau0;
00450 globalMuonCandRef_ = dau1;
00451 }
00452
00453 const double globalMuonIsolation = (*muonIso)[globalMuonCandRef_];
00454 const double standAloneMuonIsolation = (*standAloneIso)[standAloneMuonCandRef_];
00455
00456 if((globalMuonIsolation < isomax_) && (standAloneMuonIsolation < isomax_)) {
00457 ZMuStaMatchedSelectedfound = true;
00458 numberOfMatchedSelectedZMuSta_++;
00459 h_etaStandAlone_->Fill(standAloneMuonCandRef_->eta());
00460 h_ptStandAlone_->Fill(standAloneMuonCandRef_->pt());
00461 h_DELTA_ZMuStaMassReco_dimuonMassGen_->Fill(zMuStaCand.mass()-dimuonMassGen);
00462
00463 }
00464 }
00465 }
00466 }
00467
00468
00469
00470 if (zMuTrack->size() > 0) {
00471 event.getByLabel(zMuTrackMatchMap_, zMuTrackMatchMap);
00472 event.getByLabel(muonIso_, muonIso);
00473 event.getByLabel(trackIso_, trackIso);
00474 event.getByLabel(muonMatchMap_, muonMatchMap);
00475 for(unsigned int i = 0; i < zMuTrack->size(); ++i) {
00476 const Candidate & zMuTrkCand = (*zMuTrack)[i];
00477 CandidateBaseRef zMuTrkCandRef = zMuTrack->refAt(i);
00478 bool isMatched = false;
00479 GenParticleRef zMuTrkMatch = (*zMuTrackMatchMap)[zMuTrkCandRef];
00480 if(zMuTrkMatch.isNonnull()) {
00481 isMatched = true;
00482 }
00483 CandidateBaseRef dau0 = zMuTrkCand.daughter(0)->masterClone();
00484 CandidateBaseRef dau1 = zMuTrkCand.daughter(1)->masterClone();
00485
00486 if (isMatched) {
00487 ZMuTrackMatchedfound++;
00488 if (ZMuMuMatchedfound) numberOfMatchedZMuTrack_matchedZMuMu++;
00489 if (ZMuMuMatchedSelectedfound) numberOfMatchedZMuTrack_matchedSelectedZMuMu++;
00490 if (!ZMuMuMatchedfound) numberOfMatchedZMuTrack_exclusive++;
00491 }
00492
00493 if ((dau0->pt() > ptmin_) && (dau1->pt() > ptmin_) &&
00494 (fabs(dau0->eta()) < etamax_) && (fabs(dau1->eta())< etamax_) &&
00495 (zMuTrkCand.mass() > zMassMin_) && (zMuTrkCand.mass() < zMassMax_) &&
00496 (isMatched) && !ZMuMuMatchedfound && !ZMuStaMatchedfound ) {
00497
00498
00499 const double globalMuonIsolation = (*muonIso)[dau0];
00500 const double trackMuonIsolation = (*trackIso)[dau1];
00501 if((globalMuonIsolation < isomax_) && (trackMuonIsolation < isomax_)) {
00502 numberOfMatchedSelectedZMuTrack_exclusive++;
00503 ZMuTrackMatchedSelected_exclusivefound++;
00504 h_etaTrack_->Fill(dau1->eta());
00505 h_ptTrack_->Fill(dau1->pt());
00506 h_DELTA_ZMuTrackMassReco_dimuonMassGen_->Fill(zMuTrkCand.mass()-dimuonMassGen);
00507 }
00508
00509 }
00510 }
00511 }
00512
00513 if (!ZMuMuMatchedfound && !ZMuStaMatchedfound && ZMuTrackMatchedfound == 0) noMCmatching++;
00514 if (!ZMuMuMatchedfound && ZMuTrackMatchedfound == 1) ZMuTrack_exclusive_1match++;
00515 if (!ZMuMuMatchedfound && ZMuTrackMatchedfound > 1) ZMuTrack_exclusive_morematch++;
00516 if (!ZMuMuMatchedfound && ZMuTrackMatchedSelected_exclusivefound == 1) ZMuTrackselected_exclusive_1match++;
00517 if (!ZMuMuMatchedfound && ZMuTrackMatchedSelected_exclusivefound > 1) ZMuTrackselected_exclusive_morematch++;
00518 if (ZMuMuMatchedfound && ZMuTrackMatchedfound == 1) ZMuTrack_ZMuMu_1match++;
00519 if (ZMuMuMatchedfound && ZMuTrackMatchedfound == 2) ZMuTrack_ZMuMu_2match++;
00520 if (ZMuMuMatchedfound && ZMuTrackMatchedfound > 2) ZMuTrack_ZMuMu_morematch++;
00521
00522 }
00523
00524 bool ZMuMuEfficiency::check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00525 {
00526 int partId0 = dauGen0->pdgId();
00527 int partId1 = dauGen1->pdgId();
00528 int partId2 = dauGen2->pdgId();
00529 bool muplusFound=false;
00530 bool muminusFound=false;
00531 bool ZFound=false;
00532 if (partId0==13 || partId1==13 || partId2==13) muminusFound=true;
00533 if (partId0==-13 || partId1==-13 || partId2==-13) muplusFound=true;
00534 if (partId0==23 || partId1==23 || partId2==23) ZFound=true;
00535 return muplusFound*muminusFound*ZFound;
00536 }
00537
00538 float ZMuMuEfficiency::getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00539 {
00540 int partId0 = dauGen0->pdgId();
00541 int partId1 = dauGen1->pdgId();
00542 int partId2 = dauGen2->pdgId();
00543 float ptpart=0.;
00544 if (partId0 == ipart) {
00545 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00546 const Candidate * dauMuGen = dauGen0->daughter(k);
00547 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00548 ptpart = dauMuGen->pt();
00549 }
00550 }
00551 }
00552 if (partId1 == ipart) {
00553 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00554 const Candidate * dauMuGen = dauGen1->daughter(k);
00555 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00556 ptpart = dauMuGen->pt();
00557 }
00558 }
00559 }
00560 if (partId2 == ipart) {
00561 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00562 const Candidate * dauMuGen = dauGen2->daughter(k);
00563 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00564 ptpart = dauMuGen->pt();
00565 }
00566 }
00567 }
00568 return ptpart;
00569 }
00570
00571 float ZMuMuEfficiency::getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00572 {
00573 int partId0 = dauGen0->pdgId();
00574 int partId1 = dauGen1->pdgId();
00575 int partId2 = dauGen2->pdgId();
00576 float etapart=0.;
00577 if (partId0 == ipart) {
00578 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00579 const Candidate * dauMuGen = dauGen0->daughter(k);
00580 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00581 etapart = dauMuGen->eta();
00582 }
00583 }
00584 }
00585 if (partId1 == ipart) {
00586 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00587 const Candidate * dauMuGen = dauGen1->daughter(k);
00588 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00589 etapart = dauMuGen->eta();
00590 }
00591 }
00592 }
00593 if (partId2 == ipart) {
00594 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00595 const Candidate * dauMuGen = dauGen2->daughter(k);
00596 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00597 etapart = dauMuGen->eta();
00598 }
00599 }
00600 }
00601 return etapart;
00602 }
00603
00604 float ZMuMuEfficiency::getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00605 {
00606 int partId0 = dauGen0->pdgId();
00607 int partId1 = dauGen1->pdgId();
00608 int partId2 = dauGen2->pdgId();
00609 float phipart=0.;
00610 if (partId0 == ipart) {
00611 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00612 const Candidate * dauMuGen = dauGen0->daughter(k);
00613 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00614 phipart = dauMuGen->phi();
00615 }
00616 }
00617 }
00618 if (partId1 == ipart) {
00619 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00620 const Candidate * dauMuGen = dauGen1->daughter(k);
00621 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00622 phipart = dauMuGen->phi();
00623 }
00624 }
00625 }
00626 if (partId2 == ipart) {
00627 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00628 const Candidate * dauMuGen = dauGen2->daughter(k);
00629 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00630 phipart = dauMuGen->phi();
00631 }
00632 }
00633 }
00634 return phipart;
00635 }
00636
00637 Particle::LorentzVector ZMuMuEfficiency::getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00638 {
00639 int partId0 = dauGen0->pdgId();
00640 int partId1 = dauGen1->pdgId();
00641 int partId2 = dauGen2->pdgId();
00642 Particle::LorentzVector p4part(0.,0.,0.,0.);
00643 if (partId0 == ipart) {
00644 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00645 const Candidate * dauMuGen = dauGen0->daughter(k);
00646 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00647 p4part = dauMuGen->p4();
00648 }
00649 }
00650 }
00651 if (partId1 == ipart) {
00652 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00653 const Candidate * dauMuGen = dauGen1->daughter(k);
00654 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00655 p4part = dauMuGen->p4();
00656 }
00657 }
00658 }
00659 if (partId2 == ipart) {
00660 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00661 const Candidate * dauMuGen = dauGen2->daughter(k);
00662 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00663 p4part = dauMuGen->p4();
00664 }
00665 }
00666 }
00667 return p4part;
00668 }
00669
00670
00671
00672 void ZMuMuEfficiency::endJob() {
00673
00674
00675
00676 double myTrackEff = 2.*numberOfMatchedSelectedZMuMu_/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuSta_);
00677 double myErrTrackEff = sqrt(myTrackEff*(1-myTrackEff)/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuSta_));
00678
00679 double myStaEff = 2.*numberOfMatchedSelectedZMuMu_/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuTrack_exclusive);
00680 double myErrStaEff = sqrt(myTrackEff*(1-myTrackEff)/(2.*numberOfMatchedSelectedZMuMu_+(double)numberOfMatchedSelectedZMuTrack_exclusive));
00681
00682
00683
00684
00685 cout << "------------------------------------ Counters for MC acceptance --------------------------------" << endl;
00686 cout << "totalNumberOfevents = " << totalNumberOfevents << endl;
00687 cout << "totalNumberOfZfound = " << totalNumberOfZfound << endl;
00688 cout << "totalNumberOfZpassed = " << totalNumberOfZPassed << endl;
00689 cout << "n. of events zMuMu found (gen level selected)" << n_zMuMufound_genZsele << endl;
00690 cout << "n. of events zMuSta found (gen level selected)" << n_zMuStafound_genZsele << endl;
00691 cout << "n. of events zMuTrk found (gen level selected)" << n_zMuTrkfound_genZsele << endl;
00692
00693 cout << "---------------------------- Counter for MC truth efficiency calculation--------------------- " << endl;
00694
00695 cout << "number of events with ZMuMu found = " << numberOfEventsWithZMuMufound << endl;
00696 cout << "number of events with ZMuSta found = " << numberOfEventsWithZMuStafound << endl;
00697 cout << "-------------------------------------------------------------------------------------- " << endl;
00698
00699 cout << "number of events without MC maching = " << noMCmatching << endl;
00700 cout << "number of ZMuTrack exclsive 1 match = " << ZMuTrack_exclusive_1match << endl;
00701 cout << "number of ZMuTrack exclsive more match = " << ZMuTrack_exclusive_morematch << endl;
00702 cout << "number of ZMuTrack selected exclusive 1 match = " << ZMuTrackselected_exclusive_1match << endl;
00703 cout << "number of ZMuTrack selected exclusive more match = " << ZMuTrackselected_exclusive_morematch << endl;
00704 cout << "number of ZMuTrack ZMuMu 1 match = " << ZMuTrack_ZMuMu_1match << endl;
00705 cout << "number of ZMuTrack ZMuMu 2 match = " << ZMuTrack_ZMuMu_2match << endl;
00706 cout << "number of ZMuTrack ZMuMu more match = " << ZMuTrack_ZMuMu_morematch << endl;
00707 cout << "numberOfMatchedZMuMu = " << numberOfMatchedZMuMu_ << endl;
00708 cout << "numberOfMatchedSelectdZMuMu = " << numberOfMatchedSelectedZMuMu_ << endl;
00709 cout << "numberOfMatchedZMuSta = " << numberOfMatchedZMuSta_ << endl;
00710 cout << "numberOfMatchedSelectedZMuSta = " << numberOfMatchedSelectedZMuSta_ << endl;
00711 cout << "numberOfMatchedZMuTrack_matchedZMuMu = " << numberOfMatchedZMuTrack_matchedZMuMu << endl;
00712 cout << "numberOfMatchedZMuTrack_matchedSelectedZMuMu = " << numberOfMatchedZMuTrack_matchedSelectedZMuMu << endl;
00713 cout << "numberOfMatchedZMuTrack exclusive = " << numberOfMatchedZMuTrack_exclusive << endl;
00714 cout << "numberOfMatchedSelectedZMuTrack exclusive = " << numberOfMatchedSelectedZMuTrack_exclusive << endl;
00715 cout << " ----------------------------- Efficiency --------------------------------- " << endl;
00716 cout << "Efficiency StandAlone = " << myStaEff << " +/- " << myErrStaEff << endl;
00717 cout << "Efficiency Track = " << myTrackEff << " +/- " << myErrTrackEff << endl;
00718 }
00719
00720 #include "FWCore/Framework/interface/MakerMacros.h"
00721
00722 DEFINE_FWK_MODULE(ZMuMuEfficiency);
00723