CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFRecoTauDiscriminationAgainstMuon2.cc
Go to the documentation of this file.
1 
13 
15 
24 
25 #include <vector>
26 #include <string>
27 #include <iostream>
28 
30 {
32  public:
35  moduleLabel_(cfg.getParameter<std::string>("@module_label"))
36  {
37  std::string discriminatorOption_string = cfg.getParameter<std::string>("discriminatorOption");
38  if ( discriminatorOption_string == "loose" ) discriminatorOption_ = kLoose;
39  else if ( discriminatorOption_string == "medium" ) discriminatorOption_ = kMedium;
40  else if ( discriminatorOption_string == "tight" ) discriminatorOption_ = kTight;
41  else if ( discriminatorOption_string == "custom" ) discriminatorOption_ = kCustom;
43  << " Invalid Configuration parameter 'discriminatorOption' = " << discriminatorOption_string << " !!\n";
44  hop_ = cfg.getParameter<double>("HoPMin");
45  maxNumberOfMatches_ = cfg.exists("maxNumberOfMatches") ? cfg.getParameter<int>("maxNumberOfMatches"): 0;
46  doCaloMuonVeto_ = cfg.exists("doCaloMuonVeto") ? cfg.getParameter<bool>("doCaloMuonVeto"): false;
47  maxNumberOfHitsLast2Stations_ = cfg.exists("maxNumberOfHitsLast2Stations") ? cfg.getParameter<int>("maxNumberOfHitsLast2Stations"): 0;
48  if ( cfg.exists("srcMuons") ) {
49  srcMuons_ = cfg.getParameter<edm::InputTag>("srcMuons");
50  Muons_token=consumes<reco::MuonCollection>(srcMuons_);
51  dRmuonMatch_ = cfg.getParameter<double>("dRmuonMatch");
52  dRmuonMatchLimitedToJetArea_ = cfg.getParameter<bool>("dRmuonMatchLimitedToJetArea");
53  }
54  numWarnings_ = 0;
55  maxWarnings_ = 3;
56  verbosity_ = cfg.exists("verbosity") ? cfg.getParameter<int>("verbosity") : 0;
57  }
59 
60  void beginEvent(const edm::Event&, const edm::EventSetup&) override;
61 
62  double discriminate(const reco::PFTauRef&) override;
63 
64  private:
67  double hop_;
74  double dRmuonMatch_;
76  mutable int numWarnings_;
79 };
80 
82 {
83  if ( srcMuons_.label() != "" ) {
85  }
86 }
87 
88 namespace
89 {
90  void countHits(const reco::Muon& muon, std::vector<int>& numHitsDT, std::vector<int>& numHitsCSC, std::vector<int>& numHitsRPC)
91  {
92  if ( muon.outerTrack().isNonnull() ) {
93  const reco::HitPattern& muonHitPattern = muon.outerTrack()->hitPattern();
94  for ( int iHit = 0; iHit < muonHitPattern.numberOfHits(); ++iHit ) {
95  uint32_t hit = muonHitPattern.getHitPattern(iHit);
96  if ( hit == 0 ) break;
97  if ( muonHitPattern.muonHitFilter(hit) && (muonHitPattern.getHitType(hit) == TrackingRecHit::valid || muonHitPattern.getHitType(hit) == TrackingRecHit::bad) ) {
98  int muonStation = muonHitPattern.getMuonStation(hit) - 1; // CV: map into range 0..3
99  if ( muonStation >= 0 && muonStation < 4 ) {
100  if ( muonHitPattern.muonDTHitFilter(hit) ) ++numHitsDT[muonStation];
101  else if ( muonHitPattern.muonCSCHitFilter(hit) ) ++numHitsCSC[muonStation];
102  else if ( muonHitPattern.muonRPCHitFilter(hit) ) ++numHitsRPC[muonStation];
103  }
104  }
105  }
106  }
107  }
108 
109  std::string format_vint(const std::vector<int>& vi)
110  {
111  std::ostringstream os;
112  os << "{ ";
113  unsigned numEntries = vi.size();
114  for ( unsigned iEntry = 0; iEntry < numEntries; ++iEntry ) {
115  os << vi[iEntry];
116  if ( iEntry < (numEntries - 1) ) os << ", ";
117  }
118  os << " }";
119  return os.str();
120  }
121 }
122 
124 {
125  if ( verbosity_ ) {
126  std::cout << "<PFRecoTauDiscriminationAgainstMuon2::discriminate>:" << std::endl;
127  std::cout << " moduleLabel = " << moduleLabel_ << std::endl;
128  std::cout << "tau #" << pfTau.key() << ": Pt = " << pfTau->pt() << ", eta = " << pfTau->eta() << ", phi = " << pfTau->phi() << std::endl;
129  }
130 
131  int numMatches = 0;
132 
133  std::vector<int> numHitsDT(4);
134  std::vector<int> numHitsCSC(4);
135  std::vector<int> numHitsRPC(4);
136  for ( int iStation = 0; iStation < 4; ++iStation ) {
137  numHitsDT[iStation] = 0;
138  numHitsCSC[iStation] = 0;
139  numHitsRPC[iStation] = 0;
140  }
141 
142  const reco::PFCandidatePtr& pfLeadChargedHadron = pfTau->leadPFChargedHadrCand();
143  if ( pfLeadChargedHadron.isNonnull() ) {
144  reco::MuonRef muonRef = pfLeadChargedHadron->muonRef();
145  if ( muonRef.isNonnull() ) {
146  if ( verbosity_ ) std::cout << " has muonRef." << std::endl;
147  numMatches = muonRef->numberOfMatches(reco::Muon::NoArbitration);
148  countHits(*muonRef, numHitsDT, numHitsCSC, numHitsRPC);
149  }
150  }
151 
152  if ( srcMuons_.label() != "" ) {
153  size_t numMuons = muons_->size();
154  for ( size_t idxMuon = 0; idxMuon < numMuons; ++idxMuon ) {
155  reco::MuonRef muon(muons_, idxMuon);
156  if ( verbosity_ ) std::cout << "muon #" << muon.key() << ": Pt = " << muon->pt() << ", eta = " << muon->eta() << ", phi = " << muon->phi() << std::endl;
157  if ( pfLeadChargedHadron.isNonnull() && pfLeadChargedHadron->muonRef().isNonnull() && muon == pfLeadChargedHadron->muonRef() ) {
158  if ( verbosity_ ) std::cout << " matches muonRef of tau --> skipping it." << std::endl;
159  continue;
160  }
161  double dR = deltaR(muon->p4(), pfTau->p4());
162  double dRmatch = dRmuonMatch_;
164  double jetArea = 0.;
165  if ( pfTau->jetRef().isNonnull() ) jetArea = pfTau->jetRef()->jetArea();
166  if ( jetArea > 0. ) {
167  dRmatch = TMath::Min(dRmatch, TMath::Sqrt(jetArea/TMath::Pi()));
168  } else {
169  if ( numWarnings_ < maxWarnings_ ) {
170  edm::LogWarning("PFRecoTauDiscriminationAgainstMuon2::discriminate")
171  << "Jet associated to Tau: Pt = " << pfTau->pt() << ", eta = " << pfTau->eta() << ", phi = " << pfTau->phi() << " has area = " << jetArea << " !!" << std::endl;
172  ++numWarnings_;
173  }
174  dRmatch = 0.1;
175  }
176  }
177  if ( dR < dRmatch ) {
178  if ( verbosity_ ) std::cout << " overlaps with tau, dR = " << dR << std::endl;
179  numMatches += muon->numberOfMatches(reco::Muon::NoArbitration);
180  countHits(*muon, numHitsDT, numHitsCSC, numHitsRPC);
181  }
182  }
183  }
184 
185  if ( verbosity_ ) {
186  std::cout << "numMatches = " << numMatches << std::endl;
187  std::cout << "numHitsDT = " << format_vint(numHitsDT) << std::endl;
188  std::cout << "numHitsCSC = " << format_vint(numHitsCSC) << std::endl;
189  std::cout << "numHitsRPC = " << format_vint(numHitsRPC) << std::endl;
190  }
191 
192  int numLast2StationsWithHits = 0;
193  for ( int iStation = 2; iStation < 4; ++iStation ) {
194  if ( numHitsDT[iStation] > 0 ) ++numLast2StationsWithHits;
195  if ( numHitsCSC[iStation] > 0 ) ++numLast2StationsWithHits;
196  if ( numHitsRPC[iStation] > 0 ) ++numLast2StationsWithHits;
197  }
198 
199 
200  bool passesCaloMuonVeto = true;
201  if ( pfLeadChargedHadron.isNonnull() ) {
202  double energyECALplusHCAL = pfLeadChargedHadron->ecalEnergy() + pfLeadChargedHadron->hcalEnergy();
203  if ( verbosity_ ) {
204  if ( pfLeadChargedHadron->trackRef().isNonnull() ) std::cout << "decayMode = " << pfTau->decayMode() << ", energy(ECAL+HCAL) = " << energyECALplusHCAL << ", leadPFChargedHadronP = " << pfLeadChargedHadron->trackRef()->p() << std::endl;
205  else if ( pfLeadChargedHadron->gsfTrackRef().isNonnull() )
206 std::cout << "decayMode = " << pfTau->decayMode() << ", energy(ECAL+HCAL) = " << energyECALplusHCAL << ", leadPFChargedHadronP = " << pfLeadChargedHadron->gsfTrackRef()->p() << std::endl;
207 
208  }
209  const reco::Track* leadTrack = 0;
210  if ( pfLeadChargedHadron->trackRef().isNonnull() ) leadTrack = pfLeadChargedHadron->trackRef().get();
211  else if ( pfLeadChargedHadron->gsfTrackRef().isNonnull() ) leadTrack = pfLeadChargedHadron->gsfTrackRef().get();
212  if ( pfTau->decayMode() == 0 && leadTrack && energyECALplusHCAL < (hop_*leadTrack->p()) ) passesCaloMuonVeto = false;
213  }
214 
215  double discriminatorValue = 0.;
216  if ( discriminatorOption_ == kLoose && numMatches <= maxNumberOfMatches_ ) discriminatorValue = 1.;
217  else if ( discriminatorOption_ == kMedium && numMatches <= maxNumberOfMatches_ && numLast2StationsWithHits <= maxNumberOfHitsLast2Stations_ ) discriminatorValue = 1.;
218  else if ( discriminatorOption_ == kTight && numMatches <= maxNumberOfMatches_ && numLast2StationsWithHits <= maxNumberOfHitsLast2Stations_ && passesCaloMuonVeto ) discriminatorValue = 1.;
219  else if ( discriminatorOption_ == kCustom ) {
220  bool pass = true;
221  if ( maxNumberOfMatches_ >= 0 && numMatches > maxNumberOfMatches_ ) pass = false;
222  if ( maxNumberOfHitsLast2Stations_ >= 0 && numLast2StationsWithHits > maxNumberOfHitsLast2Stations_ ) pass = false;
223  if ( doCaloMuonVeto_ && !passesCaloMuonVeto ) pass = false;
224  discriminatorValue = pass ? 1.: 0.;
225  }
226  if ( verbosity_ ) std::cout << "--> returning discriminatorValue = " << discriminatorValue << std::endl;
227 
228  return discriminatorValue;
229 }
230 
double p() const
momentum vector magnitude
Definition: TrackBase.h:127
const double Pi
T getParameter(std::string const &) const
double discriminate(const reco::PFTauRef &) override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
static bool muonDTHitFilter(uint32_t pattern)
Definition: HitPattern.h:472
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void beginEvent(const edm::Event &, const edm::EventSetup &) override
bool exists(std::string const &parameterName) const
checks if a parameter exists
static uint32_t getHitType(uint32_t pattern)
Definition: HitPattern.h:529
static uint32_t getMuonStation(uint32_t pattern)
Muon station (1-4). Only valid for muon patterns, of course.
Definition: HitPattern.h:534
static bool muonHitFilter(uint32_t pattern)
Definition: HitPattern.h:500
tuple numMuons
Definition: patZpeak.py:40
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:152
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:143
Long64_t numEntries(TFile *hdl, std::string const &trname)
Definition: CollUtil.cc:50
int numberOfHits() const
Definition: HitPattern.cc:213
static bool muonRPCHitFilter(uint32_t pattern)
Definition: HitPattern.h:486
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
Definition: Muon.h:51
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
key_type key() const
Accessor for product key.
Definition: Ref.h:266
std::string const & label() const
Definition: InputTag.h:42
static bool muonCSCHitFilter(uint32_t pattern)
Definition: HitPattern.h:479
tuple cout
Definition: gather_cfg.py:121
uint32_t getHitPattern(int position) const
Definition: HitPattern.cc:144
PFRecoTauDiscriminationAgainstMuon2(const edm::ParameterSet &cfg)
edm::EDGetTokenT< reco::MuonCollection > Muons_token