Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <boost/foreach.hpp>
00011 #include <string>
00012
00013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "FWCore/Framework/interface/EDAnalyzer.h"
00017
00018 #include "RecoTauTag/RecoTau/interface/RecoTauMVAHelper.h"
00019 #include "RecoTauTag/RecoTau/interface/RecoTauCommonUtilities.h"
00020
00021 #include "DataFormats/TauReco/interface/PFTauFwd.h"
00022 #include "DataFormats/TauReco/interface/PFTau.h"
00023 #include "DataFormats/TauReco/interface/PFTauDiscriminator.h"
00024 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00025
00026 class RecoTauMVATrainer : public edm::EDAnalyzer {
00027 public:
00028 explicit RecoTauMVATrainer(const edm::ParameterSet &pset);
00029 virtual ~RecoTauMVATrainer() {};
00030 virtual void analyze(const edm::Event &evt, const edm::EventSetup &es);
00031 private:
00032 typedef std::vector<edm::InputTag> VInputTag;
00033 reco::tau::RecoTauMVAHelper mva_;
00034 edm::InputTag signalSrc_;
00035 edm::InputTag backgroundSrc_;
00036 bool applyWeights_;
00037 edm::InputTag signalWeightsSrc_;
00038 edm::InputTag backgroundWeightsSrc_;
00039 VInputTag eventWeights_;
00040 };
00041
00042 RecoTauMVATrainer::RecoTauMVATrainer(const edm::ParameterSet &pset)
00043 : mva_(pset.getParameter<std::string>("computerName"),
00044 pset.getParameter<std::string>("dbLabel"),
00045 pset.getParameter<edm::ParameterSet>("discriminantOptions")),
00046 signalSrc_(pset.getParameter<edm::InputTag>("signalSrc")),
00047 backgroundSrc_(pset.getParameter<edm::InputTag>("backgroundSrc")) {
00048
00049 applyWeights_ = false;
00050 if (pset.exists("signalWeights")) {
00051 applyWeights_ = true;
00052 signalWeightsSrc_ = pset.getParameter<edm::InputTag>("signalWeights");
00053 backgroundWeightsSrc_ = pset.getParameter<edm::InputTag>("backgroundWeights");
00054 }
00055 if (pset.exists("eventWeights")) {
00056 eventWeights_ = pset.getParameter<VInputTag>("eventWeights");
00057 }
00058 }
00059
00060 namespace {
00061
00062
00063 void uploadTrainingData(reco::tau::RecoTauMVAHelper *helper,
00064 const edm::Handle<reco::CandidateView>& taus,
00065 const edm::Handle<reco::PFTauDiscriminator>& weights,
00066 bool isSignal, double eventWeight) {
00067
00068 reco::PFTauRefVector tauRefs =
00069 reco::tau::castView<reco::PFTauRefVector>(taus);
00070
00071 BOOST_FOREACH(reco::PFTauRef tau, tauRefs) {
00072
00073 double weight = (weights.isValid()) ? (*weights)[tau] : 1.0;
00074 helper->train(tau, isSignal, weight*eventWeight);
00075 }
00076 }
00077
00078 }
00079
00080
00081 void RecoTauMVATrainer::analyze(const edm::Event &evt,
00082 const edm::EventSetup &es) {
00083
00084 edm::Handle<reco::CandidateView> signal;
00085 edm::Handle<reco::CandidateView> background;
00086
00087 bool signalExists = false;
00088 evt.getByLabel(signalSrc_, signal);
00089 if (signal.isValid() && signal->size())
00090 signalExists = true;
00091
00092 bool backgroundExists = false;
00093 evt.getByLabel(backgroundSrc_, background);
00094 if (background.isValid() && background->size())
00095 backgroundExists = true;
00096
00097
00098 bool somethingToDo = signalExists || backgroundExists;
00099 if (!somethingToDo)
00100 return;
00101
00102
00103 mva_.setEvent(evt, es);
00104
00105
00106 double eventWeight = 1.0;
00107 BOOST_FOREACH(const edm::InputTag& weightTag, eventWeights_) {
00108 edm::Handle<double> weightHandle;
00109 evt.getByLabel(weightTag, weightHandle);
00110 if (weightHandle.isValid())
00111 eventWeight *= *weightHandle;
00112 }
00113
00114
00115 edm::Handle<reco::PFTauDiscriminator> signalWeights;
00116 edm::Handle<reco::PFTauDiscriminator> backgroundWeights;
00117 if (applyWeights_ && signalExists)
00118 evt.getByLabel(signalWeightsSrc_, signalWeights);
00119 if (applyWeights_ && backgroundExists)
00120 evt.getByLabel(backgroundWeightsSrc_, backgroundWeights);
00121
00122 if (signalExists)
00123 uploadTrainingData(&mva_, signal, signalWeights, true, eventWeight);
00124 if (backgroundExists)
00125 uploadTrainingData(&mva_, background, backgroundWeights,
00126 false, eventWeight);
00127 }
00128
00129 #include "FWCore/Framework/interface/MakerMacros.h"
00130 DEFINE_FWK_MODULE(RecoTauMVATrainer);