CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_5_3_13_patch3/src/RecoTauTag/RecoTau/plugins/RecoTauDecayModeCutMultiplexer.cc

Go to the documentation of this file.
00001 #include <boost/foreach.hpp>
00002 #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h"
00003 #include "FWCore/Utilities/interface/InputTag.h"
00004 
00005 class RecoTauDecayModeCutMultiplexer : public PFTauDiscriminationProducerBase {
00006   public:
00007     explicit RecoTauDecayModeCutMultiplexer(const edm::ParameterSet& pset);
00008 
00009     ~RecoTauDecayModeCutMultiplexer() {}
00010     double discriminate(const reco::PFTauRef&);
00011     void beginEvent(const edm::Event& event, const edm::EventSetup& eventSetup);
00012 
00013   private:
00014     typedef std::pair<unsigned int, unsigned int> IntPair;
00015     typedef std::map<IntPair, double> DecayModeCutMap;
00016 
00017     DecayModeCutMap decayModeCuts_;
00018     edm::InputTag toMultiplex_;
00019     edm::Handle<reco::PFTauDiscriminator> handle_;
00020 };
00021 
00022 RecoTauDecayModeCutMultiplexer::RecoTauDecayModeCutMultiplexer(
00023     const edm::ParameterSet& pset):PFTauDiscriminationProducerBase(pset) {
00024   toMultiplex_ = pset.getParameter<edm::InputTag>("toMultiplex");
00025   typedef std::vector<edm::ParameterSet> VPSet;
00026   const VPSet& decayModes = pset.getParameter<VPSet>("decayModes");
00027   // Setup our cut map
00028   BOOST_FOREACH(const edm::ParameterSet &dm, decayModes) {
00029     // Get the mass window for each decay mode
00030     decayModeCuts_.insert(std::make_pair(
00031             // The decay mode as a key
00032             std::make_pair(
00033                 dm.getParameter<uint32_t>("nCharged"),
00034                 dm.getParameter<uint32_t>("nPiZeros")),
00035             // The selection
00036             dm.getParameter<double>("cut")
00037         ));
00038   }
00039 }
00040 
00041 void
00042 RecoTauDecayModeCutMultiplexer::beginEvent(
00043     const edm::Event& evt, const edm::EventSetup& es) {
00044    evt.getByLabel(toMultiplex_, handle_);
00045 }
00046 
00047 double
00048 RecoTauDecayModeCutMultiplexer::discriminate(const reco::PFTauRef& tau) {
00049   double disc_result = (*handle_)[tau];
00050   DecayModeCutMap::const_iterator cutIter =
00051       decayModeCuts_.find(std::make_pair(tau->signalPFChargedHadrCands().size(),
00052                                          tau->signalPiZeroCandidates().size()));
00053 
00054   // Return null if it doesn't exist
00055   if (cutIter == decayModeCuts_.end()) {
00056     return prediscriminantFailValue_;
00057   }
00058   // See if the discriminator passes our cuts
00059   return disc_result > cutIter->second;
00060 }
00061 
00062 DEFINE_FWK_MODULE(RecoTauDecayModeCutMultiplexer);