39 #ifdef GBL_EIGEN_SUPPORT_ROOT
42 #include "TMatrixDSym.h"
43 #include "TMatrixDSymEigen.h"
46 #include <Eigen/Dense>
53 typedef Eigen::Matrix<double, 2, 7>
Matrix27d;
55 typedef Eigen::Matrix<double, 5, 5>
Matrix5d;
77 #ifdef GBL_EIGEN_SUPPORT_ROOT
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.);
87 const TMatrixDSym &aPrecision,
double minPrecision = 0.);
88 void addScatterer(
const TVectorD &aResiduals,
const TVectorD &aPrecision);
90 const TMatrixDSym &aPrecision);
91 void addLocals(
const TMatrixD &aDerivatives);
92 void addGlobals(
const std::vector<int> &aLabels,
93 const TMatrixD &aDerivatives);
110 template<
typename Projection,
typename Residuals,
typename Precision,
111 typename std::enable_if<(Precision::ColsAtCompileTime != 1)>::type* =
113 void addMeasurement(
const Eigen::MatrixBase<Projection>& aProjection,
114 const Eigen::MatrixBase<Residuals>& aResiduals,
115 const Eigen::MatrixBase<Precision>& aPrecision,
116 double minPrecision = 0.);
130 template<
typename Projection,
typename Residuals,
typename Precision,
131 typename std::enable_if<(Precision::ColsAtCompileTime == 1)>::type* =
134 const Eigen::MatrixBase<Residuals>& aResiduals,
135 const Eigen::MatrixBase<Precision>& aPrecision,
136 double minPrecision = 0.);
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.);
165 template<
typename Residuals,
typename Precision,
typename std::enable_if<
166 (Precision::ColsAtCompileTime == 1)>::type* =
nullptr>
168 const Eigen::MatrixBase<Precision>& aPrecision,
169 double minPrecision = 0.);
188 template<
typename Precision,
typename std::enable_if<
189 (Precision::ColsAtCompileTime == 2)>::type* =
nullptr>
191 const Eigen::MatrixBase<Precision>& aPrecision);
210 template<
typename Precision,
typename std::enable_if<
211 (Precision::ColsAtCompileTime == 1)>::type* =
nullptr>
213 const Eigen::MatrixBase<Precision>& aPrecision);
221 template<
typename Derivative>
222 void addLocals(
const Eigen::MatrixBase<Derivative>& aDerivatives);
223 template<
typename Derivative>
232 void addGlobals(
const std::vector<int> &aLabels,
233 const Eigen::MatrixBase<Derivative>& aDerivatives);
242 Eigen::Vector2d &aResiduals, Eigen::Vector2d &aPrecision)
const;
250 std::vector<int> &aLabels, std::vector<double> &aDerivatives)
const;
255 Eigen::Matrix2d &matWJ, Eigen::Vector2d &vecWd)
const;
256 void printPoint(
unsigned int level = 0)
const;
277 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic,
288 template<
typename Projection,
typename Residuals,
typename Precision,
289 typename std::enable_if<(Precision::ColsAtCompileTime != 1)>::type*>
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;
302 Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> measEigen {
304 measTransformation = measEigen.eigenvectors().transpose();
306 measResiduals.tail(measDim) = measTransformation * aResiduals;
307 measPrecision.tail(measDim) = measEigen.eigenvalues();
308 measProjection.bottomRightCorner(measDim, measDim) = measTransformation
312 template<
typename Projection,
typename Residuals,
typename Precision,
313 typename std::enable_if<(Precision::ColsAtCompileTime == 1)>::type*>
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;
325 measResiduals.tail(measDim) = aResiduals;
326 measPrecision.tail(measDim) = aPrecision;
327 measProjection.bottomRightCorner(measDim, measDim) = aProjection;
330 template<
typename Residuals,
typename Precision,
typename std::enable_if<
331 (Precision::ColsAtCompileTime != 1)>::type*>
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;
340 Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> measEigen {
342 measTransformation = measEigen.eigenvectors().transpose();
344 measResiduals.tail(measDim) = measTransformation * aResiduals;
345 measPrecision.tail(measDim) = measEigen.eigenvalues();
346 measProjection.bottomRightCorner(measDim, measDim) = measTransformation;
349 template<
typename Residuals,
typename Precision,
typename std::enable_if<
350 (Precision::ColsAtCompileTime == 1)>::type*>
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;
359 measResiduals.tail(measDim) = aResiduals;
360 measPrecision.tail(measDim) = aPrecision;
361 measProjection.setIdentity();
364 template<
typename Precision,
typename std::enable_if<
365 (Precision::ColsAtCompileTime == 2)>::type*>
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");
371 Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> scatEigen {
373 scatTransformation = scatEigen.eigenvectors();
374 scatTransformation.transposeInPlace();
375 scatResiduals = scatTransformation * aResiduals;
376 scatPrecision = scatEigen.eigenvalues();
379 template<
typename Precision,
typename std::enable_if<
380 (Precision::ColsAtCompileTime == 1)>::type*>
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");
385 scatResiduals = aResiduals;
386 scatPrecision = aPrecision;
387 scatTransformation.setIdentity();
390 template<
typename Derivative>
402 template<
typename Derivative>
404 const Eigen::MatrixBase<Derivative>& aDerivatives) {
Matrix5d nextJacobian
Jacobian to next scatterer (or last measurement)
void getScatterer(Eigen::Matrix2d &aTransformation, Eigen::Vector2d &aResiduals, Eigen::Vector2d &aPrecision) const
Retrieve scatterer of a point.
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.
void getDerivatives(int aDirection, Eigen::Matrix2d &matW, Eigen::Matrix2d &matWJ, Eigen::Vector2d &vecWd) const
Retrieve derivatives of local track model.
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.
const Eigen::MatrixXd & getLocalDerivatives() const
Retrieve local derivatives from a point.
Eigen::MatrixXd globalDerivatives
Derivatives of measurement vs additional global (MP-II) parameters.
void getScatTransformation(Eigen::Matrix2d &aTransformation) const
Get scatterer transformation (from diagonalization).
GblPoint(GblPoint &&)=default
Eigen::Matrix2d scatTransformation
Transformation of diagonalization (of scat. precision matrix)
void printPoint(unsigned int level=0) const
Print GblPoint.
bool scatFlag
Scatterer present?
double getMeasPrecMin() const
get precision cutoff.
void addPrevJacobian(const Matrix5d &aJac)
Define jacobian to previous scatterer (by GBLTrajectory constructor)
GblPoint(const Matrix5d &aJacobian)
Create a point.
double measPrecMin
Minimal measurement precision (for usage)
Vector5d measResiduals
Measurement residuals.
unsigned int hasMeasurement() const
Check for measurement at a point.
unsigned int measDim
Dimension of measurement (1-5), 0 indicates absence of measurement.
bool transFlag
Transformation exists?
void getMeasurement(Matrix5d &aProjection, Vector5d &aResiduals, Vector5d &aPrecision) const
Retrieve measurement of a point.
bool hasScatterer() const
Check for scatterer at a point.
void addScatterer(const Eigen::Vector2d &aResiduals, const Eigen::MatrixBase< Precision > &aPrecision)
Add a (thin) scatterer to a point.
void getGlobalLabelsAndDerivatives(unsigned int aRow, std::vector< int > &aLabels, std::vector< double > &aDerivatives) const
Retrieve global derivatives from a point for a single row.
unsigned int theLabel
Label identifying point.
unsigned int getNumLocals() const
Retrieve number of local derivatives from a point.
int theOffset
Offset number at point if not negative (else interpolation needed)
void getGlobalDerivatives(Eigen::MatrixXd &aDerivatives) const
Retrieve global derivatives from a point.
GblPoint & operator=(const GblPoint &)=default
void setLabel(unsigned int aLabel)
Define label of point (by GBLTrajectory constructor)
void addLocals(const Eigen::MatrixBase< Derivative > &aDerivatives)
Add local derivatives to a point.
void addGlobals(const std::vector< int > &aLabels, const Eigen::MatrixBase< Derivative > &aDerivatives)
Add global derivatives to a point.
Matrix5d measProjection
Projection from measurement to local system.
friend class GblTrajectory
void getGlobalLabels(std::vector< int > &aLabels) const
Retrieve global derivatives labels from a point.
void addNextJacobian(const Matrix5d &aJac)
Define jacobian to next scatterer (by GBLTrajectory constructor)
unsigned int getLabel() const
Retrieve label of point.
void getMeasTransformation(Eigen::MatrixXd &aTransformation) const
Get measurement transformation (from diagonalization).
Eigen::Vector2d scatPrecision
Scattering precision (diagonal of inverse covariance matrix)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor, 5, 5 > measTransformation
Transformation of diagonalization (of meas. precision matrix)
Vector5d measPrecision
Measurement precision (diagonal of inverse covariance matrix)
Matrix5d prevJacobian
Jacobian to previous scatterer (or first measurement)
GblPoint(const GblPoint &)=default
Eigen::MatrixXd localDerivatives
Derivatives of measurement vs additional local (fit) parameters.
const Matrix5d & getP2pJacobian() const
Retrieve point-to-(previous)point jacobian.
GblPoint & operator=(GblPoint &&)=default
void setOffset(int anOffset)
Define offset for point (by GBLTrajectory constructor)
Eigen::Vector2d scatResiduals
Scattering residuals (initial kinks if iterating)
unsigned int getNumGlobals() const
Retrieve number of global derivatives from a point.
Matrix5d p2pJacobian
Point-to-point jacobian from previous point.
int getOffset() const
Retrieve offset for point.
Namespace for the general broken lines package.
Eigen::Matrix< double, 2, 3 > Matrix23d
Eigen::Matrix< double, 5, 1 > Vector5d
Eigen::Matrix< double, 2, 7 > Matrix27d
Eigen::Matrix< double, 2, 5 > Matrix25d
Eigen::Matrix< double, 3, 2 > Matrix32d
Eigen::Matrix< double, 5, 5 > Matrix5d