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 "SolGeom.h"
|
---|
9 | #include "SolGridCov.h"
|
---|
10 | #include "ObsTrk.h"
|
---|
11 | //
|
---|
12 | // Constructors
|
---|
13 | //
|
---|
14 | // x(3) track origin, p(3) track momentum at origin, Q charge, B ma gnetic field in Tesla
|
---|
15 | ObsTrk::ObsTrk(TVector3 x, TVector3 p, Double_t Q, SolGridCov *GC, SolGeom *G)
|
---|
16 | {
|
---|
17 | fB = G->B();
|
---|
18 | SetB(fB);
|
---|
19 | fG = G;
|
---|
20 | fGC = GC;
|
---|
21 | fGenX = x;
|
---|
22 | fGenP = p;
|
---|
23 | fGenQ = Q;
|
---|
24 | fGenPar.ResizeTo(5);
|
---|
25 | fGenParMm.ResizeTo(5);
|
---|
26 | fGenParACTS.ResizeTo(6);
|
---|
27 | fGenParILC.ResizeTo(5);
|
---|
28 | fObsPar.ResizeTo(5);
|
---|
29 | fObsParMm.ResizeTo(5);
|
---|
30 | fObsParACTS.ResizeTo(6);
|
---|
31 | fObsParILC.ResizeTo(5);
|
---|
32 | fCov.ResizeTo(5, 5);
|
---|
33 | fCovMm.ResizeTo(5, 5);
|
---|
34 | fCovACTS.ResizeTo(6, 6);
|
---|
35 | fCovILC.ResizeTo(5, 5);
|
---|
36 | fGenPar = XPtoPar(x,p,Q);
|
---|
37 | fGenParMm = ParToMm(fGenPar);
|
---|
38 | fGenParACTS = ParToACTS(fGenPar);
|
---|
39 | fGenParILC = ParToILC(fGenPar);
|
---|
40 | //
|
---|
41 | fObsPar = GenToObsPar(fGenPar);
|
---|
42 | fObsParMm = ParToMm(fObsPar);
|
---|
43 | fObsParACTS = ParToACTS(fObsPar);
|
---|
44 | fObsParILC = ParToILC(fObsPar);
|
---|
45 | fObsX = ParToX(fObsPar);
|
---|
46 | fObsP = ParToP(fObsPar);
|
---|
47 | fObsQ = ParToQ(fObsPar);
|
---|
48 | fCovMm = CovToMm(fCov);
|
---|
49 | fCovACTS = CovToACTS(fObsPar, fCov);
|
---|
50 | fCovILC = CovToILC(fCov);
|
---|
51 | }
|
---|
52 | //
|
---|
53 | // x[3] track origin, p[3] track momentum at origin, Q charge, B magnetic field in Tesla
|
---|
54 | ObsTrk::ObsTrk(Double_t *x, Double_t *p, Double_t Q, SolGridCov* GC, SolGeom *G)
|
---|
55 | {
|
---|
56 | fB = G->B();
|
---|
57 | SetB(fB);
|
---|
58 | fG = G;
|
---|
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 | fGenPar.ResizeTo(5);
|
---|
64 | fGenParMm.ResizeTo(5);
|
---|
65 | fGenParACTS.ResizeTo(6);
|
---|
66 | fGenParILC.ResizeTo(5);
|
---|
67 | fObsPar.ResizeTo(5);
|
---|
68 | fObsParMm.ResizeTo(5);
|
---|
69 | fObsParACTS.ResizeTo(6);
|
---|
70 | fObsParILC.ResizeTo(5);
|
---|
71 | fCov.ResizeTo(5, 5);
|
---|
72 | fCovMm.ResizeTo(5, 5);
|
---|
73 | fCovACTS.ResizeTo(6, 6);
|
---|
74 | fCovILC.ResizeTo(5, 5);
|
---|
75 | fGenPar = XPtoPar(fGenX, fGenP, Q);
|
---|
76 | fGenParMm = ParToMm(fGenPar);
|
---|
77 | fGenParACTS = ParToACTS(fGenPar);
|
---|
78 | fGenParILC = ParToILC(fGenPar);
|
---|
79 | //
|
---|
80 | fObsPar = GenToObsPar(fGenPar);
|
---|
81 | fObsParMm = ParToMm(fObsPar);
|
---|
82 | fObsParACTS = ParToACTS(fObsPar);
|
---|
83 | fObsParILC = ParToILC(fObsPar);
|
---|
84 | fObsX = ParToX(fObsPar);
|
---|
85 | fObsP = ParToP(fObsPar);
|
---|
86 | fObsQ = ParToQ(fObsPar);
|
---|
87 | fCovMm = CovToMm(fCov);
|
---|
88 | fCovACTS = CovToACTS(fObsPar, fCov);
|
---|
89 | fCovILC = CovToILC(fCov);
|
---|
90 | }
|
---|
91 | //
|
---|
92 | // Destructor
|
---|
93 | ObsTrk::~ObsTrk()
|
---|
94 | {
|
---|
95 | fGenX.Clear();
|
---|
96 | fGenP.Clear();
|
---|
97 | fGenPar.Clear();
|
---|
98 | fGenParMm.Clear();
|
---|
99 | fGenParACTS.Clear();
|
---|
100 | fGenParILC.Clear();
|
---|
101 | fObsX.Clear();
|
---|
102 | fObsP.Clear();
|
---|
103 | fObsPar.Clear();
|
---|
104 | fObsParMm.Clear();
|
---|
105 | fObsParACTS.Clear();
|
---|
106 | fObsParILC.Clear();
|
---|
107 | fCov.Clear();
|
---|
108 | fCovMm.Clear();
|
---|
109 | fCovACTS.Clear();
|
---|
110 | fCovILC.Clear();
|
---|
111 | }
|
---|
112 | //
|
---|
113 | TVectorD ObsTrk::GenToObsPar(TVectorD gPar)
|
---|
114 | {
|
---|
115 | //
|
---|
116 | // Check ranges
|
---|
117 | Double_t minPt = fGC->GetMinPt();
|
---|
118 | //if (pt < minPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is below grid range of " << minPt << std::endl;
|
---|
119 | Double_t maxPt = fGC->GetMaxPt();
|
---|
120 | //if (pt > maxPt) std::cout << "Warning ObsTrk::GenToObsPar: pt " << pt << " is above grid range of " << maxPt << std::endl;
|
---|
121 | Double_t minAn = fGC->GetMinAng();
|
---|
122 | //if (angd < minAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd
|
---|
123 | // << " is below grid range of " << minAn << std::endl;
|
---|
124 | Double_t maxAn = fGC->GetMaxAng();
|
---|
125 | //if (angd > maxAn) std::cout << "Warning ObsTrk::GenToObsPar: angle " << angd
|
---|
126 | // << " is above grid range of " << maxAn << std::endl;
|
---|
127 | //
|
---|
128 | TMatrixDSym Cov(5);
|
---|
129 | //
|
---|
130 | // Check if track origin is inside beampipe and betwen the first disks
|
---|
131 | //
|
---|
132 | Double_t Rin = fG->GetRmin();
|
---|
133 | Double_t ZinPos = fG->GetZminPos();
|
---|
134 | Double_t ZinNeg = fG->GetZminNeg();
|
---|
135 | Bool_t inside = TrkUtil::IsInside(fGenX, Rin, ZinNeg, ZinPos); // Check if in inner box
|
---|
136 | SolTrack* trk = new SolTrack(fGenX, fGenP, fG);
|
---|
137 | Double_t Xfirst, Yfirst, Zfirst;
|
---|
138 | Int_t iLay = trk->FirstHit(Xfirst, Yfirst, Zfirst);
|
---|
139 | fXfirst = TVector3(Xfirst, Yfirst, Zfirst);
|
---|
140 | //std::cout<<"obs trk: "<<Xfirst<<","<<Yfirst<<","<<Zfirst<<std::endl;
|
---|
141 |
|
---|
142 | if (inside)
|
---|
143 | {
|
---|
144 | //std::cout<<"ObsTrk:: inside: x= "<<fGenX(0)<<", y= "<<fGenX(1)
|
---|
145 | // <<", z= "<<fGenX(2)<<std::endl;
|
---|
146 | // Observed track parameters
|
---|
147 | Double_t pt = fGenP.Pt();
|
---|
148 | Double_t angd = fGenP.Theta() * 180. / TMath::Pi();
|
---|
149 | Cov = fGC->GetCov(pt, angd); // Track covariance
|
---|
150 | }
|
---|
151 | else
|
---|
152 | {
|
---|
153 | //std::cout<<"ObsTrk:: outside: x= "<<fGenX(0)<<", y= "<<fGenX(1)
|
---|
154 | // <<", z= "<<fGenX(2)<<std::endl;
|
---|
155 | Bool_t Res = kTRUE; Bool_t MS = kTRUE;
|
---|
156 | trk->CovCalc(Res, MS); // Calculate covariance matrix
|
---|
157 | Cov = trk->Cov();
|
---|
158 | } // Track covariance
|
---|
159 | delete trk;
|
---|
160 | //
|
---|
161 | fCov = Cov;
|
---|
162 | //
|
---|
163 | // Now do Choleski decomposition and random number extraction, with appropriate stabilization
|
---|
164 | //
|
---|
165 | TVectorD oPar = TrkUtil::CovSmear(gPar, Cov);
|
---|
166 | //
|
---|
167 | return oPar;
|
---|
168 | }
|
---|