CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/RecoTauTag/RecoTau/plugins/PFRecoTauDiscriminationByHPSSelection.cc

Go to the documentation of this file.
00001 #include <boost/foreach.hpp>
00002 
00003 #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h"
00004 #include "FWCore/Utilities/interface/InputTag.h"
00005 
00006 #include "CommonTools/Utils/interface/StringObjectFunction.h"
00007 #include "DataFormats/Math/interface/deltaR.h"
00008 
00009 class PFRecoTauDiscriminationByHPSSelection
00010   : public PFTauDiscriminationProducerBase {
00011   public:
00012     explicit PFRecoTauDiscriminationByHPSSelection(
00013         const edm::ParameterSet& pset);
00014 
00015     ~PFRecoTauDiscriminationByHPSSelection() {}
00016     double discriminate(const reco::PFTauRef&);
00017 
00018   private:
00019     typedef StringObjectFunction<reco::PFTau> TauFunc;
00020     typedef std::pair<unsigned int, unsigned int> IntPair;
00021     typedef std::pair<double, double> DoublePair;
00022     typedef std::map<IntPair, DoublePair> DecayModeCutMap;
00023 
00024     TauFunc signalConeFun_;
00025     DecayModeCutMap decayModeCuts_;
00026     double matchingCone_;
00027     double minPt_;
00028 };
00029 
00030 PFRecoTauDiscriminationByHPSSelection::PFRecoTauDiscriminationByHPSSelection(
00031     const edm::ParameterSet& pset):PFTauDiscriminationProducerBase(pset),
00032     signalConeFun_(pset.getParameter<std::string>("coneSizeFormula")) {
00033   // Get the matchign cut
00034   matchingCone_ = pset.getParameter<double>("matchingCone");
00035   minPt_ = pset.getParameter<double>("minTauPt");
00036   // Get the mass cuts for each decay mode
00037   typedef std::vector<edm::ParameterSet> VPSet;
00038   const VPSet& decayModes = pset.getParameter<VPSet>("decayModes");
00039   BOOST_FOREACH(const edm::ParameterSet &dm, decayModes) {
00040     // Get the mass window for each decay mode
00041     decayModeCuts_.insert(std::make_pair(
00042             // The decay mode as a key
00043             std::make_pair(
00044                 dm.getParameter<uint32_t>("nCharged"),
00045                 dm.getParameter<uint32_t>("nPiZeros")),
00046             // The mass window
00047             std::make_pair(
00048                 dm.getParameter<double>("minMass"),
00049                 dm.getParameter<double>("maxMass"))
00050             )
00051         );
00052   }
00053 }
00054 
00055 double
00056 PFRecoTauDiscriminationByHPSSelection::discriminate(const reco::PFTauRef& tau) {
00057   // Check if we pass the min pt
00058   if (tau->pt() < minPt_)
00059     return 0.0;
00060 
00061   // See if we select this decay mode
00062   DecayModeCutMap::const_iterator massWindowIter =
00063       decayModeCuts_.find(std::make_pair(tau->signalPFChargedHadrCands().size(),
00064                                          tau->signalPiZeroCandidates().size()));
00065 
00066   // Check if decay mode is supported
00067   if (massWindowIter == decayModeCuts_.end()) {
00068     return 0.0;
00069   }
00070 
00071   const DoublePair &massWindow = massWindowIter->second;
00072 
00073   // Check if tau fails mass cut
00074   if (tau->mass() > massWindow.second || tau->mass() < massWindow.first) {
00075     return 0.0;
00076   }
00077 
00078   // Check if tau passes matching cone cut
00079   if (deltaR(tau->p4(), tau->jetRef()->p4()) > matchingCone_) {
00080     return 0.0;
00081   }
00082 
00083   // Check if tau passes cone cut
00084   double cone_size = signalConeFun_(*tau);
00085   // Check if any charged objects fail the signal cone cut
00086   BOOST_FOREACH(const reco::PFCandidateRef& cand,
00087                 tau->signalPFChargedHadrCands()) {
00088     if (deltaR(cand->p4(), tau->p4()) > cone_size)
00089       return 0.0;
00090   }
00091   // Now check the pizeros
00092   BOOST_FOREACH(const reco::RecoTauPiZero& cand,
00093                 tau->signalPiZeroCandidates()) {
00094     if (deltaR(cand.p4(), tau->p4()) > cone_size)
00095       return 0.0;
00096   }
00097 
00098   // Otherwise, we pass!
00099   return 1.0;
00100 }
00101 
00102 DEFINE_FWK_MODULE(PFRecoTauDiscriminationByHPSSelection);