00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <memory>
00023
00024
00025 #include "FWCore/Framework/interface/Frameworkfwd.h"
00026 #include "FWCore/Framework/interface/EDProducer.h"
00027 #include "FWCore/Framework/interface/ESHandle.h"
00028 #include "FWCore/Framework/interface/EventSetup.h"
00029
00030 #include "FWCore/Framework/interface/Event.h"
00031 #include "FWCore/Framework/interface/MakerMacros.h"
00032
00033 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00034 #include "RecoTauTag/TauTagTools/interface/Discriminants.h"
00035
00036 #include "DataFormats/TauReco/interface/PFTauDecayMode.h"
00037 #include "DataFormats/TauReco/interface/PFTauDecayModeAssociation.h"
00038 #include "DataFormats/TauReco/interface/PFTau.h"
00039 #include "DataFormats/TauReco/interface/PFTauDiscriminator.h"
00040 #include "RecoTauTag/TauTagTools/interface/DiscriminantList.h"
00041 #include "RecoTauTag/TauTagTools/interface/PFTauDiscriminantManager.h"
00042 #include "CondFormats/PhysicsToolsObjects/interface/MVAComputer.h"
00043 #include "CondFormats/DataRecord/interface/BTauGenericMVAJetTagComputerRcd.h"
00044 #include "PhysicsTools/MVAComputer/interface/MVAComputerRecord.h"
00045 #include "PhysicsTools/MVAComputer/interface/MVAComputer.h"
00046
00047
00048
00049
00050 using namespace std;
00051 using namespace edm;
00052 using namespace PFTauDiscriminants;
00053
00054 class TauMVADiscriminator : public edm::EDProducer {
00055 public:
00056 explicit TauMVADiscriminator(const edm::ParameterSet&);
00057 ~TauMVADiscriminator();
00058
00059 private:
00060 typedef vector<Handle<PFTauDiscriminator> > DiscriminantHandleList;
00061 typedef vector<Handle<PFTauDiscriminator> >::const_iterator DiscriminantHandleIterator;
00062
00063 virtual void beginRun( const edm::Run& run, const edm::EventSetup& );
00064 virtual void beginJob(const edm::EventSetup&) ;
00065 virtual void produce(edm::Event&, const edm::EventSetup&);
00066 virtual void endJob() ;
00067 InputTag pfTauDecayModeSrc_;
00068 std::vector<InputTag> preDiscriminants_;
00069 double failValue_;
00070 string computerName_;
00071 DiscriminantList myDiscriminants_;
00072 PFTauDiscriminantManager discriminantManager_;
00073
00074 std::vector<PhysicsTools::Variable::Value> mvaComputerInput_;
00075 };
00076
00077 TauMVADiscriminator::TauMVADiscriminator(const edm::ParameterSet& iConfig):
00078 pfTauDecayModeSrc_(iConfig.getParameter<InputTag>("pfTauDecayModeSrc")),
00079 preDiscriminants_(iConfig.getParameter<std::vector<InputTag> >("preDiscriminants")),
00080 failValue_(iConfig.getParameter<double>("prefailValue")),
00081 computerName_(iConfig.getParameter<string>("computerName"))
00082 {
00083 produces<PFTauDiscriminator>();
00084
00085 for(DiscriminantList::const_iterator aDiscriminant = myDiscriminants_.begin();
00086 aDiscriminant != myDiscriminants_.end();
00087 ++aDiscriminant)
00088 {
00089 discriminantManager_.addDiscriminant(*aDiscriminant);
00090 }
00091
00092 }
00093
00094 TauMVADiscriminator::~TauMVADiscriminator()
00095 {
00096 }
00097
00098
00099 void
00100 TauMVADiscriminator::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00101 {
00102 using namespace edm;
00103 using namespace std;
00104 using namespace reco;
00105
00106 Handle<PFTauDecayModeAssociation> pfTauDecayModes;
00107 iEvent.getByLabel(pfTauDecayModeSrc_, pfTauDecayModes);
00108
00109
00110 auto_ptr<PFTauDiscriminator> outputProduct(new PFTauDiscriminator(pfTauDecayModes->keyProduct()));
00111
00112
00113 ESHandle<PhysicsTools::Calibration::MVAComputerContainer> mvaHandle;
00114 iSetup.get<BTauGenericMVAJetTagComputerRcd>().get(mvaHandle);
00115 PhysicsTools::MVAComputer mvaComputer(&mvaHandle.product()->find(computerName_));
00116
00117 DiscriminantHandleList otherDiscriminants;
00118 for(std::vector<InputTag>::const_iterator iDiscriminant = preDiscriminants_.begin();
00119 iDiscriminant != preDiscriminants_.end();
00120 ++iDiscriminant)
00121 {
00122 Handle<PFTauDiscriminator> tempDiscriminantHandle;
00123 iEvent.getByLabel(*iDiscriminant, tempDiscriminantHandle);
00124 otherDiscriminants.push_back(tempDiscriminantHandle);
00125 }
00126
00127 size_t numberOfTaus = pfTauDecayModes->size();
00128 for(size_t iDecayMode = 0; iDecayMode < numberOfTaus; ++iDecayMode)
00129 {
00130 double output = failValue_;
00131
00132
00133
00134
00135 bool passesPreDiscriminant = true;
00136
00137 for(DiscriminantHandleIterator iDiscriminant = otherDiscriminants.begin();
00138 iDiscriminant != otherDiscriminants.end();
00139 ++iDiscriminant)
00140 {
00141 float thisDiscriminant = (*iDiscriminant)->value(iDecayMode);
00142 if (thisDiscriminant < 0.5)
00143 {
00144 passesPreDiscriminant = false;
00145 break;
00146 }
00147 }
00148
00149 if (passesPreDiscriminant)
00150 {
00151 mvaComputerInput_.clear();
00152 const PFTauDecayMode& theTauDecayMode = pfTauDecayModes->value(iDecayMode);
00153
00154 discriminantManager_.setEventData(theTauDecayMode, iEvent);
00155
00156 discriminantManager_.buildMVAComputerLink(mvaComputerInput_);
00157 output = mvaComputer.eval(mvaComputerInput_);
00158 #undef EK_MVA_DEBUG
00159 #ifdef EK_MVA_DEBUG
00160 std::cout << "Passed PreDisc. DecayMode: " << theTauDecayMode.getDecayMode() << " Pt " << theTauDecayMode.pt()
00161 << " eta: " << theTauDecayMode.eta() << " neutral Pt: " << theTauDecayMode.neutralPions().pt() << " MVA: " << output << std::endl;
00162 #endif
00163 }
00164
00165 outputProduct->setValue(iDecayMode, output);
00166 }
00167 iEvent.put(outputProduct);
00168 }
00169 void
00170 TauMVADiscriminator::beginRun( const edm::Run& run, const edm::EventSetup& iSetup)
00171 {
00172 }
00173
00174
00175 void
00176 TauMVADiscriminator::beginJob(const edm::EventSetup& iSetup)
00177 {
00178 }
00179
00180
00181 void
00182 TauMVADiscriminator::endJob() {
00183 }
00184
00185
00186 DEFINE_FWK_MODULE(TauMVADiscriminator);