1 | #include <TMath.h>
|
---|
2 | #include <TVector3.h>
|
---|
3 | #include <TMatrixD.h>
|
---|
4 | #include <TMatrixDSym.h>
|
---|
5 | #include <TDecompChol.h>
|
---|
6 | #include <TRandom.h>
|
---|
7 | #include <iostream>
|
---|
8 | #include "SolGridCov.h"
|
---|
9 | #include "ObsTrk.h"
|
---|
10 | //
|
---|
11 | // Constructors
|
---|
12 | //
|
---|
13 | // x(3) track origin, p(3) track momentum at origin, Q charge, B magnetic field in Tesla
|
---|
14 | ObsTrk::ObsTrk(TVector3 x, TVector3 p, Double_t Q, Double_t B, SolGridCov *GC)
|
---|
15 | {
|
---|
16 | SetBfield(B);
|
---|
17 | fGC = GC;
|
---|
18 | fGenX = x;
|
---|
19 | fGenP = p;
|
---|
20 | fGenQ = Q;
|
---|
21 | fB = B;
|
---|
22 | fGenPar.ResizeTo(5);
|
---|
23 | fGenParMm.ResizeTo(5);
|
---|
24 | fGenParACTS.ResizeTo(6);
|
---|
25 | fGenParILC.ResizeTo(5);
|
---|
26 | fObsPar.ResizeTo(5);
|
---|
27 | fObsParMm.ResizeTo(5);
|
---|
28 | fObsParACTS.ResizeTo(6);
|
---|
29 | fObsParILC.ResizeTo(5);
|
---|
30 | fCov.ResizeTo(5, 5);
|
---|
31 | fCovMm.ResizeTo(5, 5);
|
---|
32 | fCovACTS.ResizeTo(6, 6);
|
---|
33 | fCovILC.ResizeTo(5, 5);
|
---|
34 | fGenPar = XPtoPar(x,p,Q);
|
---|
35 | fGenParMm = ParToMm(fGenPar);
|
---|
36 | fGenParACTS = ParToACTS(fGenPar);
|
---|
37 | fGenParILC = ParToILC(fGenPar);
|
---|
38 | /*
|
---|
39 | cout << "ObsTrk::ObsTrk: fGenPar";
|
---|
40 | for (Int_t i = 0; i < 5; i++)cout << fGenPar(i) << ", ";
|
---|
41 | cout << endl;
|
---|
42 | */
|
---|
43 | fObsPar = GenToObsPar(fGenPar, fGC);
|
---|
44 | fObsParMm = ParToMm(fObsPar);
|
---|
45 | fObsParACTS = ParToACTS(fObsPar);
|
---|
46 | fObsParILC = ParToILC(fObsPar);
|
---|
47 | fObsX = ParToX(fObsPar);
|
---|
48 | fObsP = ParToP(fObsPar);
|
---|
49 | fObsQ = ParToQ(fObsPar);
|
---|
50 | fCovMm = CovToMm(fCov);
|
---|
51 | fCovACTS = CovToACTS(fObsPar, fCov);
|
---|
52 | fCovILC = CovToILC(fCov);
|
---|
53 | }
|
---|
54 | //
|
---|
55 | // x[3] track origin, p[3] track momentum at origin, Q charge, B magnetic field in Tesla
|
---|
56 | ObsTrk::ObsTrk(Double_t *x, Double_t *p, Double_t Q, Double_t B, SolGridCov* GC)
|
---|
57 | {
|
---|
58 | SetBfield(B);
|
---|
59 | fGC = GC;
|
---|
60 | fGenX.SetXYZ(x[0],x[1],x[2]);
|
---|
61 | fGenP.SetXYZ(p[0],p[1],p[2]);
|
---|
62 | fGenQ = Q;
|
---|
63 | fB = B;
|
---|
64 | fGenPar.ResizeTo(5);
|
---|
65 | fGenParMm.ResizeTo(5);
|
---|
66 | fGenParACTS.ResizeTo(6);
|
---|
67 | fGenParILC.ResizeTo(5);
|
---|
68 | fObsPar.ResizeTo(5);
|
---|
69 | fObsParMm.ResizeTo(5);
|
---|
70 | fObsParACTS.ResizeTo(6);
|
---|
71 | fObsParILC.ResizeTo(5);
|
---|
72 | fCov.ResizeTo(5, 5);
|
---|
73 | fCovMm.ResizeTo(5, 5);
|
---|
74 | fCovACTS.ResizeTo(6, 6);
|
---|
75 | fCovILC.ResizeTo(5, 5);
|
---|
76 | fGenPar = XPtoPar(fGenX, fGenP, Q);
|
---|
77 | fGenParACTS = ParToACTS(fGenPar);
|
---|
78 | fGenParILC = ParToILC(fGenPar);
|
---|
79 | /*
|
---|
80 | cout << "ObsTrk::ObsTrk: fGenPar";
|
---|
81 | for (Int_t i = 0; i < 5; i++)cout << fGenPar(i) << ", ";
|
---|
82 | cout << endl;
|
---|
83 | */
|
---|
84 | fObsPar = GenToObsPar(fGenPar, fGC);
|
---|
85 | fObsParACTS = ParToACTS(fObsPar);
|
---|
86 | fObsParILC = ParToILC(fObsPar);
|
---|
87 | fObsX = ParToX(fObsPar);
|
---|
88 | fObsP = ParToP(fObsPar);
|
---|
89 | fObsQ = ParToQ(fObsPar);
|
---|
90 | fCovACTS = CovToACTS(fObsPar, fCov);
|
---|
91 | fCovILC = CovToILC(fCov);
|
---|
92 | }
|
---|
93 | //
|
---|
94 | // Destructor
|
---|
95 | ObsTrk::~ObsTrk()
|
---|
96 | {
|
---|
97 | fGenX.Clear();
|
---|
98 | fGenP.Clear();
|
---|
99 | fGenPar.Clear();
|
---|
100 | fGenParMm.Clear();
|
---|
101 | fGenParACTS.Clear();
|
---|
102 | fGenParILC.Clear();
|
---|
103 | fObsX.Clear();
|
---|
104 | fObsP.Clear();
|
---|
105 | fObsPar.Clear();
|
---|
106 | fObsParMm.Clear();
|
---|
107 | fObsParACTS.Clear();
|
---|
108 | fObsParILC.Clear();
|
---|
109 | fCov.Clear();
|
---|
110 | fCovMm.Clear();
|
---|
111 | fCovACTS.Clear();
|
---|
112 | fCovILC.Clear();
|
---|
113 | }
|
---|
114 | //
|
---|
115 | TVectorD ObsTrk::GenToObsPar(TVectorD gPar, SolGridCov *GC)
|
---|
116 | {
|
---|
117 | TVector3 p = ParToP(gPar);
|
---|
118 | Double_t pt = p.Pt();
|
---|
119 | Double_t tanTh = 1.0 / TMath::Abs(gPar(4));
|
---|
120 | Double_t angd = TMath::ATan(tanTh)*180. / TMath::Pi();
|
---|
121 | //
|
---|
122 | // Check ranges
|
---|
123 | Double_t minPt = GC->GetMinPt ();
|
---|
124 | //if (pt < minPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << endl;
|
---|
125 | Double_t maxPt = GC->GetMaxPt();
|
---|
126 | //if (pt > maxPt) cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << endl;
|
---|
127 | Double_t minAn = GC->GetMinAng();
|
---|
128 | //if (angd < minAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd
|
---|
129 | // << " is below grid range of " << minAn << endl;
|
---|
130 | Double_t maxAn = GC->GetMaxAng();
|
---|
131 | //if (angd > maxAn) cout << "Warning ObsTrk::GenToObsPar: angle " << angd
|
---|
132 | // << " is above grid range of " << maxAn << endl;
|
---|
133 | //
|
---|
134 | TMatrixDSym Cov = GC->GetCov(pt, angd);
|
---|
135 | fCov = Cov;
|
---|
136 | //
|
---|
137 | // Now do Choleski decomposition and random number extraction, with appropriate stabilization
|
---|
138 | //
|
---|
139 | TMatrixDSym CvN = Cov;
|
---|
140 | TMatrixDSym DCv(5); DCv.Zero();
|
---|
141 | TMatrixDSym DCvInv(5); DCvInv.Zero();
|
---|
142 | for (Int_t id = 0; id < 5; id++)
|
---|
143 | {
|
---|
144 | Double_t dVal = TMath::Sqrt(Cov(id, id));
|
---|
145 | DCv (id, id) = dVal;
|
---|
146 | DCvInv(id, id) = 1.0 / dVal;
|
---|
147 | }
|
---|
148 | CvN.Similarity(DCvInv); // Normalize diagonal to 1
|
---|
149 | TDecompChol Chl(CvN);
|
---|
150 | Bool_t OK = Chl.Decompose(); // Choleski decomposition of normalized matrix
|
---|
151 | TMatrixD U = Chl.GetU(); // Get Upper triangular matrix
|
---|
152 | TMatrixD Ut(TMatrixD::kTransposed, U); // Transposed of U (lower triangular)
|
---|
153 | TVectorD r(5);
|
---|
154 | for (Int_t i = 0; i < 5; i++)r(i) = gRandom->Gaus(0.0, 1.0); // Array of normal random numbers
|
---|
155 | TVectorD oPar = gPar + DCv*(Ut*r); // Observed parameter vector
|
---|
156 | //
|
---|
157 | return oPar;
|
---|
158 | }
|
---|