Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:10:16

0001 // -*- C++ -*-
0002 //
0003 // Package:    EGammaCutBasedEleIdAnalyzer
0004 // Class:      EGammaCutBasedEleIdAnalyzer
0005 //
0006 /**\class EGammaCutBasedEleIdAnalyzer EGammaCutBasedEleIdAnalyzer.cc EGamma/EGammaCutBasedEleIdAnalyzer/src/EGammaCutBasedEleIdAnalyzer.cc
0007 
0008 Description: [one line class summary]
0009 
0010 Implementation:
0011 [Notes on implementation]
0012  */
0013 //
0014 // Original Author:  Dave Evans,510 1-015,+41227679496,
0015 //         Created:  Tue Apr 10 11:17:29 CEST 2012
0016 //
0017 //
0018 
0019 // system include files
0020 #include <memory>
0021 
0022 // user include files
0023 #include "FWCore/Framework/interface/Frameworkfwd.h"
0024 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0025 #include "FWCore/Framework/interface/Event.h"
0026 #include "FWCore/Framework/interface/MakerMacros.h"
0027 #include "FWCore/Utilities/interface/transform.h"
0028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0029 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0030 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
0031 #include "DataFormats/EgammaCandidates/interface/Conversion.h"
0032 #include "DataFormats/VertexReco/interface/Vertex.h"
0033 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0034 #include "DataFormats/Common/interface/ValueMap.h"
0035 #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
0036 #include "EgammaAnalysis/ElectronTools/interface/EGammaCutBasedEleId.h"
0037 #include "EgammaAnalysis/ElectronTools/interface/ElectronEffectiveArea.h"
0038 #include "FWCore/ServiceRegistry/interface/Service.h"
0039 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0040 
0041 #include <TFile.h>
0042 #include <TH1F.h>
0043 
0044 //
0045 // class declaration
0046 //
0047 
0048 class EGammaCutBasedEleIdAnalyzer : public edm::one::EDAnalyzer<> {
0049 public:
0050   typedef std::vector<edm::Handle<edm::ValueMap<reco::IsoDeposit> > > IsoDepositMaps;
0051   typedef std::vector<edm::Handle<edm::ValueMap<double> > > IsoDepositVals;
0052 
0053   explicit EGammaCutBasedEleIdAnalyzer(const edm::ParameterSet &);
0054 
0055   static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0056   ElectronEffectiveArea::ElectronEffectiveAreaTarget EAtarget;
0057 
0058 private:
0059   void beginJob() override;
0060   void analyze(const edm::Event &, const edm::EventSetup &) override;
0061 
0062   // ----------member data ---------------------------
0063 
0064   // input tags
0065   edm::EDGetTokenT<reco::GsfElectronCollection> electronsToken_;
0066   edm::EDGetTokenT<reco::ConversionCollection> conversionsToken_;
0067   edm::EDGetTokenT<reco::BeamSpot> beamSpotToken_;
0068   edm::EDGetTokenT<double> rhoIsoToken_;
0069   edm::EDGetTokenT<reco::VertexCollection> primaryVertexToken_;
0070   std::vector<edm::EDGetTokenT<edm::ValueMap<double> > > isoValTokens_;
0071   std::string EAtargetToken_;
0072 
0073   // debug
0074   bool printDebug_;
0075 
0076   // histograms
0077   TH1F *h1_pt_;
0078   TH1F *h1_pt_veto_;
0079   TH1F *h1_pt_loose_;
0080   TH1F *h1_pt_medium_;
0081   TH1F *h1_pt_tight_;
0082   TH1F *h1_pt_trig_;
0083   TH1F *h1_pt_fbremeopin_;
0084 };
0085 
0086 //
0087 // static data member definitions
0088 //
0089 
0090 //
0091 // constructors and destructor
0092 //
0093 EGammaCutBasedEleIdAnalyzer::EGammaCutBasedEleIdAnalyzer(const edm::ParameterSet &iConfig) {
0094   // get input parameters
0095   electronsToken_ = consumes<reco::GsfElectronCollection>(iConfig.getParameter<edm::InputTag>("electronsInputTag"));
0096   conversionsToken_ = consumes<reco::ConversionCollection>(iConfig.getParameter<edm::InputTag>("conversionsInputTag"));
0097   beamSpotToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamSpotInputTag"));
0098   rhoIsoToken_ = consumes<double>(iConfig.getParameter<edm::InputTag>("rhoIsoInputTag"));
0099   primaryVertexToken_ = consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("primaryVertexInputTag"));
0100   isoValTokens_ =
0101       edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >("isoValInputTags"),
0102                             [this](edm::InputTag const &tag) { return consumes<edm::ValueMap<double> >(tag); });
0103   EAtargetToken_ = iConfig.getParameter<std::string>(
0104       "EAtarget");  //EleEANoCorr, EleEAData2011, EleEASummer11MC,EleEAFall11MC, EleEAData2012/
0105 
0106   // debug
0107   printDebug_ = iConfig.getParameter<bool>("printDebug");
0108 
0109   // output histograms
0110   edm::Service<TFileService> fs;
0111 
0112   h1_pt_ = fs->make<TH1F>("h1_pt", "pt", 100, 0.0, 100.0);
0113   h1_pt_veto_ = fs->make<TH1F>("h1_pt_veto", "pt (veto)", 100, 0.0, 100.0);
0114   h1_pt_loose_ = fs->make<TH1F>("h1_pt_loose", "pt (loose)", 100, 0.0, 100.0);
0115   h1_pt_medium_ = fs->make<TH1F>("h1_pt_medium", "pt (medium)", 100, 0.0, 100.0);
0116   h1_pt_tight_ = fs->make<TH1F>("h1_pt_tight", "pt (tight)", 100, 0.0, 100.0);
0117   h1_pt_trig_ = fs->make<TH1F>("h1_pt_trig", "pt (trig)", 100, 0.0, 100.0);
0118   h1_pt_fbremeopin_ = fs->make<TH1F>("h1_pt_fbremeopin", "pt (fbremeopin)", 100, 0.0, 100.0);
0119 }
0120 
0121 //
0122 // member functions
0123 //
0124 
0125 // ------------ method called for each event  ------------
0126 void EGammaCutBasedEleIdAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) {
0127   // electrons
0128   edm::Handle<reco::GsfElectronCollection> els_h;
0129   iEvent.getByToken(electronsToken_, els_h);
0130 
0131   // conversions
0132   edm::Handle<reco::ConversionCollection> conversions_h;
0133   iEvent.getByToken(conversionsToken_, conversions_h);
0134 
0135   // iso deposits
0136   IsoDepositVals isoVals(isoValTokens_.size());
0137   for (size_t j = 0; j < isoValTokens_.size(); ++j) {
0138     iEvent.getByToken(isoValTokens_[j], isoVals[j]);
0139   }
0140 
0141   // beam spot
0142   edm::Handle<reco::BeamSpot> beamspot_h;
0143   iEvent.getByToken(beamSpotToken_, beamspot_h);
0144   const reco::BeamSpot &beamSpot = *(beamspot_h.product());
0145 
0146   // vertices
0147   edm::Handle<reco::VertexCollection> vtx_h;
0148   iEvent.getByToken(primaryVertexToken_, vtx_h);
0149 
0150   // rho for isolation
0151   edm::Handle<double> rhoIso_h;
0152   iEvent.getByToken(rhoIsoToken_, rhoIso_h);
0153   double rhoIso = *(rhoIso_h.product());
0154 
0155   // loop on electrons
0156   unsigned int n = els_h->size();
0157   for (unsigned int i = 0; i < n; ++i) {
0158     // get reference to electron
0159     reco::GsfElectronRef ele(els_h, i);
0160 
0161     //
0162     // get particle flow isolation
0163     //
0164 
0165     double iso_ch = (*(isoVals)[0])[ele];
0166     double iso_em = (*(isoVals)[1])[ele];
0167     double iso_nh = (*(isoVals)[2])[ele];
0168 
0169     //
0170     // test ID
0171     //
0172 
0173     // working points
0174     bool veto = EgammaCutBasedEleId::PassWP(
0175         EgammaCutBasedEleId::VETO, ele, conversions_h, beamSpot, vtx_h, iso_ch, iso_em, iso_nh, rhoIso, EAtarget);
0176     bool loose = EgammaCutBasedEleId::PassWP(
0177         EgammaCutBasedEleId::LOOSE, ele, conversions_h, beamSpot, vtx_h, iso_ch, iso_em, iso_nh, rhoIso, EAtarget);
0178     bool medium = EgammaCutBasedEleId::PassWP(
0179         EgammaCutBasedEleId::MEDIUM, ele, conversions_h, beamSpot, vtx_h, iso_ch, iso_em, iso_nh, rhoIso, EAtarget);
0180     bool tight = EgammaCutBasedEleId::PassWP(
0181         EgammaCutBasedEleId::TIGHT, ele, conversions_h, beamSpot, vtx_h, iso_ch, iso_em, iso_nh, rhoIso, EAtarget);
0182 
0183     // eop/fbrem cuts for extra tight ID
0184     bool fbremeopin = EgammaCutBasedEleId::PassEoverPCuts(ele);
0185 
0186     // cuts to match tight trigger requirements
0187     bool trigtight = EgammaCutBasedEleId::PassTriggerCuts(EgammaCutBasedEleId::TRIGGERTIGHT, ele);
0188 
0189     // for 2011 WP70 trigger
0190     bool trigwp70 = EgammaCutBasedEleId::PassTriggerCuts(EgammaCutBasedEleId::TRIGGERWP70, ele);
0191 
0192     //
0193     // fill histograms
0194     //
0195 
0196     h1_pt_->Fill(ele->pt());
0197     if (veto)
0198       h1_pt_veto_->Fill(ele->pt());
0199     if (loose)
0200       h1_pt_loose_->Fill(ele->pt());
0201     if (medium)
0202       h1_pt_medium_->Fill(ele->pt());
0203     if (tight)
0204       h1_pt_tight_->Fill(ele->pt());
0205     if (trigtight)
0206       h1_pt_trig_->Fill(ele->pt());
0207     if (fbremeopin)
0208       h1_pt_fbremeopin_->Fill(ele->pt());
0209 
0210     //
0211     // print decisions
0212     //
0213 
0214     if (printDebug_) {
0215       printf("%u %u %llu : ", iEvent.id().run(), iEvent.luminosityBlock(), iEvent.id().event());
0216       printf("veto(%i), ", veto);
0217       printf("loose(%i), ", loose);
0218       printf("medium(%i), ", medium);
0219       printf("tight(%i), ", tight);
0220       printf("trigtight(%i), ", trigtight);
0221       printf("trigwp70(%i), ", trigwp70);
0222       printf("fbremeopin(%i)\n", fbremeopin);
0223     }
0224   }
0225 }
0226 
0227 // ------------ method called once each job just before starting event loop  ------------
0228 void EGammaCutBasedEleIdAnalyzer::beginJob() {
0229   if (EAtargetToken_ == "EleEANoCorr")
0230     EAtarget = ElectronEffectiveArea::kEleEANoCorr;
0231   else if (EAtargetToken_ == "EleEAData2011")
0232     EAtarget = ElectronEffectiveArea::kEleEAData2011;
0233   else if (EAtargetToken_ == "EleEASummer11MC")
0234     EAtarget = ElectronEffectiveArea::kEleEASummer11MC;
0235   else if (EAtargetToken_ == "EleEAFall11MC")
0236     EAtarget = ElectronEffectiveArea::kEleEAFall11MC;
0237   else if (EAtargetToken_ == "EleEAData2012")
0238     EAtarget = ElectronEffectiveArea::kEleEAData2012;
0239   else
0240     EAtarget = ElectronEffectiveArea::kEleEAData2012;
0241 }
0242 
0243 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
0244 void EGammaCutBasedEleIdAnalyzer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0245   //The following says we do not know what parameters are allowed so do no validation
0246   // Please change this to state exactly what you do use, even if it is no parameters
0247   edm::ParameterSetDescription desc;
0248   desc.setUnknown();
0249   descriptions.addDefault(desc);
0250 }
0251 
0252 //define this as a plug-in
0253 DEFINE_FWK_MODULE(EGammaCutBasedEleIdAnalyzer);