Belle II Software  light-2212-foldex
TrackFitResult.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 #include <mdst/dataobjects/TrackFitResult.h>
9 #include <framework/dataobjects/UncertainHelix.h>
10 #include <mdst/dataobjects/HitPatternCDC.h>
11 #include <mdst/dataobjects/HitPatternVXD.h>
12 
13 #include <framework/utilities/HTML.h>
14 
15 #include <boost/math/special_functions/gamma.hpp>
16 
17 #include <sstream>
18 #include <assert.h>
19 
20 using namespace Belle2;
21 
23  m_pdg(0), m_pValue(0),
24  m_hitPatternCDCInitializer(0),
25  m_hitPatternVXDInitializer(0),
26  m_NDF(c_NDFFlag)
27 {
28  memset(m_tau, 0, sizeof(m_tau));
29  memset(m_cov5, 0, sizeof(m_cov5));
30 }
31 
32 TrackFitResult::TrackFitResult(const ROOT::Math::XYZVector& position, const ROOT::Math::XYZVector& momentum,
33  const TMatrixDSym& covariance, const short int charge,
34  const Const::ParticleType& particleType, const float pValue,
35  const float bField,
36  const uint64_t hitPatternCDCInitializer,
37  const uint32_t hitPatternVXDInitializer,
38  const uint16_t NDF) :
39  m_pdg(std::abs(particleType.getPDGCode())), m_pValue(pValue),
40  m_hitPatternCDCInitializer(hitPatternCDCInitializer),
41  m_hitPatternVXDInitializer(hitPatternVXDInitializer),
42  m_NDF(NDF)
43 {
44  UncertainHelix h(position, momentum, charge, bField, covariance, pValue);
45 
46  m_tau[iD0] = h.getD0();
47  m_tau[iPhi0] = h.getPhi0();
48  m_tau[iOmega] = h.getOmega();
49  m_tau[iZ0] = h.getZ0();
50  m_tau[iTanLambda] = h.getTanLambda();
51 
52  // Upper half of the covariance matrix goes into m_cov5.
53  const TMatrixDSym& cov = h.getCovariance();
54  unsigned int counter = 0;
55  for (unsigned int i = 0; i < c_NPars; ++i) {
56  for (unsigned int j = i; j < c_NPars; ++j) {
57  m_cov5[counter++] = cov(i, j);
58  }
59  }
60  assert(counter == c_NCovEntries);
61 }
62 
63 TrackFitResult::TrackFitResult(const std::vector<float>& tau, const std::vector<float>& cov5,
64  const Const::ParticleType& particleType, const float pValue,
65  const uint64_t hitPatternCDCInitializer,
66  const uint32_t hitPatternVXDInitializer,
67  const uint16_t NDF) :
68  m_pdg(std::abs(particleType.getPDGCode())), m_pValue(pValue),
69  m_hitPatternCDCInitializer(hitPatternCDCInitializer),
70  m_hitPatternVXDInitializer(hitPatternVXDInitializer),
71  m_NDF(NDF)
72 {
73  if (tau.size() != c_NPars
74  || cov5.size() != c_NCovEntries)
75  B2FATAL("Invalid initializer for TrackFitResult.");
76 
77  for (unsigned int i = 0; i < c_NPars; ++i)
78  m_tau[i] = tau[i];
79  for (unsigned int i = 0; i < c_NCovEntries; ++i)
80  m_cov5[i] = cov5[i];
81 }
82 
84 {
85  // skip self-assigns
86  if (this == &input) return;
87  m_pdg = input.m_pdg;
88  m_pValue = input.m_pValue;
89  m_NDF = input.m_NDF;
90  m_hitPatternCDCInitializer = input.m_hitPatternCDCInitializer;
91  m_hitPatternVXDInitializer = input.m_hitPatternVXDInitializer;
92 
93  std::copy(std::begin(input.m_tau), std::end(input.m_tau), std::begin(this->m_tau));
94 
95  std::copy(std::begin(input.m_cov5), std::end(input.m_cov5), std::begin(this->m_cov5));
96 
97 }
98 
100 {
101  if (m_NDF == c_NDFFlag) {
102  return -1;
103  }
104  return m_NDF;
105 }
106 
108 {
109  double pValue = getPValue();
110  int nDF = getNDF();
111  if (pValue == 0) {
112  return std::numeric_limits<double>::infinity();
113  }
114  if (nDF <= 0) {
115  return std::numeric_limits<double>::quiet_NaN();
116  }
117  return 2 * boost::math::gamma_q_inv(nDF / 2., pValue);
118 }
119 
121 {
122  TMatrixDSym cov5(c_NPars);
123  unsigned int counter = 0;
124  for (unsigned int i = 0; i < c_NPars; ++i) {
125  for (unsigned int j = i; j < c_NPars; ++j) {
126  cov5(i, j) = cov5(j, i) = m_cov5[counter];
127  ++counter;
128  }
129  }
130  assert(counter == c_NCovEntries);
131  return cov5;
132 }
133 
135 {
137 }
138 
140 {
142 }
143 std::string TrackFitResult::getInfoHTML() const
144 {
145  std::stringstream out;
146  out << "<b>Fit Hypothesis (PDG)</b>: " << m_pdg << "<br>";
147  out << "<b>nPXDHits</b>: " << getHitPatternVXD().getNPXDHits() << "<br>";
148  out << "<b>nSVDHits</b>: " << getHitPatternVXD().getNSVDHits() << "<br>";
149  out << "<b>nCDCHits</b>: " << getHitPatternCDC().getNHits() << "<br>";
150  out << "<b>NDF</b>: " << getNDF() << "<br>";
151  out << " <br>";
152  out << "<b>d0</b>: " << m_tau[iD0] << " cm <br>";
153  out << "<b>phi0</b>: " << m_tau[iPhi0] << " rad <br>";
154  out << "<b>omega</b>: " << m_tau[iOmega] << " 1/GeV<br>";
155  out << "<b>z0</b>: " << m_tau[iZ0] << " cm <br>";
156  out << "<b>tanLambda</b>: " << m_tau[iTanLambda] << "<br>";
157  out << " <br>";
158  out << "<b>Covariance Matrix (d0, phi0, omega, z0, tanLambda)</b>: " << HTML::getString(getCovariance5()) << "<br>";
159  out << "<b>pValue</b>: " << m_pValue << "<br>";
160  return out.str();
161 }
The ParticleType class for identifying different particle types.
Definition: Const.h:399
Hit pattern of CDC hits within a track.
Definition: HitPatternCDC.h:35
unsigned short getNHits() const
Get the total Number of CDC hits in the fit.
Hit pattern of the VXD within a track.
Definition: HitPatternVXD.h:37
unsigned short getNPXDHits() const
Get total number of hits in the PXD.
unsigned short getNSVDHits() const
Get total number of hits in the SVD.
Values of the result of a track fit with a given particle hypothesis.
static const unsigned int c_NPars
Number of helix parameters.
TMatrixDSym getCovariance5() const
Getter for covariance matrix of perigee parameters in matrix form.
uint32_t m_hitPatternVXDInitializer
Member for initializing the information about hits in the VXD.
static const unsigned int iZ0
Index for z0.
static const unsigned int c_NCovEntries
Number of covariance entries.
unsigned int m_pdg
PDG Code for hypothesis with which the corresponding fit was performed.
Double32_t m_tau[c_NPars]
perigee helix parameters; tau = d0, phi0, omega, z0, tanLambda.
double getChi2() const
Get chi2 given NDF and p-value.
double getPValue() const
Getter for Chi2 Probability of the track fit.
Double32_t m_pValue
Chi2 Probability of the fit.
virtual std::string getInfoHTML() const override
Return a short summary of this object's contents in HTML format.
void updateTrackFitResult(const TrackFitResult &input)
update the TrackFitResults
int getNDF() const
Getter for number of degrees of freedom of the track fit.
static const unsigned int iTanLambda
Index tan lambda.
TrackFitResult()
Constructor initializing everything to zero.
static const unsigned int iD0
Index for d0.
uint64_t m_hitPatternCDCInitializer
Member for initializing the information about hits in the CDC.
static const unsigned int iOmega
Index for omega.
static const uint16_t c_NDFFlag
backward compatibility initialisation for NDF
uint16_t m_NDF
Memeber for number of degrees of freedom.
Double32_t m_cov5[c_NCovEntries]
The 15 = 5*(5+1)/2 covariance matrix elements.
static const unsigned int iPhi0
Index for phi0.
HitPatternCDC getHitPatternCDC() const
Getter for the hit pattern in the CDC;.
HitPatternVXD getHitPatternVXD() const
Getter for the hit pattern in the VXD;.
This class represents an ideal helix in perigee parameterization including the covariance matrix of t...
std::string getString(const TMatrixFBase &matrix, int precision=2, bool color=true)
get HTML table representing a matrix.
Definition: HTML.cc:24
Abstract base class for different kinds of events.
Definition: ClusterUtils.h:23