90 bool isGsfElectronMatched =
false;
92 float deltaRDummy = 9.9;
94 const float ECALBarrelEndcapEtaBorder = 1.479;
95 float tauEtaAtEcalEntrance = -99.;
96 float sumEtaTimesEnergy = 0.;
98 const std::vector<reco::PFCandidatePtr>& signalPFCands = thePFTauRef->signalPFCands();
99 for ( std::vector<reco::PFCandidatePtr>::const_iterator pfCandidate = signalPFCands.begin();
100 pfCandidate != signalPFCands.end(); ++pfCandidate ) {
101 sumEtaTimesEnergy += ((*pfCandidate)->positionAtECALEntrance().eta()*(*pfCandidate)->energy());
102 sumEnergy += (*pfCandidate)->energy();
104 if ( sumEnergy > 0. ) {
105 tauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
108 float leadChargedPFCandEtaAtEcalEntrance = -99.;
109 float leadChargedPFCandPt = -99.;
110 for ( std::vector<reco::PFCandidatePtr>::const_iterator pfCandidate = signalPFCands.begin();
111 pfCandidate != signalPFCands.end(); ++pfCandidate ) {
113 if ( (*pfCandidate)->trackRef().isNonnull() ) track = (*pfCandidate)->trackRef().get();
114 else if ( (*pfCandidate)->muonRef().isNonnull() && (*pfCandidate)->muonRef()->innerTrack().isNonnull() ) track = (*pfCandidate)->muonRef()->innerTrack().get();
115 else if ( (*pfCandidate)->muonRef().isNonnull() && (*pfCandidate)->muonRef()->globalTrack().isNonnull() ) track = (*pfCandidate)->muonRef()->globalTrack().get();
116 else if ( (*pfCandidate)->muonRef().isNonnull() && (*pfCandidate)->muonRef()->outerTrack().isNonnull() ) track = (*pfCandidate)->muonRef()->outerTrack().get();
117 else if ( (*pfCandidate)->gsfTrackRef().isNonnull() ) track = (*pfCandidate)->gsfTrackRef().get();
119 if ( track->
pt() > leadChargedPFCandPt ) {
120 leadChargedPFCandEtaAtEcalEntrance = (*pfCandidate)->positionAtECALEntrance().
eta();
121 leadChargedPFCandPt = track->
pt();
126 if( (*thePFTauRef).leadPFChargedHadrCand().isNonnull()) {
128 int numSignalPFGammaCandsInSigCone = 0;
129 const std::vector<reco::PFCandidatePtr>& signalPFGammaCands = thePFTauRef->signalPFGammaCands();
131 for ( std::vector<reco::PFCandidatePtr>::const_iterator
pfGamma = signalPFGammaCands.begin();
134 double dR =
deltaR((*pfGamma)->p4(), thePFTauRef->leadPFChargedHadrCand()->p4());
138 if (dR < signalrad) {
139 numSignalPFGammaCandsInSigCone += 1;
144 for ( reco::GsfElectronCollection::const_iterator theGsfElectron =
gsfElectrons_->begin();
146 if ( theGsfElectron->pt() > 10. ) {
147 double deltaREleTau =
deltaR(theGsfElectron->p4(), thePFTauRef->p4());
148 deltaRDummy = deltaREleTau;
149 if ( deltaREleTau < 0.3 ) {
150 double mva_match =
mva_->
MVAValue(*thePFTauRef, *theGsfElectron);
151 bool hasGsfTrack = thePFTauRef->leadPFChargedHadrCand()->gsfTrackRef().
isNonnull();
153 hasGsfTrack = theGsfElectron->gsfTrack().isNonnull();
164 if (
std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder ) {
165 if ( numSignalPFGammaCandsInSigCone == 0 && hasGsfTrack ) {
168 else if ( numSignalPFGammaCandsInSigCone >= 1 && hasGsfTrack ) {
172 if ( numSignalPFGammaCandsInSigCone == 0 && hasGsfTrack ) {
175 else if ( numSignalPFGammaCandsInSigCone >= 1 && hasGsfTrack ) {
180 mvaValue =
std::min(mvaValue, mva_match);
181 isGsfElectronMatched =
true;
186 if ( !isGsfElectronMatched ) {
188 bool hasGsfTrack = thePFTauRef->leadPFChargedHadrCand()->gsfTrackRef().
isNonnull();
199 if (
std::abs(tauEtaAtEcalEntrance) < ECALBarrelEndcapEtaBorder ) {
200 if ( numSignalPFGammaCandsInSigCone == 0 && !hasGsfTrack ) {
203 else if ( numSignalPFGammaCandsInSigCone >= 1 && !hasGsfTrack ) {
207 if ( numSignalPFGammaCandsInSigCone == 0 && !hasGsfTrack ) {
210 else if ( numSignalPFGammaCandsInSigCone >= 1 && !hasGsfTrack ) {
218 edm::LogPrint(
"PFTauAgainstEleMVA6") <<
"<PFRecoTauDiscriminationAgainstElectronMVA6::discriminate>:" ;
219 edm::LogPrint(
"PFTauAgainstEleMVA6") <<
" tau: Pt = " << thePFTauRef->pt() <<
", eta = " << thePFTauRef->eta() <<
", phi = " << thePFTauRef->phi();
220 edm::LogPrint(
"PFTauAgainstEleMVA6") <<
" deltaREleTau = " << deltaRDummy <<
", isGsfElectronMatched = " << isGsfElectronMatched;
221 edm::LogPrint(
"PFTauAgainstEleMVA6") <<
" #Prongs = " << thePFTauRef->signalPFChargedHadrCands().size();
bool isNonnull() const
Checks for non-null.
AntiElectronIDMVA6 * mva_
bool isInEcalCrack(double) const
double eta() const
pseudorapidity of momentum vector
double pt() const
track transverse momentum
Abs< T >::type abs(const T &t)
double deltaR(double eta1, double eta2, double phi1, double phi2)
std::unique_ptr< PFTauDiscriminator > category_output_
double MVAValue(Float_t TauPt, Float_t TauEtaAtEcalEntrance, Float_t TauPhi, Float_t TauLeadChargedPFCandPt, Float_t TauLeadChargedPFCandEtaAtEcalEntrance, Float_t TauEmFraction, Float_t TauLeadPFChargedHadrHoP, Float_t TauLeadPFChargedHadrEoP, Float_t TauVisMassIn, Float_t TaudCrackEta, Float_t TaudCrackPhi, Float_t TauHasGsf, Int_t TauSignalPFGammaCandsIn, Int_t TauSignalPFGammaCandsOut, const std::vector< Float_t > &GammasdEtaInSigCone, const std::vector< Float_t > &GammasdPhiInSigCone, const std::vector< Float_t > &GammasPtInSigCone, const std::vector< Float_t > &GammasdEtaOutSigCone, const std::vector< Float_t > &GammasdPhiOutSigCone, const std::vector< Float_t > &GammasPtOutSigCone, Float_t ElecEta, Float_t ElecPhi, Float_t ElecEtotOverPin, Float_t ElecChi2NormGSF, Float_t ElecChi2NormKF, Float_t ElecGSFNumHits, Float_t ElecKFNumHits, Float_t ElecGSFTrackResol, Float_t ElecGSFTracklnPt, Float_t ElecPin, Float_t ElecPout, Float_t ElecEecal, Float_t ElecDeltaEta, Float_t ElecDeltaPhi, Float_t ElecMvaInSigmaEtaEta, Float_t ElecMvaInHadEnergy, Float_t ElecMvaInDeltaEta)
edm::Handle< reco::GsfElectronCollection > gsfElectrons_