From 9cdd6b2b8646240bcccc75e24c40785a730fe124 Mon Sep 17 00:00:00 2001 From: AJ Johnson Date: Tue, 19 May 2015 17:54:39 +0200 Subject: [PATCH] Added functionality to compute signed IP wrt tau direction and also store 3D IP's --- .../PFTauTransverseImpactParameter.h | 11 ++++++-- .../src/PFTauTransverseImpactParameter.cc | 12 ++++++-- .../PFTauTransverseImpactParameters.cc | 28 +++++++++++++++---- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/DataFormats/TauReco/interface/PFTauTransverseImpactParameter.h b/DataFormats/TauReco/interface/PFTauTransverseImpactParameter.h index 552212cea9db5..1ea54b53f599e 100644 --- a/DataFormats/TauReco/interface/PFTauTransverseImpactParameter.h +++ b/DataFormats/TauReco/interface/PFTauTransverseImpactParameter.h @@ -35,8 +35,8 @@ namespace reco PFTauTransverseImpactParameter(){} /// constructor from values - PFTauTransverseImpactParameter(const Point&, double, double, const VertexRef&); - PFTauTransverseImpactParameter(const Point&, double, double, const VertexRef&, const Point&, double, const VertexRef&); + PFTauTransverseImpactParameter(const Point&, double, double, const Point&, double, double, const VertexRef&); + PFTauTransverseImpactParameter(const Point&, double, double, const Point&, double, double, const VertexRef&, const Point&, double, const VertexRef&); virtual ~PFTauTransverseImpactParameter(){} PFTauTransverseImpactParameter* clone() const; @@ -45,6 +45,10 @@ namespace reco double dxy() const { return dxy_; } double dxy_error() const { return dxy_error_; } double dxy_Sig() const { return ( dxy_error_ != 0 ) ? (dxy_/dxy_error_) : 0.; } + const Point& ip3d_PCA() const { return pca3d_; } + double ip3d() const { return ip3d_; } + double ip3d_error() const { return ip3d_error_; } + double ip3d_Sig() const { return ( ip3d_error_ != 0 ) ? (ip3d_/ip3d_error_) : 0.; } const VertexRef& primaryVertex() const { return PV_; } Point primaryVertexPos() const; CovMatrix primaryVertexCov() const; @@ -60,6 +64,9 @@ namespace reco Point pca_; double dxy_; double dxy_error_; + Point pca3d_; + double ip3d_; + double ip3d_error_; VertexRef PV_; bool hasSV_; Vector FlightLength_; diff --git a/DataFormats/TauReco/src/PFTauTransverseImpactParameter.cc b/DataFormats/TauReco/src/PFTauTransverseImpactParameter.cc index 169f2359501a1..969914bc6207d 100644 --- a/DataFormats/TauReco/src/PFTauTransverseImpactParameter.cc +++ b/DataFormats/TauReco/src/PFTauTransverseImpactParameter.cc @@ -4,20 +4,28 @@ #include "TVectorT.h" using namespace reco; -PFTauTransverseImpactParameter::PFTauTransverseImpactParameter(const Point& pca, double thedxy, double thedxy_error, const VertexRef& PV) +PFTauTransverseImpactParameter::PFTauTransverseImpactParameter(const Point& pca, double thedxy, double thedxy_error, + const Point& pca3d, double theip3d, double theip3d_error, const VertexRef& PV) : pca_(pca), dxy_(thedxy), dxy_error_(thedxy_error), + pca3d_(pca3d), + ip3d_(theip3d), + ip3d_error_(theip3d_error), PV_(PV), hasSV_(false), FlightLengthSig_(0.) {} -PFTauTransverseImpactParameter::PFTauTransverseImpactParameter(const Point& pca, double thedxy, double thedxy_error, const VertexRef& PV, +PFTauTransverseImpactParameter::PFTauTransverseImpactParameter(const Point& pca, double thedxy, double thedxy_error, + const Point& pca3d, double theip3d, double theip3d_error, const VertexRef& PV, const Point& theFlightLength, double theFlightLengthSig, const VertexRef& SV) : pca_(pca), dxy_(thedxy), dxy_error_(thedxy_error), + pca3d_(pca3d), + ip3d_(theip3d), + ip3d_error_(theip3d_error), PV_(PV), hasSV_(true), FlightLength_(theFlightLength), diff --git a/RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc b/RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc index 1cbc1a7cf736a..96f027601ed0a 100644 --- a/RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc +++ b/RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc @@ -24,6 +24,10 @@ #include "RecoVertex/VertexPrimitives/interface/TransientVertex.h" #include "RecoVertex/AdaptiveVertexFit/interface/AdaptiveVertexFitter.h" #include "RecoBTag/SecondaryVertex/interface/SecondaryVertex.h" +#include "TrackingTools/IPTools/interface/IPTools.h" +#include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h" +#include "TrackingTools/GeomPropagators/interface/AnalyticalTrajectoryExtrapolatorToLine.h" +#include "TrackingTools/GeomPropagators/interface/AnalyticalImpactPointExtrapolator.h" #include "DataFormats/TauReco/interface/PFTau.h" #include "DataFormats/TauReco/interface/PFTauFwd.h" @@ -106,19 +110,31 @@ void PFTauTransverseImpactParameters::produce(edm::Event& iEvent,const edm::Even const std::vector SV=PFTauSVA->value(RefPFTau.key()); double dxy(-999), dxy_err(-999); reco::Vertex::Point poca(0,0,0); + double ip3d(-999), ip3d_err(-999); + reco::Vertex::Point ip3d_poca(0,0,0); if(RefPFTau->leadPFChargedHadrCand().isNonnull()){ if(RefPFTau->leadPFChargedHadrCand()->trackRef().isNonnull()){ if(useFullCalculation_){ reco::TransientTrack transTrk=transTrackBuilder->build(RefPFTau->leadPFChargedHadrCand()->trackRef()); - GlobalPoint pv(PV->position().x(),PV->position().y(),PV->position().z()); - dxy=-transTrk.trajectoryStateClosestToPoint(pv).perigeeParameters().vector()(aTip); - dxy_err=transTrk.trajectoryStateClosestToPoint(pv).perigeeError().covarianceMatrix()(aTip,aTip); - GlobalPoint pos=transTrk.trajectoryStateClosestToPoint(pv).position(); + GlobalVector direction(RefPFTau->p4().px(), RefPFTau->p4().py(), RefPFTau->p4().pz()); //To compute sign of IP + std::pair signed_IP2D = IPTools::signedTransverseImpactParameter(transTrk, direction, (*PV)); + dxy=signed_IP2D.second.value(); + dxy_err=signed_IP2D.second.error(); + std::pair signed_IP3D = IPTools::signedImpactParameter3D(transTrk, direction, (*PV)); + ip3d=signed_IP3D.second.value(); + ip3d_err=signed_IP3D.second.error(); + TransverseImpactPointExtrapolator extrapolator(transTrk.field()); + GlobalPoint pos = extrapolator.extrapolate(transTrk.impactPointState(), RecoVertex::convertPos(PV->position())).globalPosition(); poca=reco::Vertex::Point(pos.x(),pos.y(),pos.z()); + AnalyticalImpactPointExtrapolator extrapolator3D(transTrk.field()); + GlobalPoint pos3d = extrapolator3D.extrapolate(transTrk.impactPointState(),RecoVertex::convertPos(PV->position())).globalPosition(); + ip3d_poca=reco::Vertex::Point(pos3d.x(),pos3d.y(),pos3d.z()); } else{ dxy_err=RefPFTau->leadPFChargedHadrCand()->trackRef()->d0Error(); dxy=RefPFTau->leadPFChargedHadrCand()->trackRef()->dxy(PV->position()); + ip3d_err=RefPFTau->leadPFChargedHadrCand()->trackRef()->dzError(); //store dz, ip3d not available + ip3d=RefPFTau->leadPFChargedHadrCand()->trackRef()->dz(PV->position()); //store dz, ip3d not available } } } @@ -132,13 +148,13 @@ void PFTauTransverseImpactParameters::produce(edm::Event& iEvent,const edm::Even } GlobalVector direction(RefPFTau->px(),RefPFTau->py(),RefPFTau->pz()); double vSig = SecondaryVertex::computeDist3d(*PV,*SV.at(0),direction,true).significance(); - reco::PFTauTransverseImpactParameter TIPV(poca,dxy,dxy_err,PV,v,vSig,SV.at(0)); + reco::PFTauTransverseImpactParameter TIPV(poca,dxy,dxy_err,ip3d_poca,ip3d,ip3d_err,PV,v,vSig,SV.at(0)); reco::PFTauTransverseImpactParameterRef TIPVRef=reco::PFTauTransverseImpactParameterRef(TIPRefProd_out,TIPCollection_out->size()); TIPCollection_out->push_back(TIPV); AVPFTauTIP->setValue(iPFTau,TIPVRef); } else{ - reco::PFTauTransverseImpactParameter TIPV(poca,dxy,dxy_err,PV); + reco::PFTauTransverseImpactParameter TIPV(poca,dxy,dxy_err,ip3d_poca,ip3d,ip3d_err,PV); reco::PFTauTransverseImpactParameterRef TIPVRef=reco::PFTauTransverseImpactParameterRef(TIPRefProd_out,TIPCollection_out->size()); TIPCollection_out->push_back(TIPV); AVPFTauTIP->setValue(iPFTau,TIPVRef);