From 869f5097eec9c02efe70e0665e9beb5f9080e995 Mon Sep 17 00:00:00 2001 From: anehrkor Date: Thu, 9 Feb 2017 10:12:33 +0100 Subject: [PATCH 1/3] Added PATTauIDEmbedder: tauId() function can now be used to access discriminators that were rerun during event processing --- .../PATTauDiscriminationByMVAIsolationRun2.cc | 1 - .../RecoTau/plugins/PATTauIDEmbedder.cc | 97 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 RecoTauTag/RecoTau/plugins/PATTauIDEmbedder.cc diff --git a/RecoTauTag/RecoTau/plugins/PATTauDiscriminationByMVAIsolationRun2.cc b/RecoTauTag/RecoTau/plugins/PATTauDiscriminationByMVAIsolationRun2.cc index a8ee0677fb233..03900e5f60f1e 100644 --- a/RecoTauTag/RecoTau/plugins/PATTauDiscriminationByMVAIsolationRun2.cc +++ b/RecoTauTag/RecoTau/plugins/PATTauDiscriminationByMVAIsolationRun2.cc @@ -15,7 +15,6 @@ // - TauPFEssential // - PFRecoTauDiscriminationByMVAIsolationRun2 // - Training of BDT -// todo 2: do we need/want to add PATTauIDEmbedder? #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h" diff --git a/RecoTauTag/RecoTau/plugins/PATTauIDEmbedder.cc b/RecoTauTag/RecoTau/plugins/PATTauIDEmbedder.cc new file mode 100644 index 0000000000000..9bc626f5d96f2 --- /dev/null +++ b/RecoTauTag/RecoTau/plugins/PATTauIDEmbedder.cc @@ -0,0 +1,97 @@ +#include "FWCore/Framework/interface/EDProducer.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Utilities/interface/InputTag.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "DataFormats/PatCandidates/interface/PATTauDiscriminator.h" +#include "DataFormats/PatCandidates/interface/Tau.h" +#include "FWCore/Utilities/interface/transform.h" + +class PATTauIDEmbedder : public edm::EDProducer +{ +public: + + explicit PATTauIDEmbedder(const edm::ParameterSet&); + ~PATTauIDEmbedder(){}; + + void produce(edm::Event&, const edm::EventSetup&); + +private: + +//--- configuration parameters + edm::EDGetTokenT src_; + typedef std::pair NameTag; + std::vector tauIDSrcs_; + std::vector > patTauIDTokens_; +}; + +PATTauIDEmbedder::PATTauIDEmbedder(const edm::ParameterSet& cfg) +{ + src_ = consumes(cfg.getParameter("src")); + // it might be a single tau ID + if (cfg.existsAs("tauIDSource")) { + tauIDSrcs_.push_back(NameTag("", cfg.getParameter("tauIDSource"))); + } + // or there might be many of them + if (cfg.existsAs("tauIDSources")) { + // please don't configure me twice + if (!tauIDSrcs_.empty()){ + throw cms::Exception("Configuration") << "PATTauProducer: you can't specify both 'tauIDSource' and 'tauIDSources'\n"; + } + // read the different tau ID names + edm::ParameterSet idps = cfg.getParameter("tauIDSources"); + std::vector names = idps.getParameterNamesForType(); + for (std::vector::const_iterator it = names.begin(), ed = names.end(); it != ed; ++it) { + tauIDSrcs_.push_back(NameTag(*it, idps.getParameter(*it))); + } + } + // but in any case at least once + if (tauIDSrcs_.empty()) throw cms::Exception("Configuration") << + "PATTauProducer: id addTauID is true, you must specify either:\n" << + "\tInputTag tauIDSource = \n" << "or\n" << + "\tPSet tauIDSources = { \n" << + "\t\tInputTag = // as many as you want \n " << + "\t}\n"; + patTauIDTokens_ = edm::vector_transform(tauIDSrcs_, [this](NameTag const & tag){return mayConsume(tag.second);}); + + produces(); +} + +void PATTauIDEmbedder::produce(edm::Event& evt, const edm::EventSetup& es) +{ + edm::Handle inputTaus; + evt.getByToken(src_, inputTaus); + + std::auto_ptr outputTaus(new pat::TauCollection()); + outputTaus->reserve(inputTaus->size()); + + int tau_idx = 0; + for(pat::TauCollection::const_iterator inputTau = inputTaus->begin(); inputTau != inputTaus->end(); ++inputTau, tau_idx++){ + pat::Tau outputTau(*inputTau); + pat::TauRef inputTauRef(inputTaus, tau_idx); + size_t nTauIds = inputTau->tauIDs().size(); + std::vector tauIds(nTauIds+tauIDSrcs_.size()); + + for(size_t i = 0; i < nTauIds; ++i){ + tauIds[i] = inputTau->tauIDs().at(i); + } + + for(size_t i = 0; i < tauIDSrcs_.size(); ++i){ + edm::Handle tauDiscr; + evt.getByToken(patTauIDTokens_[i], tauDiscr); + + tauIds[nTauIds+i].first = tauIDSrcs_[i].first; + tauIds[nTauIds+i].second = (*tauDiscr)[inputTauRef]; + } + + outputTau.setTauIDs(tauIds); + outputTaus->push_back(outputTau); + } + + evt.put(outputTaus); +} + +#include "FWCore/Framework/interface/MakerMacros.h" + +DEFINE_FWK_MODULE(PATTauIDEmbedder); + From 138c5e27398f7846c1f83c9f1bfdc21c66920aa9 Mon Sep 17 00:00:00 2001 From: anehrkor Date: Thu, 9 Feb 2017 10:13:56 +0100 Subject: [PATCH 2/3] Update testing class and script to make use of PATTauIDEmbedder --- .../test/rerunMVAIsolationOnMiniAOD.cc | 61 +++---------------- .../test/rerunMVAIsolationOnMiniAOD.py | 19 +++++- 2 files changed, 27 insertions(+), 53 deletions(-) diff --git a/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.cc b/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.cc index d23229af0272c..07532e1e2458e 100644 --- a/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.cc +++ b/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.cc @@ -75,14 +75,6 @@ class rerunMVAIsolationOnMiniAOD : public edm::one::EDAnalyzer tauToken_; - edm::EDGetTokenT mvaIsolationToken_; - edm::EDGetTokenT mvaIsolationVLooseToken_; - edm::EDGetTokenT mvaIsolationLooseToken_; - edm::EDGetTokenT mvaIsolationMediumToken_; - edm::EDGetTokenT mvaIsolationTightToken_; - edm::EDGetTokenT mvaIsolationVTightToken_; - edm::EDGetTokenT mvaIsolationVVTightToken_; - edm::EDGetTokenT mvaEleRawToken_; edm::EDGetTokenT pfTauToken_; edm::EDGetTokenT dmfNewToken_; edm::EDGetTokenT chargedIsoPtSumToken_; @@ -161,15 +153,7 @@ rerunMVAIsolationOnMiniAOD::rerunMVAIsolationOnMiniAOD(const edm::ParameterSet& outfile = new TFile("outfile_rerunMVAIsolationOnMiniAOD.root","RECREATE"); - tauToken_ = consumes(edm::InputTag("slimmedTaus","","PAT")); - mvaIsolationToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1raw","","rerunMVAIsolationOnMiniAOD")); - mvaIsolationVLooseToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1VLoose","","rerunMVAIsolationOnMiniAOD")); - mvaIsolationLooseToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1Loose","","rerunMVAIsolationOnMiniAOD")); - mvaIsolationMediumToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1Medium","","rerunMVAIsolationOnMiniAOD")); - mvaIsolationTightToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1Tight","","rerunMVAIsolationOnMiniAOD")); - mvaIsolationVTightToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1VTight","","rerunMVAIsolationOnMiniAOD")); - mvaIsolationVVTightToken_ = consumes(edm::InputTag("rerunDiscriminationByIsolationMVArun2v1VVTight","","rerunMVAIsolationOnMiniAOD")); - mvaEleRawToken_ = consumes(edm::InputTag("rerunDiscriminationAgainstElectronMVA6","","rerunMVAIsolationOnMiniAOD")); + tauToken_ = consumes(edm::InputTag("NewTauIDsEmbedded")); pfTauToken_ = consumes(edm::InputTag("hpsPFTauProducer","","PAT")); dmfNewToken_ = consumes(edm::InputTag("hpsPFTauDiscriminationByDecayModeFindingNewDMs","","PAT")); chargedIsoPtSumToken_ = consumes(edm::InputTag("hpsPFTauChargedIsoPtSum","","PAT")); @@ -254,53 +238,26 @@ rerunMVAIsolationOnMiniAOD::analyze(const edm::Event& iEvent, const edm::EventSe edm::Handle taus; iEvent.getByToken(tauToken_,taus); - edm::Handle mvaIsoRaw; - iEvent.getByToken(mvaIsolationToken_,mvaIsoRaw); - - edm::Handle mvaIsoVLoose; - iEvent.getByToken(mvaIsolationVLooseToken_,mvaIsoVLoose); - - edm::Handle mvaIsoLoose; - iEvent.getByToken(mvaIsolationLooseToken_,mvaIsoLoose); - - edm::Handle mvaIsoMedium; - iEvent.getByToken(mvaIsolationMediumToken_,mvaIsoMedium); - - edm::Handle mvaIsoTight; - iEvent.getByToken(mvaIsolationTightToken_,mvaIsoTight); - - edm::Handle mvaIsoVTight; - iEvent.getByToken(mvaIsolationVTightToken_,mvaIsoVTight); - - edm::Handle mvaIsoVVTight; - iEvent.getByToken(mvaIsolationVVTightToken_,mvaIsoVVTight); - - edm::Handle rawElecMVA6; - iEvent.getByToken(rawElecMVA6Token_,rawElecMVA6); - - edm::Handle mvaEleRaw; - iEvent.getByToken(mvaEleRawToken_,mvaEleRaw); - std::vector unmatchedTaus; for(unsigned iTau = 0; iTau < taus->size(); iTau++) { pat::TauRef tau(taus,iTau); float valueAOD = tau->tauID("byIsolationMVArun2v1DBoldDMwLTraw"); - float valueMiniAOD = (*mvaIsoRaw)[tau]; + float valueMiniAOD = tau->tauID("byIsolationMVArun2v1DBoldDMwLTrawNew"); mvaValueAOD->Fill(valueAOD); mvaValueMiniAOD->Fill(valueMiniAOD); mvaValue->Fill(valueAOD,valueMiniAOD); - mvaValue_vLoose->Fill(tau->tauID("byVLooseIsolationMVArun2v1DBoldDMwLT"),(*mvaIsoVLoose)[tau]); - mvaValue_Loose->Fill(tau->tauID("byLooseIsolationMVArun2v1DBoldDMwLT"),(*mvaIsoLoose)[tau]); - mvaValue_Medium->Fill(tau->tauID("byMediumIsolationMVArun2v1DBoldDMwLT"),(*mvaIsoMedium)[tau]); - mvaValue_Tight->Fill(tau->tauID("byTightIsolationMVArun2v1DBoldDMwLT"),(*mvaIsoTight)[tau]); - mvaValue_vTight->Fill(tau->tauID("byVTightIsolationMVArun2v1DBoldDMwLT"),(*mvaIsoVTight)[tau]); - mvaValue_vvTight->Fill(tau->tauID("byVVTightIsolationMVArun2v1DBoldDMwLT"),(*mvaIsoVVTight)[tau]); + mvaValue_vLoose->Fill(tau->tauID("byVLooseIsolationMVArun2v1DBoldDMwLT"),tau->tauID("byVLooseIsolationMVArun2v1DBoldDMwLTNew")); + mvaValue_Loose->Fill(tau->tauID("byLooseIsolationMVArun2v1DBoldDMwLT"),tau->tauID("byLooseIsolationMVArun2v1DBoldDMwLTNew")); + mvaValue_Medium->Fill(tau->tauID("byMediumIsolationMVArun2v1DBoldDMwLT"),tau->tauID("byMediumIsolationMVArun2v1DBoldDMwLTNew")); + mvaValue_Tight->Fill(tau->tauID("byTightIsolationMVArun2v1DBoldDMwLT"),tau->tauID("byTightIsolationMVArun2v1DBoldDMwLTNew")); + mvaValue_vTight->Fill(tau->tauID("byVTightIsolationMVArun2v1DBoldDMwLT"),tau->tauID("byVTightIsolationMVArun2v1DBoldDMwLTNew")); + mvaValue_vvTight->Fill(tau->tauID("byVVTightIsolationMVArun2v1DBoldDMwLT"),tau->tauID("byVVTightIsolationMVArun2v1DBoldDMwLTNew")); mvaValueDiff->Fill(fabs(valueAOD - valueMiniAOD)); - mvaValue_antiEMVA6->Fill((*mvaEleRaw)[tau] , taus->at(iTau).tauID("againstElectronMVA6Raw")); + mvaValue_antiEMVA6->Fill(tau->tauID("againstElectronMVA6Raw"), tau->tauID("againstElectronMVA6RawNew")); if(valueAOD != valueMiniAOD) unmatchedTaus.push_back(tau); diff --git a/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py b/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py index 7ffaa9f55550b..ddf82a08db3d4 100644 --- a/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py +++ b/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py @@ -8,7 +8,7 @@ process.load('Configuration.StandardSequences.MagneticField_cff') process.MessageLogger.cerr.FwkReport.reportEvery = 1000 -process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(-1) ) +process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10000) ) process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring( @@ -100,8 +100,25 @@ process.rerunMVAIsolationOnMiniAOD.verbosity = cms.int32(0) process.rerunMVAIsolationOnMiniAOD.additionalCollectionsAvailable = cms.bool(False) +# embed new id's into tau +embedID = cms.EDProducer("PATTauIDEmbedder", + src = cms.InputTag('slimmedTaus'), + tauIDSources = cms.PSet( + byIsolationMVArun2v1DBoldDMwLTrawNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1raw'), + byVLooseIsolationMVArun2v1DBoldDMwLTNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1VLoose'), + byLooseIsolationMVArun2v1DBoldDMwLTNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1Loose'), + byMediumIsolationMVArun2v1DBoldDMwLTNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1Medium'), + byTightIsolationMVArun2v1DBoldDMwLTNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1Tight'), + byVTightIsolationMVArun2v1DBoldDMwLTNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1VTight'), + byVVTightIsolationMVArun2v1DBoldDMwLTNew = cms.InputTag('rerunDiscriminationByIsolationMVArun2v1VVTight'), + againstElectronMVA6RawNew = cms.InputTag('rerunDiscriminationAgainstElectronMVA6') + ), + ) +setattr(process, "NewTauIDsEmbedded", embedID) + process.p = cms.Path( process.rerunMvaIsolation2SeqRun2 *process.rerunDiscriminationAgainstElectronMVA6 + *getattr(process, "NewTauIDsEmbedded") *process.rerunMVAIsolationOnMiniAOD ) From 9130df7c677084a202e59f039333afca4bfd6f9d Mon Sep 17 00:00:00 2001 From: anehrkor Date: Thu, 9 Feb 2017 10:59:23 +0100 Subject: [PATCH 3/3] Include fix from Jan to persist taus with new id --- DataFormats/PatCandidates/src/classes_def_objects.xml | 1 + DataFormats/PatCandidates/src/classes_objects.h | 1 + RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DataFormats/PatCandidates/src/classes_def_objects.xml b/DataFormats/PatCandidates/src/classes_def_objects.xml index 55b5a59c1c476..01ebe3ab00218 100644 --- a/DataFormats/PatCandidates/src/classes_def_objects.xml +++ b/DataFormats/PatCandidates/src/classes_def_objects.xml @@ -528,6 +528,7 @@ + diff --git a/DataFormats/PatCandidates/src/classes_objects.h b/DataFormats/PatCandidates/src/classes_objects.h index 54fa1ff130bc9..063c4fccf3bfd 100644 --- a/DataFormats/PatCandidates/src/classes_objects.h +++ b/DataFormats/PatCandidates/src/classes_objects.h @@ -191,6 +191,7 @@ namespace DataFormats_PatCandidates { std::pair pattdiscr_p; std::vector > pattdiscr_v; + edm::RefProd > patt_rp; }; } diff --git a/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py b/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py index ddf82a08db3d4..f1677d9a6c0df 100644 --- a/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py +++ b/RecoTauTag/RecoTau/test/rerunMVAIsolationOnMiniAOD.py @@ -8,7 +8,7 @@ process.load('Configuration.StandardSequences.MagneticField_cff') process.MessageLogger.cerr.FwkReport.reportEvery = 1000 -process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10000) ) +process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(-1) ) process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring(