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("pfMetT1T2Txy"))),
30  electronToken_(consumes<reco::GsfElectronCollection>(electronTag_)),
31  bsToken_(consumes<reco::BeamSpot>(bsTag_)),
32  muonToken_(consumes<reco::MuonCollection>(muonTag_)),
33  pfmetToken_(consumes<reco::PFMETCollection>(pfmetTag_)) {}
34 
36  // Read Electron Collection
38  iEvent.getByToken(electronToken_, electronColl);
39 
41  iEvent.getByToken(bsToken_, beamSpot);
42 
43  std::vector<TLorentzVector> eleList;
44  if (electronColl.isValid()) {
45  for (auto const& ele : *electronColl) {
46  if (!ele.ecalDriven())
47  continue;
48 
49  double hOverE = ele.hadronicOverEm();
50  double sigmaee = ele.sigmaIetaIeta();
51  double deltaPhiIn = ele.deltaPhiSuperClusterTrackAtVtx();
52  double deltaEtaIn = ele.deltaEtaSuperClusterTrackAtVtx();
53 
54  // separate cut for barrel and endcap
55  if (ele.isEB()) {
56  if (std::fabs(deltaPhiIn) >= .15 && std::fabs(deltaEtaIn) >= .007 && hOverE >= .12 && sigmaee >= .01)
57  continue;
58  } else if (ele.isEE()) {
59  if (std::fabs(deltaPhiIn) >= .10 && std::fabs(deltaEtaIn) >= .009 && hOverE >= .10 && sigmaee >= .03)
60  continue;
61  }
62 
63  reco::GsfTrackRef trk = ele.gsfTrack();
64  if (!trk.isNonnull())
65  continue; // only electrons wd tracks
66  double chi2 = trk->chi2();
67  double ndof = trk->ndof();
68  double chbyndof = (ndof > 0) ? chi2 / ndof : 0;
69  double trkd0 = trk->d0();
70  double trkdz = trk->dz();
71  if (beamSpot.isValid()) {
72  trkd0 = -(trk->dxy(beamSpot->position()));
73  trkdz = trk->dz(beamSpot->position());
74  } else {
75  edm::LogError("WtoLNuSelector") << "Error >> Failed to get BeamSpot for label: " << bsTag_;
76  }
77  if (chbyndof >= 10 || std::fabs(trkd0) >= 0.02 || std::fabs(trkdz) >= 20)
78  continue;
79  const reco::HitPattern& hitp = trk->hitPattern();
80  int nPixelHits = hitp.numberOfValidPixelHits();
81  int nStripHits = hitp.numberOfValidStripHits();
82  if (nPixelHits < 1 || nStripHits < 8)
83  continue;
84 
85  // PF Isolation
86  reco::GsfElectron::PflowIsolationVariables pfIso = ele.pfIsolationVariables();
87  float absiso =
88  pfIso.sumChargedHadronPt + std::max(0.0, pfIso.sumNeutralHadronEt + pfIso.sumPhotonEt - 0.5 * pfIso.sumPUPt);
89  float eiso = absiso / ele.pt();
90  if (eiso > 0.3)
91  continue;
92 
93  TLorentzVector le;
94  le.SetPtEtaPhiE(ele.pt(), ele.eta(), ele.phi(), ele.energy());
95  eleList.push_back(le);
96  }
97  } else {
98  edm::LogError("WtoLNuSelector") << "Error >> Failed to get ElectronCollection for label: " << electronTag_;
99  }
100 
101  // Read Muon Collection
103  iEvent.getByToken(muonToken_, muonColl);
104 
105  std::vector<TLorentzVector> muList;
106  if (muonColl.isValid()) {
107  for (auto const& mu : *muonColl) {
108  if (!mu.isGlobalMuon() || !mu.isPFMuon() || std::fabs(mu.eta()) > 2.1 || mu.pt() <= 5)
109  continue;
110 
111  reco::TrackRef gtrkref = mu.globalTrack();
112  if (!gtrkref.isNonnull())
113  continue;
114  const reco::Track* gtk = &(*gtrkref);
115  double chi2 = gtk->chi2();
116  double ndof = gtk->ndof();
117  double chbyndof = (ndof > 0) ? chi2 / ndof : 0;
118 
119  const reco::HitPattern& hitp = gtk->hitPattern();
120  int nPixelHits = hitp.numberOfValidPixelHits();
121  int nStripHits = hitp.numberOfValidStripHits();
122 
123  reco::TrackRef itrkref = mu.innerTrack(); // tracker segment only
124  if (!itrkref.isNonnull())
125  continue;
126  const reco::Track* tk = &(*itrkref);
127  double trkd0 = tk->d0();
128  double trkdz = tk->dz();
129  if (beamSpot.isValid()) {
130  trkd0 = -(tk->dxy(beamSpot->position()));
131  trkdz = tk->dz(beamSpot->position());
132  }
133  // Hits/section in the muon chamber
134  int nChambers = mu.numberOfChambers();
135  int nMatches = mu.numberOfMatches();
136  int nMatchedStations = mu.numberOfMatchedStations();
137 
138  // PF Isolation
139  const reco::MuonPFIsolation& pfIso04 = mu.pfIsolationR04();
140  double absiso = pfIso04.sumChargedParticlePt +
141  std::max(0.0, pfIso04.sumNeutralHadronEt + pfIso04.sumPhotonEt - 0.5 * pfIso04.sumPUPt);
142 
143  // Final selection
144  if (chbyndof < 10 && std::fabs(trkd0) < 0.02 && std::fabs(trkdz) < 20.0 && nPixelHits > 1 && nStripHits > 8 &&
145  nChambers > 2 && nMatches > 2 && nMatchedStations > 2 && absiso / mu.pt() < 0.3) {
146  TLorentzVector lm;
147  lm.SetPtEtaPhiE(mu.pt(), mu.eta(), mu.phi(), mu.energy());
148  muList.push_back(lm);
149  }
150  }
151  } else {
152  edm::LogError("WtoLNuSelector") << "Error >> Failed to get MuonCollection for label: " << muonTag_;
153  }
154 
155  // Require either a high pt electron or muon
156  if (eleList.empty() && muList.empty())
157  return false;
158 
159  // Both should not be present at the same time
160  if ((!eleList.empty() && eleList[0].Pt() > 20) && (!muList.empty() && muList[0].Pt() > 20))
161  return false;
162 
163  // find the high pt lepton
164  TLorentzVector vlep;
165  if (!eleList.empty() && !muList.empty()) {
166  vlep = (eleList[0].Pt() > muList[0].Pt()) ? eleList[0] : muList[0];
167  } else if (!eleList.empty()) {
168  vlep = eleList[0];
169  } else {
170  vlep = muList[0];
171  }
172  if (vlep.Pt() < 20)
173  return false;
174 
176  iEvent.getByToken(pfmetToken_, pfColl);
177 
178  if (pfColl.isValid()) {
179  double mt = getMt(vlep, pfColl->front());
180  if (mt < 60 || mt > 80)
181  return false;
182  } else {
183  edm::LogError("WtoLNuSelector") << "Error >> Failed to get PFMETCollection for label: " << pfmetTag_;
184  return false;
185  }
186 
187  return true;
188 }
189 double WtoLNuSelector::getMt(const TLorentzVector& vlep, const reco::PFMET& obj) {
190  double met = obj.et();
191  double phi = obj.phi();
192 
193  TLorentzVector vmet;
194  double metx = met * std::cos(phi);
195  double mety = met * std::sin(phi);
196  vmet.SetPxPyPzE(metx, mety, 0.0, met);
197 
198  // transverse mass
199  TLorentzVector vw = vlep + vmet;
200 
201  return std::sqrt(2 * vlep.Et() * met * (1 - std::cos(deltaPhi(vlep.Phi(), phi))));
202 }
203 // 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)
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
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
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
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
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
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.