Skip to content

Commit

Permalink
Merge pull request #30571 from cms-tau-pog/CMSSW_11_2_X_tau-pog_tauAt…
Browse files Browse the repository at this point in the history
…MiniUpdate

Updates for TauReco at miniAOD
  • Loading branch information
cmsbuild committed Aug 25, 2020
2 parents 9251cd8 + 7b7ad32 commit 5462bd1
Show file tree
Hide file tree
Showing 9 changed files with 288 additions and 124 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>
4 changes: 2 additions & 2 deletions PhysicsTools/PatAlgos/plugins/PATPackedCandidateProducer.cc
Expand Up @@ -144,7 +144,7 @@ pat::PATPackedCandidateProducer::PATPackedCandidateProducer(const edm::Parameter
: edm::EDGetTokenT<edm::ValueMap<float>>()) {
std::vector<edm::InputTag> sv_tags =
iConfig.getParameter<std::vector<edm::InputTag>>("secondaryVerticesForWhiteList");
for (auto itag : sv_tags) {
for (const auto &itag : sv_tags) {
SVWhiteLists_.push_back(consumes<edm::View<reco::Candidate>>(itag));
}

Expand Down 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
97 changes: 69 additions & 28 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,39 +510,54 @@ 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();
}
}
}
}
Expand Down Expand Up @@ -586,10 +603,34 @@ void PATTauProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
} 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
54 changes: 43 additions & 11 deletions RecoTauTag/Configuration/python/tools/adaptToRunAtMiniAOD.py
Expand Up @@ -151,15 +151,14 @@ def adaptTauToMiniAODReReco(process, reclusterJets=True):
# Remove RecoTau producers which are not supported (yet?), i.e. against-e/mu discriminats
for moduleName in process.TauReco.moduleNames():
if 'ElectronRejection' in moduleName or 'MuonRejection' in moduleName:
if 'ByDeadECALElectronRejection' in moduleName: continue
process.miniAODTausTask.remove(getattr(process, moduleName))

# Instead add against-mu discriminants which are MiniAOD compatible
from RecoTauTag.RecoTau.hpsPFTauDiscriminationByAMuonRejectionSimple_cff import hpsPFTauDiscriminationByLooseMuonRejectionSimple, hpsPFTauDiscriminationByTightMuonRejectionSimple
from RecoTauTag.RecoTau.hpsPFTauDiscriminationByMuonRejectionSimple_cff import hpsPFTauDiscriminationByMuonRejectionSimple

process.hpsPFTauDiscriminationByLooseMuonRejectionSimple = hpsPFTauDiscriminationByLooseMuonRejectionSimple
process.hpsPFTauDiscriminationByTightMuonRejectionSimple = hpsPFTauDiscriminationByTightMuonRejectionSimple
process.miniAODTausTask.add(process.hpsPFTauDiscriminationByLooseMuonRejectionSimple)
process.miniAODTausTask.add(process.hpsPFTauDiscriminationByTightMuonRejectionSimple)
process.hpsPFTauDiscriminationByMuonRejectionSimple = hpsPFTauDiscriminationByMuonRejectionSimple
process.miniAODTausTask.add(process.hpsPFTauDiscriminationByMuonRejectionSimple)

#####
# PAT part in the following
Expand All @@ -170,11 +169,45 @@ def adaptTauToMiniAODReReco(process, reclusterJets=True):
# Remove unsupported tauIDs
for name, src in six.iteritems(process.patTaus.tauIDSources.parameters_()):
if name.find('againstElectron') > -1 or name.find('againstMuon') > -1:
if name.find('againstElectronDeadECAL') > -1: continue
delattr(process.patTaus.tauIDSources,name)
# Add MiniAOD specific ones
setattr(process.patTaus.tauIDSources,'againstMuonLooseSimple',cms.InputTag('hpsPFTauDiscriminationByLooseMuonRejectionSimple'))
setattr(process.patTaus.tauIDSources,'againstMuonTightSimple',cms.InputTag('hpsPFTauDiscriminationByTightMuonRejectionSimple'))

setattr(process.patTaus.tauIDSources,'againstMuonLooseSimple',
cms.PSet(inputTag = cms.InputTag('hpsPFTauDiscriminationByMuonRejectionSimple'),
provenanceConfigLabel = cms.string('IDWPdefinitions'),
idLabel = cms.string('ByLooseMuonRejectionSimple')
))
setattr(process.patTaus.tauIDSources,'againstMuonTightSimple',
cms.PSet(inputTag = cms.InputTag('hpsPFTauDiscriminationByMuonRejectionSimple'),
provenanceConfigLabel = cms.string('IDWPdefinitions'),
idLabel = cms.string('ByTightMuonRejectionSimple')
))

# Run TauIDs (anti-e && deepTau) on top of selectedPatTaus
_updatedTauName = 'selectedPatTausNewIDs'
_noUpdatedTauName = 'selectedPatTausNoNewIDs'
import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig
tauIdEmbedder = tauIdConfig.TauIDEmbedder(
process, debug = False,
updatedTauName = _updatedTauName,
toKeep = ['againstEle2018','deepTau2017v2p1']
)
tauIdEmbedder.runTauID()
setattr(process, _noUpdatedTauName, process.selectedPatTaus.clone())
process.miniAODTausTask.add(getattr(process,_noUpdatedTauName))
delattr(process, 'selectedPatTaus')
process.deepTau2017v2p1.taus = _noUpdatedTauName
process.patTauDiscriminationByElectronRejectionMVA62018Raw.PATTauProducer = _noUpdatedTauName
process.patTauDiscriminationByElectronRejectionMVA62018.PATTauProducer = _noUpdatedTauName
process.selectedPatTaus = getattr(process, _updatedTauName).clone(
src = _noUpdatedTauName
)
process.newTauIDsTask = cms.Task(
process.rerunMvaIsolationTask,
process.selectedPatTaus
)
process.miniAODTausTask.add(process.newTauIDsTask)

#print '[adaptTauToMiniAODReReco]: Done!'

#####
Expand All @@ -199,13 +232,12 @@ def setOutputModule(mode=0):
output.outputCommands.append('keep *_selectedPatTaus_*_*')
if mode==1:
for prod in evtContent.RecoTauTagAOD.outputCommands:
if prod.find('ElectronRejection') > -1:
if prod.find('ElectronRejection') > -1 and prod.find('DeadECAL') == -1:
continue
if prod.find('MuonRejection') > -1:
continue
output.outputCommands.append(prod)
output.outputCommands.append('keep *_hpsPFTauDiscriminationByLooseMuonRejectionSimple_*_*')
output.outputCommands.append('keep *_hpsPFTauDiscriminationByTightMuonRejectionSimple_*_*')
output.outputCommands.append('keep *_hpsPFTauDiscriminationByMuonRejectionSimple_*_*')
output.outputCommands.append('keep *_combinatoricReco*_*_*')
output.outputCommands.append('keep *_ak4PFJetsRecoTauChargedHadrons_*_*')
output.outputCommands.append('keep *_ak4PFJetsLegacyHPSPiZeros_*_*')
Expand Down

0 comments on commit 5462bd1

Please sign in to comment.