Skip to content

Commit

Permalink
Merge pull request #3 from ikrav/egm_electron_id_development
Browse files Browse the repository at this point in the history
This pull request is for the set of changes including:

    added producer for 5x5 quantities from Ming
    added new cut definition for full 5x5 sigmaIEtaIEta
    added 4 working points for CSA14 Scenario 1 and Scenario 2
    a few other related changes
  • Loading branch information
lgray committed Aug 19, 2014
2 parents 79f14f3 + d8a86cb commit ee07a84
Show file tree
Hide file tree
Showing 18 changed files with 3,333 additions and 6 deletions.
189 changes: 189 additions & 0 deletions EgammaAnalysis/ElectronTools/plugins/ElectronIDValueMapProducer.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/EDProducer.h"

#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"

#include "FWCore/ParameterSet/interface/ParameterSet.h"

#include "DataFormats/Common/interface/ValueMap.h"
#include "DataFormats/Common/interface/View.h"

#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"

#include "DataFormats/PatCandidates/interface/Electron.h"
#include "RecoEcal/EgammaCoreTools/interface/EcalClusterLazyTools.h"

#include <memory>
#include <vector>

class ElectronIDValueMapProducer : public edm::EDProducer {

public:

explicit ElectronIDValueMapProducer(const edm::ParameterSet&);
~ElectronIDValueMapProducer();

static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);

private:

virtual void beginJob() override;
virtual void produce(edm::Event&, const edm::EventSetup&) override;
virtual void endJob() override;

void writeValueMap(edm::Event &iEvent,
const edm::Handle<reco::GsfElectronCollection> & handle,
const std::vector<float> & values,
const std::string & label) const ;

void writeValueMap(edm::Event &iEvent,
const edm::Handle<edm::View<pat::Electron> > & handle,
const std::vector<float> & values,
const std::string & label) const ;

noZS::EcalClusterLazyTools *lazyToolnoZS;

edm::InputTag ebReducedRecHitCollection_;
edm::InputTag eeReducedRecHitCollection_;
edm::InputTag esReducedRecHitCollection_;
edm::InputTag src_;

std::string dataFormat_;
};

ElectronIDValueMapProducer::ElectronIDValueMapProducer(const edm::ParameterSet& iConfig) {

ebReducedRecHitCollection_ = iConfig.getParameter<edm::InputTag>("ebReducedRecHitCollection");
eeReducedRecHitCollection_ = iConfig.getParameter<edm::InputTag>("eeReducedRecHitCollection");
esReducedRecHitCollection_ = iConfig.getParameter<edm::InputTag>("esReducedRecHitCollection");

src_ = iConfig.getParameter<edm::InputTag>("src");

dataFormat_ = iConfig.getParameter<std::string>("dataFormat");

produces<edm::ValueMap<float> >("eleFull5x5SigmaIEtaIEta");
produces<edm::ValueMap<float> >("eleFull5x5SigmaIEtaIPhi");
produces<edm::ValueMap<float> >("eleFull5x5R9");
produces<edm::ValueMap<float> >("eleFull5x5Circularity");

}

ElectronIDValueMapProducer::~ElectronIDValueMapProducer() {
}

void ElectronIDValueMapProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {

using namespace edm;

lazyToolnoZS = new noZS::EcalClusterLazyTools(iEvent, iSetup, ebReducedRecHitCollection_, eeReducedRecHitCollection_, esReducedRecHitCollection_);

if (dataFormat_ == "RECO") {

edm::Handle<reco::GsfElectronCollection> src;
iEvent.getByLabel(src_, src);

// size_t n = src->size();
std::vector<float> eleFull5x5SigmaIEtaIEta, eleFull5x5SigmaIEtaIPhi;
std::vector<float> eleFull5x5R9, eleFull5x5Circularity;

for (reco::GsfElectronCollection::const_iterator iEle = src->begin(); iEle != src->end(); ++iEle){

std::vector<float> vCov = lazyToolnoZS->localCovariances( *(iEle->superCluster()->seed()) );
const float see = (isnan(vCov[0]) ? 0. : sqrt(vCov[0]));
const float sep = vCov[1];
eleFull5x5SigmaIEtaIEta.push_back(see);
eleFull5x5SigmaIEtaIPhi.push_back(sep);

eleFull5x5R9.push_back(lazyToolnoZS->e3x3( *((*iEle).superCluster()->seed()) ) / iEle->superCluster()->rawEnergy() );

const float e1x5 = lazyToolnoZS->e5x5( *((*iEle).superCluster()->seed()) );
const float e5x5 = lazyToolnoZS->e5x5( *((*iEle).superCluster()->seed()) );
const float circularity = (e5x5 != 0.) ? 1.-e1x5/e5x5 : -1;
eleFull5x5Circularity.push_back(circularity);
}

writeValueMap(iEvent, src, eleFull5x5SigmaIEtaIEta, "eleFull5x5SigmaIEtaIEta");
writeValueMap(iEvent, src, eleFull5x5SigmaIEtaIPhi, "eleFull5x5SigmaIEtaIPhi");
writeValueMap(iEvent, src, eleFull5x5R9, "eleFull5x5R9");
writeValueMap(iEvent, src, eleFull5x5Circularity, "eleFull5x5Circularity");

} else if (dataFormat_ == "PAT") {

edm::Handle<edm::View<pat::Electron> > src;
iEvent.getByLabel(src_, src);

// size_t n = src->size();
std::vector<float> eleFull5x5SigmaIEtaIEta, eleFull5x5SigmaIEtaIPhi;
std::vector<float> eleFull5x5R9, eleFull5x5Circularity;

for (View<pat::Electron>::const_iterator iEle = src->begin(); iEle != src->end(); ++iEle) {

std::vector<float> vCov = lazyToolnoZS->localCovariances( *((*iEle).superCluster()->seed()) );
const float see = (isnan(vCov[0]) ? 0. : sqrt(vCov[0]));
const float sep = vCov[1];
eleFull5x5SigmaIEtaIEta.push_back(see);
eleFull5x5SigmaIEtaIPhi.push_back(sep);

eleFull5x5R9.push_back(lazyToolnoZS->e3x3( *((*iEle).superCluster()->seed()) ) / iEle->superCluster()->rawEnergy() );

const float e1x5 = lazyToolnoZS->e5x5( *((*iEle).superCluster()->seed()) );
const float e5x5 = lazyToolnoZS->e5x5( *((*iEle).superCluster()->seed()) );
const float circularity = (e5x5 != 0.) ? 1.-e1x5/e5x5 : -1;
eleFull5x5Circularity.push_back(circularity);
}

writeValueMap(iEvent, src, eleFull5x5SigmaIEtaIEta, "eleFull5x5SigmaIEtaIEta");
writeValueMap(iEvent, src, eleFull5x5SigmaIEtaIPhi, "eleFull5x5SigmaIEtaIPhi");
writeValueMap(iEvent, src, eleFull5x5R9, "eleFull5x5R9");
writeValueMap(iEvent, src, eleFull5x5Circularity, "eleFull5x5Circularity");

}

delete lazyToolnoZS;
}

void ElectronIDValueMapProducer::writeValueMap(edm::Event &iEvent,
const edm::Handle<reco::GsfElectronCollection> & handle,
const std::vector<float> & values,
const std::string & label) const
{
using namespace edm;
using namespace std;
auto_ptr<ValueMap<float> > valMap(new ValueMap<float>());
edm::ValueMap<float>::Filler filler(*valMap);
filler.insert(handle, values.begin(), values.end());
filler.fill();
iEvent.put(valMap, label);
}

void ElectronIDValueMapProducer::writeValueMap(edm::Event &iEvent,
const edm::Handle<edm::View<pat::Electron> > & handle,
const std::vector<float> & values,
const std::string & label) const
{
using namespace edm;
using namespace std;
auto_ptr<ValueMap<float> > valMap(new ValueMap<float>());
edm::ValueMap<float>::Filler filler(*valMap);
filler.insert(handle, values.begin(), values.end());
filler.fill();
iEvent.put(valMap, label);
}

void ElectronIDValueMapProducer::beginJob() {
}

void ElectronIDValueMapProducer::endJob() {
}

void ElectronIDValueMapProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
//The following says we do not know what parameters are allowed so do no validation
// Please change this to state exactly what you do use, even if it is no parameters
edm::ParameterSetDescription desc;
desc.setUnknown();
descriptions.addDefault(desc);
}

DEFINE_FWK_MODULE(ElectronIDValueMapProducer);
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include "PhysicsTools/SelectorUtils/interface/CutApplicatorWithEventContentBase.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"

class GsfEleFull5x5SigmaIEtaIEtaCut : public CutApplicatorWithEventContentBase {
public:
GsfEleFull5x5SigmaIEtaIEtaCut(const edm::ParameterSet& c);

result_type operator()(const reco::GsfElectronRef&) const override final;

void setConsumes(edm::ConsumesCollector&) override final;
void getEventContent(const edm::EventBase&) override final;

CandidateType candidateType() const override final {
return ELECTRON;
}

private:
float _full5x5SigmaIEtaIEtaCutValueEB;
float _full5x5SigmaIEtaIEtaCutValueEE;
float _barrelCutOff;
edm::Handle<edm::ValueMap<float> > _full5x5SigmaIEtaIEtaMap;
};

DEFINE_EDM_PLUGIN(CutApplicatorFactory,
GsfEleFull5x5SigmaIEtaIEtaCut,
"GsfEleFull5x5SigmaIEtaIEtaCut");

GsfEleFull5x5SigmaIEtaIEtaCut::GsfEleFull5x5SigmaIEtaIEtaCut(const edm::ParameterSet& c) :
CutApplicatorWithEventContentBase(c),
_full5x5SigmaIEtaIEtaCutValueEB(c.getParameter<double>("full5x5SigmaIEtaIEtaCutValueEB")),
_full5x5SigmaIEtaIEtaCutValueEE(c.getParameter<double>("full5x5SigmaIEtaIEtaCutValueEE")),
_barrelCutOff(c.getParameter<double>("barrelCutOff")) {

edm::InputTag maptag = c.getParameter<edm::InputTag>("full5x5SigmaIEtaIEtaMap");
contentTags_.emplace("full5x5SigmaIEtaIEta",maptag);
}

void GsfEleFull5x5SigmaIEtaIEtaCut::setConsumes(edm::ConsumesCollector& cc) {
auto full5x5SigmaIEtaIEta =
cc.consumes<edm::ValueMap<float> >(contentTags_["full5x5SigmaIEtaIEta"]);
contentTokens_.emplace("full5x5SigmaIEtaIEta",full5x5SigmaIEtaIEta);
}

void GsfEleFull5x5SigmaIEtaIEtaCut::getEventContent(const edm::EventBase& ev) {
ev.getByLabel(contentTags_["full5x5SigmaIEtaIEta"],_full5x5SigmaIEtaIEtaMap);
}

CutApplicatorBase::result_type
GsfEleFull5x5SigmaIEtaIEtaCut::
operator()(const reco::GsfElectronRef& cand) const{

// Figure out the cut value
const float full5x5SigmaIEtaIEtaCutValue =
( std::abs(cand->superCluster()->position().eta()) < _barrelCutOff ?
_full5x5SigmaIEtaIEtaCutValueEB : _full5x5SigmaIEtaIEtaCutValueEE );

// Retrieve the variable value for this particle
const float full5x5SigmaIEtaIEta = (*_full5x5SigmaIEtaIEtaMap)[cand];

// Apply the cut and return the result
return full5x5SigmaIEtaIEta < full5x5SigmaIEtaIEtaCutValue;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import FWCore.ParameterSet.Config as cms

electronIDValueMapProducer = cms.EDProducer('ElectronIDValueMapProducer',
ebReducedRecHitCollection = cms.InputTag('reducedEcalRecHitsEB'),
eeReducedRecHitCollection = cms.InputTag('reducedEcalRecHitsEE'),
esReducedRecHitCollection = cms.InputTag('reducedEcalRecHitsES'),
src = cms.InputTag('gedGsfElectrons'),
dataFormat = cms.string('RECO')
)
Loading

0 comments on commit ee07a84

Please sign in to comment.