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/DataFormats/TauReco/src/classes_def_3.xml b/DataFormats/TauReco/src/classes_def_3.xml
index c232baf3f781d..d09c7465ec4b6 100644
--- a/DataFormats/TauReco/src/classes_def_3.xml
+++ b/DataFormats/TauReco/src/classes_def_3.xml
@@ -99,7 +99,10 @@
-
+
+
+
+
diff --git a/RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc b/RecoTauTag/RecoTau/plugins/PFTauTransverseImpactParameters.cc
index 1cbc1a7cf736a..38a982ed689ac 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"
@@ -50,7 +54,7 @@ using namespace reco;
using namespace edm;
using namespace std;
-class PFTauTransverseImpactParameters : public EDProducer {
+class PFTauTransverseImpactParameters : public edm::stream::EDProducer<> {
public:
enum Alg{useInputPV=0, useFont};
enum CMSSWPerigee{aCurv=0,aTheta,aPhi,aTip,aLip};
@@ -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);