CMS 3D CMS Logo

WtoLNuSelector.cc
Go to the documentation of this file.
1 // W->lnu Event Selector
2 
18 
19 #include "TLorentzVector.h"
20 #include "TH1.h"
21 #include "TMath.h"
22 
24 
26  : electronTag_(ps.getUntrackedParameter<edm::InputTag>("electronInputTag", edm::InputTag("gedGsfElectrons"))),
27  bsTag_(ps.getUntrackedParameter<edm::InputTag>("offlineBeamSpot", edm::InputTag("offlineBeamSpot"))),
28  muonTag_(ps.getUntrackedParameter<edm::InputTag>("muonInputTag", edm::InputTag("muons"))),
29  //pfmetTag_(ps.getUntrackedParameter<edm::InputTag>("pfmetTag", edm::InputTag("pfMet"))),
30  pfmetTag_(ps.getUntrackedParameter<edm::InputTag>("pfmetTag", edm::InputTag("pfMetT1T2Txy"))),
31  electronToken_(consumes<reco::GsfElectronCollection>(electronTag_)),
32  bsToken_(consumes<reco::BeamSpot>(bsTag_)),
33  muonToken_(consumes<reco::MuonCollection>(muonTag_)),
34  pfmetToken_(consumes<reco::PFMETCollection>(pfmetTag_)) {}
35 
37  // Read Electron Collection
39  iEvent.getByToken(electronToken_, electronColl);
40 
42  iEvent.getByToken(bsToken_, beamSpot);
43 
44  std::vector<TLorentzVector> eleList;
45  if (electronColl.isValid()) {
46  for (auto const& ele : *electronColl) {
47  if (!ele.ecalDriven())
48  continue;
49 
50  double hOverE = ele.hadronicOverEm();
51  double sigmaee = ele.sigmaIetaIeta();
52  double deltaPhiIn = ele.deltaPhiSuperClusterTrackAtVtx();
53  double deltaEtaIn = ele.deltaEtaSuperClusterTrackAtVtx();
54 
55  // separate cut for barrel and endcap
56  if (ele.isEB()) {
57  if (std::fabs(deltaPhiIn) >= .15 && std::fabs(deltaEtaIn) >= .007 && hOverE >= .12 && sigmaee >= .01)
58  continue;
59  } else if (ele.isEE()) {
60  if (std::fabs(deltaPhiIn) >= .10 && std::fabs(deltaEtaIn) >= .009 && hOverE >= .10 && sigmaee >= .03)
61  continue;
62  }
63 
64  reco::GsfTrackRef trk = ele.gsfTrack();
65  if (!trk.isNonnull())
66  continue; // only electrons wd tracks
67  double chi2 = trk->chi2();
68  double ndof = trk->ndof();
69  double chbyndof = (ndof > 0) ? chi2 / ndof : 0;
70  double trkd0 = trk->d0();
71  double trkdz = trk->dz();
72  if (beamSpot.isValid()) {
73  trkd0 = -(trk->dxy(beamSpot->position()));
74  trkdz = trk->dz(beamSpot->position());
75  } else {
76  edm::LogError("WtoLNuSelector") << "Error >> Failed to get BeamSpot for label: " << bsTag_;
77  }
78  if (chbyndof >= 10 || std::fabs(trkd0) >= 0.02 || std::fabs(trkdz) >= 20)
79  continue;
80  const reco::HitPattern& hitp = trk->hitPattern();
81  int nPixelHits = hitp.numberOfValidPixelHits();
82  int nStripHits = hitp.numberOfValidStripHits();
83  if (nPixelHits < 1 || nStripHits < 8)
84  continue;
85 
86  // PF Isolation
87  reco::GsfElectron::PflowIsolationVariables pfIso = ele.pfIsolationVariables();
88  float absiso =
89  pfIso.sumChargedHadronPt + std::max(0.0, pfIso.sumNeutralHadronEt + pfIso.sumPhotonEt - 0.5 * pfIso.sumPUPt);
90  float eiso = absiso / ele.pt();
91  if (eiso > 0.3)
92  continue;
93 
94  TLorentzVector le;
95  le.SetPtEtaPhiE(ele.pt(), ele.eta(), ele.phi(), ele.energy());
96  eleList.push_back(le);
97  }
98  } else {
99  edm::LogError("WtoLNuSelector") << "Error >> Failed to get ElectronCollection for label: " << electronTag_;
100  }
101 
102  // Read Muon Collection
104  iEvent.getByToken(muonToken_, muonColl);
105 
106  std::vector<TLorentzVector> muList;
107  if (muonColl.isValid()) {
108  for (auto const& mu : *muonColl) {
109  if (!mu.isGlobalMuon() || !mu.isPFMuon() || std::fabs(mu.eta()) > 2.1 || mu.pt() <= 5)
110  continue;
111 
112  reco::TrackRef gtrkref = mu.globalTrack();
113  if (!gtrkref.isNonnull())
114  continue;
115  const reco::Track* gtk = &(*gtrkref);
116  double chi2 = gtk->chi2();
117  double ndof = gtk->ndof();
118  double chbyndof = (ndof > 0) ? chi2 / ndof : 0;
119 
120  const reco::HitPattern& hitp = gtk->hitPattern();
121  int nPixelHits = hitp.numberOfValidPixelHits();
122  int nStripHits = hitp.numberOfValidStripHits();
123 
124  reco::TrackRef itrkref = mu.innerTrack(); // tracker segment only
125  if (!itrkref.isNonnull())
126  continue;
127  const reco::Track* tk = &(*itrkref);
128  double trkd0 = tk->d0();
129  double trkdz = tk->dz();
130  if (beamSpot.isValid()) {
131  trkd0 = -(tk->dxy(beamSpot->position()));
132  trkdz = tk->dz(beamSpot->position());
133  }
134  // Hits/section in the muon chamber
135  int nChambers = mu.numberOfChambers();
136  int nMatches = mu.numberOfMatches();
137  int nMatchedStations = mu.numberOfMatchedStations();
138 
139  // PF Isolation
140  const reco::MuonPFIsolation& pfIso04 = mu.pfIsolationR04();
141  double absiso = pfIso04.sumChargedParticlePt +
142  std::max(0.0, pfIso04.sumNeutralHadronEt + pfIso04.sumPhotonEt - 0.5 * pfIso04.sumPUPt);
143 
144  // Final selection
145  if (chbyndof < 10 && std::fabs(trkd0) < 0.02 && std::fabs(trkdz) < 20.0 && nPixelHits > 1 && nStripHits > 8 &&
146  nChambers > 2 && nMatches > 2 && nMatchedStations > 2 && absiso / mu.pt() < 0.3) {
147  TLorentzVector lm;
148  lm.SetPtEtaPhiE(mu.pt(), mu.eta(), mu.phi(), mu.energy());
149  muList.push_back(lm);
150  }
151  }
152  } else {
153  edm::LogError("WtoLNuSelector") << "Error >> Failed to get MuonCollection for label: " << muonTag_;
154  }
155 
156  // Require either a high pt electron or muon
157  if (eleList.empty() && muList.empty())
158  return false;
159 
160  // Both should not be present at the same time
161  if ((!eleList.empty() && eleList[0].Pt() > 20) && (!muList.empty() && muList[0].Pt() > 20))
162  return false;
163 
164  // find the high pt lepton
165  TLorentzVector vlep;
166  if (!eleList.empty() && !muList.empty()) {
167  vlep = (eleList[0].Pt() > muList[0].Pt()) ? eleList[0] : muList[0];
168  } else if (!eleList.empty()) {
169  vlep = eleList[0];
170  } else {
171  vlep = muList[0];
172  }
173  if (vlep.Pt() < 20)
174  return false;
175 
177  iEvent.getByToken(pfmetToken_, pfColl);
178 
179  if (pfColl.isValid()) {
180  double mt = getMt(vlep, pfColl->front());
181  if (mt < 60 || mt > 80)
182  return false;
183  } else {
184  edm::LogError("WtoLNuSelector") << "Error >> Failed to get PFMETCollection for label: " << pfmetTag_;
185  return false;
186  }
187 
188  return true;
189 }
190 double WtoLNuSelector::getMt(const TLorentzVector& vlep, const reco::PFMET& obj) {
191  double met = obj.et();
192  double phi = obj.phi();
193 
194  TLorentzVector vmet;
195  double metx = met * std::cos(phi);
196  double mety = met * std::sin(phi);
197  vmet.SetPxPyPzE(metx, mety, 0.0, met);
198 
199  // transverse mass
200  TLorentzVector vw = vlep + vmet;
201 
202  return std::sqrt(2 * vlep.Et() * met * (1 - std::cos(deltaPhi(vlep.Phi(), phi))));
203 }
204 // Define this as a plug-in
const edm::EDGetTokenT< reco::BeamSpot > bsToken_
int numberOfValidPixelHits() const
Definition: HitPattern.h:831
double getMt(const TLorentzVector &vlep, const reco::PFMET &obj)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
float sumPUPt
sum pt of charged Particles not from PV (for Pu corrections)
Definition: GsfElectron.h:670
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
const edm::InputTag electronTag_
const edm::EDGetTokenT< reco::GsfElectronCollection > electronToken_
Log< level::Error, false > LogError
float sumPhotonEt
sum pt of PF photons
WtoLNuSelector(const edm::ParameterSet &)
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
int numberOfValidStripHits() const
Definition: HitPattern.h:843
float sumNeutralHadronEt
sum pt of neutral hadrons
float sumChargedParticlePt
sum-pt of charged Particles(inludes e/mu)
double ndof() const
number of degrees of freedom of the fit
Definition: TrackBase.h:590
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
Definition: TrackBase.h:622
float sumPUPt
sum pt of charged Particles not from PV (for Pu corrections)
int iEvent
Definition: GenABIO.cc:224
const edm::EDGetTokenT< reco::MuonCollection > muonToken_
T sqrt(T t)
Definition: SSEVec.h:19
float sumPhotonEt
sum pt of PF photons // old float photonIso ;
Definition: GsfElectron.h:665
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
float sumNeutralHadronEt
sum pt of neutral hadrons // old float neutralHadronIso ;
Definition: GsfElectron.h:664
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:504
double d0() const
dxy parameter in perigee convention (d0 = -dxy)
Definition: TrackBase.h:611
double chi2() const
chi-squared of the fit
Definition: TrackBase.h:587
const edm::InputTag bsTag_
bool filter(edm::Event &, edm::EventSetup const &) override
const edm::InputTag muonTag_
bool isValid() const
Definition: HandleBase.h:70
fixed size matrix
HLT enums.
const edm::InputTag pfmetTag_
float sumChargedHadronPt
sum-pt of charged Hadron // old float chargedHadronIso ;
Definition: GsfElectron.h:663
const edm::EDGetTokenT< reco::PFMETCollection > pfmetToken_
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:608
Collection of PF MET.