CMS 3D CMS Logo

PFRecoTauDiscriminationAgainstElectronMVA6.cc
Go to the documentation of this file.
1 /* class PFRecoTauDiscriminationAgainstElectronMVA6
2  * created : Nov 2 2015,
3  * revised : ,
4  * Authorss : Fabio Colombo (KIT)
5  */
6 
9 
12 
20 
21 #include <iostream>
22 #include <sstream>
23 #include <fstream>
24 
25 using namespace reco;
26 
28 {
29  public:
32  mva_(),
33  category_output_()
34  {
35  mva_ = std::make_unique<AntiElectronIDMVA6>(cfg);
36 
37  srcGsfElectrons_ = cfg.getParameter<edm::InputTag>("srcGsfElectrons");
38  GsfElectrons_token = consumes<reco::GsfElectronCollection>(srcGsfElectrons_);
39 
40  verbosity_ = ( cfg.exists("verbosity") ) ?
41  cfg.getParameter<int>("verbosity") : 0;
42 
43  // add category index
44  produces<PFTauDiscriminator>("category");
45  }
46 
47  void beginEvent(const edm::Event&, const edm::EventSetup&) override;
48 
49  double discriminate(const PFTauRef&) const override;
50 
51  void endEvent(edm::Event&) override;
52 
54 
55 private:
56  bool isInEcalCrack(double) const;
57 
59  std::unique_ptr<AntiElectronIDMVA6> mva_;
60 
65 
66  std::unique_ptr<PFTauDiscriminator> category_output_;
67 
69 };
70 
72 {
73  mva_->beginEvent(evt, es);
74 
75  evt.getByToken(Tau_token, taus_);
76  category_output_.reset(new PFTauDiscriminator(TauRefProd(taus_)));
77 
78  evt.getByToken(GsfElectrons_token, gsfElectrons_);
79 }
80 
82 {
83  double mvaValue = 1.;
84  double category = -1.;
85  bool isGsfElectronMatched = false;
86 
87  float deltaRDummy = 9.9;
88 
89  const float ECALBarrelEndcapEtaBorder = 1.479;
90  float tauEtaAtEcalEntrance = -99.;
91  float sumEtaTimesEnergy = 0.;
92  float sumEnergy = 0.;
93  const std::vector<reco::PFCandidatePtr>& signalPFCands = thePFTauRef->signalPFCands();
94  for ( const auto & pfCandidate : signalPFCands ) {
95  sumEtaTimesEnergy += (pfCandidate->positionAtECALEntrance().eta()*pfCandidate->energy());
96  sumEnergy += pfCandidate->energy();
97  }
98  if ( sumEnergy > 0. ) {
99  tauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
100  }
101 
102  float leadChargedPFCandEtaAtEcalEntrance = -99.;
103  float leadChargedPFCandPt = -99.;
104  for ( const auto & pfCandidate : signalPFCands ) {
105  const reco::Track* track = nullptr;
106  if ( pfCandidate->trackRef().isNonnull() ) track = pfCandidate->trackRef().get();
107  else if ( pfCandidate->muonRef().isNonnull() && pfCandidate->muonRef()->innerTrack().isNonnull() ) track = pfCandidate->muonRef()->innerTrack().get();
108  else if ( pfCandidate->muonRef().isNonnull() && pfCandidate->muonRef()->globalTrack().isNonnull() ) track = pfCandidate->muonRef()->globalTrack().get();
109  else if ( pfCandidate->muonRef().isNonnull() && pfCandidate->muonRef()->outerTrack().isNonnull() ) track = pfCandidate->muonRef()->outerTrack().get();
110  else if ( pfCandidate->gsfTrackRef().isNonnull() ) track = pfCandidate->gsfTrackRef().get();
111  if ( track ) {
112  if ( track->pt() > leadChargedPFCandPt ) {
113  leadChargedPFCandEtaAtEcalEntrance = pfCandidate->positionAtECALEntrance().eta();
114  leadChargedPFCandPt = track->pt();
115  }
116  }
117  }
118 
119  if( (*thePFTauRef).leadPFChargedHadrCand().isNonnull()) {
120 
121  int numSignalPFGammaCandsInSigCone = 0;
122  const std::vector<reco::PFCandidatePtr>& signalPFGammaCands = thePFTauRef->signalPFGammaCands();
123 
124  for ( const auto & pfGamma : signalPFGammaCands ) {
125 
126  double dR = deltaR(pfGamma->p4(), thePFTauRef->leadPFChargedHadrCand()->p4());
127  double signalrad = std::max(0.05, std::min(0.10, 3.0/std::max(1.0, thePFTauRef->pt())));
128 
129  // pfGammas inside the tau signal cone
130  if (dR < signalrad) {
131  numSignalPFGammaCandsInSigCone += 1;
132  }
133  }
134 
135  // loop over the electrons
136  for ( const auto & theGsfElectron : *gsfElectrons_ ) {
137  if ( theGsfElectron.pt() > 10. ) { // CV: only take electrons above some minimal energy/Pt into account...
138  double deltaREleTau = deltaR(theGsfElectron.p4(), thePFTauRef->p4());
139  deltaRDummy = deltaREleTau;
140  if ( deltaREleTau < 0.3 ) {
141  double mva_match = mva_->MVAValue(*thePFTauRef, theGsfElectron);
142  bool hasGsfTrack = thePFTauRef->leadPFChargedHadrCand()->gsfTrackRef().isNonnull();
143  if ( !hasGsfTrack )
144  hasGsfTrack = theGsfElectron.gsfTrack().isNonnull();
145 
147  if ( isInEcalCrack(tauEtaAtEcalEntrance) || isInEcalCrack(leadChargedPFCandEtaAtEcalEntrance) ) {
148  // add category index
149  category_output_->setValue(tauIndex_, category);
150  // return MVA output value
151  return -99;
152  }
154 
155  if ( std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder ) { // Barrel
156  if ( numSignalPFGammaCandsInSigCone == 0 && hasGsfTrack ) {
157  category = 5.;
158  }
159  else if ( numSignalPFGammaCandsInSigCone >= 1 && hasGsfTrack ) {
160  category = 7.;
161  }
162  } else { // Endcap
163  if ( numSignalPFGammaCandsInSigCone == 0 && hasGsfTrack ) {
164  category = 13.;
165  }
166  else if ( numSignalPFGammaCandsInSigCone >= 1 && hasGsfTrack ) {
167  category = 15.;
168  }
169  }
170 
171  mvaValue = std::min(mvaValue, mva_match);
172  isGsfElectronMatched = true;
173  } // deltaR < 0.3
174  } // electron pt > 10
175  } // end of loop over electrons
176 
177  if ( !isGsfElectronMatched ) {
178  mvaValue = mva_->MVAValue(*thePFTauRef);
179  bool hasGsfTrack = thePFTauRef->leadPFChargedHadrCand()->gsfTrackRef().isNonnull();
180 
182  if ( isInEcalCrack(tauEtaAtEcalEntrance) || isInEcalCrack(leadChargedPFCandEtaAtEcalEntrance) ) {
183  // add category index
184  category_output_->setValue(tauIndex_, category);
185  // return MVA output value
186  return -99;
187  }
189 
190  if ( std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder ) { // Barrel
191  if ( numSignalPFGammaCandsInSigCone == 0 && !hasGsfTrack ) {
192  category = 0.;
193  }
194  else if ( numSignalPFGammaCandsInSigCone >= 1 && !hasGsfTrack ) {
195  category = 2.;
196  }
197  } else { // Endcap
198  if ( numSignalPFGammaCandsInSigCone == 0 && !hasGsfTrack ) {
199  category = 8.;
200  }
201  else if ( numSignalPFGammaCandsInSigCone >= 1 && !hasGsfTrack ) {
202  category = 10.;
203  }
204  }
205  }
206  }
207 
208  if ( verbosity_ ) {
209  edm::LogPrint("PFTauAgainstEleMVA6") << "<PFRecoTauDiscriminationAgainstElectronMVA6::discriminate>:" ;
210  edm::LogPrint("PFTauAgainstEleMVA6") << " tau: Pt = " << thePFTauRef->pt() << ", eta = " << thePFTauRef->eta() << ", phi = " << thePFTauRef->phi();
211  edm::LogPrint("PFTauAgainstEleMVA6") << " deltaREleTau = " << deltaRDummy << ", isGsfElectronMatched = " << isGsfElectronMatched;
212  edm::LogPrint("PFTauAgainstEleMVA6") << " #Prongs = " << thePFTauRef->signalPFChargedHadrCands().size();
213  edm::LogPrint("PFTauAgainstEleMVA6") << " MVA = " << mvaValue << ", category = " << category;
214  }
215 
216  // add category index
217  category_output_->setValue(tauIndex_, category);
218  // return MVA output value
219  return mvaValue;
220 }
221 
223 {
224  // add all category indices to event
225  evt.put(std::move(category_output_), "category");
226 }
227 
228 bool
230 {
231  double absEta = fabs(eta);
232  return (absEta > 1.460 && absEta < 1.558);
233 }
234 
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
edm::RefProd< TauCollection > TauRefProd
Definition: Tau.h:39
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:253
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::EDGetTokenT< reco::GsfElectronCollection > GsfElectrons_token
void beginEvent(const edm::Event &, const edm::EventSetup &) override
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:651
double pt() const
track transverse momentum
Definition: TrackBase.h:621
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T min(T a, T b)
Definition: MathUtil.h:58
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
fixed size matrix
def move(src, dest)
Definition: eostools.py:510