Skip to content

HLTTauDQM: support for PatTau ref objects #45648

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

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
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
3 changes: 3 additions & 0 deletions DQMOffline/Trigger/interface/HLTTauRefProducer.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "DataFormats/TauReco/interface/PFTau.h"
#include "DataFormats/TauReco/interface/PFTauDiscriminator.h"
#include "DataFormats/TauReco/interface/TauDiscriminatorContainer.h"
#include "DataFormats/PatCandidates/interface/Tau.h"

// ELECTRON includes
#include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
Expand Down Expand Up @@ -71,10 +72,12 @@ class HLTTauRefProducer : public edm::global::EDProducer<edm::StreamCache<TauIDC
edm::EDGetTokenT<reco::PFTauCollection> PFTaus_;
std::vector<edm::EDGetTokenT<reco::PFTauDiscriminator>> PFTauDis_;
std::vector<edm::EDGetTokenT<reco::TauDiscriminatorContainer>> PFTauDisCont_;
edm::EDGetTokenT<edm::View<pat::Tau>> PATTaus_;
std::vector<std::string> PFTauDisContWPs_;
edm::ProcessHistoryID phID_;
bool doPFTaus_;
double ptMinPFTau_, etaMinPFTau_, etaMaxPFTau_, phiMinPFTau_, phiMaxPFTau_;
std::vector<std::string> discriminatorNames;

edm::EDGetTokenT<reco::GsfElectronCollection> Electrons_;
bool doElectrons_;
Expand Down
150 changes: 84 additions & 66 deletions DQMOffline/Trigger/plugins/HLTTauRefProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ HLTTauRefProducer::HLTTauRefProducer(const edm::ParameterSet& iConfig) {
//One Parameter Set per Collection
{
auto const& pfTau = iConfig.getUntrackedParameter<edm::ParameterSet>("PFTaus");
PFTaus_ = consumes<reco::PFTauCollection>(pfTau.getUntrackedParameter<InputTag>("PFTauProducer"));
PFTaus_ = consumes<reco::PFTauCollection>(pfTau.getUntrackedParameter<InputTag>("PFTauProducer", InputTag()));
PATTaus_ = consumes<edm::View<pat::Tau>>(pfTau.getUntrackedParameter<InputTag>("PatTauProducer", InputTag()));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as discussed by e-mail, this line triggers the execution of process.patTaus = cms.EDProducer("PATTauProducer,..., which in turn is configured as:

patTaus = cms.EDProducer("PATTauProducer",
# input
tauSource = cms.InputTag("hpsPFTauProducer"),

Now, since in cosmics workflows hpsPFTauProducer is not executed and this try/ catch construct doesn't work (as it was presumably originally intended), it leads to the runtime exception observed in the PR tests:

try {
iEvent.getByToken(baseTauToken_, anyTaus);
} catch (const edm::Exception& e) {
edm::LogWarning("DataSource") << "WARNING! No Tau collection found. This missing input will not block the job. "
"Instead, an empty tau collection is being be produced.";
auto patTaus = std::make_unique<std::vector<Tau>>();
iEvent.put(std::move(patTaus));
return;
}

For my own understanding @cms-sw/core-l2 can you confirm the right way to go about this is just to do:

diff --git a/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc b/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc
index 98732a53696..9ee4c700ae6 100644
--- a/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc
+++ b/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc
@@ -287,9 +287,7 @@ void PATTauProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
 
   // Get the collection of taus from the event
   edm::Handle<edm::View<reco::BaseTau>> anyTaus;
-  try {
-    iEvent.getByToken(baseTauToken_, anyTaus);
-  } catch (const edm::Exception& e) {
+  if(!iEvent.getByToken(baseTauToken_, anyTaus)){
     edm::LogWarning("DataSource") << "WARNING! No Tau collection found. This missing input will not block the job. "
                                      "Instead, an empty tau collection is being be produced.";
     auto patTaus = std::make_unique<std::vector<Tau>>();

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if iEvent.getBy*() has ever thrown an exception for a missing data product. The right way would indeed be to either check the return value of getByToken()

if(!iEvent.getByToken(baseTauToken_, anyTaus)) {

or check the handle, e.g. along

auto anyTaus = iEvent.getHandle(baseTauToken_);
if (not anyTaus) {

or

auto anyTaus = iEvent.getHandle(baseTauToken_);
if (not anyTaus.isValid()) {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@slehti can you follow-up with one of the suggestions above?

auto discs = pfTau.getUntrackedParameter<vector<InputTag>>("PFTauDiscriminators");
auto discConts = pfTau.getUntrackedParameter<vector<InputTag>>("PFTauDiscriminatorContainers");
PFTauDisContWPs_ = pfTau.getUntrackedParameter<vector<std::string>>("PFTauDiscriminatorContainerWPs");
Expand All @@ -39,6 +40,7 @@ HLTTauRefProducer::HLTTauRefProducer(const edm::ParameterSet& iConfig) {
"PFTauDiscriminatorContainerWPs must have the same number of entries!\n";
for (auto const& tag : discs) {
PFTauDis_.push_back(consumes<reco::PFTauDiscriminator>(tag));
discriminatorNames.push_back(tag.label());
}
for (auto const& tag : discConts) {
PFTauDisCont_.push_back(consumes<reco::TauDiscriminatorContainer>(tag));
Expand Down Expand Up @@ -138,85 +140,101 @@ void HLTTauRefProducer::produce(edm::StreamID iID, edm::Event& iEvent, edm::Even
void HLTTauRefProducer::doPFTaus(edm::StreamID iID, edm::Event& iEvent) const {
auto product_PFTaus = make_unique<LorentzVectorCollection>();

edm::Handle<PFTauCollection> pftaus;
if (iEvent.getByToken(PFTaus_, pftaus)) {
// Retrieve ID container indices if config history changes, in particular for the first event.
if (streamCache(iID)->first != iEvent.processHistoryID()) {
streamCache(iID)->first = iEvent.processHistoryID();
streamCache(iID)->second.resize(PFTauDisContWPs_.size());
for (size_t i = 0; i < PFTauDisCont_.size(); ++i) {
auto const aHandle = iEvent.getHandle(PFTauDisCont_[i]);
auto const aProv = aHandle.provenance();
if (aProv == nullptr)
aHandle.whyFailed()->raise();
const auto& psetsFromProvenance = edm::parameterSet(aProv->stable(), iEvent.processHistory());
if (psetsFromProvenance.exists("workingPoints")) {
auto const idlist = psetsFromProvenance.getParameter<std::vector<std::string>>("workingPoints");
bool found = false;
for (size_t j = 0; j < idlist.size(); ++j) {
if (PFTauDisContWPs_[i] == idlist[j]) {
found = true;
streamCache(iID)->second[i] = j;
edm::Handle<edm::View<pat::Tau>> pattaus;
if (iEvent.getByToken(PATTaus_, pattaus)) {
bool passAll{true};
for (unsigned int i = 0; i < pattaus->size(); ++i) {
auto const& tau = (*pattaus)[i];
if (tau.pt() > ptMinPFTau_ && tau.eta() > etaMinPFTau_ && tau.eta() < etaMaxPFTau_ && tau.phi() > phiMinPFTau_ &&
tau.phi() < phiMaxPFTau_) {
for (auto const& discriminatorName : discriminatorNames) {
passAll = passAll && tau.tauID(discriminatorName);
}
}
if (passAll)
product_PFTaus->emplace_back(tau.px(), tau.py(), tau.pz(), tau.energy());
}
} else {
edm::Handle<PFTauCollection> pftaus;
if (iEvent.getByToken(PFTaus_, pftaus)) {
// Retrieve ID container indices if config history changes, in particular for the first event.
if (streamCache(iID)->first != iEvent.processHistoryID()) {
streamCache(iID)->first = iEvent.processHistoryID();
streamCache(iID)->second.resize(PFTauDisContWPs_.size());
for (size_t i = 0; i < PFTauDisCont_.size(); ++i) {
auto const aHandle = iEvent.getHandle(PFTauDisCont_[i]);
auto const aProv = aHandle.provenance();
if (aProv == nullptr)
aHandle.whyFailed()->raise();
const auto& psetsFromProvenance = edm::parameterSet(aProv->stable(), iEvent.processHistory());
if (psetsFromProvenance.exists("workingPoints")) {
auto const idlist = psetsFromProvenance.getParameter<std::vector<std::string>>("workingPoints");
bool found = false;
for (size_t j = 0; j < idlist.size(); ++j) {
if (PFTauDisContWPs_[i] == idlist[j]) {
found = true;
streamCache(iID)->second[i] = j;
}
}
}
if (!found)
throw cms::Exception("Configuration")
<< "HLTTauRefProducer: Requested working point '" << PFTauDisContWPs_[i] << "' not found!\n";
} else if (psetsFromProvenance.exists("IDWPdefinitions")) {
auto const idlist = psetsFromProvenance.getParameter<std::vector<edm::ParameterSet>>("IDWPdefinitions");
bool found = false;
for (size_t j = 0; j < idlist.size(); ++j) {
if (PFTauDisContWPs_[i] == idlist[j].getParameter<std::string>("IDname")) {
found = true;
streamCache(iID)->second[i] = j;
if (!found)
throw cms::Exception("Configuration")
<< "HLTTauRefProducer: Requested working point '" << PFTauDisContWPs_[i] << "' not found!\n";
} else if (psetsFromProvenance.exists("IDWPdefinitions")) {
auto const idlist = psetsFromProvenance.getParameter<std::vector<edm::ParameterSet>>("IDWPdefinitions");
bool found = false;
for (size_t j = 0; j < idlist.size(); ++j) {
if (PFTauDisContWPs_[i] == idlist[j].getParameter<std::string>("IDname")) {
found = true;
streamCache(iID)->second[i] = j;
}
}
}
if (!found)
if (!found)
throw cms::Exception("Configuration")
<< "HLTTauRefProducer: Requested working point '" << PFTauDisContWPs_[i] << "' not found!\n";
} else
throw cms::Exception("Configuration")
<< "HLTTauRefProducer: Requested working point '" << PFTauDisContWPs_[i] << "' not found!\n";
} else
throw cms::Exception("Configuration")
<< "HLTTauRefProducer: No suitable ID list found in provenace config!\n";
<< "HLTTauRefProducer: No suitable ID list found in provenace config!\n";
}
}
}
for (unsigned int i = 0; i < pftaus->size(); ++i) {
auto const& pftau = (*pftaus)[i];
if (pftau.pt() > ptMinPFTau_ && pftau.eta() > etaMinPFTau_ && pftau.eta() < etaMaxPFTau_ &&
pftau.phi() > phiMinPFTau_ && pftau.phi() < phiMaxPFTau_) {
reco::PFTauRef thePFTau{pftaus, i};
bool passAll{true};
for (unsigned int i = 0; i < pftaus->size(); ++i) {
auto const& pftau = (*pftaus)[i];
if (pftau.pt() > ptMinPFTau_ && pftau.eta() > etaMinPFTau_ && pftau.eta() < etaMaxPFTau_ &&
pftau.phi() > phiMinPFTau_ && pftau.phi() < phiMaxPFTau_) {
reco::PFTauRef thePFTau{pftaus, i};
bool passAll{true};

for (auto const& token : PFTauDis_) {
edm::Handle<reco::PFTauDiscriminator> pftaudis;
if (iEvent.getByToken(token, pftaudis)) {
if ((*pftaudis)[thePFTau] < 0.5) {
for (auto const& token : PFTauDis_) {
edm::Handle<reco::PFTauDiscriminator> pftaudis;
if (iEvent.getByToken(token, pftaudis)) {
if ((*pftaudis)[thePFTau] < 0.5) {
passAll = false;
break;
}
} else {
passAll = false;
break;
}
} else {
passAll = false;
break;
}
}

int idx = 0;
for (auto const& token : PFTauDisCont_) {
edm::Handle<reco::TauDiscriminatorContainer> pftaudis;
if (iEvent.getByToken(token, pftaudis)) {
//WP vector not filled if prediscriminator in RecoTauDiscriminator failed.
if ((*pftaudis)[thePFTau].workingPoints.empty() ||
!(*pftaudis)[thePFTau].workingPoints.at(streamCache(iID)->second[idx])) {
int idx = 0;
for (auto const& token : PFTauDisCont_) {
edm::Handle<reco::TauDiscriminatorContainer> pftaudis;
if (iEvent.getByToken(token, pftaudis)) {
//WP vector not filled if prediscriminator in RecoTauDiscriminator failed.
if ((*pftaudis)[thePFTau].workingPoints.empty() ||
!(*pftaudis)[thePFTau].workingPoints.at(streamCache(iID)->second[idx])) {
passAll = false;
break;
}
} else {
passAll = false;
break;
}
} else {
passAll = false;
break;
idx++;
}
if (passAll) {
product_PFTaus->emplace_back(pftau.px(), pftau.py(), pftau.pz(), pftau.energy());
}
idx++;
}
if (passAll) {
product_PFTaus->emplace_back(pftau.px(), pftau.py(), pftau.pz(), pftau.energy());
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions DQMOffline/Trigger/python/HLTTauDQMOfflineTauProducer_cfi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from PhysicsTools.PatAlgos.producersLayer1.tauProducer_cfi import *
patTaus.addGenMatch = cms.bool(False)
patTaus.embedGenMatch = cms.bool(False)
patTaus.addGenJetMatch = cms.bool(False)
patTaus.embedGenJetMatch = cms.bool(False)

from Configuration.StandardSequences.MagneticField_cff import *

patAlgosToolsTask = cms.Task()
patAlgosToolsTask.add(patTaus)

HLTTauDQMOfflineTauProducer = cms.Sequence(patAlgosToolsTask)
7 changes: 6 additions & 1 deletion DQMOffline/Trigger/python/HLTTauDQMOffline_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@
from DQMOffline.Trigger.HLTTauQualityTester_cfi import *
from DQMOffline.Trigger.HLTTauCertifier_cfi import *

HLTTauDQMOffline = cms.Sequence(TauRefProducer
from DQMOffline.Trigger.HLTTauDQMOfflineTauProducer_cfi import *


HLTTauDQMOffline = cms.Sequence(HLTTauDQMOfflineTauProducer+TauRefProducer+TauRefProducerLowPurity
+hltTauOfflineMonitor_PFTaus
+hltTauOfflineMonitor_PFTausLowPurity
+hltTauOfflineMonitor_PNetTaus
+hltTauOfflineMonitor_PNetTausLowPurity
+hltTauOfflineMonitor_Inclusive
+hltTauOfflineMonitor_TagAndProbe
)
Expand Down
55 changes: 53 additions & 2 deletions DQMOffline/Trigger/python/HLTTauDQMOffline_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,18 @@
PFTauDiscriminatorContainers = cms.untracked.VInputTag(),
PFTauDiscriminatorContainerWPs = cms.untracked.vstring(),
PFTauDiscriminators = cms.untracked.VInputTag(
cms.InputTag("hpsPFTauDiscriminationByDecayModeFinding")
#cms.InputTag("hpsPFTauDiscriminationByDecayModeFinding")
cms.InputTag("decayModeFindingNewDMs"),
cms.InputTag("byMediumCombinedIsolationDeltaBetaCorr3Hits")
),
doPFTaus = cms.untracked.bool(True),
ptMin = cms.untracked.double(15.0),
etaMin = cms.untracked.double(-2.5),
etaMax = cms.untracked.double(2.5),
phiMin = cms.untracked.double(-3.15),
phiMax = cms.untracked.double(3.15),
PFTauProducer = cms.untracked.InputTag("hpsPFTauProducer")
#PFTauProducer = cms.untracked.InputTag("hpsPFTauProducer")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this commented out line really needed, if not please remove

PatTauProducer = cms.untracked.InputTag("patTaus")
),
Electrons = cms.untracked.PSet(
ElectronCollection = cms.untracked.InputTag("gedGsfElectrons"),
Expand Down Expand Up @@ -70,6 +73,24 @@
PhiMax = cms.untracked.double(3.15)
)

TauRefProducerLowPurity = TauRefProducer.clone(
PFTaus = cms.untracked.PSet(
PFTauDiscriminatorContainers = cms.untracked.VInputTag(),
PFTauDiscriminatorContainerWPs = cms.untracked.vstring(),
PFTauDiscriminators = cms.untracked.VInputTag(
cms.InputTag("decayModeFindingNewDMs"),
),
doPFTaus = cms.untracked.bool(True),
ptMin = cms.untracked.double(15.0),
etaMin = cms.untracked.double(-2.5),
etaMax = cms.untracked.double(2.5),
phiMin = cms.untracked.double(-3.15),
phiMax = cms.untracked.double(3.15),
#PFTauProducer = cms.untracked.InputTag("hpsPFTauProducer")
PatTauProducer = cms.untracked.InputTag("patTaus")
)
)

#----------------------------------MONITORS--------------------------------------------------------------------------
kEverything = 0
kVital = 1
Expand Down Expand Up @@ -129,6 +150,36 @@
)
)

hltTauOfflineMonitor_PFTausLowPurity = hltTauOfflineMonitor_PFTaus.clone(
DQMBaseFolder = cms.untracked.string("HLT/TAU/PFTausLowPurity"),
Matching = cms.PSet(
doMatching = cms.untracked.bool(True),
matchFilters = cms.untracked.VPSet(
cms.untracked.PSet(
FilterName = cms.untracked.InputTag("TauRefProducerLowPurity","PFTaus"),
matchObjectID = cms.untracked.int32(15),
),
cms.untracked.PSet(
FilterName = cms.untracked.InputTag("TauRefProducerLowPurity","Electrons"),
matchObjectID = cms.untracked.int32(11),
),
cms.untracked.PSet(
FilterName = cms.untracked.InputTag("TauRefProducerLowPurity","Muons"),
matchObjectID = cms.untracked.int32(13),
),
cms.untracked.PSet(
FilterName = cms.untracked.InputTag("TauRefProducerLowPurity","MET"),
matchObjectID = cms.untracked.int32(0),
),
),
),
)

hltTauOfflineMonitor_PNetTausLowPurity = hltTauOfflineMonitor_PFTausLowPurity.clone(
DQMBaseFolder = cms.untracked.string("HLT/TAU/PNetTausLowPurity"),
Paths = cms.untracked.string("PNetTauh")
)

def TriggerSelectionParameters(hltpaths):
genericTriggerSelectionParameters = cms.PSet(
andOr = cms.bool( False ),#specifies the logical combination of the single filters' (L1, HLT and DCS) decisions at top level (True=OR)
Expand Down
5 changes: 5 additions & 0 deletions DQMOffline/Trigger/python/HLTTauPostProcessor_cfi.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,14 @@ def _addEfficiencies(level, quantities, nameFormat, titleObject="#tau", postfix=
(HLTTauPostAnalysisPNetTaus, HLTTauPostAnalysisPNetTaus2) = makePFTauAnalyzer(hltTauOfflineMonitor_PNetTaus)
(HLTTauPostAnalysisTP, HLTTauPostAnalysisTP2) = makePFTauAnalyzer(hltTauOfflineMonitor_TagAndProbe)

(HLTTauPostAnalysisPFTausLowPurity, HLTTauPostAnalysisPFTausLowPurity2) = makePFTauAnalyzer(hltTauOfflineMonitor_PFTausLowPurity)
(HLTTauPostAnalysisPNetTausLowPurity, HLTTauPostAnalysisPNetTausLowPurity2) = makePFTauAnalyzer(hltTauOfflineMonitor_PNetTausLowPurity)

HLTTauPostSeq = cms.Sequence(
HLTTauPostAnalysisInclusive+HLTTauPostAnalysisInclusive2+
HLTTauPostAnalysisPFTaus+HLTTauPostAnalysisPFTaus2+
HLTTauPostAnalysisPFTausLowPurity+HLTTauPostAnalysisPFTausLowPurity2+
HLTTauPostAnalysisPNetTaus+HLTTauPostAnalysisPNetTaus2+
HLTTauPostAnalysisPNetTausLowPurity+HLTTauPostAnalysisPNetTausLowPurity2+
HLTTauPostAnalysisTP+HLTTauPostAnalysisTP2
)
4 changes: 1 addition & 3 deletions PhysicsTools/PatAlgos/plugins/PATTauProducer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -287,9 +287,7 @@ void PATTauProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)

// Get the collection of taus from the event
edm::Handle<edm::View<reco::BaseTau>> anyTaus;
try {
iEvent.getByToken(baseTauToken_, anyTaus);
} catch (const edm::Exception& e) {
if (!iEvent.getByToken(baseTauToken_, anyTaus)) {
edm::LogWarning("DataSource") << "WARNING! No Tau collection found. This missing input will not block the job. "
"Instead, an empty tau collection is being be produced.";
auto patTaus = std::make_unique<std::vector<Tau>>();
Expand Down