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 
15 
23 
24 #include <iostream>
25 #include <sstream>
26 #include <fstream>
27 
28 using namespace reco;
29 
31 public:
33  : PFTauDiscriminationProducerBase(cfg), mva_(), category_output_() {
34  mva_ = std::make_unique<AntiElectronIDMVA6>(cfg);
35 
36  srcGsfElectrons_ = cfg.getParameter<edm::InputTag>("srcGsfElectrons");
37  GsfElectrons_token = consumes<reco::GsfElectronCollection>(srcGsfElectrons_);
38  vetoEcalCracks_ = cfg.getParameter<bool>("vetoEcalCracks");
39 
40  verbosity_ = cfg.getParameter<int>("verbosity");
41 
42  // add category index
43  produces<PFTauDiscriminator>("category");
44  }
45 
46  void beginEvent(const edm::Event&, const edm::EventSetup&) override;
47 
48  double discriminate(const PFTauRef&) const override;
49 
50  void endEvent(edm::Event&) override;
51 
53 
54  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
55 
56 private:
57  bool isInEcalCrack(double) const;
58 
60  std::unique_ptr<AntiElectronIDMVA6> mva_;
61 
66 
67  std::unique_ptr<PFTauDiscriminator> category_output_;
68 
70 
72 };
73 
75  mva_->beginEvent(evt, es);
76 
77  evt.getByToken(Tau_token, taus_);
78  category_output_.reset(new PFTauDiscriminator(TauRefProd(taus_)));
79 
80  evt.getByToken(GsfElectrons_token, gsfElectrons_);
81 }
82 
84  double mvaValue = 1.;
85  double category = -1.;
86  bool isGsfElectronMatched = false;
87 
88  float deltaRDummy = 9.9;
89 
90  const float ECALBarrelEndcapEtaBorder = 1.479;
91  float tauEtaAtEcalEntrance = -99.;
92  float sumEtaTimesEnergy = 0.;
93  float sumEnergy = 0.;
94  for (const auto& pfCandidate : thePFTauRef->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 : thePFTauRef->signalPFCands()) {
105  const reco::Track* track = nullptr;
106  if (pfCandidate->trackRef().isNonnull())
107  track = pfCandidate->trackRef().get();
108  else if (pfCandidate->muonRef().isNonnull() && pfCandidate->muonRef()->innerTrack().isNonnull())
109  track = pfCandidate->muonRef()->innerTrack().get();
110  else if (pfCandidate->muonRef().isNonnull() && pfCandidate->muonRef()->globalTrack().isNonnull())
111  track = pfCandidate->muonRef()->globalTrack().get();
112  else if (pfCandidate->muonRef().isNonnull() && pfCandidate->muonRef()->outerTrack().isNonnull())
113  track = pfCandidate->muonRef()->outerTrack().get();
114  else if (pfCandidate->gsfTrackRef().isNonnull())
115  track = pfCandidate->gsfTrackRef().get();
116  if (track) {
117  if (track->pt() > leadChargedPFCandPt) {
118  leadChargedPFCandEtaAtEcalEntrance = pfCandidate->positionAtECALEntrance().eta();
119  leadChargedPFCandPt = track->pt();
120  }
121  }
122  }
123 
124  if ((*thePFTauRef).leadChargedHadrCand().isNonnull()) {
125  int numSignalGammaCandsInSigCone = 0;
126  const std::vector<reco::CandidatePtr>& signalGammaCands = thePFTauRef->signalGammaCands();
127 
128  for (const auto& pfGamma : signalGammaCands) {
129  double dR = deltaR(pfGamma->p4(), thePFTauRef->leadChargedHadrCand()->p4());
130  double signalrad = std::max(0.05, std::min(0.10, 3.0 / std::max(1.0, thePFTauRef->pt())));
131 
132  // pfGammas inside the tau signal cone
133  if (dR < signalrad) {
134  numSignalGammaCandsInSigCone += 1;
135  }
136  }
137 
138  // loop over the electrons
139  for (const auto& theGsfElectron : *gsfElectrons_) {
140  if (theGsfElectron.pt() > 10.) { // CV: only take electrons above some minimal energy/Pt into account...
141  double deltaREleTau = deltaR(theGsfElectron.p4(), thePFTauRef->p4());
142  deltaRDummy = deltaREleTau;
143  if (deltaREleTau < 0.3) {
144  double mva_match = mva_->MVAValue(*thePFTauRef, theGsfElectron);
145  const reco::PFCandidatePtr& lpfch = thePFTauRef->leadPFChargedHadrCand();
146  bool hasGsfTrack = false;
147  if (lpfch.isNonnull()) {
148  hasGsfTrack = lpfch->gsfTrackRef().isNonnull();
149  }
150  if (!hasGsfTrack)
151  hasGsfTrack = theGsfElectron.gsfTrack().isNonnull();
152 
154  if (vetoEcalCracks_ &&
155  (isInEcalCrack(tauEtaAtEcalEntrance) || isInEcalCrack(leadChargedPFCandEtaAtEcalEntrance))) {
156  // add category index
157  category_output_->setValue(tauIndex_, category);
158  // return MVA output value
159  return -99;
160  }
162 
163  if (std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder) { // Barrel
164  if (numSignalGammaCandsInSigCone == 0 && hasGsfTrack) {
165  category = 5.;
166  } else if (numSignalGammaCandsInSigCone >= 1 && hasGsfTrack) {
167  category = 7.;
168  }
169  } else { // Endcap
170  if (numSignalGammaCandsInSigCone == 0 && hasGsfTrack) {
171  category = 13.;
172  } else if (numSignalGammaCandsInSigCone >= 1 && hasGsfTrack) {
173  category = 15.;
174  }
175  }
176 
177  mvaValue = std::min(mvaValue, mva_match);
178  isGsfElectronMatched = true;
179  } // deltaR < 0.3
180  } // electron pt > 10
181  } // end of loop over electrons
182 
183  if (!isGsfElectronMatched) {
184  mvaValue = mva_->MVAValue(*thePFTauRef);
185  const reco::PFCandidatePtr& lpfch = thePFTauRef->leadPFChargedHadrCand();
186  bool hasGsfTrack = false;
187  if (lpfch.isNonnull()) {
188  hasGsfTrack = lpfch->gsfTrackRef().isNonnull();
189  }
190 
192  if (vetoEcalCracks_ &&
193  (isInEcalCrack(tauEtaAtEcalEntrance) || isInEcalCrack(leadChargedPFCandEtaAtEcalEntrance))) {
194  // add category index
195  category_output_->setValue(tauIndex_, category);
196  // return MVA output value
197  return -99;
198  }
200 
201  if (std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder) { // Barrel
202  if (numSignalGammaCandsInSigCone == 0 && !hasGsfTrack) {
203  category = 0.;
204  } else if (numSignalGammaCandsInSigCone >= 1 && !hasGsfTrack) {
205  category = 2.;
206  }
207  } else { // Endcap
208  if (numSignalGammaCandsInSigCone == 0 && !hasGsfTrack) {
209  category = 8.;
210  } else if (numSignalGammaCandsInSigCone >= 1 && !hasGsfTrack) {
211  category = 10.;
212  }
213  }
214  }
215  }
216 
217  if (verbosity_) {
218  edm::LogPrint("PFTauAgainstEleMVA6") << "<PFRecoTauDiscriminationAgainstElectronMVA6::discriminate>:";
219  edm::LogPrint("PFTauAgainstEleMVA6") << " tau: Pt = " << thePFTauRef->pt() << ", eta = " << thePFTauRef->eta()
220  << ", phi = " << thePFTauRef->phi();
221  edm::LogPrint("PFTauAgainstEleMVA6") << " deltaREleTau = " << deltaRDummy
222  << ", isGsfElectronMatched = " << isGsfElectronMatched;
223  edm::LogPrint("PFTauAgainstEleMVA6") << " #Prongs = " << thePFTauRef->signalChargedHadrCands().size();
224  edm::LogPrint("PFTauAgainstEleMVA6") << " MVA = " << mvaValue << ", category = " << category;
225  }
226 
227  // add category index
228  category_output_->setValue(tauIndex_, category);
229  // return MVA output value
230  return mvaValue;
231 }
232 
234  // add all category indices to event
235  evt.put(std::move(category_output_), "category");
236 }
237 
239  double absEta = fabs(eta);
240  return (absEta > 1.460 && absEta < 1.558);
241 }
242 
244  // pfRecoTauDiscriminationAgainstElectronMVA6
246  desc.add<double>("minMVANoEleMatchWOgWOgsfBL", 0.0);
247  desc.add<edm::InputTag>("PFTauProducer", edm::InputTag("pfTauProducer"));
248  desc.add<double>("minMVANoEleMatchWgWOgsfBL", 0.0);
249  desc.add<std::string>("mvaName_wGwGSF_EC", "gbr_wGwGSF_EC");
250  desc.add<double>("minMVAWgWgsfBL", 0.0);
251  desc.add<std::string>("mvaName_woGwGSF_EC", "gbr_woGwGSF_EC");
252  desc.add<double>("minMVAWOgWgsfEC", 0.0);
253  desc.add<std::string>("mvaName_wGwGSF_BL", "gbr_wGwGSF_BL");
254  desc.add<std::string>("mvaName_woGwGSF_BL", "gbr_woGwGSF_BL");
255  desc.add<bool>("returnMVA", true);
256  desc.add<bool>("loadMVAfromDB", true);
257  {
258  edm::ParameterSetDescription pset_Prediscriminants;
259  pset_Prediscriminants.add<std::string>("BooleanOperator", "and");
260  {
262  psd1.add<double>("cut");
263  psd1.add<edm::InputTag>("Producer");
264  pset_Prediscriminants.addOptional<edm::ParameterSetDescription>("leadTrack", psd1);
265  }
266  {
267  // encountered this at
268  // RecoTauTag/Configuration/python/HPSPFTaus_cff.py
270  psd1.add<double>("cut");
271  psd1.add<edm::InputTag>("Producer");
272  pset_Prediscriminants.addOptional<edm::ParameterSetDescription>("decayMode", psd1);
273  }
274  desc.add<edm::ParameterSetDescription>("Prediscriminants", pset_Prediscriminants);
275  }
276  desc.add<std::string>("mvaName_NoEleMatch_woGwoGSF_BL", "gbr_NoEleMatch_woGwoGSF_BL");
277  desc.add<bool>("vetoEcalCracks", true);
278  desc.add<bool>("usePhiAtEcalEntranceExtrapolation", false);
279  desc.add<std::string>("mvaName_NoEleMatch_wGwoGSF_BL", "gbr_NoEleMatch_wGwoGSF_BL");
280  desc.add<double>("minMVANoEleMatchWOgWOgsfEC", 0.0);
281  desc.add<double>("minMVAWOgWgsfBL", 0.0);
282  desc.add<double>("minMVAWgWgsfEC", 0.0);
283  desc.add<int>("verbosity", 0);
284  desc.add<std::string>("mvaName_NoEleMatch_wGwoGSF_EC", "gbr_NoEleMatch_wGwoGSF_EC");
285  desc.add<std::string>("method", "BDTG");
286  desc.add<edm::InputTag>("srcGsfElectrons", edm::InputTag("gedGsfElectrons"));
287  desc.add<std::string>("mvaName_NoEleMatch_woGwoGSF_EC", "gbr_NoEleMatch_woGwoGSF_EC");
288  desc.add<double>("minMVANoEleMatchWgWOgsfEC", 0.0);
289  descriptions.add("pfRecoTauDiscriminationAgainstElectronMVA6", desc);
290 }
291 
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
edm::RefProd< TauCollection > TauRefProd
Definition: Tau.h:38
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
edm::EDGetTokenT< reco::GsfElectronCollection > GsfElectrons_token
void beginEvent(const edm::Event &, const edm::EventSetup &) override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:617
double pt() const
track transverse momentum
Definition: TrackBase.h:602
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T min(T a, T b)
Definition: MathUtil.h:58
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:146
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
fixed size matrix
reco::GsfTrackRef gsfTrackRef() const
Definition: PFCandidate.cc:440
def move(src, dest)
Definition: eostools.py:511