00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "DataFormats/Common/interface/AssociationVector.h"
00011 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00012 #include "DataFormats/Candidate/interface/CandMatchMap.h"
00013 #include "FWCore/Framework/interface/EDAnalyzer.h"
00014 #include "DataFormats/Candidate/interface/Particle.h"
00015 #include "DataFormats/Candidate/interface/Candidate.h"
00016 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00017 #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
00018 #include "DataFormats/MuonReco/interface/Muon.h"
00019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00020 #include "FWCore/Framework/interface/Event.h"
00021 #include "FWCore/Framework/interface/EventSetup.h"
00022 #include "FWCore/Utilities/interface/InputTag.h"
00023 #include "DataFormats/Candidate/interface/OverlapChecker.h"
00024 #include "DataFormats/Math/interface/deltaR.h"
00025 #include "DataFormats/PatCandidates/interface/Muon.h"
00026 #include "DataFormats/PatCandidates/interface/GenericParticle.h"
00027 #include "DataFormats/PatCandidates/interface/TriggerObjectStandAlone.h"
00028 #include "DataFormats/Common/interface/AssociationVector.h"
00029 #include "DataFormats/PatCandidates/interface/PATObject.h"
00030
00031 #include "TH1.h"
00032 #include "TH2.h"
00033 #include "TH3.h"
00034 #include <vector>
00035 using namespace edm;
00036 using namespace std;
00037 using namespace reco;
00038
00039 class ZMuMu_vtxAnalyzer : public edm::EDAnalyzer {
00040 public:
00041 ZMuMu_vtxAnalyzer(const edm::ParameterSet& pset);
00042 private:
00043 virtual void analyze(const edm::Event& event, const edm::EventSetup& setup);
00044 bool check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00045 float getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00046 float getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00047 float getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00048 Particle::LorentzVector getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2);
00049 virtual void endJob();
00050
00051 edm::InputTag zMuMu_, zMuMuMatchMap_;
00052 edm::InputTag zMuStandAlone_, zMuStandAloneMatchMap_;
00053 edm::InputTag zMuTrack_, zMuTrackMatchMap_;
00054 edm::InputTag muons_, muonMatchMap_, muonIso_;
00055 edm::InputTag tracks_, trackIso_;
00056 edm::InputTag genParticles_, primaryVertices_;
00057
00058 bool bothMuons_;
00059
00060 double etamax_, ptmin_, massMin_, massMax_, isoMax_;
00061
00062 reco::CandidateBaseRef globalMuonCandRef_, trackMuonCandRef_, standAloneMuonCandRef_;
00063 OverlapChecker overlap_;
00064
00065
00066
00067
00068
00069 TH1D *h_muon_vz, *h_dimuon_vz, *h_muon_d0signed;
00070 TH1D *h_muon_vz_respectToPV, *h_muon_d0signed_respectToPV;
00071
00072 TH1D *h_zmumuSele_muon_vz, *h_zmumuSele_dimuon_vz, *h_zmumuSele_muon_d0signed;
00073 TH1D *h_zmumuSele_muon_vz_respectToPV, *h_zmumuSele_muon_d0signed_respectToPV;
00074
00075 TH1D *h_zmumuNotIsoSele_dimuon_vz;
00076 TH1D *h_zmumuNotIsoSele_muonIso_vz, *h_zmumuNotIsoSele_muonIso_d0signed;
00077 TH1D *h_zmumuNotIsoSele_muonIso_vz_respectToPV, *h_zmumuNotIsoSele_muonIso_d0signed_respectToPV;
00078 TH1D *h_zmumuNotIsoSele_muonNotIso_vz, *h_zmumuNotIsoSele_muonNotIso_d0signed;
00079 TH1D *h_zmumuNotIsoSele_muonNotIso_vz_respectToPV, *h_zmumuNotIsoSele_muonNotIso_d0signed_respectToPV;
00080
00081 TH1D *h_zmutrackSele_muon_vz, *h_zmutrackSele_muon_d0signed;
00082 TH1D *h_zmutrackSele_muon_vz_respectToPV, *h_zmutrackSele_muon_d0signed_respectToPV;
00083 TH1D *h_zmutrackSele_track_vz, *h_zmutrackSele_track_d0signed;
00084 TH1D *h_zmutrackSele_track_vz_respectToPV, *h_zmutrackSele_track_d0signed_respectToPV;
00085
00086 TH1D *h_zmustaSele_muon_vz, *h_zmustaSele_muon_d0signed;
00087 TH1D *h_zmustaSele_muon_vz_respectToPV, *h_zmustaSele_muon_d0signed_respectToPV;
00088 TH1D *h_zmustaSele_sta_vz, *h_zmustaSele_sta_d0signed;
00089 TH1D *h_zmustaSele_sta_vz_respectToPV, *h_zmustaSele_sta_d0signed_respectToPV;
00090
00091
00092
00093 };
00094
00095 #include "FWCore/ServiceRegistry/interface/Service.h"
00096 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00097 #include "DataFormats/Common/interface/Handle.h"
00098 #include "DataFormats/Candidate/interface/Particle.h"
00099 #include "DataFormats/Candidate/interface/Candidate.h"
00100 #include "DataFormats/Common/interface/ValueMap.h"
00101 #include "DataFormats/Candidate/interface/CandAssociation.h"
00102 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00103 #include "DataFormats/Math/interface/LorentzVector.h"
00104 #include "DataFormats/TrackReco/interface/Track.h"
00105 #include <iostream>
00106 #include <iterator>
00107 #include <cmath>
00108 using namespace std;
00109 using namespace reco;
00110 using namespace edm;
00111
00112 typedef edm::ValueMap<float> IsolationCollection;
00113
00114 ZMuMu_vtxAnalyzer::ZMuMu_vtxAnalyzer(const ParameterSet& pset) :
00115 zMuMu_(pset.getParameter<InputTag>("zMuMu")),
00116 zMuMuMatchMap_(pset.getParameter<InputTag>("zMuMuMatchMap")),
00117 zMuStandAlone_(pset.getParameter<InputTag>("zMuStandAlone")),
00118 zMuStandAloneMatchMap_(pset.getParameter<InputTag>("zMuStandAloneMatchMap")),
00119 zMuTrack_(pset.getParameter<InputTag>("zMuTrack")),
00120 zMuTrackMatchMap_(pset.getParameter<InputTag>("zMuTrackMatchMap")),
00121 muons_(pset.getParameter<InputTag>("muons")),
00122 tracks_(pset.getParameter<InputTag>("tracks")),
00123 genParticles_(pset.getParameter<InputTag>( "genParticles" ) ),
00124 primaryVertices_(pset.getParameter<InputTag>( "primaryVertices" ) ),
00125
00126 bothMuons_(pset.getParameter<bool>("bothMuons")),
00127
00128 etamax_(pset.getUntrackedParameter<double>("etamax")),
00129 ptmin_(pset.getUntrackedParameter<double>("ptmin")),
00130 massMin_(pset.getUntrackedParameter<double>("zMassMin")),
00131 massMax_(pset.getUntrackedParameter<double>("zMassMax")),
00132 isoMax_(pset.getUntrackedParameter<double>("isomax")) {
00133 Service<TFileService> fs;
00134
00135
00136
00137
00138
00139 h_muon_vz = fs->make<TH1D>("muonVz","z vertex of muons",50,-20.,20.);
00140 h_muon_d0signed = fs->make<TH1D>("muonD0signed","d0 vertex of muons",50,-.1,.1);
00141 h_dimuon_vz = fs->make<TH1D>("dimuonVz","z vertex of dimuon",50,-20.,20.);
00142 h_muon_vz_respectToPV = fs->make<TH1D>("muonVz_respectToPV","z vertex of muons respect to PrimaryVertex",50,-.05,.05);
00143 h_muon_d0signed_respectToPV = fs->make<TH1D>("muonD0signed_respectToPV","d0 vertex of muons respect to PrimaryVertex",50,-.05,.05);
00144
00145 h_zmumuSele_muon_vz = fs->make<TH1D>("zmumuSele_muonVz","z vertex of muons (zmumu sele)",50,-20.,20.);
00146 h_zmumuSele_muon_d0signed = fs->make<TH1D>("zmumuSele_muonD0signed","d0 vertex of muons (zmumu sele)",50,-.1,.1);
00147 h_zmumuSele_dimuon_vz = fs->make<TH1D>("zmumuSele_dimuonVz","z vertex of dimuon (zmumu sele)",50,-20.,20.);
00148 h_zmumuSele_muon_vz_respectToPV = fs->make<TH1D>("zmumuSele_muonVz_respectToPV","z vertex of muons respect to PrimaryVertex (zmumu sele)",50,-.05,.05);
00149 h_zmumuSele_muon_d0signed_respectToPV = fs->make<TH1D>("zmumuSele_muonD0signed_respectToPV","d0 vertex of muons respect to PrimaryVertex (zmumu sele)",50,-.05,.05);
00150
00151 h_zmumuNotIsoSele_dimuon_vz = fs->make<TH1D>("zmumuNotIsoSele_dimuonVz","z vertex of dimuon (zmumuNotIso sele)",50,-20.,20.);
00152 h_zmumuNotIsoSele_muonIso_vz = fs->make<TH1D>("zmumuNotIsoSele_muonIsoVz","z vertex of muons (zmumuNotIso sele muon Iso)",50,-20.,20.);
00153 h_zmumuNotIsoSele_muonIso_d0signed = fs->make<TH1D>("zmumuNotIsoSele_muonIsoD0signed","d0 vertex of muons (zmumuNotIso sele muon Iso)",50,-.1,.1);
00154 h_zmumuNotIsoSele_muonIso_vz_respectToPV = fs->make<TH1D>("zmumuNotIsoSele_muonIsoVz_respectToPV","z vertex of muons respect to PrimaryVertex (zmumuNotIso sele muon Iso)",50,-.05,.05);
00155 h_zmumuNotIsoSele_muonIso_d0signed_respectToPV = fs->make<TH1D>("zmumuNotIsoSele_muonIsoD0signed_respectToPV","d0 vertex of muons respect to PrimaryVertex (zmumuNotIso sele muon Iso)",50,-.05,.05);
00156 h_zmumuNotIsoSele_muonNotIso_vz = fs->make<TH1D>("zmumuNotIsoSele_muonNotIsoVz","z vertex of muons (zmumuNotIso sele muon Not Iso)",50,-20.,20.);
00157 h_zmumuNotIsoSele_muonNotIso_d0signed = fs->make<TH1D>("zmumuNotIsoSele_muonNotIsoD0signed","d0 vertex of muons (zmumuNotIso sele muon Not Iso)",50,-.1,.1);
00158 h_zmumuNotIsoSele_muonNotIso_vz_respectToPV = fs->make<TH1D>("zmumuNotIsoSele_muonNotIsoVz_respectToPV","z vertex of muons respect to PrimaryVertex (zmumuNotIso sele muon Not Iso)",50,-.05,.05);
00159 h_zmumuNotIsoSele_muonNotIso_d0signed_respectToPV = fs->make<TH1D>("zmumuNotIsoSele_muonNotIsoD0signed_respectToPV","d0 vertex of muons respect to PrimaryVertex (zmumuNotIso sele muon Not Iso)",50,-.05,.05);
00160
00161 h_zmutrackSele_muon_vz = fs->make<TH1D>("zmutrackSele_muonVz","z vertex of muon (zmutrack sele)",50,-20.,20.);
00162 h_zmutrackSele_muon_d0signed = fs->make<TH1D>("zmutrackSele_muonD0signed","d0 vertex of muon (zmutrack sele)",50,-.1,.1);
00163 h_zmutrackSele_muon_vz_respectToPV = fs->make<TH1D>("zmutrackSele_muonVz_respectToPV","z vertex of muon respect to PV (zmutrack sele)",50,-.05,.05);
00164 h_zmutrackSele_muon_d0signed_respectToPV = fs->make<TH1D>("zmutrackSele_muonD0signed_respectToPV","d0 vertex of muon respect to PV (zmutrack sele)",50,-.1,.1);
00165 h_zmutrackSele_track_vz = fs->make<TH1D>("zmutrackSele_trackVz","z vertex of track (zmutrack sele)",50,-20.,20.);
00166 h_zmutrackSele_track_d0signed = fs->make<TH1D>("zmutrackSele_trackD0signed","d0 vertex of track (zmutrack sele)",50,-.1,.1);
00167 h_zmutrackSele_track_vz_respectToPV = fs->make<TH1D>("zmutrackSele_trackVz_respectToPV","z vertex of track respect to PV (zmutrack sele)",50,-.05,.05);
00168 h_zmutrackSele_track_d0signed_respectToPV = fs->make<TH1D>("zmutrackSele_trackD0signed_respectToPV","d0 vertex of track respect to PV (zmutrack sele)",50,-.1,.1);
00169
00170 h_zmustaSele_muon_vz = fs->make<TH1D>("zmustaSele_muonVz","z vertex of muon (zmusta sele)",50,-20.,20.);
00171 h_zmustaSele_muon_d0signed = fs->make<TH1D>("zmustaSele_muonD0signed","d0 vertex of muon (zmusta sele)",50,-.1,.1);
00172 h_zmustaSele_muon_vz_respectToPV = fs->make<TH1D>("zmustaSele_muonVz_respectToPV","z vertex of muon respect to PV (zmusta sele)",50,-.05,.05);
00173 h_zmustaSele_muon_d0signed_respectToPV = fs->make<TH1D>("zmustaSele_muonD0signed_respectToPV","d0 vertex of muon respect to PV (zmusta sele)",50,-.1,.1);
00174 h_zmustaSele_sta_vz = fs->make<TH1D>("zmustaSele_staVz","z vertex of sta (zmusta sele)",50,-20.,20.);
00175 h_zmustaSele_sta_d0signed = fs->make<TH1D>("zmustaSele_staD0signed","d0 vertex of sta (zmusta sele)",50,-.1,.1);
00176 h_zmustaSele_sta_vz_respectToPV = fs->make<TH1D>("zmustaSele_staVz_respectToPV","z vertex of sta respect to PV (zmusta sele)",50,-.05,.05);
00177 h_zmustaSele_sta_d0signed_respectToPV = fs->make<TH1D>("zmustaSele_staD0signed_respectToPV","d0 vertex of sta respect to PV (zmusta sele)",50,-.1,.1);
00178
00179 }
00180
00181 void ZMuMu_vtxAnalyzer::analyze(const Event& event, const EventSetup& setup) {
00182 Handle<CandidateView> zMuMu;
00183 Handle<GenParticleMatch> zMuMuMatchMap;
00184 Handle<CandidateView> zMuStandAlone;
00185 Handle<GenParticleMatch> zMuStandAloneMatchMap;
00186 Handle<CandidateView> zMuTrack;
00187 Handle<GenParticleMatch> zMuTrackMatchMap;
00188 Handle<CandidateView> muons;
00189 Handle<CandidateView> tracks;
00190
00191 Handle<GenParticleCollection> genParticles;
00192 Handle<reco::VertexCollection> primaryVertices;
00193
00194 event.getByLabel(zMuMu_, zMuMu);
00195 event.getByLabel(zMuStandAlone_, zMuStandAlone);
00196 event.getByLabel(zMuTrack_, zMuTrack);
00197 event.getByLabel(genParticles_, genParticles);
00198 event.getByLabel(primaryVertices_, primaryVertices);
00199 event.getByLabel(muons_, muons);
00200 event.getByLabel(tracks_, tracks);
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 bool zMuMu_found = false;
00215
00216
00217 if (zMuMu->size() > 0 ) {
00218 event.getByLabel(zMuMuMatchMap_, zMuMuMatchMap);
00219 for(unsigned int i = 0; i < zMuMu->size(); ++i) {
00220 const Candidate & zMuMuCand = (*zMuMu)[i];
00221 CandidateBaseRef zMuMuCandRef = zMuMu->refAt(i);
00222
00223 const Candidate * lep0 = zMuMuCand.daughter( 0 );
00224 const Candidate * lep1 = zMuMuCand.daughter( 1 );
00225 const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
00226 double trkiso0 = muonDau0.trackIso();
00227 const pat::Muon & muonDau1 = dynamic_cast<const pat::Muon &>(*lep1->masterClone());
00228 double trkiso1 = muonDau1.trackIso();
00229
00230
00231 h_muon_vz->Fill(muonDau0.vz());
00232 h_muon_vz->Fill(muonDau1.vz());
00233 h_dimuon_vz->Fill((muonDau0.vz()+muonDau1.vz())/2.);
00234
00235 TrackRef mu0TrkRef = muonDau0.track();
00236 float d0signed_mu0 = (*mu0TrkRef).dxy();
00237 float d0signed_mu0_respectToPV= (*mu0TrkRef).dxy( primaryVertices->begin()->position() );
00238 float vz_mu0_respectToPV= (*mu0TrkRef).dz( primaryVertices->begin()->position() );
00239
00240 TrackRef mu1TrkRef = muonDau1.track();
00241 float d0signed_mu1 = (*mu1TrkRef).dxy();
00242 float d0signed_mu1_respectToPV= (*mu1TrkRef).dxy( primaryVertices->begin()->position() );
00243 float vz_mu1_respectToPV= (*mu1TrkRef).dz( primaryVertices->begin()->position() );
00244 h_muon_d0signed->Fill(d0signed_mu0);
00245 h_muon_d0signed->Fill(d0signed_mu1);
00246 h_muon_d0signed_respectToPV->Fill(d0signed_mu0_respectToPV);
00247 h_muon_d0signed_respectToPV->Fill(d0signed_mu1_respectToPV);
00248 h_muon_vz_respectToPV->Fill(vz_mu0_respectToPV);
00249 h_muon_vz_respectToPV->Fill(vz_mu1_respectToPV);
00250
00251
00252 double pt0 = zMuMuCand.daughter(0)->pt();
00253 double pt1 = zMuMuCand.daughter(1)->pt();
00254 double eta0 = zMuMuCand.daughter(0)->eta();
00255 double eta1 = zMuMuCand.daughter(1)->eta();
00256 double mass = zMuMuCand.mass();
00257
00258
00259 const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
00260 muonDau0.triggerObjectMatchesByPath( "HLT_Mu9" );
00261 const pat::TriggerObjectStandAloneCollection mu1HLTMatches =
00262 muonDau1.triggerObjectMatchesByPath( "HLT_Mu9" );
00263
00264 bool trig0found = false;
00265 bool trig1found = false;
00266 if( mu0HLTMatches.size()>0 )
00267 trig0found = true;
00268 if( mu1HLTMatches.size()>0 )
00269 trig1found = true;
00270
00271
00272 if ((trig0found || trig1found) && pt0>ptmin_ && pt1>ptmin_ && abs(eta0)<etamax_ && abs(eta1)<etamax_ && mass > massMin_) {
00273 if (trkiso0<isoMax_ && trkiso1<isoMax_) {
00274 h_zmumuSele_muon_vz->Fill(muonDau0.vz());
00275 h_zmumuSele_muon_vz->Fill(muonDau1.vz());
00276 h_zmumuSele_dimuon_vz->Fill((muonDau0.vz()+muonDau1.vz())/2.);
00277 h_zmumuSele_muon_d0signed->Fill(d0signed_mu0);
00278 h_zmumuSele_muon_d0signed->Fill(d0signed_mu1);
00279 h_zmumuSele_muon_d0signed_respectToPV->Fill(d0signed_mu0_respectToPV);
00280 h_zmumuSele_muon_d0signed_respectToPV->Fill(d0signed_mu1_respectToPV);
00281 h_zmumuSele_muon_vz_respectToPV->Fill(vz_mu0_respectToPV);
00282 h_zmumuSele_muon_vz_respectToPV->Fill(vz_mu1_respectToPV);
00283 }
00284 if (trkiso0>=isoMax_ && trkiso1<isoMax_) {
00285 h_zmumuNotIsoSele_muonNotIso_vz->Fill(muonDau0.vz());
00286 h_zmumuNotIsoSele_muonIso_vz->Fill(muonDau1.vz());
00287 h_zmumuNotIsoSele_dimuon_vz->Fill((muonDau0.vz()+muonDau1.vz())/2.);
00288 h_zmumuNotIsoSele_muonNotIso_d0signed->Fill(d0signed_mu0);
00289 h_zmumuNotIsoSele_muonIso_d0signed->Fill(d0signed_mu1);
00290 h_zmumuNotIsoSele_muonNotIso_d0signed_respectToPV->Fill(d0signed_mu0_respectToPV);
00291 h_zmumuNotIsoSele_muonIso_d0signed_respectToPV->Fill(d0signed_mu1_respectToPV);
00292 h_zmumuNotIsoSele_muonNotIso_vz_respectToPV->Fill(vz_mu0_respectToPV);
00293 h_zmumuNotIsoSele_muonIso_vz_respectToPV->Fill(vz_mu1_respectToPV);
00294 }
00295 if (trkiso0<isoMax_ && trkiso1>=isoMax_) {
00296 h_zmumuNotIsoSele_muonNotIso_vz->Fill(muonDau1.vz());
00297 h_zmumuNotIsoSele_muonIso_vz->Fill(muonDau0.vz());
00298 h_zmumuNotIsoSele_dimuon_vz->Fill((muonDau1.vz()+muonDau1.vz())/2.);
00299 h_zmumuNotIsoSele_muonNotIso_d0signed->Fill(d0signed_mu1);
00300 h_zmumuNotIsoSele_muonIso_d0signed->Fill(d0signed_mu0);
00301 h_zmumuNotIsoSele_muonNotIso_d0signed_respectToPV->Fill(d0signed_mu1_respectToPV);
00302 h_zmumuNotIsoSele_muonIso_d0signed_respectToPV->Fill(d0signed_mu0_respectToPV);
00303 h_zmumuNotIsoSele_muonNotIso_vz_respectToPV->Fill(vz_mu1_respectToPV);
00304 h_zmumuNotIsoSele_muonIso_vz_respectToPV->Fill(vz_mu0_respectToPV);
00305 }
00306 }
00307 }
00308 }
00309
00310
00311 bool zMuSta_found = false;
00312 if (!zMuMu_found && zMuStandAlone->size() > 0 ) {
00313 event.getByLabel(zMuStandAloneMatchMap_, zMuStandAloneMatchMap);
00314 for(unsigned int i = 0; i < zMuStandAlone->size(); ++i) {
00315 const Candidate & zMuStandAloneCand = (*zMuStandAlone)[i];
00316 CandidateBaseRef zMuStandAloneCandRef = zMuStandAlone->refAt(i);
00317 GenParticleRef zMuStandAloneMatch = (*zMuStandAloneMatchMap)[zMuStandAloneCandRef];
00318
00319 const Candidate * lep0 = zMuStandAloneCand.daughter( 0 );
00320 const Candidate * lep1 = zMuStandAloneCand.daughter( 1 );
00321 const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
00322 double trkiso0 = muonDau0.trackIso();
00323 const pat::Muon & muonDau1 = dynamic_cast<const pat::Muon &>(*lep1->masterClone());
00324 double trkiso1 = muonDau1.trackIso();
00325
00326
00327
00328 TrackRef mu0TrkRef = muonDau0.track();
00329 float d0signed_mu0 = (*mu0TrkRef).dxy();
00330 float d0signed_mu0_respectToPV= (*mu0TrkRef).dxy( primaryVertices->begin()->position() );
00331 float vz_mu0_respectToPV= (*mu0TrkRef).dz( primaryVertices->begin()->position() );
00332
00333 TrackRef mu1TrkRef = muonDau1.track();
00334 float d0signed_mu1 = (*mu1TrkRef).dxy();
00335 float d0signed_mu1_respectToPV= (*mu1TrkRef).dxy( primaryVertices->begin()->position() );
00336 float vz_mu1_respectToPV= (*mu1TrkRef).dz( primaryVertices->begin()->position() );
00337
00338 double pt0 = zMuStandAloneCand.daughter(0)->pt();
00339 double pt1 = zMuStandAloneCand.daughter(1)->pt();
00340 double eta0 = zMuStandAloneCand.daughter(0)->eta();
00341 double eta1 = zMuStandAloneCand.daughter(1)->eta();
00342 double mass = zMuStandAloneCand.mass();
00343
00344
00345 const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
00346 muonDau0.triggerObjectMatchesByPath( "HLT_Mu9" );
00347 const pat::TriggerObjectStandAloneCollection mu1HLTMatches =
00348 muonDau1.triggerObjectMatchesByPath( "HLT_Mu9" );
00349
00350 bool trig0found = false;
00351 bool trig1found = false;
00352 if( mu0HLTMatches.size()>0 )
00353 trig0found = true;
00354 if( mu1HLTMatches.size()>0 )
00355 trig1found = true;
00356
00357
00358 bool trigfound = false;
00359 if (muonDau0.isGlobalMuon()) trigfound = trig0found;
00360 if (muonDau1.isGlobalMuon()) trigfound = trig1found;
00361
00362
00363 if (trigfound && pt0>ptmin_ && pt1>ptmin_ && abs(eta0)<etamax_ && abs(eta1)<etamax_ && mass>massMin_ && trkiso0<isoMax_ && trkiso1<isoMax_) {
00364 zMuSta_found = true;
00365 h_zmustaSele_muon_vz->Fill(muonDau0.vz(),1.);
00366 h_zmustaSele_sta_vz->Fill(muonDau1.vz(),1.);
00367 h_zmustaSele_muon_d0signed->Fill(d0signed_mu0,1.);
00368 h_zmustaSele_sta_d0signed->Fill(d0signed_mu1,1.);
00369 h_zmustaSele_muon_d0signed_respectToPV->Fill(d0signed_mu0_respectToPV,1.);
00370 h_zmustaSele_sta_d0signed_respectToPV->Fill(d0signed_mu1_respectToPV,1.);
00371 h_zmustaSele_muon_vz_respectToPV->Fill(vz_mu0_respectToPV,1.);
00372 h_zmustaSele_sta_vz_respectToPV->Fill(vz_mu1_respectToPV,1.);
00373 }
00374
00375 }
00376 }
00377
00378
00379
00380 if (!zMuMu_found && !zMuSta_found && zMuTrack->size() > 0 ) {
00381 event.getByLabel(zMuTrackMatchMap_, zMuTrackMatchMap);
00382 for(unsigned int i = 0; i < zMuTrack->size(); ++i) {
00383 const Candidate & zMuTrackCand = (*zMuTrack)[i];
00384 CandidateBaseRef zMuTrackCandRef = zMuTrack->refAt(i);
00385 const Candidate * lep0 = zMuTrackCand.daughter( 0 );
00386 const Candidate * lep1 = zMuTrackCand.daughter( 1 );
00387 const pat::Muon & muonDau0 = dynamic_cast<const pat::Muon &>(*lep0->masterClone());
00388 double trkiso0 = muonDau0.trackIso();
00389 const pat::GenericParticle & trackDau1 = dynamic_cast<const pat::GenericParticle &>(*lep1->masterClone());
00390 double trkiso1 = trackDau1.trackIso();
00391
00392
00393
00394 TrackRef mu0TrkRef = muonDau0.track();
00395 float d0signed_mu0 = (*mu0TrkRef).dxy();
00396 float d0signed_mu0_respectToPV= (*mu0TrkRef).dxy( primaryVertices->begin()->position() );
00397 float vz_mu0_respectToPV= (*mu0TrkRef).dz( primaryVertices->begin()->position() );
00398
00399 TrackRef mu1TrkRef = trackDau1.track();
00400 float d0signed_mu1 = (*mu1TrkRef).dxy();
00401 float d0signed_mu1_respectToPV= (*mu1TrkRef).dxy( primaryVertices->begin()->position() );
00402 float vz_mu1_respectToPV= (*mu1TrkRef).dz( primaryVertices->begin()->position() );
00403
00404
00405
00406 double pt0 = zMuTrackCand.daughter(0)->pt();
00407 double pt1 = zMuTrackCand.daughter(1)->pt();
00408 double eta0 = zMuTrackCand.daughter(0)->eta();
00409 double eta1 = zMuTrackCand.daughter(1)->eta();
00410 double mass = zMuTrackCand.mass();
00411
00412
00413 const pat::TriggerObjectStandAloneCollection mu0HLTMatches =
00414 muonDau0.triggerObjectMatchesByPath( "HLT_Mu9" );
00415
00416 bool trig0found = false;
00417 if( mu0HLTMatches.size()>0 )
00418 trig0found = true;
00419
00420
00421 if (trig0found && pt0>ptmin_ && pt1>ptmin_ && abs(eta0)<etamax_ && abs(eta1)<etamax_ && mass>massMin_ && trkiso0<isoMax_ && trkiso1<isoMax_) {
00422 h_zmutrackSele_muon_vz->Fill(muonDau0.vz(),1.);
00423 h_zmutrackSele_track_vz->Fill(trackDau1.vz(),1.);
00424 h_zmutrackSele_muon_d0signed->Fill(d0signed_mu0,1.);
00425 h_zmutrackSele_track_d0signed->Fill(d0signed_mu1,1.);
00426 h_zmutrackSele_muon_d0signed_respectToPV->Fill(d0signed_mu0_respectToPV,1.);
00427 h_zmutrackSele_track_d0signed_respectToPV->Fill(d0signed_mu1_respectToPV,1.);
00428 h_zmutrackSele_muon_vz_respectToPV->Fill(vz_mu0_respectToPV,1.);
00429 h_zmutrackSele_track_vz_respectToPV->Fill(vz_mu1_respectToPV,1.);
00430 }
00431
00432 }
00433 }
00434
00435 }
00436
00437 bool ZMuMu_vtxAnalyzer::check_ifZmumu(const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00438 {
00439 int partId0 = dauGen0->pdgId();
00440 int partId1 = dauGen1->pdgId();
00441 int partId2 = dauGen2->pdgId();
00442 bool muplusFound=false;
00443 bool muminusFound=false;
00444 bool ZFound=false;
00445 if (partId0==13 || partId1==13 || partId2==13) muminusFound=true;
00446 if (partId0==-13 || partId1==-13 || partId2==-13) muplusFound=true;
00447 if (partId0==23 || partId1==23 || partId2==23) ZFound=true;
00448 return muplusFound*muminusFound*ZFound;
00449 }
00450
00451 float ZMuMu_vtxAnalyzer::getParticlePt(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00452 {
00453 int partId0 = dauGen0->pdgId();
00454 int partId1 = dauGen1->pdgId();
00455 int partId2 = dauGen2->pdgId();
00456 float ptpart=0.;
00457 if (partId0 == ipart) {
00458 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00459 const Candidate * dauMuGen = dauGen0->daughter(k);
00460 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00461 ptpart = dauMuGen->pt();
00462 }
00463 }
00464 }
00465 if (partId1 == ipart) {
00466 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00467 const Candidate * dauMuGen = dauGen1->daughter(k);
00468 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00469 ptpart = dauMuGen->pt();
00470 }
00471 }
00472 }
00473 if (partId2 == ipart) {
00474 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00475 const Candidate * dauMuGen = dauGen2->daughter(k);
00476 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00477 ptpart = dauMuGen->pt();
00478 }
00479 }
00480 }
00481 return ptpart;
00482 }
00483
00484 float ZMuMu_vtxAnalyzer::getParticleEta(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00485 {
00486 int partId0 = dauGen0->pdgId();
00487 int partId1 = dauGen1->pdgId();
00488 int partId2 = dauGen2->pdgId();
00489 float etapart=0.;
00490 if (partId0 == ipart) {
00491 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00492 const Candidate * dauMuGen = dauGen0->daughter(k);
00493 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00494 etapart = dauMuGen->eta();
00495 }
00496 }
00497 }
00498 if (partId1 == ipart) {
00499 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00500 const Candidate * dauMuGen = dauGen1->daughter(k);
00501 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00502 etapart = dauMuGen->eta();
00503 }
00504 }
00505 }
00506 if (partId2 == ipart) {
00507 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00508 const Candidate * dauMuGen = dauGen2->daughter(k);
00509 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00510 etapart = dauMuGen->eta();
00511 }
00512 }
00513 }
00514 return etapart;
00515 }
00516
00517 float ZMuMu_vtxAnalyzer::getParticlePhi(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00518 {
00519 int partId0 = dauGen0->pdgId();
00520 int partId1 = dauGen1->pdgId();
00521 int partId2 = dauGen2->pdgId();
00522 float phipart=0.;
00523 if (partId0 == ipart) {
00524 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00525 const Candidate * dauMuGen = dauGen0->daughter(k);
00526 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00527 phipart = dauMuGen->phi();
00528 }
00529 }
00530 }
00531 if (partId1 == ipart) {
00532 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00533 const Candidate * dauMuGen = dauGen1->daughter(k);
00534 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00535 phipart = dauMuGen->phi();
00536 }
00537 }
00538 }
00539 if (partId2 == ipart) {
00540 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00541 const Candidate * dauMuGen = dauGen2->daughter(k);
00542 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00543 phipart = dauMuGen->phi();
00544 }
00545 }
00546 }
00547 return phipart;
00548 }
00549
00550 Particle::LorentzVector ZMuMu_vtxAnalyzer::getParticleP4(const int ipart, const Candidate * dauGen0, const Candidate * dauGen1, const Candidate * dauGen2)
00551 {
00552 int partId0 = dauGen0->pdgId();
00553 int partId1 = dauGen1->pdgId();
00554 int partId2 = dauGen2->pdgId();
00555 Particle::LorentzVector p4part(0.,0.,0.,0.);
00556 if (partId0 == ipart) {
00557 for(unsigned int k = 0; k < dauGen0->numberOfDaughters(); ++k) {
00558 const Candidate * dauMuGen = dauGen0->daughter(k);
00559 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00560 p4part = dauMuGen->p4();
00561 }
00562 }
00563 }
00564 if (partId1 == ipart) {
00565 for(unsigned int k = 0; k < dauGen1->numberOfDaughters(); ++k) {
00566 const Candidate * dauMuGen = dauGen1->daughter(k);
00567 if(dauMuGen->pdgId() == ipart && dauMuGen->status() ==1) {
00568 p4part = dauMuGen->p4();
00569 }
00570 }
00571 }
00572 if (partId2 == ipart) {
00573 for(unsigned int k = 0; k < dauGen2->numberOfDaughters(); ++k) {
00574 const Candidate * dauMuGen = dauGen2->daughter(k);
00575 if(abs(dauMuGen->pdgId()) == ipart && dauMuGen->status() ==1) {
00576 p4part = dauMuGen->p4();
00577 }
00578 }
00579 }
00580 return p4part;
00581 }
00582
00583
00584
00585 void ZMuMu_vtxAnalyzer::endJob() {
00586
00587 }
00588
00589 #include "FWCore/Framework/interface/MakerMacros.h"
00590
00591 DEFINE_FWK_MODULE(ZMuMu_vtxAnalyzer);
00592