46 void endJob()
override;
63 double zMassMin_, zMassMax_, ptmin_, etamax_, isomax_;
125 zMassMin_(pset.getUntrackedParameter<double>(
"zMassMin")),
126 zMassMax_(pset.getUntrackedParameter<double>(
"zMassMax")),
127 ptmin_(pset.getUntrackedParameter<double>(
"ptmin")),
128 etamax_(pset.getUntrackedParameter<double>(
"etamax")),
129 isomax_(pset.getUntrackedParameter<double>(
"isomax")),
130 nbinsPt_(pset.getUntrackedParameter<unsigned
int>(
"nbinsPt")),
131 nbinsEta_(pset.getUntrackedParameter<unsigned
int>(
"nbinsEta")) {
137 "StandAlone #eta for Z -> #mu + standalone",
140 "Global muon overlapped to standAlone #eta for Z -> #mu + sa",
143 "StandAlone p_{t} for Z -> #mu + standalone",
146 "Global muon overlapped to standAlone p_{t} for Z -> #mu + sa",
152 h_etaTrack_ = standaloneEffDir.make<TH1D>(
"TrackMuonEta",
153 "Track #eta for Z -> #mu + track",
156 "Global muon overlapped to track #eta for Z -> #mu + tk",
158 h_ptTrack_ = standaloneEffDir.make<TH1D>(
"TrackMuonPt",
159 "Track p_{t} for Z -> #mu + track",
162 "Global muon overlapped to track p_{t} for Z -> #mu + tk",
175 h_nZMCfound_ = genParticleDir.make<TH1D>(
"NumberOfgeneratedZeta",
"n. of generated Z per event",4,-.5,3.5);
176 h_ZetaGen_ = genParticleDir.make<TH1D>(
"generatedZeta",
"#eta of generated Z",100,-5.,5.);
177 h_ZptGen_ = genParticleDir.make<TH1D>(
"generatedZpt",
"pt of generated Z",100,0.,200.);
178 h_ZmassGen_ = genParticleDir.make<TH1D>(
"generatedZmass",
"mass of generated Z",100,0.,200.);
179 h_muetaGen_ = genParticleDir.make<TH1D>(
"generatedMuonEta",
"#eta of generated muons from Z decay",100,-5.,5.);
180 h_muptGen_ = genParticleDir.make<TH1D>(
"generatedMuonpt",
"pt of generated muons from Z decay",100,0.,200.);
181 h_dimuonEtaGen_ = genParticleDir.make<TH1D>(
"generatedDimuonEta",
"#eta of generated dimuon",100,-5.,5.);
182 h_dimuonPtGen_ = genParticleDir.make<TH1D>(
"generatedDimuonPt",
"pt of generated dimuon",100,0.,200.);
183 h_dimuonMassGen_ = genParticleDir.make<TH1D>(
"generatedDimuonMass",
"mass of generated dimuon",100,0.,200.);
184 h_ZetaGenPassed_ = genParticleDir.make<TH1D>(
"generatedZeta_passed",
"#eta of generated Z after cuts",100,-5.,5.);
185 h_ZptGenPassed_ = genParticleDir.make<TH1D>(
"generatedZpt_passed",
"pt of generated Z after cuts",100,0.,200.);
186 h_ZmassGenPassed_ = genParticleDir.make<TH1D>(
"generatedZmass_passed",
"mass of generated Z after cuts",100,0.,200.);
187 h_muetaGenPassed_ = genParticleDir.make<TH1D>(
"generatedMuonEta_passed",
"#eta of generated muons from Z decay after cuts",100,-5.,5.);
188 h_muptGenPassed_ = genParticleDir.make<TH1D>(
"generatedMuonpt_passed",
"pt of generated muons from Z decay after cuts",100,0.,200.);
189 h_dimuonEtaGenPassed_ = genParticleDir.make<TH1D>(
"generatedDimuonEta_passed",
"#eta of generated dimuon after cuts",100,-5.,5.);
190 h_dimuonPtGenPassed_ = genParticleDir.make<TH1D>(
"generatedDimuonPt_passed",
"pt of generated dimuon after cuts",100,0.,200.);
191 h_dimuonMassGenPassed_ = genParticleDir.make<TH1D>(
"generatedDimuonMass_passed",
"mass of generated dimuon after cuts",100,0.,200.);
251 cout <<
"********* zMuMu size : " << zMuMu->
size() << endl;
252 cout <<
"********* zMuStandAlone size : " << zMuStandAlone->
size() << endl;
253 cout <<
"********* zMuTrack size : " << zMuTrack->
size() << endl;
254 cout <<
"********* muons size : " << muons->
size()<< endl;
255 cout <<
"********* standAlone size : " << standAlone->
size()<< endl;
256 cout <<
"********* tracks size : " << tracks->
size()<< endl;
257 cout <<
"********* generated size : " << genParticles->size()<< endl;
264 int ngen = genParticles->size();
265 bool ZMuMuMatchedfound =
false;
266 bool ZMuMuMatchedSelectedfound =
false;
267 bool ZMuStaMatchedfound =
false;
269 int ZMuTrackMatchedfound = 0;
270 int ZMuTrackMatchedSelected_exclusivefound = 0;
272 double dimuonMassGen = 0;
274 for (
int i=0;
i<ngen;
i++) {
275 const Candidate &genCand = (*genParticles)[
i];
279 if((genCand.
pdgId() == 23)&&(genCand.
status() == 3)) {
287 bool checkpt =
false;
288 bool checketa =
false;
289 bool checkmass =
false;
290 float mupluspt, muminuspt, mupluseta, muminuseta;
300 pZ = muplusp4 + muminusp4;
301 double dimuon_pt =
sqrt(pZ.x()*pZ.x()+pZ.y()*pZ.y());
302 double tan_theta_half =
tan(atan(dimuon_pt/pZ.z())/2.);
303 double dimuon_eta = 0.;
304 if (tan_theta_half>0) dimuon_eta = -
log(
tan(tan_theta_half));
305 if (tan_theta_half<=0) dimuon_eta =
log(
tan(-tan_theta_half));
307 dimuonMassGen = pZ.mass();
327 if (mupluspt >
ptmin_ && muminuspt >
ptmin_) checkpt =
true;
330 if (checkpt && checketa && checkmass) {
343 if (!zMuMu->
empty() ) {
346 else if (!zMuStandAlone->
empty() ) {
363 if (!zMuMu->
empty() ) {
369 for(
unsigned int i = 0;
i < zMuMu->
size(); ++
i) {
381 if (isMatched) ZMuMuMatchedfound =
true;
389 const double globalMuonIsolation0 = (*muonIso)[dau0];
390 const double globalMuonIsolation1 = (*muonIso)[dau1];
391 if((globalMuonIsolation0 <
isomax_) && (globalMuonIsolation1 <
isomax_)) {
392 ZMuMuMatchedSelectedfound =
true;
414 for(
unsigned int j = 0; j < muons->
size() ; ++j) {
424 if (!zMuStandAlone->
empty()) {
430 for(
unsigned int i = 0;
i < zMuStandAlone->
size(); ++
i) {
431 const Candidate & zMuStaCand = (*zMuStandAlone)[
i];
434 GenParticleRef zMuStaMatch = (*zMuStandAloneMatchMap)[zMuStaCandRef];
437 ZMuStaMatchedfound =
true;
450 standAloneMuonCandRef_ = dau1;
451 globalMuonCandRef_ = dau0;
454 standAloneMuonCandRef_ = dau0;
455 globalMuonCandRef_ = dau1;
461 if((globalMuonIsolation <
isomax_) && (standAloneMuonIsolation <
isomax_)) {
475 if (!zMuTrack->
empty()) {
480 for(
unsigned int i = 0;
i < zMuTrack->
size(); ++
i) {
481 const Candidate & zMuTrkCand = (*zMuTrack)[
i];
492 ZMuTrackMatchedfound++;
501 (isMatched) && !ZMuMuMatchedfound && !ZMuStaMatchedfound ) {
504 const double globalMuonIsolation = (*muonIso)[dau0];
505 const double trackMuonIsolation = (*trackIso)[dau1];
506 if((globalMuonIsolation <
isomax_) && (trackMuonIsolation <
isomax_)) {
508 ZMuTrackMatchedSelected_exclusivefound++;
518 if (!ZMuMuMatchedfound && !ZMuStaMatchedfound && ZMuTrackMatchedfound == 0)
noMCmatching++;
531 int partId0 = dauGen0->
pdgId();
532 int partId1 = dauGen1->
pdgId();
533 int partId2 = dauGen2->
pdgId();
534 bool muplusFound=
false;
535 bool muminusFound=
false;
537 if (partId0==13 || partId1==13 || partId2==13) muminusFound=
true;
538 if (partId0==-13 || partId1==-13 || partId2==-13) muplusFound=
true;
539 if (partId0==23 || partId1==23 || partId2==23) ZFound=
true;
540 return ( muplusFound && muminusFound && ZFound );
545 int partId0 = dauGen0->
pdgId();
546 int partId1 = dauGen1->
pdgId();
547 int partId2 = dauGen2->
pdgId();
549 if (partId0 == ipart) {
552 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
553 ptpart = dauMuGen->
pt();
557 if (partId1 == ipart) {
560 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
561 ptpart = dauMuGen->
pt();
565 if (partId2 == ipart) {
569 ptpart = dauMuGen->
pt();
578 int partId0 = dauGen0->
pdgId();
579 int partId1 = dauGen1->
pdgId();
580 int partId2 = dauGen2->
pdgId();
582 if (partId0 == ipart) {
585 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
586 etapart = dauMuGen->
eta();
590 if (partId1 == ipart) {
593 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
594 etapart = dauMuGen->
eta();
598 if (partId2 == ipart) {
602 etapart = dauMuGen->
eta();
611 int partId0 = dauGen0->
pdgId();
612 int partId1 = dauGen1->
pdgId();
613 int partId2 = dauGen2->
pdgId();
615 if (partId0 == ipart) {
618 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
619 phipart = dauMuGen->
phi();
623 if (partId1 == ipart) {
626 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
627 phipart = dauMuGen->
phi();
631 if (partId2 == ipart) {
635 phipart = dauMuGen->
phi();
644 int partId0 = dauGen0->
pdgId();
645 int partId1 = dauGen1->
pdgId();
646 int partId2 = dauGen2->
pdgId();
648 if (partId0 == ipart) {
651 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
652 p4part = dauMuGen->
p4();
656 if (partId1 == ipart) {
659 if(dauMuGen->
pdgId() == ipart && dauMuGen->
status() ==1) {
660 p4part = dauMuGen->
p4();
664 if (partId2 == ipart) {
668 p4part = dauMuGen->
p4();
690 cout <<
"------------------------------------ Counters for MC acceptance --------------------------------" << endl;
698 cout <<
"---------------------------- Counter for MC truth efficiency calculation--------------------- " << endl;
702 cout <<
"-------------------------------------------------------------------------------------- " << endl;
715 cout <<
"numberOfMatchedSelectedZMuSta = " << numberOfMatchedSelectedZMuSta_ << endl;
719 cout <<
"numberOfMatchedSelectedZMuTrack exclusive = " << numberOfMatchedSelectedZMuTrack_exclusive << endl;
720 cout <<
" ----------------------------- Efficiency --------------------------------- " << endl;
721 cout <<
"Efficiency StandAlone = " << myStaEff <<
" +/- " << myErrStaEff << endl;
722 cout <<
"Efficiency Track = " << myTrackEff <<
" +/- " << myErrTrackEff << endl;
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
EDGetTokenT< GenParticleMatch > zMuMuMatchMapToken_
bool isNonnull() const
Checks for non-null.
TH1D * h_ptMuonOverlappedToTrack_
int n_zMuMufound_genZsele
TH1D * h_dimuonPtGenPassed_
ZMuMuEfficiency(const edm::ParameterSet &pset)
bool check_ifZmumu(const Candidate *dauGen0, const Candidate *dauGen1, const Candidate *dauGen2)
EDGetTokenT< CandidateView > zMuStandAloneToken_
int numberOfMatchedSelectedZMuSta_
virtual example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
#define DEFINE_FWK_MODULE(type)
TH1D * h_etaMuonOverlappedToStandAlone_
virtual const Candidate * daughter(size_type i) const =0
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
int ZMuTrackselected_exclusive_1match
int numberOfMatchedZMuTrack_exclusive
def setup(process, global_tag, zero_tesla=False)
TH1D * h_dimuonEtaGenPassed_
EDGetTokenT< CandidateView > zMuTrackToken_
int numberOfMatchedZMuTrack_matchedSelectedZMuMu
reco::CandidateBaseRef standAloneMuonCandRef_
int numberOfOverlappedStandAlone_
TH1D * h_DELTA_ZMuMuMassReco_dimuonMassGen_
int numberOfMatchedZMuTrack_matchedZMuMu
int ZMuTrack_ZMuMu_1match
RefToBase< value_type > refAt(size_type i) const
EDGetTokenT< CandidateView > tracksToken_
virtual int status() const =0
status word
EDGetTokenT< GenParticleCollection > genParticlesToken_
float getParticlePt(const int ipart, const Candidate *dauGen0, const Candidate *dauGen1, const Candidate *dauGen2)
int n_zMuTrkfound_genZsele
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
virtual int pdgId() const =0
PDG identifier.
int numberOfMatchedZMuMu_
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
int ZMuTrackselected_exclusive_morematch
int numberOfMatchedSelectedZMuTrack_exclusive
int ZMuTrack_ZMuMu_2match
bool isMatched(TrackingRecHit const &hit)
int numberOfMatchedZMuSta_
float getParticleEta(const int ipart, const Candidate *dauGen0, const Candidate *dauGen1, const Candidate *dauGen2)
T * make(const Args &...args) const
make new ROOT object
reco::CandidateBaseRef trackMuonCandRef_
EDGetTokenT< CandidateView > zMuMuToken_
float getParticlePhi(const int ipart, const Candidate *dauGen0, const Candidate *dauGen1, const Candidate *dauGen2)
TH1D * h_DELTA_ZMuStaMassReco_dimuonMassGen_
virtual const CandidateBaseRef & masterClone() const =0
virtual bool isGlobalMuon() const =0
virtual double eta() const =0
momentum pseudorapidity
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
void analyze(const edm::Event &event, const edm::EventSetup &setup) override
virtual double pt() const =0
transverse momentum
int numberOfEventsWithZMuMufound
virtual double mass() const =0
mass
int ZMuTrack_exclusive_1match
int numberOfMatchedZMuTrack_notOverlapped
Particle::LorentzVector getParticleP4(const int ipart, const Candidate *dauGen0, const Candidate *dauGen1, const Candidate *dauGen2)
int numberOfMatchedSelectedZMuMu_
ValueMap< float > IsolationCollection
TH1D * h_dimuonMassGenPassed_
TH1D * h_ptMuonOverlappedToStandAlone_
EDGetTokenT< CandidateView > standAloneToken_
TH1D * h_DELTA_ZMuTrackMassReco_dimuonMassGen_
EDGetTokenT< IsolationCollection > standAloneIsoToken_
EDGetTokenT< GenParticleMatch > zMuTrackMatchMapToken_
int numberOfEventsWithZMuStafound
TH1D * h_etaMuonOverlappedToTrack_
int numberOfOverlappedTracks_
int ZMuTrack_exclusive_morematch
int n_zMuStafound_genZsele
EDGetTokenT< GenParticleMatch > muonMatchMapToken_
virtual size_type numberOfDaughters() const =0
number of daughters
EDGetTokenT< IsolationCollection > trackIsoToken_
virtual double phi() const =0
momentum azimuthal angle
EDGetTokenT< CandidateView > muonsToken_
int ZMuTrack_ZMuMu_morematch
EDGetTokenT< IsolationCollection > muonIsoToken_
math::PtEtaPhiELorentzVectorF LorentzVector
EDGetTokenT< GenParticleMatch > zMuStandAloneMatchMapToken_
reco::CandidateBaseRef globalMuonCandRef_