GeneralBrokenLines  Rev: 2.2.0
GblPoint.h
Go to the documentation of this file.
1 /*
2  * GblPoint.h
3  *
4  * Created on: Aug 18, 2011
5  * Author: kleinwrt
6  */
7 
32 #ifndef GBLPOINT_H_
33 #define GBLPOINT_H_
34 
35 #include<iostream>
36 #include<vector>
37 #include<math.h>
38 #include <stdexcept>
39 #ifdef GBL_EIGEN_SUPPORT_ROOT
40 #include "TVectorD.h"
41 #include "TMatrixD.h"
42 #include "TMatrixDSym.h"
43 #include "TMatrixDSymEigen.h"
44 #endif
45 
46 #include <Eigen/Dense>
47 
48 namespace gbl {
49 
50 typedef Eigen::Matrix<double, 5, 1> Vector5d;
51 typedef Eigen::Matrix<double, 2, 3> Matrix23d;
52 typedef Eigen::Matrix<double, 2, 5> Matrix25d;
53 typedef Eigen::Matrix<double, 2, 7> Matrix27d;
54 typedef Eigen::Matrix<double, 3, 2> Matrix32d;
55 typedef Eigen::Matrix<double, 5, 5> Matrix5d;
56 
58 
69 class GblPoint {
70 public:
71  GblPoint(const Matrix5d &aJacobian);
72  GblPoint(const GblPoint&) = default;
73  GblPoint& operator=(const GblPoint&) = default;
74  GblPoint(GblPoint&&) = default;
75  GblPoint& operator=(GblPoint&&) = default;
76  virtual ~GblPoint();
77 #ifdef GBL_EIGEN_SUPPORT_ROOT
78  // input via ROOT
79  GblPoint(const TMatrixD &aJacobian);
80  void addMeasurement(const TMatrixD &aProjection, const TVectorD &aResiduals,
81  const TVectorD &aPrecision, double minPrecision = 0.);
82  void addMeasurement(const TMatrixD &aProjection, const TVectorD &aResiduals,
83  const TMatrixDSym &aPrecision, double minPrecision = 0.);
84  void addMeasurement(const TVectorD &aResiduals, const TVectorD &aPrecision,
85  double minPrecision = 0.);
86  void addMeasurement(const TVectorD &aResiduals,
87  const TMatrixDSym &aPrecision, double minPrecision = 0.);
88  void addScatterer(const TVectorD &aResiduals, const TVectorD &aPrecision);
89  void addScatterer(const TVectorD &aResiduals,
90  const TMatrixDSym &aPrecision);
91  void addLocals(const TMatrixD &aDerivatives);
92  void addGlobals(const std::vector<int> &aLabels,
93  const TMatrixD &aDerivatives);
94 #endif
95  // input via Eigen
96 
98 
110  template<typename Projection, typename Residuals, typename Precision,
111  typename std::enable_if<(Precision::ColsAtCompileTime != 1)>::type* =
112  nullptr>
113  void addMeasurement(const Eigen::MatrixBase<Projection>& aProjection,
114  const Eigen::MatrixBase<Residuals>& aResiduals,
115  const Eigen::MatrixBase<Precision>& aPrecision,
116  double minPrecision = 0.);
117 
119 
130  template<typename Projection, typename Residuals, typename Precision,
131  typename std::enable_if<(Precision::ColsAtCompileTime == 1)>::type* =
132  nullptr>
133  void addMeasurement(const Eigen::MatrixBase<Projection>& aProjection,
134  const Eigen::MatrixBase<Residuals>& aResiduals,
135  const Eigen::MatrixBase<Precision>& aPrecision,
136  double minPrecision = 0.);
137 
139 
149  template<typename Residuals, typename Precision, typename std::enable_if<
150  (Precision::ColsAtCompileTime != 1)>::type* = nullptr>
151  void addMeasurement(const Eigen::MatrixBase<Residuals>& aResiduals,
152  const Eigen::MatrixBase<Precision>& aPrecision,
153  double minPrecision = 0.);
154 
156 
165  template<typename Residuals, typename Precision, typename std::enable_if<
166  (Precision::ColsAtCompileTime == 1)>::type* = nullptr>
167  void addMeasurement(const Eigen::MatrixBase<Residuals>& aResiduals,
168  const Eigen::MatrixBase<Precision>& aPrecision,
169  double minPrecision = 0.);
170 
172 
188  template<typename Precision, typename std::enable_if<
189  (Precision::ColsAtCompileTime == 2)>::type* = nullptr>
190  void addScatterer(const Eigen::Vector2d &aResiduals,
191  const Eigen::MatrixBase<Precision>& aPrecision);
192 
194 
210  template<typename Precision, typename std::enable_if<
211  (Precision::ColsAtCompileTime == 1)>::type* = nullptr>
212  void addScatterer(const Eigen::Vector2d &aResiduals,
213  const Eigen::MatrixBase<Precision>& aPrecision);
214 
216 
221  template<typename Derivative>
222  void addLocals(const Eigen::MatrixBase<Derivative>& aDerivatives);
223  template<typename Derivative>
224 
226 
232  void addGlobals(const std::vector<int> &aLabels,
233  const Eigen::MatrixBase<Derivative>& aDerivatives);
234  //
235  unsigned int hasMeasurement() const;
236  double getMeasPrecMin() const;
237  void getMeasurement(Matrix5d &aProjection, Vector5d &aResiduals,
238  Vector5d &aPrecision) const;
239  void getMeasTransformation(Eigen::MatrixXd &aTransformation) const;
240  bool hasScatterer() const;
241  void getScatterer(Eigen::Matrix2d &aTransformation,
242  Eigen::Vector2d &aResiduals, Eigen::Vector2d &aPrecision) const;
243  void getScatTransformation(Eigen::Matrix2d &aTransformation) const;
244  unsigned int getNumLocals() const;
245  const Eigen::MatrixXd& getLocalDerivatives() const;
246  unsigned int getNumGlobals() const;
247  void getGlobalLabels(std::vector<int> &aLabels) const;
248  void getGlobalDerivatives(Eigen::MatrixXd &aDerivatives) const;
249  void getGlobalLabelsAndDerivatives(unsigned int aRow,
250  std::vector<int> &aLabels, std::vector<double> &aDerivatives) const;
251  unsigned int getLabel() const;
252  int getOffset() const;
253  const Matrix5d& getP2pJacobian() const;
254  void getDerivatives(int aDirection, Eigen::Matrix2d &matW,
255  Eigen::Matrix2d &matWJ, Eigen::Vector2d &vecWd) const;
256  void printPoint(unsigned int level = 0) const;
257 
258 private:
259  friend class GblTrajectory; // to have the following setters private
260  void setLabel(unsigned int aLabel);
261  void setOffset(int anOffset);
262  void addPrevJacobian(const Matrix5d &aJac);
263  void addNextJacobian(const Matrix5d &aJac);
264 
265  unsigned int theLabel;
266  int theOffset;
270  unsigned int measDim;
271  double measPrecMin;
273 
276  bool transFlag;
277  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic,
278  Eigen::ColMajor /* default */, 5, 5> measTransformation;
279  bool scatFlag;
280  Eigen::Matrix2d scatTransformation;
281  Eigen::Vector2d scatResiduals;
282  Eigen::Vector2d scatPrecision;
283  Eigen::MatrixXd localDerivatives;
284  std::vector<int> globalLabels;
285  Eigen::MatrixXd globalDerivatives;
286 };
287 
288 template<typename Projection, typename Residuals, typename Precision,
289  typename std::enable_if<(Precision::ColsAtCompileTime != 1)>::type*>
290 void GblPoint::addMeasurement(const Eigen::MatrixBase<Projection>& aProjection,
291  const Eigen::MatrixBase<Residuals>& aResiduals,
292  const Eigen::MatrixBase<Precision>& aPrecision, double minPrecision) {
293  static_assert(static_cast<int>(Residuals::ColsAtCompileTime) == 1, "addMeasurement: cols(Residuals) must be 1 (vector)");
294  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) <= 5 or static_cast<int>(Residuals::RowsAtCompileTime) == Eigen::Dynamic, "addMeasurement: rows(Residuals) must be 1-5 or dynamic");
295  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) == static_cast<int>(Precision::RowsAtCompileTime), "addMeasurement: rows(Residuals) and rows(Precision) must be equal");
296  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) == static_cast<int>(Projection::RowsAtCompileTime), "addMeasurement: rows(Residuals) and rows(Projection) must be equal");
297  static_assert(static_cast<int>(Precision::RowsAtCompileTime) == static_cast<int>(Precision::ColsAtCompileTime), "addMeasurement: rows(Precision) and cols(Precision) must be equal");
298  static_assert(static_cast<int>(Projection::RowsAtCompileTime) == static_cast<int>(Projection::ColsAtCompileTime), "addMeasurement: rows(Projection) and cols(Projection) must be equal");
299  measDim = aResiduals.rows();
300  measPrecMin = minPrecision;
301  // arbitrary precision matrix
302  Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> measEigen {
303  aPrecision };
304  measTransformation = measEigen.eigenvectors().transpose();
305  transFlag = true;
306  measResiduals.tail(measDim) = measTransformation * aResiduals;
307  measPrecision.tail(measDim) = measEigen.eigenvalues();
308  measProjection.bottomRightCorner(measDim, measDim) = measTransformation
309  * aProjection;
310 }
311 
312 template<typename Projection, typename Residuals, typename Precision,
313  typename std::enable_if<(Precision::ColsAtCompileTime == 1)>::type*>
314 void GblPoint::addMeasurement(const Eigen::MatrixBase<Projection>& aProjection,
315  const Eigen::MatrixBase<Residuals>& aResiduals,
316  const Eigen::MatrixBase<Precision>& aPrecision, double minPrecision) {
317  static_assert(static_cast<int>(Residuals::ColsAtCompileTime) == 1, "addMeasurement: cols(Residuals) must be 1 (vector)");
318  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) <= 5 or static_cast<int>(Residuals::RowsAtCompileTime) == Eigen::Dynamic, "addMeasurement: rows(Residuals) must be 1-5 or dynamic");
319  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) == static_cast<int>(Precision::RowsAtCompileTime), "addMeasurement: rows(Residuals) and rows(Precision) must be equal");
320  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) == static_cast<int>(Projection::RowsAtCompileTime), "addMeasurement: rows(Residuals) and rows(Projection) must be equal");
321  static_assert(static_cast<int>(Projection::RowsAtCompileTime) == static_cast<int>(Projection::ColsAtCompileTime), "addMeasurement: rows(Projection) and cols(Projection) must be equal");
322  measDim = aResiduals.rows();
323  measPrecMin = minPrecision;
324  // diagonal precision matrix
325  measResiduals.tail(measDim) = aResiduals;
326  measPrecision.tail(measDim) = aPrecision;
327  measProjection.bottomRightCorner(measDim, measDim) = aProjection;
328 }
329 
330 template<typename Residuals, typename Precision, typename std::enable_if<
331  (Precision::ColsAtCompileTime != 1)>::type*>
332 void GblPoint::addMeasurement(const Eigen::MatrixBase<Residuals>& aResiduals,
333  const Eigen::MatrixBase<Precision>& aPrecision, double minPrecision) {
334  static_assert(static_cast<int>(Residuals::ColsAtCompileTime) == 1, "addMeasurement: cols(Residuals) must be 1 (vector)");
335  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) <= 5 or static_cast<int>(Residuals::RowsAtCompileTime) == Eigen::Dynamic, "addMeasurement: rows(Residuals) must be 1-5 or dynamic");
336  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) == static_cast<int>(Precision::RowsAtCompileTime), "addMeasurement: rows(Residuals) and rows(Precision) must be equal");
337  measDim = aResiduals.rows();
338  measPrecMin = minPrecision;
339  // arbitrary precision matrix
340  Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> measEigen {
341  aPrecision };
342  measTransformation = measEigen.eigenvectors().transpose();
343  transFlag = true;
344  measResiduals.tail(measDim) = measTransformation * aResiduals;
345  measPrecision.tail(measDim) = measEigen.eigenvalues();
346  measProjection.bottomRightCorner(measDim, measDim) = measTransformation;
347 }
348 
349 template<typename Residuals, typename Precision, typename std::enable_if<
350  (Precision::ColsAtCompileTime == 1)>::type*>
351 void GblPoint::addMeasurement(const Eigen::MatrixBase<Residuals>& aResiduals,
352  const Eigen::MatrixBase<Precision>& aPrecision, double minPrecision) {
353  static_assert(static_cast<int>(Residuals::ColsAtCompileTime) == 1, "addMeasurement: cols(Residuals) must be 1 (vector)");
354  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) <= 5 or static_cast<int>(Residuals::RowsAtCompileTime) == Eigen::Dynamic, "addMeasurement: rows(Residuals) must be 1-5 or dynamic");
355  static_assert(static_cast<int>(Residuals::RowsAtCompileTime) == static_cast<int>(Precision::RowsAtCompileTime), "addMeasurement: rows(Residuals) and rows(Precision) must be equal");
356  measDim = aResiduals.rows();
357  measPrecMin = minPrecision;
358  // diagonal precision matrix
359  measResiduals.tail(measDim) = aResiduals;
360  measPrecision.tail(measDim) = aPrecision;
361  measProjection.setIdentity();
362 }
363 
364 template<typename Precision, typename std::enable_if<
365  (Precision::ColsAtCompileTime == 2)>::type*>
366 void GblPoint::addScatterer(const Eigen::Vector2d &aResiduals,
367  const Eigen::MatrixBase<Precision>& aPrecision) {
368  static_assert(static_cast<int>(Precision::RowsAtCompileTime) == 2 or static_cast<int>(Precision::RowsAtCompileTime) == Eigen::Dynamic, "addScatterer: rows(Precision) must be 2 or dynamic");
369  scatFlag = true;
370  // arbitrary precision matrix
371  Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> scatEigen {
372  aPrecision };
373  scatTransformation = scatEigen.eigenvectors();
374  scatTransformation.transposeInPlace();
375  scatResiduals = scatTransformation * aResiduals;
376  scatPrecision = scatEigen.eigenvalues();
377 }
378 
379 template<typename Precision, typename std::enable_if<
380  (Precision::ColsAtCompileTime == 1)>::type*>
381 void GblPoint::addScatterer(const Eigen::Vector2d &aResiduals,
382  const Eigen::MatrixBase<Precision>& aPrecision) {
383  static_assert(static_cast<int>(Precision::RowsAtCompileTime) == 2 or static_cast<int>(Precision::RowsAtCompileTime) == Eigen::Dynamic, "addScatterer: rows(Precision) must be 2 or dynamic");
384  scatFlag = true;
385  scatResiduals = aResiduals;
386  scatPrecision = aPrecision;
387  scatTransformation.setIdentity();
388 }
389 
390 template<typename Derivative>
391 void GblPoint::addLocals(const Eigen::MatrixBase<Derivative>& aDerivatives) {
392  if (measDim) {
393  localDerivatives.resize(aDerivatives.rows(), aDerivatives.cols());
394  if (transFlag) {
395  localDerivatives = measTransformation * aDerivatives;
396  } else {
397  localDerivatives = aDerivatives;
398  }
399  }
400 }
401 
402 template<typename Derivative>
403 void GblPoint::addGlobals(const std::vector<int> &aLabels,
404  const Eigen::MatrixBase<Derivative>& aDerivatives) {
405  if (measDim) {
406  globalLabels = aLabels;
407  globalDerivatives.resize(aDerivatives.rows(), aDerivatives.cols());
408  if (transFlag) {
409  globalDerivatives = measTransformation * aDerivatives;
410  } else {
411  globalDerivatives = aDerivatives;
412  }
413 
414  }
415 }
416 
417 }
418 #endif /* GBLPOINT_H_ */
Point on trajectory.
Definition: GblPoint.h:69
Matrix5d nextJacobian
Jacobian to next scatterer (or last measurement)
Definition: GblPoint.h:269
void getScatterer(Eigen::Matrix2d &aTransformation, Eigen::Vector2d &aResiduals, Eigen::Vector2d &aPrecision) const
Retrieve scatterer of a point.
Definition: GblPoint.cpp:290
void addMeasurement(const Eigen::MatrixBase< Residuals > &aResiduals, const Eigen::MatrixBase< Precision > &aPrecision, double minPrecision=0.)
Add a measurement to a point.
std::vector< int > globalLabels
Labels of global (MP-II) derivatives.
Definition: GblPoint.h:284
void getDerivatives(int aDirection, Eigen::Matrix2d &matW, Eigen::Matrix2d &matWJ, Eigen::Vector2d &vecWd) const
Retrieve derivatives of local track model.
Definition: GblPoint.cpp:474
void addMeasurement(const Eigen::MatrixBase< Projection > &aProjection, const Eigen::MatrixBase< Residuals > &aResiduals, const Eigen::MatrixBase< Precision > &aPrecision, double minPrecision=0.)
Add a measurement to a point.
Definition: GblPoint.h:290
const Eigen::MatrixXd & getLocalDerivatives() const
Retrieve local derivatives from a point.
Definition: GblPoint.cpp:340
Eigen::MatrixXd globalDerivatives
Derivatives of measurement vs additional global (MP-II) parameters.
Definition: GblPoint.h:285
void getScatTransformation(Eigen::Matrix2d &aTransformation) const
Get scatterer transformation (from diagonalization).
Definition: GblPoint.cpp:301
GblPoint(GblPoint &&)=default
Eigen::Matrix2d scatTransformation
Transformation of diagonalization (of scat. precision matrix)
Definition: GblPoint.h:280
void printPoint(unsigned int level=0) const
Print GblPoint.
Definition: GblPoint.cpp:506
bool scatFlag
Scatterer present?
Definition: GblPoint.h:279
double getMeasPrecMin() const
get precision cutoff.
Definition: GblPoint.cpp:194
void addPrevJacobian(const Matrix5d &aJac)
Define jacobian to previous scatterer (by GBLTrajectory constructor)
Definition: GblPoint.cpp:445
GblPoint(const Matrix5d &aJacobian)
Create a point.
Definition: GblPoint.cpp:41
double measPrecMin
Minimal measurement precision (for usage)
Definition: GblPoint.h:271
Vector5d measResiduals
Measurement residuals.
Definition: GblPoint.h:274
unsigned int hasMeasurement() const
Check for measurement at a point.
Definition: GblPoint.cpp:186
unsigned int measDim
Dimension of measurement (1-5), 0 indicates absence of measurement.
Definition: GblPoint.h:270
bool transFlag
Transformation exists?
Definition: GblPoint.h:276
void getMeasurement(Matrix5d &aProjection, Vector5d &aResiduals, Vector5d &aPrecision) const
Retrieve measurement of a point.
Definition: GblPoint.cpp:204
bool hasScatterer() const
Check for scatterer at a point.
Definition: GblPoint.cpp:280
void addScatterer(const Eigen::Vector2d &aResiduals, const Eigen::MatrixBase< Precision > &aPrecision)
Add a (thin) scatterer to a point.
Definition: GblPoint.h:366
void getGlobalLabelsAndDerivatives(unsigned int aRow, std::vector< int > &aLabels, std::vector< double > &aDerivatives) const
Retrieve global derivatives from a point for a single row.
Definition: GblPoint.cpp:400
unsigned int theLabel
Label identifying point.
Definition: GblPoint.h:265
unsigned int getNumLocals() const
Retrieve number of local derivatives from a point.
Definition: GblPoint.cpp:335
int theOffset
Offset number at point if not negative (else interpolation needed)
Definition: GblPoint.h:266
void getGlobalDerivatives(Eigen::MatrixXd &aDerivatives) const
Retrieve global derivatives from a point.
Definition: GblPoint.cpp:390
GblPoint & operator=(const GblPoint &)=default
void setLabel(unsigned int aLabel)
Define label of point (by GBLTrajectory constructor)
Definition: GblPoint.cpp:414
void addLocals(const Eigen::MatrixBase< Derivative > &aDerivatives)
Add local derivatives to a point.
Definition: GblPoint.h:391
void addGlobals(const std::vector< int > &aLabels, const Eigen::MatrixBase< Derivative > &aDerivatives)
Add global derivatives to a point.
Definition: GblPoint.h:403
Matrix5d measProjection
Projection from measurement to local system.
Definition: GblPoint.h:272
friend class GblTrajectory
Definition: GblPoint.h:259
void getGlobalLabels(std::vector< int > &aLabels) const
Retrieve global derivatives labels from a point.
Definition: GblPoint.cpp:382
void addNextJacobian(const Matrix5d &aJac)
Define jacobian to next scatterer (by GBLTrajectory constructor)
Definition: GblPoint.cpp:460
unsigned int getLabel() const
Retrieve label of point.
Definition: GblPoint.cpp:419
void getMeasTransformation(Eigen::MatrixXd &aTransformation) const
Get measurement transformation (from diagonalization).
Definition: GblPoint.cpp:216
Eigen::Vector2d scatPrecision
Scattering precision (diagonal of inverse covariance matrix)
Definition: GblPoint.h:282
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor, 5, 5 > measTransformation
Transformation of diagonalization (of meas. precision matrix)
Definition: GblPoint.h:278
Vector5d measPrecision
Measurement precision (diagonal of inverse covariance matrix)
Definition: GblPoint.h:275
virtual ~GblPoint()
Definition: GblPoint.cpp:65
Matrix5d prevJacobian
Jacobian to previous scatterer (or first measurement)
Definition: GblPoint.h:268
GblPoint(const GblPoint &)=default
Eigen::MatrixXd localDerivatives
Derivatives of measurement vs additional local (fit) parameters.
Definition: GblPoint.h:283
const Matrix5d & getP2pJacobian() const
Retrieve point-to-(previous)point jacobian.
Definition: GblPoint.cpp:437
GblPoint & operator=(GblPoint &&)=default
void setOffset(int anOffset)
Define offset for point (by GBLTrajectory constructor)
Definition: GblPoint.cpp:427
Eigen::Vector2d scatResiduals
Scattering residuals (initial kinks if iterating)
Definition: GblPoint.h:281
unsigned int getNumGlobals() const
Retrieve number of global derivatives from a point.
Definition: GblPoint.cpp:374
Matrix5d p2pJacobian
Point-to-point jacobian from previous point.
Definition: GblPoint.h:267
int getOffset() const
Retrieve offset for point.
Definition: GblPoint.cpp:432
Namespace for the general broken lines package.
Eigen::Matrix< double, 2, 3 > Matrix23d
Definition: GblPoint.h:51
Eigen::Matrix< double, 5, 1 > Vector5d
Definition: GblPoint.h:50
Eigen::Matrix< double, 2, 7 > Matrix27d
Definition: GblData.h:47
Eigen::Matrix< double, 2, 5 > Matrix25d
Definition: GblPoint.h:52
Eigen::Matrix< double, 3, 2 > Matrix32d
Definition: GblPoint.h:54
Eigen::Matrix< double, 5, 5 > Matrix5d
Definition: GblData.h:46