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);