GeneralBrokenLines V03-01-01
using EIGEN
GblTrajectory.h
Go to the documentation of this file.
1/*
2 * GblTrajectory.h
3 *
4 * Created on: Aug 18, 2011
5 * Author: kleinwrt
6 */
7
32#ifndef GBLTRAJECTORY_H_
33#define GBLTRAJECTORY_H_
34
35#include <array>
36#include "GblPoint.h"
37#include "GblData.h"
38#include "GblPoint.h"
39#include "BorderedBandMatrix.h"
40#include "MilleBinary.h"
41
43namespace gbl {
44
46
51public:
52 GblTrajectory(const std::vector<GblPoint> &aPointList, bool flagCurv = true,
53 bool flagU1dir = true, bool flagU2dir = true);
55 const std::vector<std::pair<std::vector<GblPoint>, Eigen::MatrixXd> > &aPointsAndTransList);
56
58
70 template<typename Seed>
71 GblTrajectory(const std::vector<GblPoint> &aPointList, unsigned int aLabel,
72 const Eigen::MatrixBase<Seed> &aSeed, bool flagCurv = true,
73 bool flagU1dir = true, bool flagU2dir = true);
74
76
87 template<typename Derivatives, typename Measurements, typename Precision,
88 typename std::enable_if<(Precision::ColsAtCompileTime != 1)>::type* =
89 nullptr>
91 const std::vector<std::pair<std::vector<GblPoint>, Eigen::MatrixXd> > &aPointsAndTransList,
92 const Eigen::MatrixBase<Derivatives> &extDerivatives,
93 const Eigen::MatrixBase<Measurements> &extMeasurements,
94 const Eigen::MatrixBase<Precision> &extPrecisions);
95
97
109 template<typename Derivatives, typename Measurements, typename Precision,
110 typename std::enable_if<(Precision::ColsAtCompileTime == 1)>::type* =
111 nullptr>
113 const std::vector<std::pair<std::vector<GblPoint>, Eigen::MatrixXd> > &aPointsAndTransList,
114 const Eigen::MatrixBase<Derivatives> &extDerivatives,
115 const Eigen::MatrixBase<Measurements> &extMeasurements,
116 const Eigen::MatrixBase<Precision> &extPrecisions);
117
118#ifdef GBL_EIGEN_SUPPORT_ROOT
119 // input from ROOT
120 GblTrajectory(const std::vector<GblPoint> &aPointList, unsigned int aLabel,
121 const TMatrixDSym &aSeed, bool flagCurv = true, bool flagU1dir =
122 true, bool flagU2dir = true);
124 const std::vector<std::pair<std::vector<GblPoint>, TMatrixD> > &aPointsAndTransList);
126 const std::vector<std::pair<std::vector<GblPoint>, TMatrixD> > &aPointsAndTransList,
127 const TMatrixD &extDerivatives, const TVectorD &extMeasurements,
128 const TVectorD &extPrecisions);
130 const std::vector<std::pair<std::vector<GblPoint>, TMatrixD> > &aPointsAndTransList,
131 const TMatrixD &extDerivatives, const TVectorD &extMeasurements,
132 const TMatrixDSym &extPrecisions);
133#endif
134 virtual ~GblTrajectory();
135 bool isValid() const;
136 unsigned int getNumPoints() const;
137 unsigned int getExtResults(Eigen::VectorXd &extPar,
138 Eigen::MatrixXd &extCov) const;
139 unsigned int getResults(int aSignedLabel, Eigen::VectorXd &localPar,
140 Eigen::MatrixXd &localCov) const;
141 unsigned int getMeasResults(unsigned int aLabel, unsigned int &numData,
142 Eigen::VectorXd &aResiduals, Eigen::VectorXd &aMeasErrors,
143 Eigen::VectorXd &aResErrors, Eigen::VectorXd &aDownWeights);
144 unsigned int getMeasResults(unsigned int aLabel, unsigned int &numData,
145 Eigen::VectorXd &aResiduals, Eigen::VectorXd &aMeasErrors);
146 unsigned int getScatResults(unsigned int aLabel, unsigned int &numData,
147 Eigen::VectorXd &aResiduals, Eigen::VectorXd &aMeasErrors,
148 Eigen::VectorXd &aResErrors, Eigen::VectorXd &aDownWeights);
149#ifdef GBL_EIGEN_SUPPORT_ROOT
150 // input from ROOT
151 unsigned int getExtResults(TVectorD &extPar,
152 TMatrixDSym &extCov) const;
153 unsigned int getResults(int aSignedLabel, TVectorD &localPar,
154 TMatrixDSym &localCov) const;
155 unsigned int getMeasResults(unsigned int aLabel, unsigned int &numData,
156 TVectorD &aResiduals, TVectorD &aMeasErrors, TVectorD &aResErrors,
157 TVectorD &aDownWeights);
158 unsigned int getScatResults(unsigned int aLabel, unsigned int &numData,
159 TVectorD &aResiduals, TVectorD &aMeasErrors, TVectorD &aResErrors,
160 TVectorD &aDownWeights);
161#endif
162 unsigned int getLabels(std::vector<unsigned int> &aLabelList) const;
163 unsigned int getLabels(
164 std::vector<std::vector<unsigned int> > &aLabelList) const;
165 unsigned int fit(double &Chi2, int &Ndf, double &lostWeight,
166 const std::string &optionList = "", unsigned int aLabel = 0);
167 void milleOut(MilleBinary &aMille);
168 void printTrajectory(unsigned int level = 0) const;
169 void printPoints(unsigned int level = 0) const;
170 void printData() const;
171
172private:
173 unsigned int numAllPoints;
174 std::vector<unsigned int> numPoints;
175 unsigned int numTrajectories;
176 unsigned int numOffsetPoints;
177 unsigned int numOffsets;
179 unsigned int numInnerTransOffsets;
180 unsigned int numCurvature;
181 unsigned int numParameters;
182 unsigned int numLocals;
183 unsigned int numMeasurements;
184 unsigned int externalPoint;
185 unsigned int skippedMeasLabel;
186 unsigned int maxNumGlobals;
188 bool fitOK;
189 std::vector<unsigned int> theDimension;
190 std::vector<std::vector<GblPoint> > thePoints;
191 std::vector<GblData> theData;
192 std::vector<unsigned int> measDataIndex;
193 std::vector<unsigned int> scatDataIndex;
194 Eigen::MatrixXd externalSeed;
195 // composed trajectory
196 std::vector<Eigen::MatrixXd> innerTransformations;
197 std::vector<Eigen::MatrixXd> innerTransDer;
198 std::vector<std::array<unsigned int, 5> > innerTransLab;
199 Eigen::MatrixXd externalDerivatives;
200 Eigen::VectorXd externalMeasurements;
201 Eigen::VectorXd externalPrecisions;
202 // linear equation system
205
206 std::pair<std::vector<unsigned int>, Eigen::MatrixXd> getJacobian(
207 int aSignedLabel) const;
208 void getFitToLocalJacobian(std::array<unsigned int, 5> &anIndex,
209 Matrix5d &aJacobian, const GblPoint &aPoint, unsigned int measDim,
210 unsigned int nJacobian = 1) const;
211 unsigned int getFitToKinkJacobian(std::array<unsigned int, 9> &anIndex,
212 Matrix49d &aJacobian, const GblPoint &aPoint) const;
213 unsigned int getFitToStepJacobian(std::array<unsigned int, 9> &anIndex,
214 Matrix49d &aJacobian, const GblPoint &aPoint) const;
215 unsigned int getFitToKinkAndStepJacobian(
216 std::array<unsigned int, 9> &anIndex, Matrix49d &aJacobian,
217 const GblPoint &aPoint) const;
218 void construct();
219 void defineOffsets();
220 void calcJacobians();
221 void prepare();
223 void predict();
224 double downWeight(unsigned int aMethod);
225 void getResAndErr(unsigned int aData, bool used, double &aResidual,
226 double &aMeasError, double &aResError, double &aDownWeight);
227 void getResAndErr(unsigned int aData, double &aResidual,
228 double &aMeasError);
229};
230
231template<typename Seed>
232GblTrajectory::GblTrajectory(const std::vector<GblPoint> &aPointList,
233 unsigned int aLabel, const Eigen::MatrixBase<Seed> &aSeed,
234 bool flagCurv, bool flagU1dir, bool flagU2dir) :
235 numAllPoints(aPointList.size()), numPoints(), numOffsetPoints(0), numOffsets(
236 0), numInnerTransformations(0), numInnerTransOffsets(0), numCurvature(
237 flagCurv ? 1 : 0), numParameters(0), numLocals(0), numMeasurements(
238 0), externalPoint(aLabel), skippedMeasLabel(0), maxNumGlobals(
239 0), theDimension(0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalSeed(
240 aSeed), innerTransformations(), externalDerivatives(), externalMeasurements(), externalPrecisions() {
241
242 if (flagU1dir)
243 theDimension.push_back(0);
244 if (flagU2dir)
245 theDimension.push_back(1);
246 // simple (single) trajectory
247 thePoints.push_back(aPointList);
248 numPoints.push_back(numAllPoints);
249 construct(); // construct trajectory
250}
251
252template<typename Derivatives, typename Measurements, typename Precision,
253 typename std::enable_if<(Precision::ColsAtCompileTime != 1)>::type*>
255 const std::vector<std::pair<std::vector<GblPoint>, Eigen::MatrixXd> > &aPointsAndTransList,
256 const Eigen::MatrixBase<Derivatives> &extDerivatives,
257 const Eigen::MatrixBase<Measurements> &extMeasurements,
258 const Eigen::MatrixBase<Precision> &extPrecisions) :
259 numAllPoints(), numPoints(), numOffsetPoints(0), numOffsets(0), numInnerTransformations(
260 aPointsAndTransList.size()), numParameters(0), numLocals(0), numMeasurements(
261 0), externalPoint(0), skippedMeasLabel(0), maxNumGlobals(0), theDimension(
262 0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalSeed(), innerTransformations() {
263
264 static_assert(static_cast<int>(Measurements::ColsAtCompileTime) == 1, "GblTrajectory: cols(Measurements) must be 1 (vector)");
265 static_assert(static_cast<int>(Measurements::RowsAtCompileTime) == static_cast<int>(Derivatives::RowsAtCompileTime), "GblTrajectory: rows(Measurements) and rows(Derivatives) must be equal");
266 static_assert(static_cast<int>(Measurements::RowsAtCompileTime) == static_cast<int>(Precision::RowsAtCompileTime), "GblTrajectory: rows(Measurements) and rows(Precision) must be equal");
267 static_assert(static_cast<int>(Precision::RowsAtCompileTime) == static_cast<int>(Precision::ColsAtCompileTime), "GblTrajectory: rows(Precision) and cols(Precision) must be equal");
268 // diagonalize external measurement
269 Eigen::SelfAdjointEigenSolver<typename Precision::PlainObject> extEigen {
270 extPrecisions };
271 // @TODO if (extEigen.info() != Success) abort();
272 auto extTransformation = extEigen.eigenvectors().transpose();
273 externalDerivatives.resize(extDerivatives.rows(), extDerivatives.cols());
274 externalDerivatives = extTransformation * extDerivatives;
275 externalMeasurements.resize(extMeasurements.size());
276 externalMeasurements = extTransformation * extMeasurements;
277 externalPrecisions.resize(extMeasurements.size());
278 externalPrecisions = extEigen.eigenvalues();
279
280 for (unsigned int iTraj = 0; iTraj < aPointsAndTransList.size(); ++iTraj) {
281 thePoints.push_back(aPointsAndTransList[iTraj].first);
282 numPoints.push_back(thePoints.back().size());
283 numAllPoints += numPoints.back();
284 innerTransformations.push_back(aPointsAndTransList[iTraj].second);
285 }
286 theDimension.push_back(0);
287 theDimension.push_back(1);
288 // kinematic (2) or geometric (1) constraint
289 numInnerTransOffsets = innerTransformations[0].rows() == 5 ? 2 : 1;
290 numCurvature =
291 innerTransformations[0].rows() == 5 ?
292 innerTransformations[0].cols() :
293 innerTransformations[0].cols() + numInnerTransformations;
294 construct(); // construct (composed) trajectory
295}
296
297template<typename Derivatives, typename Measurements, typename Precision,
298 typename std::enable_if<(Precision::ColsAtCompileTime == 1)>::type*>
300 const std::vector<std::pair<std::vector<GblPoint>, Eigen::MatrixXd> > &aPointsAndTransList,
301 const Eigen::MatrixBase<Derivatives> &extDerivatives,
302 const Eigen::MatrixBase<Measurements> &extMeasurements,
303 const Eigen::MatrixBase<Precision> &extPrecisions) :
304 numAllPoints(), numPoints(), numOffsetPoints(0), numOffsets(0), numInnerTransformations(
305 aPointsAndTransList.size()), numParameters(0), numLocals(0), numMeasurements(
306 0), externalPoint(0), skippedMeasLabel(0), maxNumGlobals(0), theDimension(
307 0), thePoints(), theData(), measDataIndex(), scatDataIndex(), externalSeed(), innerTransformations() {
308 static_assert(static_cast<int>(Measurements::ColsAtCompileTime) == 1, "GblTrajectory: cols(Measurements) must be 1 (vector)");
309 static_assert(static_cast<int>(Measurements::RowsAtCompileTime) == static_cast<int>(Derivatives::RowsAtCompileTime), "GblTrajectory: rows(Measurements) and rows(Derivatives) must be equal");
310 static_assert(static_cast<int>(Measurements::RowsAtCompileTime) == static_cast<int>(Precision::RowsAtCompileTime), "GblTrajectory: rows(Measurements) and rows(Precision) must be equal");
311
312 externalDerivatives = extDerivatives;
313 externalMeasurements = extMeasurements;
314 externalPrecisions = extPrecisions;
315
316 for (unsigned int iTraj = 0; iTraj < aPointsAndTransList.size(); ++iTraj) {
317 thePoints.push_back(aPointsAndTransList[iTraj].first);
318 numPoints.push_back(thePoints.back().size());
319 numAllPoints += numPoints.back();
320 innerTransformations.push_back(aPointsAndTransList[iTraj].second);
321 }
322 theDimension.push_back(0);
323 theDimension.push_back(1);
324 // kinematic (2) or geometric (1) constraint
325 numInnerTransOffsets = innerTransformations[0].rows() == 5 ? 2 : 1;
327 innerTransformations[0].rows() == 5 ?
328 innerTransformations[0].cols() :
330 construct(); // construct (composed) trajectory
331}
332
333}
334#endif /* GBLTRAJECTORY_H_ */
BorderedBandMatrix definition.
GblData definition.
GblPoint definition.
MilleBinary definition.
(Symmetric) Bordered Band Matrix.
Point on trajectory.
Definition: GblPoint.h:62
GBL trajectory.
Definition: GblTrajectory.h:50
std::vector< unsigned int > numPoints
Number of points on (sub)trajectory.
std::vector< unsigned int > scatDataIndex
mapping points to data blocks from scatterers
BorderedBandMatrix theMatrix
(Bordered band) matrix of linear equation system
std::vector< std::vector< GblPoint > > thePoints
(list of) List of points on trajectory
void printPoints(unsigned int level=0) const
Print GblPoints on trajectory.
unsigned int skippedMeasLabel
Label of point with measurements skipped in fit (for unbiased residuals) (or 0)
unsigned int numTrajectories
Number of trajectories (in composed trajectory)
unsigned int getFitToStepJacobian(std::array< unsigned int, 9 > &anIndex, Matrix49d &aJacobian, const GblPoint &aPoint) const
Get jacobian for transformation from (trajectory) fit to step parameters at point.
void construct()
Construct trajectory from list of points.
unsigned int externalPoint
Label of external point (or 0)
Eigen::MatrixXd externalSeed
Precision (inverse covariance matrix) of external seed.
unsigned int getMeasResults(unsigned int aLabel, unsigned int &numData, Eigen::VectorXd &aResiduals, Eigen::VectorXd &aMeasErrors, Eigen::VectorXd &aResErrors, Eigen::VectorXd &aDownWeights)
Get residuals from fit at point for measurement "long list".
unsigned int numAllPoints
Number of all points on trajectory.
double downWeight(unsigned int aMethod)
Down-weight all points.
VVector theVector
Vector of linear equation system.
void calcJacobians()
Calculate Jacobians to previous/next scatterer from point to point ones.
unsigned int numCurvature
Number of curvature parameters (0 or 1) or external parameters.
Eigen::VectorXd externalPrecisions
Precisions for external measurements of composed trajectory.
std::vector< std::array< unsigned int, 5 > > innerTransLab
Labels at innermost points of composed trajectory.
Eigen::VectorXd externalMeasurements
Residuals for external measurements of composed trajectory.
void printTrajectory(unsigned int level=0) const
Print GblTrajectory.
void predict()
Calculate predictions for all points.
unsigned int getFitToKinkAndStepJacobian(std::array< unsigned int, 9 > &anIndex, Matrix49d &aJacobian, const GblPoint &aPoint) const
Get jacobian for transformation from (trajectory) fit to kink and step parameters at point.
void defineOffsets()
Define offsets from list of points.
std::vector< Eigen::MatrixXd > innerTransformations
Transformations at innermost points of composed trajectory (from common external parameters)
unsigned int numLocals
Total number of (additional) local parameters.
unsigned int numOffsetPoints
Number of points with offsets on trajectory.
void milleOut(MilleBinary &aMille)
Write valid trajectory to Millepede-II binary file.
unsigned int getExtResults(Eigen::VectorXd &extPar, Eigen::MatrixXd &extCov) const
Get fit results for external parameters.
void getFitToLocalJacobian(std::array< unsigned int, 5 > &anIndex, Matrix5d &aJacobian, const GblPoint &aPoint, unsigned int measDim, unsigned int nJacobian=1) const
Get (part of) jacobian for transformation from (trajectory) fit to track parameters at point.
unsigned int numInnerTransformations
Number of inner transformations to external parameters.
unsigned int maxNumGlobals
Max. number of global labels/derivatives per point.
bool isValid() const
Retrieve validity of trajectory.
GblTrajectory(const std::vector< std::pair< std::vector< GblPoint >, Eigen::MatrixXd > > &aPointsAndTransList, const Eigen::MatrixBase< Derivatives > &extDerivatives, const Eigen::MatrixBase< Measurements > &extMeasurements, const Eigen::MatrixBase< Precision > &extPrecisions)
Create new composed trajectory from list of points and transformations with independent external meas...
GblTrajectory(const std::vector< GblPoint > &aPointList, bool flagCurv=true, bool flagU1dir=true, bool flagU2dir=true)
Create new (simple) trajectory from list of points.
void prepare()
Prepare fit for simple or composed trajectory.
unsigned int getResults(int aSignedLabel, Eigen::VectorXd &localPar, Eigen::MatrixXd &localCov) const
Get fit results at point.
Eigen::MatrixXd externalDerivatives
Derivatives for external measurements of composed trajectory.
unsigned int fit(double &Chi2, int &Ndf, double &lostWeight, const std::string &optionList="", unsigned int aLabel=0)
Perform fit of (valid) trajectory.
unsigned int getScatResults(unsigned int aLabel, unsigned int &numData, Eigen::VectorXd &aResiduals, Eigen::VectorXd &aMeasErrors, Eigen::VectorXd &aResErrors, Eigen::VectorXd &aDownWeights)
Get (kink) residuals from fit at point for scatterer.
std::vector< GblData > theData
List of data blocks.
bool constructOK
Trajectory has been successfully constructed (ready for fit/output)
unsigned int numInnerTransOffsets
Number of (points with) offsets affected by inner transformations to external parameters.
std::vector< unsigned int > measDataIndex
mapping points to data blocks from measurements
void buildLinearEquationSystem()
Build linear equation system from data (blocks).
void printData() const
Print GblData blocks for trajectory.
unsigned int getLabels(std::vector< unsigned int > &aLabelList) const
Get (list of) labels of points on (simple) valid trajectory.
unsigned int numParameters
Number of fit parameters.
unsigned int numMeasurements
Total number of measurements.
std::vector< Eigen::MatrixXd > innerTransDer
Derivatives at innermost points of composed trajectory.
unsigned int getFitToKinkJacobian(std::array< unsigned int, 9 > &anIndex, Matrix49d &aJacobian, const GblPoint &aPoint) const
Get jacobian for transformation from (trajectory) fit to kink parameters at point.
std::pair< std::vector< unsigned int >, Eigen::MatrixXd > getJacobian(int aSignedLabel) const
Get jacobian for transformation from fit to track parameters at point.
void getResAndErr(unsigned int aData, bool used, double &aResidual, double &aMeasError, double &aResError, double &aDownWeight)
Get residual and errors from data block "long list".
bool fitOK
Trajectory has been successfully fitted (results are valid)
unsigned int numOffsets
Number of (1D or 2D) offsets on trajectory.
std::vector< unsigned int > theDimension
List of active dimensions (0=u1, 1=u2) in fit.
unsigned int getNumPoints() const
Retrieve number of point from trajectory.
Millepede-II (binary) record.
Definition: MilleBinary.h:81
Simple Vector based on std::vector<double>
Definition: VMatrix.h:43
Namespace for the general broken lines package.
Eigen::Matrix< double, 4, 9 > Matrix49d
Definition: GblData.h:47
Eigen::Matrix< double, 5, 5 > Matrix5d
Definition: GblData.h:46