Skip to content

Commit

Permalink
Store energy fractions for gammas, and then use to build pat::taus on…
Browse files Browse the repository at this point in the history
… top of MiniAOD
  • Loading branch information
mbluj committed Aug 12, 2020
1 parent 37a05c6 commit 0d4f18f
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 44 deletions.
1 change: 1 addition & 0 deletions PhysicsTools/PatAlgos/plugins/BuildFile.xml
Expand Up @@ -35,5 +35,6 @@
<use name="RecoMET/METAlgorithms"/>
<use name="RecoTracker/DeDx"/>
<use name="TrackingTools/IPTools"/>
<use name="RecoTauTag/RecoTau"/>
<use name="root"/>
</library>
Expand Up @@ -347,7 +347,7 @@ void pat::PATPackedCandidateProducer::produce(edm::StreamID, edm::Event &iEvent,

if (abs(cand.pdgId()) == 1 || abs(cand.pdgId()) == 130) {
outPtrP->back().setHcalFraction(cand.hcalEnergy() / (cand.ecalEnergy() + cand.hcalEnergy()));
} else if (cand.charge() && cand.pt() > 0.5) {
} else if ((cand.charge() || abs(cand.pdgId()) == 22) && cand.pt() > 0.5) {
outPtrP->back().setHcalFraction(cand.hcalEnergy() / (cand.ecalEnergy() + cand.hcalEnergy()));
outPtrP->back().setCaloFraction((cand.hcalEnergy() + cand.ecalEnergy()) / cand.energy());
} else {
Expand Down
131 changes: 88 additions & 43 deletions PhysicsTools/PatAlgos/plugins/PATTauProducer.cc
Expand Up @@ -191,6 +191,8 @@ void PATTauProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
return;
}

posAtECalEntranceComputer_.beginEvent(iSetup);

if (isolator_.enabled())
isolator_.beginEvent(iEvent, iSetup);

Expand Down Expand Up @@ -508,42 +510,59 @@ void PATTauProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
float leadChargedCandEtaAtEcalEntrance = -99;
const std::vector<reco::CandidatePtr>& signalCands = pfTauRef->signalCands();
for (const auto& it : signalCands) {
const reco::PFCandidate* icand = dynamic_cast<const reco::PFCandidate*>(it.get());
if (icand != nullptr) {
ecalEnergy += icand->ecalEnergy();
hcalEnergy += icand->hcalEnergy();
sumPhiTimesEnergy += icand->positionAtECALEntrance().phi() * icand->energy();
sumEtaTimesEnergy += icand->positionAtECALEntrance().eta() * icand->energy();
sumEnergy += icand->energy();
const reco::PFCandidate* ipfcand = dynamic_cast<const reco::PFCandidate*>(it.get());
if (ipfcand != nullptr) {
ecalEnergy += ipfcand->ecalEnergy();
hcalEnergy += ipfcand->hcalEnergy();
sumPhiTimesEnergy += ipfcand->positionAtECALEntrance().phi() * ipfcand->energy();
sumEtaTimesEnergy += ipfcand->positionAtECALEntrance().eta() * ipfcand->energy();
sumEnergy += ipfcand->energy();
const reco::Track* track = nullptr;
if (icand->trackRef().isNonnull())
track = icand->trackRef().get();
else if (icand->muonRef().isNonnull() && icand->muonRef()->innerTrack().isNonnull())
track = icand->muonRef()->innerTrack().get();
else if (icand->muonRef().isNonnull() && icand->muonRef()->globalTrack().isNonnull())
track = icand->muonRef()->globalTrack().get();
else if (icand->muonRef().isNonnull() && icand->muonRef()->outerTrack().isNonnull())
track = icand->muonRef()->outerTrack().get();
else if (icand->gsfTrackRef().isNonnull())
track = icand->gsfTrackRef().get();
if (ipfcand->trackRef().isNonnull())
track = ipfcand->trackRef().get();
else if (ipfcand->muonRef().isNonnull() && ipfcand->muonRef()->innerTrack().isNonnull())
track = ipfcand->muonRef()->innerTrack().get();
else if (ipfcand->muonRef().isNonnull() && ipfcand->muonRef()->globalTrack().isNonnull())
track = ipfcand->muonRef()->globalTrack().get();
else if (ipfcand->muonRef().isNonnull() && ipfcand->muonRef()->outerTrack().isNonnull())
track = ipfcand->muonRef()->outerTrack().get();
else if (ipfcand->gsfTrackRef().isNonnull())
track = ipfcand->gsfTrackRef().get();
if (track) {
if (track->pt() > leadChargedCandPt) {
leadChargedCandEtaAtEcalEntrance = icand->positionAtECALEntrance().eta();
leadChargedCandEtaAtEcalEntrance = ipfcand->positionAtECALEntrance().eta();
leadChargedCandPt = track->pt();
}
}
} else {
// TauReco@MiniAOD: individual ECAL and HCAL energies currently not available for PackedCandidates
// (see above implementation for PFCandidates).
// Should be added if available, as well as on-the-fly computation of position at ECAL entrance
sumEnergy += it->energy();
const reco::Track* track = it->bestTrack();
if (track != nullptr) {
if (track->pt() > leadChargedCandPt) {
leadChargedCandPt = track->pt();
}
}
}
// TauReco@MiniAOD: individual ECAL and HCAL energies recovered from fractions,
// and position at ECAL entrance computed on-the-fly
const pat::PackedCandidate* ipatcand = dynamic_cast<const pat::PackedCandidate*>(it.get());
if (ipatcand != nullptr) {
ecalEnergy += ipatcand->caloFraction() * ipatcand->energy()
* (1. - ipatcand->hcalFraction());
hcalEnergy += ipatcand->caloFraction() * ipatcand->energy()
* ipatcand->hcalFraction();
double posAtECal_phi = ipatcand->phi();
double posAtECal_eta = ipatcand->eta();
bool success = false;
reco::Candidate::Point posAtECalEntrance = posAtECalEntranceComputer_(ipatcand, success);
if (success) {
posAtECal_phi = posAtECalEntrance.phi();
posAtECal_eta = posAtECalEntrance.eta();
}
sumPhiTimesEnergy += posAtECal_phi * ipatcand->energy();
sumEtaTimesEnergy += posAtECal_eta * ipatcand->energy();
sumEnergy += ipatcand->energy();
const reco::Track* track = ipatcand->bestTrack();
if (track != nullptr) {
if (track->pt() > leadChargedCandPt) {
leadChargedCandEtaAtEcalEntrance = posAtECal_eta;
leadChargedCandPt = track->pt();
}
}
}
}
}
aTauPFEssential.ecalEnergy_ = ecalEnergy;
aTauPFEssential.hcalEnergy_ = hcalEnergy;
Expand Down Expand Up @@ -571,26 +590,52 @@ void PATTauProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
reco::TrackRef trackRef = pfCandPtr->trackRef();
if (trackRef.isNonnull()) {
leadingTrackNormChi2 = trackRef->normalizedChi2();
for (const auto& isoPFCand : pfTauRef->isolationPFCands()) {
myHCALenergy += isoPFCand->hcalEnergy();
myECALenergy += isoPFCand->ecalEnergy();
}
for (const auto& signalPFCand : pfTauRef->signalPFCands()) {
myHCALenergy += signalPFCand->hcalEnergy();
myECALenergy += signalPFCand->ecalEnergy();
}
if (myHCALenergy + myECALenergy != 0.) {
emFraction = myECALenergy / (myHCALenergy + myECALenergy);
}
}
}
for (const auto& isoPFCand : pfTauRef->isolationPFCands()) {
myHCALenergy += isoPFCand->hcalEnergy();
myECALenergy += isoPFCand->ecalEnergy();
}
for (const auto& signalPFCand : pfTauRef->signalPFCands()) {
myHCALenergy += signalPFCand->hcalEnergy();
myECALenergy += signalPFCand->ecalEnergy();
}
if (myHCALenergy + myECALenergy != 0.) {
emFraction = myECALenergy / (myHCALenergy + myECALenergy);
}
} else {
const pat::PackedCandidate* packedCandPtr = dynamic_cast<const pat::PackedCandidate*>(leadingPFCharged.get());
if (packedCandPtr != nullptr) {
// TauReco@MiniAOD: Update code below if ecal/hcal energies are available.
const reco::Track* track = packedCandPtr->hasTrackDetails() ? &packedCandPtr->pseudoTrack() : nullptr;
// TauReco@MiniAOD: individual ECAL and HCAL energies recovered from fractions,
// and position at ECAL entrance computed on-the-fly
ecalEnergyLeadChargedHadrCand = packedCandPtr->caloFraction() * packedCandPtr->energy()
* (1. - packedCandPtr->hcalFraction());
hcalEnergyLeadChargedHadrCand = packedCandPtr->caloFraction() * packedCandPtr->energy()
* packedCandPtr->hcalFraction();
const reco::Track* track = packedCandPtr->bestTrack();
if (track != nullptr) {
leadingTrackNormChi2 = track->normalizedChi2();
}
for (const auto& isoCand : pfTauRef->isolationCands()) {
//can safely use static_cast as it is ensured that this PFTau is
//built with packedCands as its leadingCanidate
const pat::PackedCandidate* isoPackedCand = static_cast<const pat::PackedCandidate*>(isoCand.get());
myHCALenergy += isoPackedCand->caloFraction() * isoPackedCand->energy()
* isoPackedCand->hcalFraction();
myECALenergy += isoPackedCand->caloFraction() * isoPackedCand->energy()
* (1. - isoPackedCand->hcalFraction());
}
for (const auto& signalCand : pfTauRef->signalCands()) {
//can safely use static_cast as it is ensured that this PFTau is
//built with packedCands as its leadingCanidate
const pat::PackedCandidate* sigPackedCand = static_cast<const pat::PackedCandidate*>(signalCand.get());
myHCALenergy += sigPackedCand->caloFraction() * sigPackedCand->energy()
* sigPackedCand->hcalFraction();
myECALenergy += sigPackedCand->caloFraction() * sigPackedCand->energy()
* (1. - sigPackedCand->hcalFraction());
}
if (myHCALenergy + myECALenergy != 0.) {
emFraction = myECALenergy / (myHCALenergy + myECALenergy);
}
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions PhysicsTools/PatAlgos/plugins/PATTauProducer.h
Expand Up @@ -40,6 +40,8 @@
#include "DataFormats/TauReco/interface/PFTauTransverseImpactParameterFwd.h"
#include "PhysicsTools/PatAlgos/interface/PATUserDataMerger.h"

#include "RecoTauTag/RecoTau/interface/PositionAtECalEntranceComputer.h"

#include <string>

typedef edm::AssociationVector<reco::PFTauRefProd, std::vector<reco::PFTauTransverseImpactParameterRef> >
Expand Down Expand Up @@ -125,6 +127,8 @@ namespace pat {
size_t,
const edm::Handle<reco::TauDiscriminatorContainer>&,
int);

PositionAtECalEntranceComputer posAtECalEntranceComputer_;
};

} // namespace pat
Expand Down

0 comments on commit 0d4f18f

Please sign in to comment.