#include <RecoBTag/BTagTools/interface/SignedTransverseImpactParameter.h>
Public Member Functions | |
std::pair< bool, Measurement1D > | apply (const reco::TransientTrack &, const GlobalVector &, const reco::Vertex &) const |
SignedTransverseImpactParameter () | |
std::pair< bool, Measurement1D > | zImpactParameter (const reco::TransientTrack &, const GlobalVector &, const reco::Vertex &) const |
Definition at line 16 of file SignedTransverseImpactParameter.h.
SignedTransverseImpactParameter::SignedTransverseImpactParameter | ( | ) | [inline] |
pair< bool, Measurement1D > SignedTransverseImpactParameter::apply | ( | const reco::TransientTrack & | track, | |
const GlobalVector & | direction, | |||
const reco::Vertex & | vertex | |||
) | const |
Definition at line 20 of file SignedTransverseImpactParameter.cc.
References funct::A, funct::abs(), reco::Vertex::covariance(), reco::TransientTrack::field(), TrajectoryStateOnSurface::freeState(), reco::TransientTrack::impactPointState(), LogDebug, funct::sqrt(), PV3DBase< T, PVType, FrameType >::x(), reco::Vertex::x(), x, PV3DBase< T, PVType, FrameType >::y(), reco::Vertex::y(), PV3DBase< T, PVType, FrameType >::z(), and reco::Vertex::z().
Referenced by ImpactParameterAlgorithm::tag().
00022 { 00023 00024 TrajectoryStateOnSurface stateOnSurface = track.impactPointState(); 00025 00026 FreeTrajectoryState * FTS = stateOnSurface.freeState(); //aRecTrack.stateAtFirstPoint().freeTrajectoryState()); 00027 00028 GlobalPoint vertexPosition(vertex.x(),vertex.y(),vertex.z()); 00029 00030 double theValue; 00031 double theError; 00032 TransverseImpactPointExtrapolator TIPE(track.field()); 00033 TrajectoryStateOnSurface TSOS = TIPE.extrapolate(*FTS, vertexPosition); 00034 00035 if(!TSOS.isValid()){ 00036 theValue=0.; 00037 theError=0.; 00038 } 00039 else{ 00040 00041 GlobalPoint D0(TSOS.globalPosition()); 00042 00043 GlobalVector DD0(D0.x()-vertex.x(),D0.y()-vertex.y(),0.); 00044 GlobalVector JetDir(direction); 00045 double ps = DD0.dot(JetDir); 00046 theValue = DD0.mag()*(ps/abs(ps)); 00047 00048 //error calculation 00049 00050 AlgebraicVector6 deriv; 00051 AlgebraicVector3 deriv_v; 00052 GlobalVector dd0 = DD0.unit();//check 00053 00054 deriv_v[0] = - dd0.x(); 00055 deriv_v[1] = - dd0.y(); 00056 deriv_v[2] = - dd0.z(); 00057 00058 deriv[0] = dd0.x(); 00059 deriv[1] = dd0.y(); 00060 deriv[2] = dd0.z(); 00061 deriv[3] = 0.; 00062 deriv[4] = 0.; 00063 deriv[5] = 0.; 00064 //cout << TSOS.cartesianError().matrix() << endl; 00065 //cout << deriv << endl; 00066 double E1 = ROOT::Math::Similarity(deriv,TSOS.cartesianError().matrix()); 00067 double E2 = ROOT::Math::Similarity(deriv_v,vertex.covariance()); 00068 // (aJet.vertex().positionError().matrix()).similarity(deriv_v); 00069 theError = sqrt(E1+E2); 00070 LogDebug("BTagTools") << "Tk error : " << E1 << " , Vtx error : " << E2 << " tot : " << theError; 00071 00072 }//end if 00073 00074 bool x = true; 00075 00076 Measurement1D A(theValue, theError); 00077 return pair<bool,Measurement1D>(x,A); 00078 }// end constructor declaration
pair< bool, Measurement1D > SignedTransverseImpactParameter::zImpactParameter | ( | const reco::TransientTrack & | track, | |
const GlobalVector & | direction, | |||
const reco::Vertex & | vertex | |||
) | const |
Definition at line 82 of file SignedTransverseImpactParameter.cc.
References reco::Vertex::covariance(), reco::TransientTrack::field(), reco::TransientTrack::impactPointState(), LogDebug, funct::sqrt(), true, PV3DBase< T, PVType, FrameType >::x(), reco::Vertex::x(), PV3DBase< T, PVType, FrameType >::y(), reco::Vertex::y(), PV3DBase< T, PVType, FrameType >::z(), and reco::Vertex::z().
00083 { 00084 00085 TransverseImpactPointExtrapolator TIPE(track.field()) ; 00086 TrajectoryStateOnSurface TSOS = track.impactPointState(); 00087 00088 if ( !TSOS.isValid() ) { 00089 LogDebug("BTagTools") << "====>>>> SignedTransverseImpactParameter::zImpactParameter : TSOS not valid" ; 00090 return pair<bool,Measurement1D> (false,Measurement1D(0.0,0.0)) ; 00091 } 00092 00093 GlobalPoint PV(vertex.x(),vertex.y(),vertex.z()); 00094 TrajectoryStateOnSurface statePCA = TIPE.extrapolate( TSOS , PV ) ; 00095 00096 if ( !statePCA.isValid() ) { 00097 LogDebug("BTagTools") << "====>>>> SignedTransverseImpactParameter::zImpactParameter : statePCA not valid" ; 00098 return pair<bool,Measurement1D> (false,Measurement1D(0.0,0.0)) ; 00099 } 00100 00101 GlobalPoint PCA = statePCA.globalPosition() ; 00102 00103 // sign as in rphi 00104 GlobalVector PVPCA ( PCA.x()-PV.x() , PCA.y()-PV.y() , 0. ); 00105 GlobalVector JetDir(direction); 00106 double sign = PVPCA.dot(JetDir); 00107 sign /= fabs(sign) ; 00108 00109 // z IP 00110 double deltaZ = fabs(PCA.z()-PV.z()) * sign ; 00111 00112 // error 00113 double errPvZ2 = vertex.covariance()(2,2) ; 00114 //CW cout << "CW number or rows and columns : " << statePCA.cartesianError().matrix().num_row() << " , " 00115 //CW << statePCA.cartesianError().matrix().num_col() << endl ; 00116 double errTrackZ2 = statePCA.cartesianError().matrix()(2,2) ; 00117 double errZ = sqrt ( errPvZ2 + errTrackZ2 ) ; 00118 00119 // CW alt. -> gives the same!! 00120 // double errTZAlt = statePCA.localError().matrix()[4][4] ; 00121 //CW 00122 00123 return pair<bool,Measurement1D> ( true , Measurement1D( deltaZ , errZ ) ) ; 00124 }