BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmKFMaterial.cxx
Go to the documentation of this file.
1#include "CbmKFMaterial.h"
2
3#include "CbmKF.h"
4#include "CbmKFMath.h"
5#include "TString.h"
6
7#include <cmath>
8
9using std::fabs;
10
12{
13 char tmp[255];
14 sprintf(tmp, " ( id, z, dz, RadL )= ( %i, %f, %f, %f )", ID, ZReference, ZThickness, RadLength);
15 return tmp;
16}
17
19 Double_t ZThick,
21 Bool_t downstream,
22 Double_t& QP0)
23{
24 Bool_t err = 0;
25 Double_t* T = track.GetTrack();
26 Double_t* C = track.GetCovMatrix();
27 err = err || CbmKF::Instance()->Propagate(T, C, ZCross, QP0);
28 if (err)
29 return err;
30 if (IsOutside(T[0], T[1]))
31 return 0;
32 Double_t Q5, Q8, Q9, Ecor;
33 err = err
34 || CbmKFMath::GetNoise(ZThick / RadLength, F, Fe, T[2], T[3], QP0, track.GetMass(), track.IsElectron(),
35 downstream, &Q5, &Q8, &Q9, &Ecor);
36 if (err)
37 return err;
38 C[5] += Q5;
39 C[8] += Q8;
40 C[9] += Q9;
41 QP0 *= Ecor;
42 T[4] *= Ecor;
43 C[10] *= Ecor;
44 C[11] *= Ecor;
45 C[12] *= Ecor;
46 C[13] *= Ecor;
47 C[14] *= Ecor * Ecor;
48 return 0;
49}
50
52 Double_t x_,
53 Double_t y_,
54 Double_t z_,
55 Double_t dz_,
56 Double_t r_,
57 Double_t R_,
58 Double_t radL_)
59 : x(x_)
60 , y(y_)
61 , z(z_)
62 , dz(dz_)
63 , r(r_)
64 , R(R_)
65 , rr(r_ * r_)
66 , RR(R_ * R_)
67{
68 ID = ID_;
69 ZReference = z_;
70 ZThickness = dz_;
71 RadLength = radL_;
72 F = 1;
73}
74
76{
77 char tmp[255];
78 sprintf(tmp, " tube ( id, x,y,z, dz, r, R, RadL )= ( %i, %f, %f, %f, %f, %f, %f, %f )", ID, x, y, z, dz, r, R,
79 RadLength);
80 return tmp;
81}
82
84 Double_t x_,
85 Double_t y_,
86 Double_t z_,
87 Double_t dx_,
88 Double_t dy_,
89 Double_t dz_,
90 Double_t radL_)
91 : x(x_)
92 , y(y_)
93 , z(z_)
94 , dx05(dx_ / 2)
95 , dy05(dy_ / 2)
96 , dz(dz_)
97{
98 ID = ID_;
99 ZReference = z_;
100 ZThickness = dz_;
101 RadLength = radL_;
102 F = 1;
103}
104
106{
107 return (TMath::Abs(X - x) > dx05 || TMath::Abs(Y - y) > dy05);
108}
109
111{
112 char tmp[255];
113 sprintf(tmp, " box ( id, x,y,z, dx, dy, dz, RadL )= ( %i, %f, %f, %f, %f, %f, %f, %f )", ID, x, y, z, dx05 * 2,
114 dy05 * 2, dz, RadLength);
115 return tmp;
116}
117
119{
120
121 Bool_t err = 0;
122 CbmKF* KF = CbmKF::Instance();
123 Double_t* T = track.GetTrack();
124 Double_t* C = track.GetCovMatrix();
125
126 Double_t zthick = ZThickness, zcross = ZReference;
127 Double_t T_tmp[6];
128 for (Int_t j = 0; j < 6; j++)
129 T_tmp[j] = T[j];
130 err = err || KF->Propagate(T_tmp, 0, ZReference, QP0);
131 if (err)
132 return err;
133 Double_t cz1, ct1, cz2, ct2;
134 {
135 Double_t iz1, iz2, iZ1, iZ2;
136 Bool_t err1 = CbmKFMath::intersectCone(z1, z2, r1, r2, T_tmp, &iz1, &iz2);
137 Bool_t err2 = CbmKFMath::intersectCone(z1, z2, R1, R2, T_tmp, &iZ1, &iZ2);
138 if (err1 || iz1 < z1 || iz1 > z2)
139 iz1 = -200;
140 if (err1 || iz2 < z1 || iz2 > z2)
141 iz2 = -200;
142 if (err2 || iZ1 < z1 || iZ1 > z2)
143 iZ1 = -200;
144 if (err2 || iZ2 < z1 || iZ2 > z2)
145 iZ2 = -200;
146
147 if (iz1 > -200 && iZ1 > -200) {
148 cz1 = (iz1 + iZ1) / 2;
149 ct1 = fabs(iZ1 - iz1);
150 } else {
151 cz1 = ZCross; // TODO Check me
152 ct1 = 0;
153 }
154
155 if (iz2 > -200 && iZ2 > -200) {
156 cz2 = (iz2 + iZ2) / 2;
157 ct2 = fabs(iZ2 - iz2);
158 } else {
159 cz2 = ZCross; // TODO Check me
160 ct2 = 0;
161 }
162
163 if (iz1 <= -200 && iz2 <= -200 && iZ1 > -200 && iZ2 > -200) {
164 cz1 = (iZ1 + iZ2) / 2;
165 ct1 = fabs(iZ2 - iZ1);
166 cz2 = ZCross; // TODO Check me
167 ct2 = 0;
168 }
169 }
170 Double_t dz1 = cz1 - T[5];
171 Double_t dz2 = cz2 - T[5];
172 if (fabs(dz1) < fabs(dz2)) {
173 zthick = ct1;
174 zcross = cz1;
175 } else {
176 zthick = ct2;
177 zcross = cz2;
178 }
179
180 err = err || KF->Propagate(T, C, zcross, QP0);
181
182 Double_t Q5, Q8, Q9, Ecor;
183 err = err
184 || CbmKFMath::GetNoise(zthick / RadLength, F, Fe, T[2], T[3], QP0, track.GetMass(), track.IsElectron(),
185 downstream, &Q5, &Q8, &Q9, &Ecor);
186 if (err)
187 return err;
188 C[5] += Q5;
189 C[8] += Q8;
190 C[9] += Q9;
191 QP0 *= Ecor;
192 T[4] *= Ecor;
193 C[10] *= Ecor;
194 C[11] *= Ecor;
195 C[12] *= Ecor;
196 C[13] *= Ecor;
197 C[14] *= Ecor * Ecor;
198 return 0;
199}
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
bool Bool_t
int Int_t
double Double_t
Double_t x
Double_t z
TString Info() const
Bool_t IsOutside(Double_t X, Double_t Y)
Double_t dx05
Double_t y
Double_t dz
Double_t dy05
Double_t R2
Double_t z2
Double_t R1
Double_t r1
Double_t r2
Int_t Pass(Double_t ZCross, Double_t ZThick, CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)
Double_t z1
virtual Bool_t IsOutside(Double_t x, Double_t y)
Double_t ZReference
virtual Int_t Pass(Double_t ZCross, Double_t ZThick, CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)
virtual TString Info() const
Double_t RadLength
Double_t ZThickness
static Bool_t intersectCone(Double_t zCone, Double_t ZCone, Double_t rCone, Double_t RCone, const Double_t x[], Double_t *z1, Double_t *z2)
Definition CbmKFMath.cxx:13
static Int_t GetNoise(Double_t Lrl, Double_t F, Double_t Fe, Double_t tx, Double_t ty, Double_t qp, Double_t mass, Bool_t is_electron, Bool_t downstream_direction, Double_t *Q5, Double_t *Q8, Double_t *Q9, Double_t *Ecor)
virtual Double_t * GetTrack()
Is it electron.
virtual Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
virtual Double_t GetMass()
Information not to be changed.
virtual Bool_t IsElectron()
Mass hypothesis.
Double_t R
Double_t rr
Double_t RR
Double_t x
TString Info() const
Double_t r
Double_t dz
Double_t y
Double_t z
The CbmKF Kalman Filter algorithm.
Definition CbmKF.h:28
Int_t Propagate(Double_t *T, Double_t *C, Double_t z_out, Double_t QP0, Bool_t line=false)
Propagation of (T, C) to z_out without material, using linearisation at qp0.
Definition CbmKF.cxx:747
static CbmKF * Instance()
Definition CbmKF.h:34
Double_t Abs(Double_t d)