Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Puppi isolation electrons mini aod rebased v2 #15722

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions DataFormats/PatCandidates/interface/Electron.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,17 @@ namespace pat {
void setEcalPFClusterIso(float ecalPFClus) { ecalPFClusIso_ = ecalPFClus; };
void setHcalPFClusterIso(float hcalPFClus) { hcalPFClusIso_ = hcalPFClus; };

float puppiChargedHardonsIso() const {return puppiChargedHardonsIso_; };
float puppiNeutralHardonsIso() const {return puppiNeutralHardonsIso_; };
float puppiPhotonsIso() const {return puppiPhotonsIso_; };

void setIsolationPUPPI(float chargedhadrons_, float neutralhadrons_, float photons_)
{
puppiChargedHardonsIso_ = chargedhadrons_;
puppiNeutralHardonsIso_ = neutralhadrons_;
puppiPhotonsIso_ = photons_;

}
// ---- PF specific methods ----
bool isPF() const{ return isPF_; }
void setIsPF(bool hasPFCandidate) { isPF_ = hasPFCandidate ; }
Expand Down Expand Up @@ -344,6 +355,11 @@ namespace pat {
float ecalPFClusIso_;
float hcalPFClusIso_;

//PUPPI isolations
float puppiChargedHardonsIso_;
float puppiNeutralHardonsIso_;
float puppiPhotonsIso_;

/// conversion veto
bool passConversionVeto_;

Expand Down
18 changes: 18 additions & 0 deletions DataFormats/PatCandidates/interface/Photon.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,11 @@ namespace pat {
//<< key << " was not stored for this particle.";
}
}

float puppiChargedHardonsIso() const {return puppiChargedHardonsIso_; };
float puppiNeutralHardonsIso() const {return puppiNeutralHardonsIso_; };
float puppiPhotonsIso() const {return puppiPhotonsIso_; };

/// Sets the isolation variable for a specifc key.
/// Note that you can't set isolation for a pseudo-key like CaloIso
void setIsolation(IsolationKeys key, float value) {
Expand All @@ -191,6 +196,14 @@ namespace pat {
void setHcalIso(float caloIso) { setIsolation(HcalIso, caloIso); }
/// Sets user isolation variable #index
void setUserIso(float value, uint8_t index=0) { setIsolation(IsolationKeys(UserBaseIso + index), value); }
/// Sets PUPPI isolation
void setIsolationPUPPI(float chargedhadrons_, float neutralhadrons_, float photons_)
{
puppiChargedHardonsIso_ = chargedhadrons_;
puppiNeutralHardonsIso_ = neutralhadrons_;
puppiPhotonsIso_ = photons_;

}

// ---- methods for photon isolation deposits ----
/// Returns the IsoDeposit associated with some key, or a null pointer if it is not available
Expand Down Expand Up @@ -392,6 +405,11 @@ namespace pat {
float ecalPFClusIso_;
float hcalPFClusIso_;

//PUPPI isolations
float puppiChargedHardonsIso_;
float puppiNeutralHardonsIso_;
float puppiPhotonsIso_;

// ---- link to PackedPFCandidates
edm::RefProd<pat::PackedCandidateCollection> packedPFCandidates_;
std::vector<uint16_t> associatedPackedFCandidateIndices_;
Expand Down
7 changes: 5 additions & 2 deletions DataFormats/PatCandidates/src/classes_def_objects.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
<class name="pat::Lepton<reco::BaseTau>" />

<!-- PAT Objects, and embedded data -->
<class name="pat::Electron" ClassVersion="33">
<class name="pat::Electron" ClassVersion="35">
<version ClassVersion="35" checksum="1857282274"/>
<version ClassVersion="34" checksum="3659401979"/>
<version ClassVersion="33" checksum="459924678"/>
<version ClassVersion="32" checksum="3508125821"/>
<version ClassVersion="31" checksum="1881133053"/>
Expand Down Expand Up @@ -189,7 +191,8 @@
</ioread>

<class name="std::vector<pat::tau::TauPFEssential>" />
<class name="pat::Photon" ClassVersion="18">
<class name="pat::Photon" ClassVersion="19">
<version ClassVersion="19" checksum="211560632"/>
<version ClassVersion="18" checksum="1413598928"/>
<version ClassVersion="17" checksum="2394457997"/>
<field name="superClusterRelinked_" transient="true"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ namespace citk {
const edm::EventSetup&) override final;

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

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

private:
// datamembers
Expand All @@ -49,6 +51,7 @@ namespace citk {
std::array<IsoTypes,kNPFTypes> _isolation_types;
std::array<std::vector<std::string>,kNPFTypes> _product_names;
bool useValueMapForPUPPI = true;
bool usePUPPINoLepton = false;// in case puppi weights are taken from packedCandidate can take weights for puppiNoLeptons
};
}

Expand Down Expand Up @@ -153,8 +156,9 @@ namespace citk {
for( unsigned i = 0; i < isolations.size(); ++ i ) {
if( isolations[i]->isInIsolationCone(cand_to_isolate,isocand) ) {
double puppiWeight = 0.;
if (!useValueMapForPUPPI) puppiWeight = aspackedCandidate -> puppiWeight(); // if miniAOD, take puppiWeight directly from the object
else puppiWeight = (*puppiValueMap)[isocand]; // if AOD, take puppiWeight from the valueMap
if (!useValueMapForPUPPI && !usePUPPINoLepton) puppiWeight = aspackedCandidate -> puppiWeight(); // if miniAOD, take puppiWeight directly from the object
else if (!useValueMapForPUPPI && usePUPPINoLepton) puppiWeight = aspackedCandidate -> puppiWeightNoLep(); // if miniAOD, take puppiWeightNoLep directly from the object
else puppiWeight = (*puppiValueMap)[isocand]; // if AOD, take puppiWeight from the valueMap
if (puppiWeight > 0.)cand_values[isotype][i] += (isocand->pt())*puppiWeight; // this is basically the main change to Lindsey's code: scale pt with puppiWeight for candidates with puppiWeight > 0.
}
}
Expand All @@ -179,4 +183,37 @@ namespace citk {
}
}
}


// ParameterSet description for module
void PFIsolationSumProducerForPUPPI::fillDescriptions(edm::ConfigurationDescriptions & descriptions)
{
edm::ParameterSetDescription iDesc;
iDesc.setComment("PUPPI isolation sum producer");

iDesc.add<edm::InputTag>("srcToIsolate", edm::InputTag("no default"))->setComment("calculate isolation for this collection");
iDesc.add<edm::InputTag>("srcForIsolationCone", edm::InputTag("no default"))->setComment("collection for the isolation calculation: like particleFlow ");
iDesc.add<edm::InputTag>("puppiValueMap", edm::InputTag("puppi"))->setComment("source for puppi, if left empty weight from packedCandidate is taken");

edm::ParameterSetDescription descIsoConeDefinitions;
descIsoConeDefinitions.add<std::string>("isolationAlgo", "no default");
descIsoConeDefinitions.add<double>("coneSize", 0.3);
descIsoConeDefinitions.add<std::string>("isolateAgainst", "no default");
descIsoConeDefinitions.add<std::vector<unsigned>>("miniAODVertexCodes", {2,3});
descIsoConeDefinitions.addOptional<double>("VetoConeSizeBarrel", 0.0);
descIsoConeDefinitions.addOptional<double>("VetoConeSizeEndcaps", 0.0);
descIsoConeDefinitions.addOptional<int>("vertexIndex",0);


std::vector<edm::ParameterSet> isolationConeDefinitions;
edm::ParameterSet chargedHadrons, neutralHadrons,photons;
isolationConeDefinitions.push_back(chargedHadrons);
isolationConeDefinitions.push_back(neutralHadrons);
isolationConeDefinitions.push_back(photons);
iDesc.addVPSet("isolationConeDefinitions", descIsoConeDefinitions, isolationConeDefinitions);
iDesc.addOptional<bool>("usePUPPINoLepton",false);

descriptions.add("CITKPFIsolationSumProducerForPUPPI", iDesc);
}

}
51 changes: 37 additions & 14 deletions PhysicsTools/PatAlgos/plugins/PATElectronProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,10 @@ PATElectronProducer::PATElectronProducer(const edm::ParameterSet & iConfig) :
isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
addEfficiencies_(iConfig.getParameter<bool>("addEfficiencies")),
addResolutions_(iConfig.getParameter<bool>( "addResolutions" )),
useUserData_(iConfig.exists("userData"))
useUserData_(iConfig.exists("userData")),
PUPPIIsolation_charged_hadrons_(consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"))),
PUPPIIsolation_neutral_hadrons_(consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"))),
PUPPIIsolation_photons_(consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons")))

{
// MC matching configurables (scheduled mode)
Expand Down Expand Up @@ -280,6 +283,15 @@ void PATElectronProducer::produce(edm::Event & iEvent, const edm::EventSetup & i
}
}

//value maps for puppi isolation
edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);


std::vector<Electron> * patElectrons = new std::vector<Electron>();

if( useParticleFlow_ ) {
Expand All @@ -300,17 +312,19 @@ void PATElectronProducer::produce(edm::Event & iEvent, const edm::EventSetup & i
bool MatchedToAmbiguousGsfTrack=false;
for (edm::View<reco::GsfElectron>::const_iterator itElectron = electrons->begin(); itElectron != electrons->end(); ++itElectron) {
unsigned int idx = itElectron - electrons->begin();
if (Matched || MatchedToAmbiguousGsfTrack) continue;
auto elePtr = electrons -> ptrAt(idx);
if (Matched || MatchedToAmbiguousGsfTrack) continue;

reco::GsfTrackRef EgTk= itElectron->gsfTrack();
reco::GsfTrackRef EgTk= itElectron->gsfTrack();

if (itElectron->gsfTrack()==i->gsfTrackRef()){
Matched=true;
}
else {
for( reco::GsfTrackRefVector::const_iterator it = itElectron->ambiguousGsfTracksBegin() ;
if (itElectron->gsfTrack()==i->gsfTrackRef()){
Matched=true;
}
else {

for( reco::GsfTrackRefVector::const_iterator it = itElectron->ambiguousGsfTracksBegin() ;
it!=itElectron->ambiguousGsfTracksEnd(); it++ ){
MatchedToAmbiguousGsfTrack |= (bool)(i->gsfTrackRef()==(*it));
MatchedToAmbiguousGsfTrack |= (bool)(i->gsfTrackRef()==(*it));
}
}

Expand All @@ -319,10 +333,11 @@ void PATElectronProducer::produce(edm::Event & iEvent, const edm::EventSetup & i
// ptr needed for finding the matched gen particle
reco::CandidatePtr ptrToGsfElectron(electrons,idx);

// ref to base needed for the construction of the pat object
const edm::RefToBase<reco::GsfElectron>& elecsRef = electrons->refAt(idx);
Electron anElectron(elecsRef);
anElectron.setPFCandidateRef( pfRef );
// ref to base needed for the construction of the pat object
const edm::RefToBase<reco::GsfElectron>& elecsRef = electrons->refAt(idx);
Electron anElectron(elecsRef);
anElectron.setPFCandidateRef( pfRef );
anElectron.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[elePtr], (*PUPPIIsolation_neutral_hadrons)[elePtr], (*PUPPIIsolation_photons)[elePtr]);

//it should be always true when particleFlow electrons are used.
anElectron.setIsPF( true );
Expand Down Expand Up @@ -503,7 +518,8 @@ void PATElectronProducer::produce(edm::Event & iEvent, const edm::EventSetup & i
edm::RefToBase<reco::GsfElectron> elecsRef = electrons->refAt(idx);
reco::CandidateBaseRef elecBaseRef(elecsRef);
Electron anElectron(elecsRef);

auto elePtr = electrons -> ptrAt(idx);
anElectron.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[elePtr], (*PUPPIIsolation_neutral_hadrons)[elePtr], (*PUPPIIsolation_photons)[elePtr]);
// Is this GsfElectron also identified as an e- in the particle flow?
bool pfId = false;

Expand Down Expand Up @@ -771,6 +787,7 @@ void PATElectronProducer::fillElectron(Electron& anElectron,
(*deposits[j])[elecRef]);
}


for (size_t j = 0; j<isolationValues.size(); ++j) {
if(useParticleFlow_) {
reco::CandidatePtr source = anElectron.pfCandidateRef()->sourceCandidatePtr(0);
Expand Down Expand Up @@ -980,6 +997,12 @@ void PATElectronProducer::fillDescriptions(edm::ConfigurationDescriptions & desc
PATUserDataHelper<Electron>::fillDescription(userDataPSet);
iDesc.addOptional("userData", userDataPSet);

iDesc.add<edm::InputTag>("puppiIsolationChargedHadrons", edm::InputTag("egmElectronIsolationAODPUPPI","h+-DR030-BarVeto000-EndVeto001"))->setComment("puppi isolation sum for charged hadrons");
iDesc.add<edm::InputTag>("puppiIsolationNeutralHadrons", edm::InputTag("egmElectronIsolationAODPUPPI","h0-DR030-BarVeto000-EndVeto000"))->setComment("puppi isolation sum for neutral hadrons");
iDesc.add<edm::InputTag>("puppiIsolationPhotons", edm::InputTag("egmElectronIsolationAODPUPPI","gamma-DR030-BarVeto000-EndVeto008"))->setComment("puppi isolation sum for photons");



// electron shapes
iDesc.add<bool>("addElectronShapes", true);
iDesc.add<edm::InputTag>("reducedBarrelRecHitCollection", edm::InputTag("reducedEcalRecHitsEB"));
Expand Down
4 changes: 4 additions & 0 deletions PhysicsTools/PatAlgos/plugins/PATElectronProducer.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@ namespace pat {
pat::helper::KinResolutionsLoader resolutionLoader_;

const bool useUserData_;
//PUPPI isolation tokens
edm::EDGetTokenT<edm::ValueMap<float> > PUPPIIsolation_charged_hadrons_;
edm::EDGetTokenT<edm::ValueMap<float> > PUPPIIsolation_neutral_hadrons_;
edm::EDGetTokenT<edm::ValueMap<float> > PUPPIIsolation_photons_;
pat::PATUserDataHelper<pat::Electron> userDataHelper_;

const CaloTopology * ecalTopology_;
Expand Down
2 changes: 2 additions & 0 deletions PhysicsTools/PatAlgos/plugins/PATElectronSlimmer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "CommonTools/UtilAlgos/interface/StringCutObjectSelector.h"
#include "RecoEcal/EgammaCoreTools/interface/EcalClusterLazyTools.h"
#include "FWCore/Utilities/interface/isFinite.h"
#include "DataFormats/Common/interface/ValueMap.h"

namespace pat {

Expand Down Expand Up @@ -70,6 +71,7 @@ pat::PATElectronSlimmer::PATElectronSlimmer(const edm::ParameterSet & iConfig) :
reducedBarrelRecHitCollectionToken_(consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection"))),
reducedEndcapRecHitCollectionToken_(consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection"))),
modifyElectron_(iConfig.getParameter<bool>("modifyElectrons"))

{
edm::ConsumesCollector sumes(consumesCollector());
if( modifyElectron_ ) {
Expand Down
19 changes: 18 additions & 1 deletion PhysicsTools/PatAlgos/plugins/PATPhotonProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ using namespace pat;

PATPhotonProducer::PATPhotonProducer(const edm::ParameterSet & iConfig) :
isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false) ,
useUserData_(iConfig.exists("userData"))
useUserData_(iConfig.exists("userData")),
PUPPIIsolation_charged_hadrons_(consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"))),
PUPPIIsolation_neutral_hadrons_(consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"))),
PUPPIIsolation_photons_(consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons")))
{
// initialize the configurables
photonToken_ = consumes<edm::View<reco::Photon> >(iConfig.getParameter<edm::InputTag>("photonSource"));
Expand Down Expand Up @@ -187,6 +190,14 @@ void PATPhotonProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSe
}
}

//value maps for puppi isolation
edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);

// loop over photons
std::vector<Photon> * PATPhotons = new std::vector<Photon>();
for (edm::View<reco::Photon>::const_iterator itPhoton = photons->begin(); itPhoton != photons->end(); itPhoton++) {
Expand All @@ -195,6 +206,7 @@ void PATPhotonProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSe
edm::RefToBase<reco::Photon> photonRef = photons->refAt(idx);
edm::Ptr<reco::Photon> photonPtr = photons->ptrAt(idx);
Photon aPhoton(photonRef);
auto phoPtr = photons -> ptrAt(idx);
if (embedSuperCluster_) aPhoton.embedSuperCluster();
if (embedSeedCluster_) aPhoton.embedSeedCluster();
if (embedBasicClusters_) aPhoton.embedBasicClusters();
Expand Down Expand Up @@ -351,6 +363,7 @@ void PATPhotonProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSe
aPhoton.setCryEta( ecalRegData.seedCrysEtaOrX() );
aPhoton.setIEta( ecalRegData.seedCrysIEtaOrIX() );
aPhoton.setIPhi( ecalRegData.seedCrysIPhiOrIY() );
aPhoton.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[phoPtr], (*PUPPIIsolation_neutral_hadrons)[phoPtr], (*PUPPIIsolation_photons)[phoPtr]);

// Get PFCluster Isolation
if (addPFClusterIso_) {
Expand Down Expand Up @@ -461,6 +474,10 @@ void PATPhotonProducer::fillDescriptions(edm::ConfigurationDescriptions & descri
edm::ParameterSetDescription userDataPSet;
PATUserDataHelper<Photon>::fillDescription(userDataPSet);
iDesc.addOptional("userData", userDataPSet);
// isolation sums for PUPPI
iDesc.add<edm::InputTag>("puppiIsolationChargedHadrons", edm::InputTag("egmElectronIsolationAODPUPPI","h+-DR030-BarVeto000-EndVeto001"))->setComment("puppi isolation sum for charged hadrons");
iDesc.add<edm::InputTag>("puppiIsolationNeutralHadrons", edm::InputTag("egmElectronIsolationAODPUPPI","h0-DR030-BarVeto000-EndVeto000"))->setComment("puppi isolation sum for neutral hadrons");
iDesc.add<edm::InputTag>("puppiIsolationPhotons", edm::InputTag("egmElectronIsolationAODPUPPI","gamma-DR030-BarVeto000-EndVeto008"))->setComment("puppi isolation sum for photons");

edm::ParameterSetDescription isolationPSet;
isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
Expand Down
4 changes: 4 additions & 0 deletions PhysicsTools/PatAlgos/plugins/PATPhotonProducer.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ namespace pat {
std::vector<edm::EDGetTokenT<edm::ValueMap<Bool_t> > > photIDTokens_;

bool useUserData_;
//PUPPI isolation tokens
edm::EDGetTokenT<edm::ValueMap<float> > PUPPIIsolation_charged_hadrons_;
edm::EDGetTokenT<edm::ValueMap<float> > PUPPIIsolation_neutral_hadrons_;
edm::EDGetTokenT<edm::ValueMap<float> > PUPPIIsolation_photons_;
pat::PATUserDataHelper<pat::Photon> userDataHelper_;

const CaloTopology * ecalTopology_;
Expand Down
Loading