diff --git a/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc b/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc index e221597c3c9a6..6128df30b25b6 100755 --- a/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc +++ b/PhysicsTools/PatAlgos/plugins/PATTauProducer.cc @@ -361,95 +361,91 @@ void PATTauProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSetup // extraction of variables needed to rerun MVA isolation and ant-electron discriminator on MiniAOD // (only available for PFTaus) if( aTau.isPFTau() ) { - edm::Handle pfTaus; - iEvent.getByToken(pfTauToken_, pfTaus); - reco::PFTauRef pfTauRef(pfTaus, idx); - pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0]; - float ecalEnergy = 0; - float hcalEnergy = 0; - float sumEtaTimesEnergy = 0.; - float sumEnergy = 0.; - float leadChargedCandPt = -99; - float leadChargedCandEtaAtEcalEntrance = -99; - const std::vector& signalCands = pfTauRef->signalPFCands(); - for(std::vector::const_iterator it = signalCands.begin(); it != signalCands.end(); ++it) { - const reco::PFCandidatePtr& icand = *it; - ecalEnergy += icand->ecalEnergy(); - hcalEnergy += icand->hcalEnergy(); - sumEtaTimesEnergy += icand->positionAtECALEntrance().eta()*icand->energy(); - sumEnergy += icand->energy(); - const reco::Track* track = 0; - if ( icand->trackRef().isNonnull() ) track = icand->trackRef().get(); - else if ( icand->muonRef().isNonnull() && icand->muonRef()->innerTrack().isNonnull() ) track = icand->muonRef()->innerTrack().get(); - else if ( icand->muonRef().isNonnull() && icand->muonRef()->globalTrack().isNonnull() ) track = icand->muonRef()->globalTrack().get(); - else if ( icand->muonRef().isNonnull() && icand->muonRef()->outerTrack().isNonnull() ) track = icand->muonRef()->outerTrack().get(); - else if ( icand->gsfTrackRef().isNonnull() ) track = icand->gsfTrackRef().get(); - if ( track ) { - if ( track->pt() > leadChargedCandPt ) { - leadChargedCandEtaAtEcalEntrance = icand->positionAtECALEntrance().eta(); - leadChargedCandPt = track->pt(); - } - } - } - aTauPFEssential.ecalEnergy_ = ecalEnergy; - aTauPFEssential.hcalEnergy_ = hcalEnergy; - aTauPFEssential.ptLeadChargedCand_ = leadChargedCandPt; - aTauPFEssential.etaAtEcalEntranceLeadChargedCand_ = leadChargedCandEtaAtEcalEntrance; - if (sumEnergy != 0.) { - aTauPFEssential.etaAtEcalEntrance_ = sumEtaTimesEnergy/sumEnergy; - } - else { - aTauPFEssential.etaAtEcalEntrance_ = -99.; - } - float leadingTrackNormChi2 = 0; - float ecalEnergyLeadChargedHadrCand = -99.; - float hcalEnergyLeadChargedHadrCand = -99.; - float emFraction = -1.; - float myHCALenergy = 0.; - float myECALenergy = 0.; - const reco::PFCandidatePtr& leadingPFCharged = pfTauRef->leadPFChargedHadrCand(); - if(leadingPFCharged.isNonnull()) { - ecalEnergyLeadChargedHadrCand = leadingPFCharged->ecalEnergy(); - hcalEnergyLeadChargedHadrCand = leadingPFCharged->hcalEnergy(); - reco::TrackRef trackRef = leadingPFCharged->trackRef(); - if(trackRef.isNonnull()) { - leadingTrackNormChi2 = trackRef->normalizedChi2(); - - std::vector myPFCands; - myPFCands.reserve(pfTauRef->isolationPFCands().size()+pfTauRef->signalPFCands().size()); - std::copy(pfTauRef->isolationPFCands().begin(), pfTauRef->isolationPFCands().end(), - std::back_inserter(myPFCands)); - std::copy(pfTauRef->signalPFCands().begin(), pfTauRef->signalPFCands().end(), - std::back_inserter(myPFCands)); - - for(int i=0;i<(int)myPFCands.size();++i){ - myHCALenergy += myPFCands[i]->hcalEnergy(); - myECALenergy += myPFCands[i]->ecalEnergy(); - } - if( myHCALenergy + myECALenergy != 0. ){ - emFraction = myECALenergy/( myHCALenergy + myECALenergy); - } - } - } - aTauPFEssential.emFraction_ = emFraction; - aTauPFEssential.leadingTrackNormChi2_ = leadingTrackNormChi2; - aTauPFEssential.ecalEnergyLeadChargedHadrCand_ = ecalEnergyLeadChargedHadrCand; - aTauPFEssential.hcalEnergyLeadChargedHadrCand_ = hcalEnergyLeadChargedHadrCand; - // extraction of tau lifetime information - if( tauTransverseImpactParameterSrc_.label() != "" ) { - edm::Handle tauLifetimeInfos; - iEvent.getByToken(tauTransverseImpactParameterToken_, tauLifetimeInfos); - const reco::PFTauTransverseImpactParameter& tauLifetimeInfo = *(*tauLifetimeInfos)[pfTauRef]; - pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0]; - aTauPFEssential.dxy_PCA_ = tauLifetimeInfo.dxy_PCA(); - aTauPFEssential.dxy_ = tauLifetimeInfo.dxy(); - aTauPFEssential.dxy_error_ = tauLifetimeInfo.dxy_error(); - aTauPFEssential.hasSV_ = tauLifetimeInfo.hasSecondaryVertex(); - aTauPFEssential.flightLength_ = tauLifetimeInfo.flightLength(); - aTauPFEssential.flightLengthSig_ = tauLifetimeInfo.flightLengthSig(); - aTauPFEssential.ip3d_ = tauLifetimeInfo.ip3d(); - aTauPFEssential.ip3d_error_ = tauLifetimeInfo.ip3d_error(); + edm::Handle pfTaus; + iEvent.getByToken(pfTauToken_, pfTaus); + reco::PFTauRef pfTauRef(pfTaus, idx); + pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0]; + float ecalEnergy = 0; + float hcalEnergy = 0; + float sumEtaTimesEnergy = 0.; + float sumEnergy = 0.; + float leadChargedCandPt = -99; + float leadChargedCandEtaAtEcalEntrance = -99; + const std::vector& signalCands = pfTauRef->signalPFCands(); + for(std::vector::const_iterator it = signalCands.begin(); it != signalCands.end(); ++it) { + const reco::PFCandidatePtr& icand = *it; + ecalEnergy += icand->ecalEnergy(); + hcalEnergy += icand->hcalEnergy(); + sumEtaTimesEnergy += icand->positionAtECALEntrance().eta()*icand->energy(); + sumEnergy += icand->energy(); + const reco::Track* track = 0; + if ( icand->trackRef().isNonnull() ) track = icand->trackRef().get(); + else if ( icand->muonRef().isNonnull() && icand->muonRef()->innerTrack().isNonnull() ) track = icand->muonRef()->innerTrack().get(); + else if ( icand->muonRef().isNonnull() && icand->muonRef()->globalTrack().isNonnull() ) track = icand->muonRef()->globalTrack().get(); + else if ( icand->muonRef().isNonnull() && icand->muonRef()->outerTrack().isNonnull() ) track = icand->muonRef()->outerTrack().get(); + else if ( icand->gsfTrackRef().isNonnull() ) track = icand->gsfTrackRef().get(); + if( track ) { + if( track->pt() > leadChargedCandPt ) { + leadChargedCandEtaAtEcalEntrance = icand->positionAtECALEntrance().eta(); + leadChargedCandPt = track->pt(); + } + } + } + aTauPFEssential.ecalEnergy_ = ecalEnergy; + aTauPFEssential.hcalEnergy_ = hcalEnergy; + aTauPFEssential.ptLeadChargedCand_ = leadChargedCandPt; + aTauPFEssential.etaAtEcalEntranceLeadChargedCand_ = leadChargedCandEtaAtEcalEntrance; + if (sumEnergy != 0.) { + aTauPFEssential.etaAtEcalEntrance_ = sumEtaTimesEnergy/sumEnergy; + } + else { + aTauPFEssential.etaAtEcalEntrance_ = -99.; + } + float leadingTrackNormChi2 = 0; + float ecalEnergyLeadChargedHadrCand = -99.; + float hcalEnergyLeadChargedHadrCand = -99.; + float emFraction = -1.; + float myHCALenergy = 0.; + float myECALenergy = 0.; + const reco::PFCandidatePtr& leadingPFCharged = pfTauRef->leadPFChargedHadrCand(); + if(leadingPFCharged.isNonnull()) { + ecalEnergyLeadChargedHadrCand = leadingPFCharged->ecalEnergy(); + hcalEnergyLeadChargedHadrCand = leadingPFCharged->hcalEnergy(); + reco::TrackRef trackRef = leadingPFCharged->trackRef(); + if( trackRef.isNonnull() ) { + leadingTrackNormChi2 = trackRef->normalizedChi2(); + for( std::vector::const_iterator tauIt = pfTauRef->isolationPFCands().begin(); tauIt!=pfTauRef->isolationPFCands().end(); ++tauIt ){ + myHCALenergy += (*tauIt)->hcalEnergy(); + myECALenergy += (*tauIt)->ecalEnergy(); + } + for( std::vector::const_iterator tauIt = pfTauRef->signalPFCands().begin(); tauIt!=pfTauRef->signalPFCands().end(); ++tauIt ){ + myHCALenergy += (*tauIt)->hcalEnergy(); + myECALenergy += (*tauIt)->ecalEnergy(); + } + if( myHCALenergy + myECALenergy != 0. ) { + emFraction = myECALenergy/( myHCALenergy + myECALenergy); + } } + } + aTauPFEssential.emFraction_ = emFraction; + aTauPFEssential.leadingTrackNormChi2_ = leadingTrackNormChi2; + aTauPFEssential.ecalEnergyLeadChargedHadrCand_ = ecalEnergyLeadChargedHadrCand; + aTauPFEssential.hcalEnergyLeadChargedHadrCand_ = hcalEnergyLeadChargedHadrCand; + // extraction of tau lifetime information + if( tauTransverseImpactParameterSrc_.label() != "" ) { + edm::Handle tauLifetimeInfos; + iEvent.getByToken(tauTransverseImpactParameterToken_, tauLifetimeInfos); + const reco::PFTauTransverseImpactParameter& tauLifetimeInfo = *(*tauLifetimeInfos)[pfTauRef]; + pat::tau::TauPFEssential& aTauPFEssential = aTau.pfEssential_[0]; + aTauPFEssential.dxy_PCA_ = tauLifetimeInfo.dxy_PCA(); + aTauPFEssential.dxy_ = tauLifetimeInfo.dxy(); + aTauPFEssential.dxy_error_ = tauLifetimeInfo.dxy_error(); + aTauPFEssential.hasSV_ = tauLifetimeInfo.hasSecondaryVertex(); + aTauPFEssential.flightLength_ = tauLifetimeInfo.flightLength(); + aTauPFEssential.flightLengthSig_ = tauLifetimeInfo.flightLengthSig(); + aTauPFEssential.ip3d_ = tauLifetimeInfo.ip3d(); + aTauPFEssential.ip3d_error_ = tauLifetimeInfo.ip3d_error(); + } } // Isolation