34 mva_ = std::make_unique<AntiElectronIDMVA6>(
cfg);
37 GsfElectrons_token = consumes<reco::GsfElectronCollection>(srcGsfElectrons_);
38 vetoEcalCracks_ = cfg.
getParameter<
bool>(
"vetoEcalCracks");
43 produces<PFTauDiscriminator>(
"category");
48 double discriminate(
const PFTauRef&)
const override;
57 bool isInEcalCrack(
double)
const;
60 std::unique_ptr<AntiElectronIDMVA6>
mva_;
75 mva_->beginEvent(evt, es);
80 evt.
getByToken(GsfElectrons_token, gsfElectrons_);
86 bool isGsfElectronMatched =
false;
88 float deltaRDummy = 9.9;
90 const float ECALBarrelEndcapEtaBorder = 1.479;
91 float tauEtaAtEcalEntrance = -99.;
92 float sumEtaTimesEnergy = 0.;
94 for (
const auto& pfCandidate : thePFTauRef->signalPFCands()) {
95 sumEtaTimesEnergy += (pfCandidate->positionAtECALEntrance().eta() * pfCandidate->energy());
96 sumEnergy += pfCandidate->energy();
99 tauEtaAtEcalEntrance = sumEtaTimesEnergy / sumEnergy;
102 float leadChargedPFCandEtaAtEcalEntrance = -99.;
103 float leadChargedPFCandPt = -99.;
104 for (
const auto& pfCandidate : thePFTauRef->signalPFCands()) {
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();
117 if (track->
pt() > leadChargedPFCandPt) {
118 leadChargedPFCandEtaAtEcalEntrance = pfCandidate->positionAtECALEntrance().
eta();
119 leadChargedPFCandPt = track->
pt();
124 if ((*thePFTauRef).leadChargedHadrCand().isNonnull()) {
125 int numSignalGammaCandsInSigCone = 0;
126 const std::vector<reco::CandidatePtr>& signalGammaCands = thePFTauRef->signalGammaCands();
128 for (
const auto&
pfGamma : signalGammaCands) {
129 double dR =
deltaR(
pfGamma->p4(), thePFTauRef->leadChargedHadrCand()->p4());
133 if (dR < signalrad) {
134 numSignalGammaCandsInSigCone += 1;
139 for (
const auto& theGsfElectron : *gsfElectrons_) {
140 if (theGsfElectron.pt() > 10.) {
141 double deltaREleTau =
deltaR(theGsfElectron.p4(), thePFTauRef->p4());
142 deltaRDummy = deltaREleTau;
143 if (deltaREleTau < 0.3) {
144 double mva_match = mva_->MVAValue(*thePFTauRef, theGsfElectron);
146 bool hasGsfTrack =
false;
151 hasGsfTrack = theGsfElectron.gsfTrack().isNonnull();
154 if (vetoEcalCracks_ &&
155 (isInEcalCrack(tauEtaAtEcalEntrance) || isInEcalCrack(leadChargedPFCandEtaAtEcalEntrance))) {
157 category_output_->setValue(tauIndex_, category);
163 if (
std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder) {
164 if (numSignalGammaCandsInSigCone == 0 && hasGsfTrack) {
166 }
else if (numSignalGammaCandsInSigCone >= 1 && hasGsfTrack) {
170 if (numSignalGammaCandsInSigCone == 0 && hasGsfTrack) {
172 }
else if (numSignalGammaCandsInSigCone >= 1 && hasGsfTrack) {
177 mvaValue =
std::min(mvaValue, mva_match);
178 isGsfElectronMatched =
true;
183 if (!isGsfElectronMatched) {
184 mvaValue = mva_->MVAValue(*thePFTauRef);
186 bool hasGsfTrack =
false;
192 if (vetoEcalCracks_ &&
193 (isInEcalCrack(tauEtaAtEcalEntrance) || isInEcalCrack(leadChargedPFCandEtaAtEcalEntrance))) {
195 category_output_->setValue(tauIndex_, category);
201 if (
std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder) {
202 if (numSignalGammaCandsInSigCone == 0 && !hasGsfTrack) {
204 }
else if (numSignalGammaCandsInSigCone >= 1 && !hasGsfTrack) {
208 if (numSignalGammaCandsInSigCone == 0 && !hasGsfTrack) {
210 }
else if (numSignalGammaCandsInSigCone >= 1 && !hasGsfTrack) {
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();
228 category_output_->setValue(tauIndex_, category);
239 double absEta = fabs(eta);
240 return (absEta > 1.460 && absEta < 1.558);
246 desc.
add<
double>(
"minMVANoEleMatchWOgWOgsfBL", 0.0);
248 desc.
add<
double>(
"minMVANoEleMatchWgWOgsfBL", 0.0);
250 desc.
add<
double>(
"minMVAWgWgsfBL", 0.0);
252 desc.
add<
double>(
"minMVAWOgWgsfEC", 0.0);
255 desc.
add<
bool>(
"returnMVA",
true);
256 desc.
add<
bool>(
"loadMVAfromDB",
true);
262 psd1.
add<
double>(
"cut");
270 psd1.
add<
double>(
"cut");
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");
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);
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
edm::RefProd< TauCollection > TauRefProd
bool isNonnull() const
Checks for non-null.
double discriminate(const PFTauRef &) const override
~PFRecoTauDiscriminationAgainstElectronMVA6() override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::EDGetTokenT< reco::GsfElectronCollection > GsfElectrons_token
void beginEvent(const edm::Event &, const edm::EventSetup &) override
edm::Handle< TauCollection > taus_
bool isInEcalCrack(double) const
#define DEFINE_FWK_MODULE(type)
double eta() const
pseudorapidity of momentum vector
double pt() const
track transverse momentum
edm::InputTag srcGsfElectrons_
Abs< T >::type abs(const T &t)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool isNonnull() const
Checks for non-null.
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
std::unique_ptr< PFTauDiscriminator > category_output_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
PFRecoTauDiscriminationAgainstElectronMVA6(const edm::ParameterSet &cfg)
std::unique_ptr< AntiElectronIDMVA6 > mva_
reco::GsfTrackRef gsfTrackRef() const
edm::Handle< reco::GsfElectronCollection > gsfElectrons_
void endEvent(edm::Event &) override