Skip to content

Commit

Permalink
Merge pull request cms-sw#5 from Sam-Harper/HEEPV50ID
Browse files Browse the repository at this point in the history
Heepv50
  • Loading branch information
lgray committed Aug 19, 2014
2 parents ee07a84 + ba82553 commit a46e17a
Show file tree
Hide file tree
Showing 11 changed files with 607 additions and 8 deletions.
24 changes: 24 additions & 0 deletions EgammaAnalysis/ElectronTools/interface/EBEECutValues.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef EgammaAnalysis_ElectronTools_EBEECutValues_h
#define EgammaAnalysis_ElectronTools_EBEECutValues_h

#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
class EBEECutValues {
private:
double barrel_;
double endcap_;
const double barrelCutOff_=1.479; //this is currrently used to identify if object is barrel or endcap but may change

public:
EBEECutValues(const edm::ParameterSet& params,const std::string& name):
barrel_(params.getParameter<double>(name+"EB")),
endcap_(params.getParameter<double>(name+"EE")){}
double operator()(const reco::GsfElectronRef& cand)const{return isBarrel(cand) ? barrel_ : endcap_;}

private:
const bool isBarrel(const reco::GsfElectronRef& cand)const{return std::abs(cand->superCluster()->position().eta())<barrelCutOff_;}

};

#endif
38 changes: 30 additions & 8 deletions EgammaAnalysis/ElectronTools/plugins/ElectronIDValueMapProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ ElectronIDValueMapProducer::ElectronIDValueMapProducer(const edm::ParameterSet&
dataFormat_ = iConfig.getParameter<std::string>("dataFormat");

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

Expand All @@ -87,6 +90,7 @@ void ElectronIDValueMapProducer::produce(edm::Event& iEvent, const edm::EventSet
// size_t n = src->size();
std::vector<float> eleFull5x5SigmaIEtaIEta, eleFull5x5SigmaIEtaIPhi;
std::vector<float> eleFull5x5R9, eleFull5x5Circularity;
std::vector<float> eleFull5x5E1x5,eleFull5x5E2x5,eleFull5x5E5x5;

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

Expand All @@ -95,20 +99,29 @@ void ElectronIDValueMapProducer::produce(edm::Event& iEvent, const edm::EventSet
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 e1x5 = lazyToolnoZS->e1x5( *((*iEle).superCluster()->seed()) );
const float e2x5 = lazyToolnoZS->e2x5Max( *((*iEle).superCluster()->seed()) );
const float e5x5 = lazyToolnoZS->e5x5( *((*iEle).superCluster()->seed()) );
const float circularity = (e5x5 != 0.) ? 1.-e1x5/e5x5 : -1;

eleFull5x5E1x5.push_back(e1x5);
eleFull5x5E2x5.push_back(e2x5);
eleFull5x5E5x5.push_back(e5x5);
eleFull5x5Circularity.push_back(circularity);
}

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



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

edm::Handle<edm::View<pat::Electron> > src;
Expand All @@ -117,6 +130,7 @@ void ElectronIDValueMapProducer::produce(edm::Event& iEvent, const edm::EventSet
// size_t n = src->size();
std::vector<float> eleFull5x5SigmaIEtaIEta, eleFull5x5SigmaIEtaIPhi;
std::vector<float> eleFull5x5R9, eleFull5x5Circularity;
std::vector<float> eleFull5x5E1x5,eleFull5x5E2x5,eleFull5x5E5x5;

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

Expand All @@ -128,17 +142,25 @@ void ElectronIDValueMapProducer::produce(edm::Event& iEvent, const edm::EventSet

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

const float e1x5 = lazyToolnoZS->e5x5( *((*iEle).superCluster()->seed()) );

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

eleFull5x5E1x5.push_back(e1x5);
eleFull5x5E2x5.push_back(e2x5);
eleFull5x5E5x5.push_back(e5x5);
eleFull5x5Circularity.push_back(circularity);
}

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

writeValueMap(iEvent, src, eleFull5x5E1x5, "eleFull5x5E1x5");
writeValueMap(iEvent, src, eleFull5x5E2x5, "eleFull5x5E2x5");
writeValueMap(iEvent, src, eleFull5x5E5x5, "eleFull5x5E5x5");
writeValueMap(iEvent, src, eleFull5x5Circularity, "eleFull5x5Circularity");
}

delete lazyToolnoZS;
Expand Down
39 changes: 39 additions & 0 deletions EgammaAnalysis/ElectronTools/plugins/cuts/GsfEleDEtaInLinearCut.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include "PhysicsTools/SelectorUtils/interface/CutApplicatorBase.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "EgammaAnalysis/ElectronTools/interface/EBEECutValues.h"

class GsfEleDEtaInLinearCut : public CutApplicatorBase {
public:
GsfEleDEtaInLinearCut(const edm::ParameterSet& param) :
CutApplicatorBase(param),
slopeTerm_(param,"slopeTerm"),
constTerm_(param,"constTerm"),
minValue_(param,"minValue")
{
}

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

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

private:
const EBEECutValues slopeTerm_;
const EBEECutValues constTerm_;
const EBEECutValues minValue_;
};

DEFINE_EDM_PLUGIN(CutApplicatorFactory,
GsfEleDEtaInLinearCut,
"GsfEleDEtaInLinearCut");

CutApplicatorBase::result_type
GsfEleDEtaInLinearCut::
operator()(const reco::GsfElectronRef& cand) const
{
float et = cand->energy()!=0. ? cand->et()/cand->energy()*cand->caloEnergy() : 0.;
double cutValue = std::max(constTerm_(cand)+slopeTerm_(cand)*et,minValue_(cand));
return std::abs(cand->deltaEtaSuperClusterTrackAtVtx())<cutValue;

}
36 changes: 36 additions & 0 deletions EgammaAnalysis/ElectronTools/plugins/cuts/GsfEleE2x5OverE5x5Cut.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include "PhysicsTools/SelectorUtils/interface/CutApplicatorBase.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "EgammaAnalysis/ElectronTools/interface/EBEECutValues.h"

class GsfEleE2x5OverE5x5Cut : public CutApplicatorBase {
public:
GsfEleE2x5OverE5x5Cut(const edm::ParameterSet& params) :
CutApplicatorBase(params),
minE1x5OverE5x5_(params,"minE1x5OverE5x5"),
minE2x5OverE5x5_(params,"minE2x5OverE5x5"){}

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

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

private:
EBEECutValues minE1x5OverE5x5_;
EBEECutValues minE2x5OverE5x5_;


};

DEFINE_EDM_PLUGIN(CutApplicatorFactory,
GsfEleE2x5OverE5x5Cut,
"GsfEleE2x5OverE5x5Cut");

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

return cand->e2x5Max() > minE2x5OverE5x5_(cand)*cand->e5x5() ||
cand->e1x5() > minE1x5OverE5x5_(cand)*cand->e5x5();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "PhysicsTools/SelectorUtils/interface/CutApplicatorWithEventContentBase.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "DataFormats/EgammaCandidates/interface/ConversionFwd.h"
#include "DataFormats/EgammaCandidates/interface/Conversion.h"
#include "RecoEgamma/EgammaTools/interface/ConversionTools.h"

#include "EgammaAnalysis/ElectronTools/interface/EBEECutValues.h"

class GsfEleEmHadD1IsoRhoCut : public CutApplicatorWithEventContentBase {
public:
GsfEleEmHadD1IsoRhoCut(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 rhoConstant_;
EBEECutValues slopeTerm_;
EBEECutValues slopeStart_;
EBEECutValues constTerm_;


edm::Handle<double> rhoHandle_;

};

DEFINE_EDM_PLUGIN(CutApplicatorFactory,
GsfEleEmHadD1IsoRhoCut,
"GsfEleEmHadD1IsoRhoCut");

GsfEleEmHadD1IsoRhoCut::GsfEleEmHadD1IsoRhoCut(const edm::ParameterSet& params) :
CutApplicatorWithEventContentBase(params),
rhoConstant_(params.getParameter<double>("rhoConstant")),
slopeTerm_(params,"slopeTerm"),
slopeStart_(params,"slopeStart"),
constTerm_(params,"constTerm"){
edm::InputTag rhoTag = params.getParameter<edm::InputTag>("rho");
contentTags_.emplace("rho",rhoTag);

}

void GsfEleEmHadD1IsoRhoCut::setConsumes(edm::ConsumesCollector& cc) {
auto rho = cc.consumes<double>(contentTags_["rho"]);
contentTokens_.emplace("rho",rho);
}

void GsfEleEmHadD1IsoRhoCut::getEventContent(const edm::EventBase& ev) {
ev.getByLabel(contentTags_["rho"],rhoHandle_);
}

CutApplicatorBase::result_type
GsfEleEmHadD1IsoRhoCut::
operator()(const reco::GsfElectronRef& cand) const{
const double rho = (*rhoHandle_);

const float isolEmHadDepth1 = cand->dr03EcalRecHitSumEt() + cand->dr03HcalDepth1TowerSumEt();

const float et = cand->et();
const float cutValue = et > slopeStart_(cand) ? slopeTerm_(cand)*(et-slopeStart_(cand)) + constTerm_(cand) : constTerm_(cand);
return isolEmHadDepth1 < cutValue + rhoConstant_*rho;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include "PhysicsTools/SelectorUtils/interface/CutApplicatorWithEventContentBase.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "DataFormats/EgammaCandidates/interface/ConversionFwd.h"
#include "DataFormats/EgammaCandidates/interface/Conversion.h"
#include "RecoEgamma/EgammaTools/interface/ConversionTools.h"

#include "EgammaAnalysis/ElectronTools/interface/EBEECutValues.h"

class GsfEleFull5x5E2x5OverE5x5Cut : public CutApplicatorWithEventContentBase {
public:
GsfEleFull5x5E2x5OverE5x5Cut(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:
EBEECutValues minE1x5OverE5x5Cut_;
EBEECutValues minE2x5OverE5x5Cut_;


edm::Handle<edm::ValueMap<float> > e1x5Handle_;
edm::Handle<edm::ValueMap<float> > e2x5Handle_;
edm::Handle<edm::ValueMap<float> > e5x5Handle_;

};

DEFINE_EDM_PLUGIN(CutApplicatorFactory,
GsfEleFull5x5E2x5OverE5x5Cut,
"GsfEleFull5x5E2x5OverE5x5Cut");

GsfEleFull5x5E2x5OverE5x5Cut::GsfEleFull5x5E2x5OverE5x5Cut(const edm::ParameterSet& params) :
CutApplicatorWithEventContentBase(params),
minE1x5OverE5x5Cut_(params,"minE1x5OverE5x5"),
minE2x5OverE5x5Cut_(params,"minE2x5OverE5x5"){
edm::InputTag e5x5Tag = params.getParameter<edm::InputTag>("e5x5");
edm::InputTag e2x5Tag = params.getParameter<edm::InputTag>("e2x5");
edm::InputTag e1x5Tag = params.getParameter<edm::InputTag>("e1x5");
contentTags_.emplace("e1x5",e1x5Tag);
contentTags_.emplace("e2x5",e2x5Tag);
contentTags_.emplace("e5x5",e5x5Tag);

}

void GsfEleFull5x5E2x5OverE5x5Cut::setConsumes(edm::ConsumesCollector& cc) {
auto e1x5 = cc.consumes<double>(contentTags_["e1x5"]);
contentTokens_.emplace("e1x5",e1x5);
auto e2x5 = cc.consumes<double>(contentTags_["e2x5"]);
contentTokens_.emplace("e2x5",e2x5);
auto e5x5 = cc.consumes<double>(contentTags_["e5x5"]);
contentTokens_.emplace("e5x5",e5x5);
}

void GsfEleFull5x5E2x5OverE5x5Cut::getEventContent(const edm::EventBase& ev) {
ev.getByLabel(contentTags_["e1x5"],e1x5Handle_);
ev.getByLabel(contentTags_["e2x5"],e2x5Handle_);
ev.getByLabel(contentTags_["e5x5"],e5x5Handle_);
}

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

const double e5x5 = (*e5x5Handle_)[cand];
const double e1x5OverE5x5 = e5x5!=0 ? (*e1x5Handle_)[cand]/e5x5 : 0;
const double e2x5OverE5x5 = e5x5!=0 ? (*e2x5Handle_)[cand]/e5x5 : 0;

return e1x5OverE5x5 > minE1x5OverE5x5Cut_(cand) || e2x5OverE5x5 > minE2x5OverE5x5Cut_(cand);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include "PhysicsTools/SelectorUtils/interface/CutApplicatorBase.h"
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
#include "EgammaAnalysis/ElectronTools/interface/EBEECutValues.h"
class GsfEleHadronicOverEMLinearCut : public CutApplicatorBase {
public:
GsfEleHadronicOverEMLinearCut(const edm::ParameterSet& params) :
CutApplicatorBase(params),
slopeTerm_(params,"slopeTerm"),
slopeStart_(params,"slopeStart"),
constTerm_(params,"constTerm"){}

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

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

private:
EBEECutValues slopeTerm_;
EBEECutValues slopeStart_;
EBEECutValues constTerm_;

};

DEFINE_EDM_PLUGIN(CutApplicatorFactory,
GsfEleHadronicOverEMLinearCut,
"GsfEleHadronicOverEMLinearCut");

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

const float energy = cand->superCluster()->energy();
const float cutValue = energy > slopeStart_(cand) ? slopeTerm_(cand)*(energy-slopeStart_(cand)) + constTerm_(cand) : constTerm_(cand);

return cand->hadronicOverEm()*energy < cutValue;
}

0 comments on commit a46e17a

Please sign in to comment.