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
00034 matchingCone_ = pset.getParameter<double>("matchingCone");
00035 minPt_ = pset.getParameter<double>("minTauPt");
00036
00037 typedef std::vector<edm::ParameterSet> VPSet;
00038 const VPSet& decayModes = pset.getParameter<VPSet>("decayModes");
00039 BOOST_FOREACH(const edm::ParameterSet &dm, decayModes) {
00040
00041 decayModeCuts_.insert(std::make_pair(
00042
00043 std::make_pair(
00044 dm.getParameter<uint32_t>("nCharged"),
00045 dm.getParameter<uint32_t>("nPiZeros")),
00046
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
00058 if (tau->pt() < minPt_)
00059 return 0.0;
00060
00061
00062 DecayModeCutMap::const_iterator massWindowIter =
00063 decayModeCuts_.find(std::make_pair(tau->signalPFChargedHadrCands().size(),
00064 tau->signalPiZeroCandidates().size()));
00065
00066
00067 if (massWindowIter == decayModeCuts_.end()) {
00068 return 0.0;
00069 }
00070
00071 const DoublePair &massWindow = massWindowIter->second;
00072
00073
00074 if (tau->mass() > massWindow.second || tau->mass() < massWindow.first) {
00075 return 0.0;
00076 }
00077
00078
00079 if (deltaR(tau->p4(), tau->jetRef()->p4()) > matchingCone_) {
00080 return 0.0;
00081 }
00082
00083
00084 double cone_size = signalConeFun_(*tau);
00085
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
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
00099 return 1.0;
00100 }
00101
00102 DEFINE_FWK_MODULE(PFRecoTauDiscriminationByHPSSelection);