CMS 3D CMS Logo

PFRecoTauDiscriminationAgainstMuon.cc
Go to the documentation of this file.
1 /*
2  * class PFRecoTauDiscriminationAgainstMuon
3  * created : May 07 2008,
4  * revised : always,
5  * Authors : Sho Maruyama,M.Bachtis
6  */
7 
10 
12 
16 
17 #include <string>
18 
19 using namespace reco;
20 
22 {
23  public:
26  {
27  discriminatorOption_ = iConfig.getParameter<std::string>("discriminatorOption");
28  hop_ = iConfig.getParameter<double>("HoPMin");
29  a = iConfig.getParameter<double>("a");
30  b = iConfig.getParameter<double>("b");
31  c = iConfig.getParameter<double>("c");
32  maxNumberOfMatches_ = iConfig.getParameter<int>("maxNumberOfMatches");
33  checkNumMatches_ = iConfig.getParameter<bool>("checkNumMatches");
34  }
35 
37 
38  double discriminate(const PFTauRef& pfTau) const override;
39 
40  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
41 
42  private:
44  double hop_;
45  double a;
46  double b;
47  double c;
50 };
51 
53 {
54  bool decision = true;
55 
56  if ( thePFTauRef->hasMuonReference() ) {
57 
58  MuonRef muonref = thePFTauRef->leadPFChargedHadrCand()->muonRef();
59  if ( discriminatorOption_ == "noSegMatch" ) {
60  if ( muonref ->numberOfMatches() > maxNumberOfMatches_ ) decision = false;
61  } else if (discriminatorOption_ == "twoDCut") {
62  double seg = muon::segmentCompatibility(*muonref);
63  double calo= muonref->caloCompatibility();
64  double border = calo * a + seg * b +c;
65  if ( border > 0 ) decision = false;
66  } else if ( discriminatorOption_ == "merePresence" ) {
67  decision = false;
68  } else if (discriminatorOption_ == "combined" ) { // testing purpose only
69  unsigned int muType = 0;
70  if ( muonref->isGlobalMuon() ) muType = 1;
71  else if ( muonref->isCaloMuon() ) muType = 2;
72  else if ( muonref->isTrackerMuon() ) muType = 3;
73  float muonEnergyFraction = 0.;
74  const reco::PFJet* pfJetPtr = dynamic_cast<const reco::PFJet*>(thePFTauRef->pfTauTagInfoRef()->pfjetRef().get());
75  if (pfJetPtr) {
76  muonEnergyFraction = pfJetPtr->chargedMuEnergyFraction();
77  } else throw cms::Exception("Type Mismatch") << "The PFTau was not made from PFJets, and this outdated algorithm was not updated to cope with PFTaus made from other Jets.\n";
78  bool eta_veto = false;
79  bool phi_veto = false;
80  if ( fabs(muonref->eta()) > 2.3 || (fabs(muonref->eta()) > 1.4 && fabs(muonref->eta()) < 1.6)) eta_veto = true;
81  if ( muonref->phi() < 0.1 && muonref->phi() > -0.1) phi_veto = true;
82  if ( muType != 1 || muonref ->numberOfMatches() > 0 || eta_veto || phi_veto || muonEnergyFraction > 0.9 ) decision = false; // as place holder
83  } else if ( discriminatorOption_ == "noAllArbitrated" || discriminatorOption_ == "noAllArbitratedWithHOP" ) {
84  if(checkNumMatches_ && muonref ->numberOfMatches() > maxNumberOfMatches_) decision = false;
85  if ( muon::isGoodMuon(*muonref, muon::AllArbitrated) ) decision = false;
86  } else if ( discriminatorOption_ == "HOP" ) {
87  decision = true; // only calo. muon cut requested: keep all tau candidates, regardless of signals in muon system
88  } else {
90  << " Invalid Discriminator option = " << discriminatorOption_ << " --> please check cfi file !!\n";
91  }
92  } // valid muon ref
93 
94  // Additional calo. muon cut: veto one prongs compatible with MIP signature
95  if ( discriminatorOption_ == "HOP" || discriminatorOption_ == "noAllArbitratedWithHOP" ) {
96  if ( thePFTauRef->leadPFChargedHadrCand().isNonnull() ) {
97  double muonCaloEn = thePFTauRef->leadPFChargedHadrCand()->hcalEnergy() + thePFTauRef->leadPFChargedHadrCand()->ecalEnergy();
98  if ( thePFTauRef->decayMode() == 0 && muonCaloEn < (hop_*thePFTauRef->leadPFChargedHadrCand()->p()) ) decision = false;
99  }
100  }
101 
102  return (decision ? 1. : 0.);
103 }
104 
105 void
107  // pfRecoTauDiscriminationAgainstMuon
109  desc.add<double>("a", 0.5);
110  desc.add<double>("c", 0.0);
111  desc.add<double>("b", 0.5);
112  desc.add<edm::InputTag>("PFTauProducer", edm::InputTag("pfRecoTauProducer"));
113  {
115  psd0.add<std::string>("BooleanOperator", "and");
116  {
118  psd1.add<double>("cut");
119  psd1.add<edm::InputTag>("Producer");
120  psd0.addOptional<edm::ParameterSetDescription>("leadTrack", psd1);
121  }
122  desc.add<edm::ParameterSetDescription>("Prediscriminants", psd0);
123  }
124  desc.add<std::string>("discriminatorOption", "noSegMatch");
125  desc.add<double>("HoPMin", 0.2);
126  desc.add<int>("maxNumberOfMatches", 0);
127  desc.add<bool>("checkNumMatches", false);
128  descriptions.add("pfRecoTauDiscriminationAgainstMuon", desc);
129 }
130 
T getParameter(std::string const &) const
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:251
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double discriminate(const PFTauRef &pfTau) const override
Jets made from PFObjects.
Definition: PFJet.h:21
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:243
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double b
Definition: hdecay.h:120
void add(std::string const &label, ParameterSetDescription const &psetDescription)
PFRecoTauDiscriminationAgainstMuon(const edm::ParameterSet &iConfig)
fixed size matrix
double a
Definition: hdecay.h:121
float chargedMuEnergyFraction() const
chargedMuEnergyFraction
Definition: PFJet.h:148