Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <memory>
00010 #include <iostream>
00011 #include <fstream>
00012 #include <sstream>
00013 #include <string>
00014 #include <stdio.h>
00015 #include <stdlib.h>
00016
00017 #include "FWCore/Framework/interface/Frameworkfwd.h"
00018 #include "FWCore/Framework/interface/EDFilter.h"
00019
00020 #include "FWCore/Framework/interface/Event.h"
00021 #include "FWCore/Framework/interface/MakerMacros.h"
00022 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00023
00024 #include "FWCore/Utilities/interface/InputTag.h"
00025
00026 #include "FWCore/Framework/interface/LuminosityBlock.h"
00027 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
00028 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
00029 #include "DataFormats/METReco/interface/CaloMETFwd.h"
00030 #include "DataFormats/METReco/interface/CaloMET.h"
00031 #include "DataFormats/METReco/interface/CaloMETCollection.h"
00032 #include "DataFormats/METReco/interface/PFMETFwd.h"
00033 #include "DataFormats/METReco/interface/PFMET.h"
00034 #include "DataFormats/METReco/interface/PFMETCollection.h"
00035 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00036 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00037
00038 #include "TLorentzVector.h"
00039
00040
00041
00042
00043 using namespace reco;
00044
00045 class WZInterestingEventSelector : public edm::EDFilter {
00046 public:
00047 struct event
00048 {
00049 long run;
00050 long event;
00051 long ls;
00052 int nEle;
00053 float maxPt;
00054 float maxPtEleEta;
00055 float maxPtElePhi;
00056 float invMass;
00057 float met;
00058 float metPhi;
00059 };
00060
00061 explicit WZInterestingEventSelector(const edm::ParameterSet&);
00062 ~WZInterestingEventSelector();
00063
00064 private:
00065 virtual bool filter(edm::Event&, const edm::EventSetup&);
00066 virtual void endJob();
00067 bool electronSelection( const GsfElectron* eleRef , math::XYZPoint bspotPosition);
00068
00069
00070
00071
00072
00073 float ptCut_;
00074 int missHitCut_;
00075
00076
00077 float eb_trIsoCut_;
00078 float eb_ecalIsoCut_;
00079 float eb_hcalIsoCut_;
00080 float eb_hoeCut_;
00081 float eb_seeCut_;
00082
00083
00084 float ee_trIsoCut_;
00085 float ee_ecalIsoCut_;
00086 float ee_hcalIsoCut_;
00087 float ee_hoeCut_;
00088 float ee_seeCut_;
00089
00090
00091 float metCut_;
00092
00093
00094 float invMassCut_;
00095
00096 edm::InputTag electronCollection_;
00097 edm::InputTag pfMetCollection_;
00098 edm::InputTag offlineBSCollection_;
00099
00100 };
00101
00102
00103
00104
00105 WZInterestingEventSelector::WZInterestingEventSelector(const edm::ParameterSet& iConfig)
00106 {
00107 ptCut_ = iConfig.getParameter<double>("ptCut");
00108 missHitCut_ = iConfig.getParameter<int>("missHitsCut");
00109
00110 eb_trIsoCut_ = iConfig.getParameter<double>("eb_trIsoCut");
00111 eb_ecalIsoCut_ = iConfig.getParameter<double>("eb_ecalIsoCut");
00112 eb_hcalIsoCut_ = iConfig.getParameter<double>("eb_hcalIsoCut");
00113 eb_hoeCut_ = iConfig.getParameter<double>("eb_hoeCut");
00114 eb_seeCut_ = iConfig.getParameter<double>("eb_seeCut");
00115
00116 ee_trIsoCut_ = iConfig.getParameter<double>("ee_trIsoCut");
00117 ee_ecalIsoCut_ = iConfig.getParameter<double>("ee_ecalIsoCut");
00118 ee_hcalIsoCut_ = iConfig.getParameter<double>("ee_hcalIsoCut");
00119 ee_hoeCut_ = iConfig.getParameter<double>("ee_hoeCut");
00120 ee_seeCut_ = iConfig.getParameter<double>("ee_seeCut");
00121
00122 metCut_ = iConfig.getParameter<double>("metCut");
00123 invMassCut_ = iConfig.getParameter<double>("invMassCut");
00124
00125 electronCollection_ = iConfig.getUntrackedParameter<edm::InputTag>("electronCollection",edm::InputTag("gsfElectrons"));
00126 pfMetCollection_ = iConfig.getUntrackedParameter<edm::InputTag>("pfMetCollection",edm::InputTag("pfMet"));
00127 offlineBSCollection_ = iConfig.getUntrackedParameter<edm::InputTag>("offlineBSCollection",edm::InputTag("offlineBeamSpot"));
00128
00129 }
00130
00131
00132 WZInterestingEventSelector::~WZInterestingEventSelector()
00133 {
00134
00135
00136
00137
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147 void WZInterestingEventSelector::endJob() {
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 }
00181
00182 bool WZInterestingEventSelector::electronSelection( const GsfElectron* eleRef , math::XYZPoint bspotPosition )
00183 {
00184
00185
00186
00187
00188
00189
00190
00191
00192 if (eleRef->pt()<ptCut_) return false;
00193
00194 if (eleRef->isEB())
00195 {
00196 if (eleRef->dr03TkSumPt()/eleRef->pt()>eb_trIsoCut_) return false;
00197 if (eleRef->dr03EcalRecHitSumEt()/eleRef->pt()>eb_ecalIsoCut_) return false;
00198 if (eleRef->dr03HcalTowerSumEt()/eleRef->pt()>eb_hcalIsoCut_) return false;
00199 if (eleRef->sigmaIetaIeta()>eb_seeCut_) return false;
00200 if (eleRef->hcalOverEcal()>eb_hoeCut_) return false;
00201 }
00202 else if (eleRef->isEE())
00203 {
00204 if (eleRef->dr03TkSumPt()/eleRef->pt()>ee_trIsoCut_) return false;
00205 if (eleRef->dr03EcalRecHitSumEt()/eleRef->pt()>ee_ecalIsoCut_) return false;
00206 if (eleRef->dr03HcalTowerSumEt()/eleRef->pt()>ee_hcalIsoCut_) return false;
00207 if (eleRef->sigmaIetaIeta()>ee_seeCut_) return false;
00208 if (eleRef->hcalOverEcal()>ee_hoeCut_) return false;
00209 }
00210
00211 if (eleRef->gsfTrack()->trackerExpectedHitsInner().numberOfHits()>missHitCut_) return false;
00212
00213 return true;
00214 }
00215
00216 bool
00217 WZInterestingEventSelector::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00218 {
00219
00220 edm::Handle<reco::GsfElectronCollection> gsfElectrons;
00221 iEvent.getByLabel(electronCollection_,gsfElectrons);
00222
00223
00224
00225
00226 edm::Handle<reco::PFMETCollection> pfMET;
00227 iEvent.getByLabel(pfMetCollection_, pfMET);
00228
00229 edm::Handle<reco::BeamSpot> pBeamSpot;
00230 iEvent.getByLabel(offlineBSCollection_, pBeamSpot);
00231
00232 const reco::BeamSpot *bspot = pBeamSpot.product();
00233 math::XYZPoint bspotPosition = bspot->position();
00234
00235 std::vector<const GsfElectron*> goodElectrons;
00236 float ptMax=-999.;
00237 const GsfElectron* ptMaxEle=0;
00238 for(reco::GsfElectronCollection::const_iterator myEle=gsfElectrons->begin();myEle!=gsfElectrons->end();++myEle)
00239 {
00240
00241 if (!electronSelection(&(*myEle),bspotPosition)) continue;
00242 goodElectrons.push_back(&(*myEle));
00243 if (myEle->pt() > ptMax )
00244 {
00245 ptMax = myEle->pt();
00246 ptMaxEle = &(*myEle);
00247 }
00248 }
00249
00250 float maxInv=-999.;
00251 TLorentzVector v1;
00252 if (ptMaxEle)
00253 v1.SetPtEtaPhiM(ptMaxEle->pt(),ptMaxEle->eta(),ptMaxEle->phi(),0);
00254 if (goodElectrons.size()>1)
00255 {
00256 for (unsigned int iEle=0; iEle<goodElectrons.size(); ++iEle)
00257 if (goodElectrons[iEle]!=ptMaxEle && (goodElectrons[iEle]->charge() * ptMaxEle->charge() == -1) )
00258 {
00259 TLorentzVector v2;
00260 v2.SetPtEtaPhiM(goodElectrons[iEle]->pt(),goodElectrons[iEle]->eta(),goodElectrons[iEle]->phi(),0.);
00261 if ( (v1+v2).M() > maxInv )
00262 maxInv = (v1+v2).M();
00263 }
00264 }
00265
00266
00267 if (goodElectrons.size()>1 && maxInv > invMassCut_)
00268 {
00269
00270 return true;
00271 }
00272
00273
00274 if (goodElectrons.size()>=1 && (pfMET->begin()->et()>metCut_))
00275 {
00276
00277 return true;
00278 }
00279
00280 return false;
00281 }
00282
00283
00284 DEFINE_FWK_MODULE(WZInterestingEventSelector);