// -*- C++ -*- // // Package: Electron/ElectronAnalyzer // Class: ElectronAnalyzer // // system include files #include // user include files #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/one/EDAnalyzer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/Utilities/interface/InputTag.h" #include "CommonTools/UtilAlgos/interface/TFileService.h" #include "FWCore/ServiceRegistry/interface/Service.h" #include "DataFormats/Common/interface/ValueMap.h" //class to extract electron information #include "DataFormats/PatCandidates/interface/Electron.h" #include "DataFormats/EgammaCandidates/interface/GsfElectron.h" #include "DataFormats/VertexReco/interface/VertexFwd.h" #include "DataFormats/VertexReco/interface/Vertex.h" //Transient track for impact parameter #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h" #include "TrackingTools/Records/interface/TransientTrackRecord.h" #include "TrackingTools/TransientTrack/interface/TransientTrack.h" #include "TrackingTools/IPTools/interface/IPTools.h" //classes to save data #include "TTree.h" #include "TFile.h" #include // // class declaration // // If the analyzer does not use TFileService, please remove // the template argument to the base class so the class inherits // from edm::one::EDAnalyzer<> // This will improve performance in multithreaded jobs. //using reco::TrackCollection; class ElectronAnalyzer : public edm::one::EDAnalyzer { public: explicit ElectronAnalyzer(const edm::ParameterSet&); ~ElectronAnalyzer(); static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); private: virtual void beginJob() override; virtual void analyze(const edm::Event&, const edm::EventSetup& ) override; virtual void endJob() override; edm::EDGetTokenT electronToken_, electronToken2_; edm::EDGetTokenT vtxToken_; // ----------member data --------------------------- TTree *mtree; int numelectron; //number of electrons in the event std::vector electron_e; std::vector electron_pt; std::vector electron_px; std::vector electron_py; std::vector electron_pz; std::vector electron_eta; std::vector electron_phi; std::vector electron_ch; std::vector electron_iso; std::vector electron_veto;// std::vector electron_isLoose; std::vector electron_isMedium; std::vector electron_isTight; std::vector electron_dxy; std::vector electron_dz; std::vector electron_dxyError; std::vector electron_dzError; std::vector electron_ismvaLoose; std::vector electron_ismvaTight; std::vector electron_ip3d; std::vector electron_sip3d; }; // // constants, enums and typedefs // // // static data member definitions // // // constructors and destructor // ElectronAnalyzer::ElectronAnalyzer(const edm::ParameterSet& iConfig): electronToken_(consumes(iConfig.getParameter("electrons"))), vtxToken_(consumes(iConfig.getParameter("vertices"))) { //now do what ever initialization is needed edm::Service fs; mtree = fs->make("Events", "Events"); mtree->Branch("numberelectron",&numelectron); mtree->GetBranch("numberelectron")->SetTitle("number of electrons"); mtree->Branch("electron_e",&electron_e); mtree->GetBranch("electron_e")->SetTitle("electron energy"); mtree->Branch("electron_pt",&electron_pt); mtree->GetBranch("electron_pt")->SetTitle("electron transverse momentum"); mtree->Branch("electron_px",&electron_px); mtree->GetBranch("electron_px")->SetTitle("electron momentum x-component"); mtree->Branch("electron_py",&electron_py); mtree->GetBranch("electron_py")->SetTitle("electron momentum y-component"); mtree->Branch("electron_pz",&electron_pz); mtree->GetBranch("electron_pz")->SetTitle("electron momentum z-component"); mtree->Branch("electron_eta",&electron_eta); mtree->GetBranch("electron_eta")->SetTitle("electron pseudorapidity"); mtree->Branch("electron_phi",&electron_phi); mtree->GetBranch("electron_phi")->SetTitle("electron polar angle"); mtree->Branch("electron_ch",&electron_ch); mtree->GetBranch("electron_ch")->SetTitle("electron charge"); mtree->Branch("electron_iso",&electron_iso); mtree->GetBranch("electron_iso")->SetTitle("electron isolation"); mtree->Branch("electron_veto",&electron_veto);// mtree->GetBranch("electron_veto")->SetTitle("electron veto");// mtree->Branch("electron_isLoose",&electron_isLoose); mtree->GetBranch("electron_isLoose")->SetTitle("electron tagged loose"); mtree->Branch("electron_isMedium",&electron_isMedium); mtree->GetBranch("electron_isMedium")->SetTitle("electron tagged medium"); mtree->Branch("electron_isTight",&electron_isTight); mtree->GetBranch("electron_isTight")->SetTitle("electron tagged tight"); mtree->Branch("electron_dxy",&electron_dxy); mtree->GetBranch("electron_dxy")->SetTitle("electron transverse plane impact parameter (mm)"); mtree->Branch("electron_dz",&electron_dz); mtree->GetBranch("electron_dz")->SetTitle("electron longitudinal impact parameter (mm)"); mtree->Branch("electron_dxyError",&electron_dxyError); mtree->GetBranch("electron_dxyError")->SetTitle("electron transverse impact parameter uncertainty (mm)"); mtree->Branch("electron_dzError",&electron_dzError); mtree->GetBranch("electron_dzError")->SetTitle("electron longitudinal impact parameter uncertainty (mm)"); mtree->Branch("electron_ismvaLoose",&electron_ismvaLoose); mtree->GetBranch("electron_ismvaLoose")->SetTitle("electron mva Loose"); mtree->Branch("electron_ismvaTight",&electron_ismvaTight); mtree->GetBranch("electron_ismvaTight")->SetTitle("electron mva Tight"); mtree->Branch("electron_ip3d",&electron_ip3d); mtree->GetBranch("electron_ip3d")->SetTitle("electron impact parameter in 3d"); mtree->Branch("electron_sip3d",&electron_sip3d); mtree->GetBranch("electron_sip3d")->SetTitle("electron significance on impact parameter in 3d"); } //Destructor ElectronAnalyzer::~ElectronAnalyzer() { // do anything here that needs to be done at desctruction time // (e.g. close files, deallocate resources etc.) } // // member functions // // ------------ method called for each event ------------ void ElectronAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup ) { using namespace edm; Handle electrons; iEvent.getByToken(electronToken_, electrons); Handle vertices; iEvent.getByToken(vtxToken_, vertices); const reco::Vertex &primaryVertex = vertices->front(); math::XYZPoint pv(vertices->begin()->position()); numelectron = 0; electron_e.clear(); electron_pt.clear(); electron_px.clear(); electron_py.clear(); electron_pz.clear(); electron_eta.clear(); electron_phi.clear(); electron_ch.clear(); electron_iso.clear(); electron_veto.clear();// electron_isLoose.clear(); electron_isMedium.clear(); electron_isTight.clear(); electron_dxy.clear(); electron_dz.clear(); electron_dxyError.clear(); electron_dzError.clear(); electron_ismvaLoose.clear(); electron_ismvaTight.clear(); electron_ip3d.clear(); electron_sip3d.clear(); for (const pat::Electron &el : *electrons) { electron_e.push_back(el.energy()); electron_pt.push_back(el.pt()); electron_px.push_back(el.px()); electron_py.push_back(el.py()); electron_pz.push_back(el.pz()); electron_eta.push_back(el.eta()); electron_phi.push_back(el.phi()); electron_ch.push_back(el.charge()); electron_iso.push_back(el.ecalPFClusterIso()); electron_veto.push_back(el.electronID("cutBasedElectronID-Spring15-25ns-V1-standalone-veto"));// electron_isLoose.push_back(el.electronID("cutBasedElectronID-Spring15-25ns-V1-standalone-loose")); electron_isMedium.push_back(el.electronID("cutBasedElectronID-Spring15-25ns-V1-standalone-medium")); electron_isTight.push_back(el.electronID("cutBasedElectronID-Spring15-25ns-V1-standalone-tight")); electron_dxy.push_back(el.gsfTrack()->dxy(pv)); electron_dz.push_back(el.gsfTrack()->dz(pv)); electron_dxyError.push_back(el.gsfTrack()->d0Error()); electron_dzError.push_back(el.gsfTrack()->dzError()); electron_ismvaLoose.push_back(el.electronID("mvaEleID-Spring15-25ns-nonTrig-V1-wp90")); electron_ismvaTight.push_back(el.electronID("mvaEleID-Spring15-25ns-nonTrig-V1-wp80")); //get impact parameter in 3D // https://github.com/cms-sw/cmssw/blob/CMSSW_7_6_X/PhysicsTools/PatAlgos/plugins/PATElectronProducer.cc // This is needed by the IPTools methods from the tracking group edm::ESHandle trackBuilder; iSetup.get().get("TransientTrackBuilder", trackBuilder); reco::TransientTrack tt = trackBuilder->build(el.gsfTrack()); std::pair ip3dpv = IPTools::absoluteImpactParameter3D(tt, primaryVertex); electron_ip3d.push_back(ip3dpv.second.value()); electron_sip3d.push_back(ip3dpv.second.significance()); //std::cout<<"ip3d vanilla = "<