SND@LHC Software
Loading...
Searching...
No Matches
GblPoint.cc
Go to the documentation of this file.
1/*
2 * GblPoint.cpp
3 *
4 * Created on: Aug 18, 2011
5 * Author: kleinwrt
6 */
7
8#include "GblPoint.h"
9
11namespace gbl {
12
14
18GblPoint::GblPoint(const TMatrixD &aJacobian) :
19 theLabel(0), theOffset(0), measDim(0), transFlag(false), measTransformation(), scatFlag(
20 false), localDerivatives(), globalLabels(), globalDerivatives() {
21
22 for (unsigned int i = 0; i < 5; ++i) {
23 for (unsigned int j = 0; j < 5; ++j) {
24 p2pJacobian(i, j) = aJacobian(i, j);
25 }
26 }
27}
28
29GblPoint::GblPoint(const SMatrix55 &aJacobian) :
30 theLabel(0), theOffset(0), p2pJacobian(aJacobian), measDim(0), transFlag(
31 false), measTransformation(), scatFlag(false), localDerivatives(), globalLabels(), globalDerivatives() {
32
33}
34
37
39
47void GblPoint::addMeasurement(const TMatrixD &aProjection,
48 const TVectorD &aResiduals, const TVectorD &aPrecision,
49 double minPrecision) {
50 measDim = aResiduals.GetNrows();
51 unsigned int iOff = 5 - measDim;
52 for (unsigned int i = 0; i < measDim; ++i) {
53 measResiduals(iOff + i) = aResiduals[i];
54 measPrecision(iOff + i) = (
55 aPrecision[i] >= minPrecision ? aPrecision[i] : 0.);
56 for (unsigned int j = 0; j < measDim; ++j) {
57 measProjection(iOff + i, iOff + j) = aProjection(i, j);
58 }
59 }
60}
61
63
72void GblPoint::addMeasurement(const TMatrixD &aProjection,
73 const TVectorD &aResiduals, const TMatrixDSym &aPrecision,
74 double minPrecision) {
75 measDim = aResiduals.GetNrows();
76 TMatrixDSymEigen measEigen(aPrecision);
78 measTransformation = measEigen.GetEigenVectors();
80 transFlag = true;
81 TVectorD transResiduals = measTransformation * aResiduals;
82 TVectorD transPrecision = measEigen.GetEigenValues();
83 TMatrixD transProjection = measTransformation * aProjection;
84 unsigned int iOff = 5 - measDim;
85 for (unsigned int i = 0; i < measDim; ++i) {
86 measResiduals(iOff + i) = transResiduals[i];
87 measPrecision(iOff + i) = (
88 transPrecision[i] >= minPrecision ? transPrecision[i] : 0.);
89 for (unsigned int j = 0; j < measDim; ++j) {
90 measProjection(iOff + i, iOff + j) = transProjection(i, j);
91 }
92 }
93}
94
96
103void GblPoint::addMeasurement(const TVectorD &aResiduals,
104 const TVectorD &aPrecision, double minPrecision) {
105 measDim = aResiduals.GetNrows();
106 unsigned int iOff = 5 - measDim;
107 for (unsigned int i = 0; i < measDim; ++i) {
108 measResiduals(iOff + i) = aResiduals[i];
109 measPrecision(iOff + i) = (
110 aPrecision[i] >= minPrecision ? aPrecision[i] : 0.);
111 }
112 measProjection = ROOT::Math::SMatrixIdentity();
113}
114
116
124void GblPoint::addMeasurement(const TVectorD &aResiduals,
125 const TMatrixDSym &aPrecision, double minPrecision) {
126 measDim = aResiduals.GetNrows();
127 TMatrixDSymEigen measEigen(aPrecision);
129 measTransformation = measEigen.GetEigenVectors();
131 transFlag = true;
132 TVectorD transResiduals = measTransformation * aResiduals;
133 TVectorD transPrecision = measEigen.GetEigenValues();
134 unsigned int iOff = 5 - measDim;
135 for (unsigned int i = 0; i < measDim; ++i) {
136 measResiduals(iOff + i) = transResiduals[i];
137 measPrecision(iOff + i) = (
138 transPrecision[i] >= minPrecision ? transPrecision[i] : 0.);
139 for (unsigned int j = 0; j < measDim; ++j) {
140 measProjection(iOff + i, iOff + j) = measTransformation(i, j);
141 }
142 }
143}
144
146
150unsigned int GblPoint::hasMeasurement() const {
151 return measDim;
152}
153
155
160void GblPoint::getMeasurement(SMatrix55 &aProjection, SVector5 &aResiduals,
161 SVector5 &aPrecision) const {
162 aProjection = measProjection;
163 aResiduals = measResiduals;
164 aPrecision = measPrecision;
165}
166
168
171void GblPoint::getMeasTransformation(TMatrixD &aTransformation) const {
172 aTransformation.ResizeTo(measDim, measDim);
173 if (transFlag) {
174 aTransformation = measTransformation;
175 } else {
176 aTransformation.UnitMatrix();
177 }
178}
179
181
188void GblPoint::addScatterer(const TVectorD &aResiduals,
189 const TVectorD &aPrecision) {
190 scatFlag = true;
191 scatResiduals(0) = aResiduals[0];
192 scatResiduals(1) = aResiduals[1];
193 scatPrecision(0) = aPrecision[0];
194 scatPrecision(1) = aPrecision[1];
195 scatTransformation = ROOT::Math::SMatrixIdentity();
196}
197
199
214void GblPoint::addScatterer(const TVectorD &aResiduals,
215 const TMatrixDSym &aPrecision) {
216 scatFlag = true;
217 TMatrixDSymEigen scatEigen(aPrecision);
218 TMatrixD aTransformation = scatEigen.GetEigenVectors();
219 aTransformation.T();
220 TVectorD transResiduals = aTransformation * aResiduals;
221 TVectorD transPrecision = scatEigen.GetEigenValues();
222 for (unsigned int i = 0; i < 2; ++i) {
223 scatResiduals(i) = transResiduals[i];
224 scatPrecision(i) = transPrecision[i];
225 for (unsigned int j = 0; j < 2; ++j) {
226 scatTransformation(i, j) = aTransformation(i, j);
227 }
228 }
229}
230
233 return scatFlag;
234}
235
237
242void GblPoint::getScatterer(SMatrix22 &aTransformation, SVector2 &aResiduals,
243 SVector2 &aPrecision) const {
244 aTransformation = scatTransformation;
245 aResiduals = scatResiduals;
246 aPrecision = scatPrecision;
247}
248
250
253void GblPoint::getScatTransformation(TMatrixD &aTransformation) const {
254 aTransformation.ResizeTo(2, 2);
255 if (scatFlag) {
256 for (unsigned int i = 0; i < 2; ++i) {
257 for (unsigned int j = 0; j < 2; ++j) {
258 aTransformation(i, j) = scatTransformation(i, j);
259 }
260 }
261 } else {
262 aTransformation.UnitMatrix();
263 }
264}
265
267
271void GblPoint::addLocals(const TMatrixD &aDerivatives) {
272 if (measDim) {
273 localDerivatives.ResizeTo(aDerivatives);
274 if (transFlag) {
275 localDerivatives = measTransformation * aDerivatives;
276 } else {
277 localDerivatives = aDerivatives;
278 }
279 }
280}
281
283unsigned int GblPoint::getNumLocals() const {
284 return localDerivatives.GetNcols();
285}
286
288const TMatrixD& GblPoint::getLocalDerivatives() const {
289 return localDerivatives;
290}
291
293
298void GblPoint::addGlobals(const std::vector<int> &aLabels,
299 const TMatrixD &aDerivatives) {
300 if (measDim) {
301 globalLabels = aLabels;
302 globalDerivatives.ResizeTo(aDerivatives);
303 if (transFlag) {
304 globalDerivatives = measTransformation * aDerivatives;
305 } else {
306 globalDerivatives = aDerivatives;
307 }
308
309 }
310}
311
313unsigned int GblPoint::getNumGlobals() const {
314 return globalDerivatives.GetNcols();
315}
316
318std::vector<int> GblPoint::getGlobalLabels() const {
319 return globalLabels;
320}
321
323const TMatrixD& GblPoint::getGlobalDerivatives() const {
324 return globalDerivatives;
325}
326
328
331void GblPoint::setLabel(unsigned int aLabel) {
332 theLabel = aLabel;
333}
334
336unsigned int GblPoint::getLabel() const {
337 return theLabel;
338}
339
341
344void GblPoint::setOffset(int anOffset) {
345 theOffset = anOffset;
346}
347
350 return theOffset;
351}
352
355 return p2pJacobian;
356}
357
359
363 int ifail = 0;
364// to optimize: need only two last rows of inverse
365// prevJacobian = aJac.InverseFast(ifail);
366// block matrix algebra
367 SMatrix23 CA = aJac.Sub<SMatrix23>(3, 0)
368 * aJac.Sub<SMatrix33>(0, 0).InverseFast(ifail); // C*A^-1
369 SMatrix22 DCAB = aJac.Sub<SMatrix22>(3, 3) - CA * aJac.Sub<SMatrix32>(0, 3); // D - C*A^-1 *B
370 DCAB.InvertFast();
371 prevJacobian.Place_at(DCAB, 3, 3);
372 prevJacobian.Place_at(-DCAB * CA, 3, 0);
373}
374
376
380 nextJacobian = aJac;
381}
382
384
393void GblPoint::getDerivatives(int aDirection, SMatrix22 &matW, SMatrix22 &matWJ,
394 SVector2 &vecWd) const {
395
396 SMatrix22 matJ;
397 SVector2 vecd;
398 if (aDirection < 1) {
399 matJ = prevJacobian.Sub<SMatrix22>(3, 3);
400 matW = -prevJacobian.Sub<SMatrix22>(3, 1);
401 vecd = prevJacobian.SubCol<SVector2>(0, 3);
402 } else {
403 matJ = nextJacobian.Sub<SMatrix22>(3, 3);
404 matW = nextJacobian.Sub<SMatrix22>(3, 1);
405 vecd = nextJacobian.SubCol<SVector2>(0, 3);
406 }
407
408 if (!matW.InvertFast()) {
409 std::cout << " GblPoint::getDerivatives failed to invert matrix: "
410 << matW << std::endl;
411 std::cout
412 << " Possible reason for singular matrix: multiple GblPoints at same arc-length"
413 << std::endl;
414 throw std::overflow_error("Singular matrix inversion exception");
415 }
416 matWJ = matW * matJ;
417 vecWd = matW * vecd;
418
419}
420
422
425void GblPoint::printPoint(unsigned int level) const {
426 std::cout << " GblPoint";
427 if (theLabel) {
428 std::cout << ", label " << theLabel;
429 if (theOffset >= 0) {
430 std::cout << ", offset " << theOffset;
431 }
432 }
433 if (measDim) {
434 std::cout << ", " << measDim << " measurements";
435 }
436 if (scatFlag) {
437 std::cout << ", scatterer";
438 }
439 if (transFlag) {
440 std::cout << ", diagonalized";
441 }
442 if (localDerivatives.GetNcols()) {
443 std::cout << ", " << localDerivatives.GetNcols()
444 << " local derivatives";
445 }
446 if (globalDerivatives.GetNcols()) {
447 std::cout << ", " << globalDerivatives.GetNcols()
448 << " global derivatives";
449 }
450 std::cout << std::endl;
451 if (level > 0) {
452 if (measDim) {
453 std::cout << " Measurement" << std::endl;
454 std::cout << " Projection: " << std::endl << measProjection
455 << std::endl;
456 std::cout << " Residuals: " << measResiduals << std::endl;
457 std::cout << " Precision: " << measPrecision << std::endl;
458 }
459 if (scatFlag) {
460 std::cout << " Scatterer" << std::endl;
461 std::cout << " Residuals: " << scatResiduals << std::endl;
462 std::cout << " Precision: " << scatPrecision << std::endl;
463 }
464 if (localDerivatives.GetNcols()) {
465 std::cout << " Local Derivatives:" << std::endl;
466 localDerivatives.Print();
467 }
468 if (globalDerivatives.GetNcols()) {
469 std::cout << " Global Labels:";
470 for (unsigned int i = 0; i < globalLabels.size(); ++i) {
471 std::cout << " " << globalLabels[i];
472 }
473 std::cout << std::endl;
474 std::cout << " Global Derivatives:" << std::endl;
475 globalDerivatives.Print();
476 }
477 std::cout << " Jacobian " << std::endl;
478 std::cout << " Point-to-point " << std::endl << p2pJacobian
479 << std::endl;
480 if (theLabel) {
481 std::cout << " To previous offset " << std::endl << prevJacobian
482 << std::endl;
483 std::cout << " To next offset " << std::endl << nextJacobian
484 << std::endl;
485 }
486 }
487}
488
489}
ROOT::Math::SMatrix< double, 5, 5 > SMatrix55
Definition GblData.h:23
ROOT::Math::SMatrix< double, 3 > SMatrix33
Definition GblPoint.h:28
ROOT::Math::SVector< double, 5 > SVector5
Definition GblPoint.h:31
ROOT::Math::SVector< double, 2 > SVector2
Definition GblPoint.h:30
ROOT::Math::SMatrix< double, 3, 2 > SMatrix32
Definition GblPoint.h:27
ROOT::Math::SMatrix< double, 2 > SMatrix22
Definition GblPoint.h:23
ROOT::Math::SMatrix< double, 2, 3 > SMatrix23
Definition GblPoint.h:24
GblPoint(const TMatrixD &aJacobian)
Create a point.
Definition GblPoint.cc:18
std::vector< int > getGlobalLabels() const
Retrieve global derivatives labels from a point.
Definition GblPoint.cc:318
TMatrixD localDerivatives
Derivatives of measurement vs additional local (fit) parameters.
Definition GblPoint.h:107
std::vector< int > globalLabels
Labels of global (MP-II) derivatives.
Definition GblPoint.h:108
void addMeasurement(const TMatrixD &aProjection, const TVectorD &aResiduals, const TVectorD &aPrecision, double minPrecision=0.)
Add a measurement to a point.
Definition GblPoint.cc:47
SMatrix55 nextJacobian
Jacobian to next scatterer (or last measurement)
Definition GblPoint.h:96
void getScatterer(SMatrix22 &aTransformation, SVector2 &aResiduals, SVector2 &aPrecision) const
Retrieve scatterer of a point.
Definition GblPoint.cc:242
TMatrixD measTransformation
Transformation of diagonalization (of meas. precision matrix)
Definition GblPoint.h:102
void printPoint(unsigned int level=0) const
Print GblPoint.
Definition GblPoint.cc:425
void getDerivatives(int aDirection, SMatrix22 &matW, SMatrix22 &matWJ, SVector2 &vecWd) const
Retrieve derivatives of local track model.
Definition GblPoint.cc:393
bool scatFlag
Scatterer present?
Definition GblPoint.h:103
void addScatterer(const TVectorD &aResiduals, const TVectorD &aPrecision)
Add a (thin) scatterer to a point.
Definition GblPoint.cc:188
unsigned int hasMeasurement() const
Check for measurement at a point.
Definition GblPoint.cc:150
unsigned int measDim
Dimension of measurement (1-5), 0 indicates absence of measurement.
Definition GblPoint.h:97
const SMatrix55 & getP2pJacobian() const
Retrieve point-to-(previous)point jacobian.
Definition GblPoint.cc:354
bool transFlag
Transformation exists?
Definition GblPoint.h:101
bool hasScatterer() const
Check for scatterer at a point.
Definition GblPoint.cc:232
void getMeasTransformation(TMatrixD &aTransformation) const
Get measurement transformation (from diagonalization).
Definition GblPoint.cc:171
const TMatrixD & getGlobalDerivatives() const
Retrieve global derivatives from a point.
Definition GblPoint.cc:323
void getMeasurement(SMatrix55 &aProjection, SVector5 &aResiduals, SVector5 &aPrecision) const
Retrieve measurement of a point.
Definition GblPoint.cc:160
void addLocals(const TMatrixD &aDerivatives)
Add local derivatives to a point.
Definition GblPoint.cc:271
SVector2 scatResiduals
Scattering residuals (initial kinks if iterating)
Definition GblPoint.h:105
unsigned int theLabel
Label identifying point.
Definition GblPoint.h:92
unsigned int getNumLocals() const
Retrieve number of local derivatives from a point.
Definition GblPoint.cc:283
int theOffset
Offset number at point if not negative (else interpolation needed)
Definition GblPoint.h:93
void addGlobals(const std::vector< int > &aLabels, const TMatrixD &aDerivatives)
Add global derivatives to a point.
Definition GblPoint.cc:298
void addNextJacobian(const SMatrix55 &aJac)
Define jacobian to next scatterer (by GBLTrajectory constructor)
Definition GblPoint.cc:379
void setLabel(unsigned int aLabel)
Define label of point (by GBLTrajectory constructor)
Definition GblPoint.cc:331
TMatrixD globalDerivatives
Derivatives of measurement vs additional global (MP-II) parameters.
Definition GblPoint.h:109
void addPrevJacobian(const SMatrix55 &aJac)
Define jacobian to previous scatterer (by GBLTrajectory constructor)
Definition GblPoint.cc:362
unsigned int getLabel() const
Retrieve label of point.
Definition GblPoint.cc:336
SMatrix22 scatTransformation
Transformation of diagonalization (of scat. precision matrix)
Definition GblPoint.h:104
SVector2 scatPrecision
Scattering precision (diagonal of inverse covariance matrix)
Definition GblPoint.h:106
const TMatrixD & getLocalDerivatives() const
Retrieve local derivatives from a point.
Definition GblPoint.cc:288
virtual ~GblPoint()
Definition GblPoint.cc:35
SVector5 measPrecision
Measurement precision (diagonal of inverse covariance matrix)
Definition GblPoint.h:100
SMatrix55 measProjection
Projection from measurement to local system.
Definition GblPoint.h:98
SMatrix55 p2pJacobian
Point-to-point jacobian from previous point.
Definition GblPoint.h:94
void setOffset(int anOffset)
Define offset for point (by GBLTrajectory constructor)
Definition GblPoint.cc:344
unsigned int getNumGlobals() const
Retrieve number of global derivatives from a point.
Definition GblPoint.cc:313
SVector5 measResiduals
Measurement residuals.
Definition GblPoint.h:99
SMatrix55 prevJacobian
Jacobian to previous scatterer (or first measurement)
Definition GblPoint.h:95
void getScatTransformation(TMatrixD &aTransformation) const
Get scatterer transformation (from diagonalization).
Definition GblPoint.cc:253
int getOffset() const
Retrieve offset for point.
Definition GblPoint.cc:349
Namespace for the general broken lines package.