Belle II Software  release-06-00-14
ModuleAlignment.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 #include <top/reconstruction_cpp/ModuleAlignment.h>
10 #include <TVector3.h>
11 #include <TRotation.h>
12 #include <TDecompChol.h>
13 
14 namespace Belle2 {
19  namespace TOP {
20 
22  {
23  m_parNames.push_back("x");
24  m_parNames.push_back("y");
25  m_parNames.push_back("z");
26  m_parNames.push_back("alpha");
27  m_parNames.push_back("beta");
28  m_parNames.push_back("gamma");
29  m_parNames.push_back("t0");
30  unsigned numPar = m_parNames.size();
31  m_parInit.resize(numPar, 0);
32  m_par = m_parInit;
33  m_steps.resize(numPar, 0);
34  m_fixed.resize(numPar, false);
35  m_COV.ResizeTo(numPar, numPar);
36  m_U.ResizeTo(numPar, numPar);
37  setSteps(1.0, 0.01, 0.05);
38  }
39 
40  void ModuleAlignment::setSteps(double position, double angle, double time)
41  {
42  m_steps[0] = position;
43  m_steps[1] = position;
44  m_steps[2] = position;
45  m_steps[3] = angle;
46  m_steps[4] = angle;
47  m_steps[5] = angle;
48  m_steps[6] = time;
50  }
51 
53  {
54  m_numPhotons = 0;
55  if (track.getModuleID() != m_moduleID) return -2;
56 
57  m_track = &track;
58  m_hypothesis = hypothesis;
59 
60  std::vector<double> first(m_par.size(), 0);
61  TMatrixDSym second(m_par.size());
62  if (not derivatives(first, second)) return -1;
63 
64  m_U -= second;
65  m_numTracks++;
66 
67  int ier = invertMatrixU();
68  if (ier != 0) return ier;
69 
70  std::vector<double> dpar(m_par.size(), 0);
71  for (size_t i = 0; i < dpar.size(); i++) {
72  for (size_t k = 0; k < dpar.size(); k++) {
73  dpar[i] += m_COV[i][k] * first[k];
74  }
75  if (fabs(dpar[i]) > m_maxDpar[i]) return ier;
76  }
77 
78  for (size_t i = 0; i < dpar.size(); i++) {
79  m_par[i] += dpar[i];
80  }
82  m_valid = true;
83 
84  return 0;
85  }
86 
88  {
89  m_par = m_parInit;
90  m_COV.Zero();
91  m_U.Zero();
92  m_numTracks = 0;
93  m_numUsedTracks = 0;
94  m_valid = false;
95  m_numPhotons = 0;
96  }
97 
98  std::vector<float> ModuleAlignment::getParameters() const
99  {
100  std::vector<float> pars;
101  for (auto par : m_par) pars.push_back(par);
102  return pars;
103  }
104 
105  std::vector<float> ModuleAlignment::getErrors() const
106  {
107  std::vector<float> errors;
108  int numPar = m_par.size();
109  for (int i = 0; i < numPar; i++) {
110  errors.push_back(sqrt(m_COV[i][i]));
111  }
112  return errors;
113  }
114 
115  double ModuleAlignment::getLogL(const std::vector<double>& par, bool& ok)
116  {
117  TVector3 translation(par[0], par[1], par[2]);
118  TRotation rotation;
119  rotation.RotateX(par[3]).RotateY(par[4]).RotateZ(par[5]);
120  ok = m_track->overrideTransformation(rotation, translation);
121  if (not ok) return 0;
122 
123  PDFConstructor pdfConstructor(*m_track, m_hypothesis, m_opt);
124  if (not pdfConstructor.isValid()) {
125  ok = false;
126  return 0;
127  }
128 
129  auto LL = pdfConstructor.getLogL(par[6]);
130  m_numPhotons = LL.numPhotons;
131 
132  return LL.logL;
133  }
134 
135  bool ModuleAlignment::derivatives(std::vector<double>& first, TMatrixDSym& second)
136  {
137  bool ok = false;
138  double f0 = getLogL(m_par, ok);
139  if (not ok) return false;
140 
141  auto par = m_par;
142  for (size_t k = 0; k < par.size(); k++) {
143  if (m_fixed[k]) continue;
144 
145  par[k] = m_par[k] + m_steps[k];
146  double fp = getLogL(par, ok);
147  if (not ok) return false;
148 
149  par[k] = m_par[k] - m_steps[k];
150  double fm = getLogL(par, ok);
151  if (not ok) return false;
152 
153  first[k] = (fp - fm) / 2 / m_steps[k];
154  second[k][k] = (fp - 2 * f0 + fm) / pow(m_steps[k], 2);
155 
156  par[k] = m_par[k];
157  }
158 
159  for (size_t k = 0; k < par.size(); k++) {
160  if (m_fixed[k]) continue;
161  for (size_t j = k + 1; j < par.size(); j++) {
162  if (m_fixed[j]) continue;
163 
164  par[k] = m_par[k] + m_steps[k];
165  par[j] = m_par[j] + m_steps[j];
166  double fpp = getLogL(par, ok);
167  if (not ok) return false;
168 
169  par[j] = m_par[j] - m_steps[j];
170  double fpm = getLogL(par, ok);
171  if (not ok) return false;
172 
173  par[k] = m_par[k] - m_steps[k];
174  par[j] = m_par[j] + m_steps[j];
175  double fmp = getLogL(par, ok);
176  if (not ok) return false;
177 
178  par[j] = m_par[j] - m_steps[j];
179  double fmm = getLogL(par, ok);
180  if (not ok) return false;
181 
182  second[j][k] = second[k][j] = (fpp - fmp - fpm + fmm) / 4 / m_steps[k] / m_steps[j];
183 
184  par[j] = m_par[j];
185  }
186  par[k] = m_par[k];
187  }
188 
189  return true;
190  }
191 
193  {
194  int n = 0;
195  for (auto fixed : m_fixed) {
196  if (not fixed) n++;
197  }
198 
199  TMatrixDSym A(n);
200  int ii = 0;
201  for (int i = 0; i < m_U.GetNrows(); i++) {
202  if (m_fixed[i]) continue;
203  int kk = 0;
204  for (int k = 0; k < m_U.GetNrows(); k++) {
205  if (m_fixed[k]) continue;
206  A[ii][kk] = m_U[i][k];
207  kk++;
208  }
209  ii++;
210  }
211 
212  TDecompChol chol(A);
213  if (not chol.Decompose()) return 1;
214  chol.Invert(A);
215 
216  ii = 0;
217  for (int i = 0; i < m_U.GetNrows(); i++) {
218  if (m_fixed[i]) continue;
219  int kk = 0;
220  for (int k = 0; k < m_U.GetNrows(); k++) {
221  if (m_fixed[k]) continue;
222  m_COV[i][k] = A[ii][kk];
223  kk++;
224  }
225  ii++;
226  }
227 
228  return 0;
229  }
230 
231  } // end top namespace
233 } // end Belle2 namespace
234 
235 
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:470
int m_numUsedTracks
number of tracks used
TMatrixDSym m_U
matrix (neg.
bool derivatives(std::vector< double > &first, TMatrixDSym &second)
Calculates numerically first and second derivatives of log likelihood against the parameters.
TMatrixDSym m_COV
covariance matrix
std::vector< double > m_steps
step sizes
int m_numPhotons
number of photons used for log likelihood calculation
std::vector< bool > m_fixed
true if parameter is fixed
std::vector< std::string > m_parNames
parameter names
std::vector< float > getParameters() const
Returns alignment parameters.
std::vector< double > m_par
current parameter values
double getLogL(const std::vector< double > &par, bool &ok)
Returns log likelihood for given parameters Note: it changes helix parameters of TOPTrack object (m_t...
Const::ChargedStable m_hypothesis
particle hypothesis
bool m_valid
validity of results
void setSteps(double position, double angle, double time)
Sets steps for numerical calculation of derivatives.
int iterate(TOPTrack &track, const Const::ChargedStable &hypothesis)
Run a single alignment iteration, on success update alignment parameters.
std::vector< double > m_parInit
initial parameter values
int invertMatrixU()
Inverts matrix m_U using Cholesky decomposition.
std::vector< double > m_maxDpar
maximal parameter changes in one iteration
std::vector< float > getErrors() const
Returns errors on alignment parameters.
void reset()
Reset the object.
ModuleAlignment(PDFConstructor::EPDFOption opt=PDFConstructor::c_Rough)
Constructor.
TOPTrack * m_track
track parameters at TOP
PDFConstructor::EPDFOption m_opt
PDF option.
PDF construction and log likelihood determination for a given track and particle hypothesis.
LogL getLogL() const
Returns extended log likelihood (using the default time window)
bool isValid() const
Checks the object status.
EPDFOption
Signal PDF construction options.
Reconstructed track at TOP.
Definition: TOPTrack.h:40
bool overrideTransformation(const TRotation &rotation, const TVector3 &translation)
Overrides transformation from local to nominal frame, which is by default obtained from DB.
Definition: TOPTrack.h:129
Abstract base class for different kinds of events.