Belle II Software  release-06-00-14
DistanceTools.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 
10 #include <analysis/utility/DistanceTools.h>
11 #include <framework/logging/Logger.h>
12 #include "TMath.h"
13 
14 using namespace Belle2;
15 
16 
17 TVector3 DistanceTools::poca(TVector3 const& trackPos, TVector3 const& trackP, TVector3 const& vtxPos)
18 {
19  TVector3 trackDir(trackP.Unit());
20  TVector3 r(vtxPos - trackPos);
21  return trackPos + r.Dot(trackDir) * trackDir;
22 }
23 
24 TVector3 DistanceTools::trackToVtxVec(TVector3 const& trackPos, TVector3 const& trackP, TVector3 const& vtxPos)
25 {
26  TVector3 trackDir(trackP.Unit());
27  TVector3 r(vtxPos - trackPos);
28  return r - (r.Dot(trackDir)) * trackDir;
29 }
30 
31 double DistanceTools::trackToVtxDist(TVector3 const& trackPos, TVector3 const& trackP, TVector3 const& vtxPos)
32 {
33  return trackToVtxVec(trackPos, trackP, vtxPos).Mag();
34 }
35 
36 TMatrixDSym DistanceTools::trackToVtxCovmat(TVector3 const& trackP,
37  TMatrixDSym const& trackPosCovMat, TMatrixDSym const& vtxPosCovMat)
38 {
39  if (trackPosCovMat.GetNcols() != 3 || vtxPosCovMat.GetNcols() != 3) {
40  B2ERROR("in DistanceTools::trackToVtxCovmat, matrices must be of size 3");
41  return TMatrixDSym(3);
42  }
43 
44  TMatrixDSym rCovMat(trackPosCovMat + vtxPosCovMat);
45  TVector3 trackDir(trackP.Unit());
46  //d_j = r_j - v_j * v_k r_k
47  //Jij = del_i d_j = delta_ij - v_i * v_j
48  //Since the vector of closest approach is a linear function of r, its
49  //propagation of errors is exact
50  TMatrixDSym Jacobian(3);
51  // Jacobian_ij = delta_ij -v(i)v(j)
52  for (int i(0); i < 3; ++i)
53  for (int j(0); j < 3; ++j)
54  Jacobian(i, j) = -trackDir(i) * trackDir(j);
55  for (int i(0); i < 3; ++i)
56  Jacobian(i, i) += 1;
57 
58  return rCovMat.Similarity(Jacobian); //calculates J * rCovMat * J^T, and returns it
59 
60 }
61 
62 double DistanceTools::trackToVtxDistErr(TVector3 const& trackPos, TVector3 const& trackP, TVector3 const& vtxPos,
63  TMatrixDSym const& trackPosCovMat, TMatrixDSym const& vtxPosCovMat)
64 {
65  TMatrixDSym covMat(trackToVtxCovmat(trackP, trackPosCovMat, vtxPosCovMat));
66  TVector3 dVec(trackToVtxVec(trackPos, trackP, vtxPos));
67  // n is the normalise vector in the direction of the POCA between the track and the vtx
68  TVector3 n((1. / dVec.Mag()) * dVec);
69 
70  double ret(0);
71 
72  //error on the distance computed as d^T * covMat * d
73  for (int i(0); i < 3; ++i)
74  for (int j(0); j < 3; ++j)
75  ret += n(i) * covMat(i, j) * n(j);
76 
77  return TMath::Sqrt(ret);
78 }
79 
80 
81 TVector3 DistanceTools::vtxToVtxVec(TVector3 const& vtx1Pos, TVector3 const& vtx2Pos)
82 {
83  return vtx2Pos - vtx1Pos;
84 }
85 
86 double DistanceTools::vtxToVtxDist(TVector3 const& vtx1Pos, TVector3 const& vtx2Pos)
87 {
88  return vtxToVtxVec(vtx1Pos, vtx2Pos).Mag();
89 }
90 
91 TMatrixDSym DistanceTools::vtxToVtxCovMat(TMatrixDSym const& vtx1CovMat, TMatrixDSym const& vtx2CovMat)
92 {
93  if (vtx1CovMat.GetNcols() != 3 || vtx2CovMat.GetNcols() != 3) {
94  B2ERROR("in DistanceTools::vtxToVtxCovMat, matrices must be of size 3");
95  return TMatrixDSym(3);
96  }
97 
98  return vtx1CovMat + vtx2CovMat;
99 }
100 
101 double DistanceTools::vtxToVtxDistErr(TVector3 const& vtx1Pos, TVector3 const& vtx2Pos,
102  TMatrixDSym const& vtx1CovMat, TMatrixDSym const& vtx2CovMat)
103 {
104  TMatrixDSym covMat(vtxToVtxCovMat(vtx1CovMat, vtx2CovMat));
105  TVector3 dVec(vtxToVtxVec(vtx1Pos, vtx2Pos));
106  TVector3 n((1. / dVec.Mag()) * dVec);
107 
108  double ret(0);
109 
110  //error on the distance computed as d^T * covMat * d
111  for (int i(0); i < 3; ++i)
112  for (int j(0); j < 3; ++j)
113  ret += n(i) * covMat(i, j) * n(j);
114 
115  return TMath::Sqrt(ret);
116 }
117 
TMatrixDSym vtxToVtxCovMat(TMatrixDSym const &vtx1CovMat, TMatrixDSym const &vtx2CovMat)
Returns the covariance (error) matrix related to the vector linking two vertices.
double trackToVtxDist(TVector3 const &trackPos, TVector3 const &trackP, TVector3 const &vtxPos)
Returns the distance between a vertex and a track's point of closest approach to that vertex.
TMatrixDSym trackToVtxCovmat(TVector3 const &trackP, TMatrixDSym const &trackPosCovMat, TMatrixDSym const &vtxPosCovMat)
Returns the covariance (error) matrix of the 3D vector between a vertex and a track's point of closes...
double trackToVtxDistErr(TVector3 const &trackPos, TVector3 const &trackP, TVector3 const &vtxPos, TMatrixDSym const &trackPosCovMat, TMatrixDSym const &vtxPosCovMat)
Returns the estimated uncertainty between a vertex and a track's point of closest approach to that ve...
double vtxToVtxDistErr(TVector3 const &vtx1Pos, TVector3 const &vtx2Pos, TMatrixDSym const &vtx1CovMat, TMatrixDSym const &vtx2CovMat)
Returns the estimated uncertainty on the distance between two vertices.
TVector3 trackToVtxVec(TVector3 const &trackPos, TVector3 const &trackP, TVector3 const &vtxPos)
Returns the 3D vector between a vertex and a track's point of closest approach to that vertex.
TVector3 vtxToVtxVec(TVector3 const &vtx1Pos, TVector3 const &vtx2Pos)
Returns the 3D vector between two vertices, ie vtxPos2 - vtxPos1.
double vtxToVtxDist(TVector3 const &vtx1Pos, TVector3 const &vtx2Pos)
Returns the distance between two vertices.
TVector3 poca(TVector3 const &trackPos, TVector3 const &trackP, TVector3 const &vtxPos)
Returns the Point Of Closest Approach of a track to a vertex.
Abstract base class for different kinds of events.