CMS 3D CMS Logo

TauMVADiscriminator.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    TauMVADiscriminator
00004 // Class:      TauMVADiscriminator
00005 // 
00013 //
00014 // Original Author:  Evan K. Friis, UC Davis (friis@physics.ucdavis.edu)
00015 //         Created:  Fri Aug 15 11:22:14 PDT 2008
00016 // $Id: TauMVADiscriminator.cc,v 1.5 2008/11/07 19:38:36 friis Exp $
00017 //
00018 //
00019 
00020 
00021 // system include files
00022 #include <memory>
00023 
00024 // user include files
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 // class decleration
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_; //these must pass for the MVA value to be computed
00069       double                    failValue_;        //specifies discriminant output when the object fails one of the preDiscriminants
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 // ------------ method called to produce the data  ------------
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    //initialize discriminant vector w/ the RefProd of the tau collection
00110    auto_ptr<PFTauDiscriminator> outputProduct(new PFTauDiscriminator(pfTauDecayModes->keyProduct()));
00111 
00112    //get appropriate MVA setup (specified in CFG file)
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       // Check if this tau fails one of the specified discriminants
00133       // This is needed as applying these discriminants on a tau w/o a 
00134       // lead track doesn't do much good
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          //sets the current tau decay mode as the active object
00154          discriminantManager_.setEventData(theTauDecayMode, iEvent);
00155          //applies associated discriminants (see ctor) and constructs the appropriate MVA framework input
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 // ------------ method called once each job just before starting event loop  ------------
00175 void 
00176 TauMVADiscriminator::beginJob(const edm::EventSetup& iSetup)
00177 {
00178 }
00179 
00180 // ------------ method called once each job just after ending the event loop  ------------
00181 void 
00182 TauMVADiscriminator::endJob() {
00183 }
00184 
00185 //define this as a plug-in
00186 DEFINE_FWK_MODULE(TauMVADiscriminator);

Generated on Tue Jun 9 17:45:07 2009 for CMSSW by  doxygen 1.5.4