BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
L1Extrapolation.h
Go to the documentation of this file.
1#ifndef L1Extrapolation_h
2#define L1Extrapolation_h
3
4#include "CbmL1Def.h"
5#include "L1Field.h"
6#include "L1TrackPar.h"
7
8// #define cnst static const fvec
9#define cnst const fvec
10
11inline void L1Extrapolate(L1TrackPar& T, // input track parameters (x,y,tx,ty,Q/p) and cov.matrix
12 fvec z_out, // extrapolate to this z position
13 fvec qp0, // use Q/p linearisation at this value
15 fvec* w = 0)
16{
17 // cout<<"Extrapolation..."<<endl;
18 //
19 // Part of the analytic extrapolation formula with error (c_light*B*dz)^4/4!
20 //
21
22 cnst ZERO = 0.0, ONE = 1.;
23 cnst c_light = 0.000299792458; //, c_light_i = 1./c_light;
24
25 cnst c1 = 1., c2 = 2., c3 = 3., c4 = 4., c6 = 6., c9 = 9., c15 = 15., c18 = 18., c45 = 45., c2i = 1. / 2.,
26 c3i = 1. / 3., c6i = 1. / 6., c12i = 1. / 12.;
27
28 const fvec qp = T.qp;
29 const fvec dz = (z_out - T.z);
30 const fvec dz2 = dz * dz;
31 const fvec dz3 = dz2 * dz;
32
33 // construct coefficients
34
35 const fvec x = T.tx;
36 const fvec y = T.ty;
37 const fvec xx = x * x;
38 const fvec xy = x * y;
39 const fvec yy = y * y;
40 const fvec y2 = y * c2;
41 const fvec x2 = x * c2;
42 const fvec x4 = x * c4;
43 const fvec xx31 = xx * c3 + c1;
44 const fvec xx159 = xx * c15 + c9;
45
46 const fvec Ay = -xx - c1;
47 const fvec Ayy = x * (xx * c3 + c3);
48 const fvec Ayz = -c2 * xy;
49 const fvec Ayyy = -(c15 * xx * xx + c18 * xx + c3);
50
51 const fvec Ayy_x = c3 * xx31;
52 const fvec Ayyy_x = -x4 * xx159;
53
54 const fvec Bx = yy + c1;
55 const fvec Byy = y * xx31;
56 const fvec Byz = c2 * xx + c1;
57 const fvec Byyy = -xy * xx159;
58
59 const fvec Byy_x = c6 * xy;
60 const fvec Byyy_x = -y * (c45 * xx + c9);
61 const fvec Byyy_y = -x * xx159;
62
63 // end of coefficients calculation
64
65 const fvec t2 = c1 + xx + yy;
66 const fvec t = sqrt(t2);
67 const fvec h = qp0 * c_light;
68 const fvec ht = h * t;
69
70 // get field integrals
71 const fvec ddz = T.z - F.z0;
72 const fvec Fx0 = F.cx0 + F.cx1 * ddz + F.cx2 * ddz * ddz;
73 const fvec Fx1 = (F.cx1 + c2 * F.cx2 * ddz) * dz;
74 const fvec Fx2 = F.cx2 * dz2;
75 const fvec Fy0 = F.cy0 + F.cy1 * ddz + F.cy2 * ddz * ddz;
76 const fvec Fy1 = (F.cy1 + c2 * F.cy2 * ddz) * dz;
77 const fvec Fy2 = F.cy2 * dz2;
78 const fvec Fz0 = F.cz0 + F.cz1 * ddz + F.cz2 * ddz * ddz;
79 const fvec Fz1 = (F.cz1 + c2 * F.cz2 * ddz) * dz;
80 const fvec Fz2 = F.cz2 * dz2;
81
82 //
83
84 const fvec sx = (Fx0 + Fx1 * c2i + Fx2 * c3i);
85 const fvec sy = (Fy0 + Fy1 * c2i + Fy2 * c3i);
86 const fvec sz = (Fz0 + Fz1 * c2i + Fz2 * c3i);
87
88 const fvec Sx = (Fx0 * c2i + Fx1 * c6i + Fx2 * c12i);
89 const fvec Sy = (Fy0 * c2i + Fy1 * c6i + Fy2 * c12i);
90 const fvec Sz = (Fz0 * c2i + Fz1 * c6i + Fz2 * c12i);
91
92 fvec syz;
93 {
94 cnst d = 1. / 360., c00 = 30. * 6. * d, c01 = 30. * 2. * d, c02 = 30. * d, c10 = 3. * 40. * d,
95 c11 = 3. * 15. * d, c12 = 3. * 8. * d, c20 = 2. * 45. * d, c21 = 2. * 2. * 9. * d, c22 = 2. * 2. * 5. * d;
96 syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2)
97 + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
98 }
99
100 fvec Syz;
101 {
102 cnst d = 1. / 2520., c00 = 21. * 20. * d, c01 = 21. * 5. * d, c02 = 21. * 2. * d, c10 = 7. * 30. * d,
103 c11 = 7. * 9. * d, c12 = 7. * 4. * d, c20 = 2. * 63. * d, c21 = 2. * 21. * d, c22 = 2. * 10. * d;
104 Syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2)
105 + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
106 }
107
108 const fvec syy = sy * sy * c2i;
109 const fvec syyy = syy * sy * c3i;
110
111 fvec Syy;
112 {
113 cnst d = 1. / 2520., c00 = 420. * d, c01 = 21. * 15. * d, c02 = 21. * 8. * d, c03 = 63. * d, c04 = 70. * d,
114 c05 = 20. * d;
115 Syy = Fy0 * (c00 * Fy0 + c01 * Fy1 + c02 * Fy2) + Fy1 * (c03 * Fy1 + c04 * Fy2) + c05 * Fy2 * Fy2;
116 }
117
118 fvec Syyy;
119 {
120 cnst d = 1. / 181440., c000 = 7560 * d, c001 = 9 * 1008 * d, c002 = 5 * 1008 * d, c011 = 21 * 180 * d,
121 c012 = 24 * 180 * d, c022 = 7 * 180 * d, c111 = 540 * d, c112 = 945 * d, c122 = 560 * d, c222 = 112 * d;
122 const fvec Fy22 = Fy2 * Fy2;
123 Syyy = Fy0 * (Fy0 * (c000 * Fy0 + c001 * Fy1 + c002 * Fy2) + Fy1 * (c011 * Fy1 + c012 * Fy2) + c022 * Fy22)
124 + Fy1 * (Fy1 * (c111 * Fy1 + c112 * Fy2) + c122 * Fy22) + c222 * Fy22 * Fy2;
125 }
126
127 const fvec sA1 = sx * xy + sy * Ay + sz * y;
128 const fvec sA1_x = sx * y - sy * x2;
129 const fvec sA1_y = sx * x + sz;
130
131 const fvec sB1 = sx * Bx - sy * xy - sz * x;
132 const fvec sB1_x = -sy * y - sz;
133 const fvec sB1_y = sx * y2 - sy * x;
134
135 const fvec SA1 = Sx * xy + Sy * Ay + Sz * y;
136 const fvec SA1_x = Sx * y - Sy * x2;
137 const fvec SA1_y = Sx * x + Sz;
138
139 const fvec SB1 = Sx * Bx - Sy * xy - Sz * x;
140 const fvec SB1_x = -Sy * y - Sz;
141 const fvec SB1_y = Sx * y2 - Sy * x;
142
143 const fvec sA2 = syy * Ayy + syz * Ayz;
144 const fvec sA2_x = syy * Ayy_x - syz * y2;
145 const fvec sA2_y = -syz * x2;
146 const fvec sB2 = syy * Byy + syz * Byz;
147 const fvec sB2_x = syy * Byy_x + syz * x4;
148 const fvec sB2_y = syy * xx31;
149
150 const fvec SA2 = Syy * Ayy + Syz * Ayz;
151 const fvec SA2_x = Syy * Ayy_x - Syz * y2;
152 const fvec SA2_y = -Syz * x2;
153 const fvec SB2 = Syy * Byy + Syz * Byz;
154 const fvec SB2_x = Syy * Byy_x + Syz * x4;
155 const fvec SB2_y = Syy * xx31;
156
157 const fvec sA3 = syyy * Ayyy;
158 const fvec sA3_x = syyy * Ayyy_x;
159 const fvec sB3 = syyy * Byyy;
160 const fvec sB3_x = syyy * Byyy_x;
161 const fvec sB3_y = syyy * Byyy_y;
162
163 const fvec SA3 = Syyy * Ayyy;
164 const fvec SA3_x = Syyy * Ayyy_x;
165 const fvec SB3 = Syyy * Byyy;
166 const fvec SB3_x = Syyy * Byyy_x;
167 const fvec SB3_y = Syyy * Byyy_y;
168
169 const fvec ht1 = ht * dz;
170 const fvec ht2 = ht * ht * dz2;
171 const fvec ht3 = ht * ht * ht * dz3;
172 const fvec ht1sA1 = ht1 * sA1;
173 const fvec ht1sB1 = ht1 * sB1;
174 const fvec ht1SA1 = ht1 * SA1;
175 const fvec ht1SB1 = ht1 * SB1;
176 const fvec ht2sA2 = ht2 * sA2;
177 const fvec ht2SA2 = ht2 * SA2;
178 const fvec ht2sB2 = ht2 * sB2;
179 const fvec ht2SB2 = ht2 * SB2;
180 const fvec ht3sA3 = ht3 * sA3;
181 const fvec ht3sB3 = ht3 * sB3;
182 const fvec ht3SA3 = ht3 * SA3;
183 const fvec ht3SB3 = ht3 * SB3;
184
185 fvec initialised = ZERO;
186 if (w) // TODO use operator {?:}
187 {
188 const fvec zero = ZERO;
189 initialised = fvec(zero < *w);
190 } else {
191 const fvec one = ONE;
192 const fvec zero = ZERO;
193 initialised = fvec(zero < one);
194 }
195
196 T.x += (((x + ht1SA1 + ht2SA2 + ht3SA3) * dz) & initialised);
197 T.y += (((y + ht1SB1 + ht2SB2 + ht3SB3) * dz) & initialised);
198 T.tx += ((ht1sA1 + ht2sA2 + ht3sA3) & initialised);
199 T.ty += ((ht1sB1 + ht2sB2 + ht3sB3) & initialised);
200 T.z += ((dz)&initialised);
201
202 const fvec ctdz = c_light * t * dz;
203 const fvec ctdz2 = c_light * t * dz2;
204
205 const fvec dqp = qp - qp0;
206 const fvec t2i = c1 * rcp(t2); // /t2;
207 const fvec xt2i = x * t2i;
208 const fvec yt2i = y * t2i;
209 const fvec tmp0 = ht1SA1 + c2 * ht2SA2 + c3 * ht3SA3;
210 const fvec tmp1 = ht1SB1 + c2 * ht2SB2 + c3 * ht3SB3;
211 const fvec tmp2 = ht1sA1 + c2 * ht2sA2 + c3 * ht3sA3;
212 const fvec tmp3 = ht1sB1 + c2 * ht2sB2 + c3 * ht3sB3;
213
214 const fvec j02 = dz * (c1 + xt2i * tmp0 + ht1 * SA1_x + ht2 * SA2_x + ht3 * SA3_x);
215 const fvec j12 = dz * (xt2i * tmp1 + ht1 * SB1_x + ht2 * SB2_x + ht3 * SB3_x);
216 const fvec j22 = c1 + xt2i * tmp2 + ht1 * sA1_x + ht2 * sA2_x + ht3 * sA3_x;
217 const fvec j32 = xt2i * tmp3 + ht1 * sB1_x + ht2 * sB2_x + ht3 * sB3_x;
218
219 const fvec j03 = dz * (yt2i * tmp0 + ht1 * SA1_y + ht2 * SA2_y);
220 const fvec j13 = dz * (c1 + yt2i * tmp1 + ht1 * SB1_y + ht2 * SB2_y + ht3 * SB3_y);
221 const fvec j23 = yt2i * tmp2 + ht1 * sA1_y + ht2 * sA2_y;
222 const fvec j33 = c1 + yt2i * tmp3 + ht1 * sB1_y + ht2 * sB2_y + ht3 * sB3_y;
223
224 const fvec j04 = ctdz2 * (SA1 + c2 * ht1 * SA2 + c3 * ht2 * SA3);
225 const fvec j14 = ctdz2 * (SB1 + c2 * ht1 * SB2 + c3 * ht2 * SB3);
226 const fvec j24 = ctdz * (sA1 + c2 * ht1 * sA2 + c3 * ht2 * sA3);
227 const fvec j34 = ctdz * (sB1 + c2 * ht1 * sB2 + c3 * ht2 * sB3);
228
229 // extrapolate inverse momentum
230
231 T.x += ((j04 * dqp) & initialised);
232 T.y += ((j14 * dqp) & initialised);
233 T.tx += ((j24 * dqp) & initialised);
234 T.ty += ((j34 * dqp) & initialised);
235
236 // covariance matrix transport
237
238 const fvec c42 = T.C42, c43 = T.C43;
239
240 const fvec cj00 = T.C00 + T.C20 * j02 + T.C30 * j03 + T.C40 * j04;
241 // const fvec cj10 = T.C10 + T.C21*j02 + T.C31*j03 + T.C41*j04;
242 const fvec cj20 = T.C20 + T.C22 * j02 + T.C32 * j03 + c42 * j04;
243 const fvec cj30 = T.C30 + T.C32 * j02 + T.C33 * j03 + c43 * j04;
244
245 const fvec cj01 = T.C10 + T.C20 * j12 + T.C30 * j13 + T.C40 * j14;
246 const fvec cj11 = T.C11 + T.C21 * j12 + T.C31 * j13 + T.C41 * j14;
247 const fvec cj21 = T.C21 + T.C22 * j12 + T.C32 * j13 + c42 * j14;
248 const fvec cj31 = T.C31 + T.C32 * j12 + T.C33 * j13 + c43 * j14;
249
250 // const fvec cj02 = T.C20*j22 + T.C30*j23 + T.C40*j24;
251 // const fvec cj12 = T.C21*j22 + T.C31*j23 + T.C41*j24;
252 const fvec cj22 = T.C22 * j22 + T.C32 * j23 + c42 * j24;
253 const fvec cj32 = T.C32 * j22 + T.C33 * j23 + c43 * j24;
254
255 // const fvec cj03 = T.C20*j32 + T.C30*j33 + T.C40*j34;
256 // const fvec cj13 = T.C21*j32 + T.C31*j33 + T.C41*j34;
257 const fvec cj23 = T.C22 * j32 + T.C32 * j33 + c42 * j34;
258 const fvec cj33 = T.C32 * j32 + T.C33 * j33 + c43 * j34;
259
260 T.C40 += ((c42 * j02 + c43 * j03 + T.C44 * j04) & initialised); // cj40
261 T.C41 += ((c42 * j12 + c43 * j13 + T.C44 * j14) & initialised); // cj41
262 T.C42 = ((c42 * j22 + c43 * j23 + T.C44 * j24) & initialised) + (T.C42 & (!initialised)); // cj42
263 T.C43 = ((c42 * j32 + c43 * j33 + T.C44 * j34) & initialised) + (T.C43 & (!initialised)); // cj43
264
265 T.C00 = ((cj00 + j02 * cj20 + j03 * cj30 + j04 * T.C40) & initialised) + (T.C00 & (!initialised));
266 T.C10 = ((cj01 + j02 * cj21 + j03 * cj31 + j04 * T.C41) & initialised) + (T.C10 & (!initialised));
267 T.C11 = ((cj11 + j12 * cj21 + j13 * cj31 + j14 * T.C41) & initialised) + (T.C11 & (!initialised));
268
269 T.C20 = ((j22 * cj20 + j23 * cj30 + j24 * T.C40) & initialised) + (T.C20 & (!initialised));
270 T.C30 = ((j32 * cj20 + j33 * cj30 + j34 * T.C40) & initialised) + (T.C30 & (!initialised));
271 T.C21 = ((j22 * cj21 + j23 * cj31 + j24 * T.C41) & initialised) + (T.C21 & (!initialised));
272 T.C31 = ((j32 * cj21 + j33 * cj31 + j34 * T.C41) & initialised) + (T.C31 & (!initialised));
273 T.C22 = ((j22 * cj22 + j23 * cj32 + j24 * T.C42) & initialised) + (T.C22 & (!initialised));
274 T.C32 = ((j32 * cj22 + j33 * cj32 + j34 * T.C42) & initialised) + (T.C32 & (!initialised));
275 T.C33 = ((j32 * cj23 + j33 * cj33 + j34 * T.C43) & initialised) + (T.C33 & (!initialised));
276 // cout<<"Extrapolation ok"<<endl;
277}
278
279inline void L1Extrapolate0(L1TrackPar& T, // input track parameters (x,y,tx,ty,Q/p) and cov.matrix
280 fvec z_out, // extrapolate to this z position
281 L1FieldRegion& F)
282{
283 //
284 // Part of the analytic extrapolation formula with error (c_light*B*dz)^4/4!
285 //
286
287 cnst c_light = 0.000299792458;
288
289 cnst c1 = 1., /*c2 = 2., c3 = 3., c4 = 4., c6 = 6., c9 = 9., c15 = 15., c18 = 18., c45 = 45.,*/
290 c2i = 1. / 2., c3i = 1. / 3., c6i = 1. / 6., c12i = 1. / 12.;
291
292 const fvec qp = T.qp;
293 const fvec dz = (z_out - T.z);
294 const fvec dz2 = dz * dz;
295
296 // construct coefficients
297
298 const fvec x = T.tx;
299 const fvec y = T.ty;
300 const fvec xx = x * x;
301 const fvec xy = x * y;
302 const fvec yy = y * y;
303 const fvec Ay = -xx - c1;
304 const fvec Bx = yy + c1;
305 const fvec ct = c_light * sqrt(c1 + xx + yy);
306
307 const fvec dzc2i = dz * c2i;
308 const fvec dz2c3i = dz2 * c3i;
309 const fvec dzc6i = dz * c6i;
310 const fvec dz2c12i = dz2 * c12i;
311
312 const fvec sx = (F.cx0 + F.cx1 * dzc2i + F.cx2 * dz2c3i);
313 const fvec sy = (F.cy0 + F.cy1 * dzc2i + F.cy2 * dz2c3i);
314 const fvec sz = (F.cz0 + F.cz1 * dzc2i + F.cz2 * dz2c3i);
315
316 const fvec Sx = (F.cx0 * c2i + F.cx1 * dzc6i + F.cx2 * dz2c12i);
317 const fvec Sy = (F.cy0 * c2i + F.cy1 * dzc6i + F.cy2 * dz2c12i);
318 const fvec Sz = (F.cz0 * c2i + F.cz1 * dzc6i + F.cz2 * dz2c12i);
319
320 const fvec ctdz = ct * dz;
321 const fvec ctdz2 = ct * dz2;
322
323 const fvec j04 = ctdz2 * (Sx * xy + Sy * Ay + Sz * y);
324 const fvec j14 = ctdz2 * (Sx * Bx - Sy * xy - Sz * x);
325 const fvec j24 = ctdz * (sx * xy + sy * Ay + sz * y);
326 const fvec j34 = ctdz * (sx * Bx - sy * xy - sz * x);
327
328 T.x += x * dz + j04 * qp;
329 T.y += y * dz + j14 * qp;
330 T.tx += j24 * qp;
331 T.ty += j34 * qp;
332 T.z += dz;
333
334 // covariance matrix transport
335
336 const fvec cj00 = T.C00 + T.C20 * dz + T.C40 * j04;
337 // const fvec cj10 = T.C10 + T.C21*dz + T.C41*j04;
338 const fvec cj20 = T.C20 + T.C22 * dz + T.C42 * j04;
339 const fvec cj30 = T.C30 + T.C32 * dz + T.C43 * j04;
340
341 const fvec cj01 = T.C10 + T.C30 * dz + T.C40 * j14;
342 const fvec cj11 = T.C11 + T.C31 * dz + T.C41 * j14;
343 const fvec cj21 = T.C21 + T.C32 * dz + T.C42 * j14;
344 const fvec cj31 = T.C31 + T.C33 * dz + T.C43 * j14;
345
346 // const fvec cj02 = T.C20 + T.C40*j24;
347 // const fvec cj12 = T.C21 + T.C41*j24;
348 const fvec cj22 = T.C22 + T.C42 * j24;
349 const fvec cj32 = T.C32 + T.C43 * j24;
350
351 // const fvec cj03 = T.C30 + T.C40*j34;
352 // const fvec cj13 = T.C31 + T.C41*j34;
353 // const fvec cj23 = T.C32 + T.C42*j34;
354 const fvec cj33 = T.C33 + T.C43 * j34;
355
356 T.C40 += T.C42 * dz + T.C44 * j04; // cj40
357 T.C41 += T.C43 * dz + T.C44 * j14; // cj41
358 T.C42 += T.C44 * j24; // cj42
359 T.C43 += T.C44 * j34; // cj43
360
361 T.C00 = cj00 + dz * cj20 + j04 * T.C40;
362 T.C10 = cj01 + dz * cj21 + j04 * T.C41;
363 T.C11 = cj11 + dz * cj31 + j14 * T.C41;
364
365 T.C20 = cj20 + j24 * T.C40;
366 T.C30 = cj30 + j34 * T.C40;
367 T.C21 = cj21 + j24 * T.C41;
368 T.C31 = cj31 + j34 * T.C41;
369 T.C22 = cj22 + j24 * T.C42;
370 T.C32 = cj32 + j34 * T.C42;
371 T.C33 = cj33 + j34 * T.C43;
372}
373
374inline void L1ExtrapolateLine(L1TrackPar& T, fvec z_out)
375{
376 fvec dz = (z_out - T.z);
377
378 T.x += T.tx * dz;
379 T.y += T.ty * dz;
380 T.z += dz;
381
382 const fvec dzC32_in = dz * T.C32;
383
384 T.C21 += dzC32_in;
385 T.C10 += dz * (T.C21 + T.C30);
386
387 const fvec C20_in = T.C20;
388
389 T.C20 += dz * T.C22;
390 T.C00 += dz * (T.C20 + C20_in);
391
392 const fvec C31_in = T.C31;
393
394 T.C31 += dz * T.C33;
395 T.C11 += dz * (T.C31 + C31_in);
396 T.C30 += dzC32_in;
397
398 T.C40 += dz * T.C42;
399 T.C41 += dz * T.C43;
400}
401
402inline void L1ExtrapolateXC00Line(const L1TrackPar& T, fvec z_out, fvec& x, fvec& C00)
403{
404 const fvec dz = (z_out - T.z);
405 x = T.x + T.tx * dz;
406 C00 = T.C00 + dz * (2 * T.C20 + dz * T.C22);
407}
408
409inline void L1ExtrapolateYC11Line(const L1TrackPar& T, fvec z_out, fvec& y, fvec& C11)
410{
411 const fvec dz = (z_out - T.z);
412 y = T.y + T.ty * dz;
413 C11 = T.C11 + dz * (2 * T.C31 + dz * T.C33);
414}
415
416inline void L1ExtrapolateC10Line(const L1TrackPar& T, fvec z_out, fvec& C10)
417{
418 const fvec dz = (z_out - T.z);
419 C10 = T.C10 + dz * (T.C21 + T.C30 + dz * T.C32);
420}
421
422inline void L1ExtrapolateJXY // is not used currently
423 (fvec& tx,
424 fvec& ty,
425 fvec& qp, // input track parameters
426 fvec dz, // extrapolate to this dz
427 L1FieldRegion& F,
428 fvec& extrDx,
429 fvec& extrDy,
430 fvec extrJ[])
431{
432 //
433 // Part of the analytic extrapolation formula with error (c_light*B*dz)^4/4!
434 //
435
436 // cnst ZERO = 0.0, ONE = 1.;
437 cnst c_light = 0.000299792458; //, c_light_i = 1./c_light;
438
439 cnst c1 = 1., c2 = 2., c3 = 3., c4 = 4., c6 = 6., c9 = 9., c15 = 15., c18 = 18., c45 = 45., c2i = 1. / 2.,
440 /*c3i = 1./3.,*/ c6i = 1. / 6., c12i = 1. / 12.;
441
442 fvec dz2 = dz * dz;
443 fvec dz3 = dz2 * dz;
444
445 // construct coefficients
446
447 fvec x = tx;
448 fvec y = ty;
449 fvec xx = x * x;
450 fvec xy = x * y;
451 fvec yy = y * y;
452 fvec y2 = y * c2;
453 fvec x2 = x * c2;
454 fvec x4 = x * c4;
455 fvec xx31 = xx * c3 + c1;
456 fvec xx159 = xx * c15 + c9;
457
458 fvec Ay = -xx - c1;
459 fvec Ayy = x * (xx * c3 + c3);
460 fvec Ayz = -c2 * xy;
461 fvec Ayyy = -(c15 * xx * xx + c18 * xx + c3);
462
463 fvec Ayy_x = c3 * xx31;
464 fvec Ayyy_x = -x4 * xx159;
465
466 fvec Bx = yy + c1;
467 fvec Byy = y * xx31;
468 fvec Byz = c2 * xx + c1;
469 fvec Byyy = -xy * xx159;
470
471 fvec Byy_x = c6 * xy;
472 fvec Byyy_x = -y * (c45 * xx + c9);
473 fvec Byyy_y = -x * xx159;
474
475 // end of coefficients calculation
476
477 fvec t2 = c1 + xx + yy;
478 fvec t = sqrt(t2);
479 fvec h = qp * c_light;
480 fvec ht = h * t;
481
482 // get field integrals
483 fvec Fx0 = F.cx0;
484 fvec Fx1 = F.cx1 * dz;
485 fvec Fx2 = F.cx2 * dz2;
486 fvec Fy0 = F.cy0;
487 fvec Fy1 = F.cy1 * dz;
488 fvec Fy2 = F.cy2 * dz2;
489 fvec Fz0 = F.cz0;
490 fvec Fz1 = F.cz1 * dz;
491 fvec Fz2 = F.cz2 * dz2;
492
493 //
494
495 fvec Sx = (Fx0 * c2i + Fx1 * c6i + Fx2 * c12i);
496 fvec Sy = (Fy0 * c2i + Fy1 * c6i + Fy2 * c12i);
497 fvec Sz = (Fz0 * c2i + Fz1 * c6i + Fz2 * c12i);
498
499 fvec Syz;
500 {
501 cnst d = 1. / 2520., c00 = 21. * 20. * d, c01 = 21. * 5. * d, c02 = 21. * 2. * d, c10 = 7. * 30. * d,
502 c11 = 7. * 9. * d, c12 = 7. * 4. * d, c20 = 2. * 63. * d, c21 = 2. * 21. * d, c22 = 2. * 10. * d;
503 Syz = Fy0 * (c00 * Fz0 + c01 * Fz1 + c02 * Fz2) + Fy1 * (c10 * Fz0 + c11 * Fz1 + c12 * Fz2)
504 + Fy2 * (c20 * Fz0 + c21 * Fz1 + c22 * Fz2);
505 }
506
507 fvec Syy;
508 {
509 cnst d = 1. / 2520., c00 = 420. * d, c01 = 21. * 15. * d, c02 = 21. * 8. * d, c03 = 63. * d, c04 = 70. * d,
510 c05 = 20. * d;
511 Syy = Fy0 * (c00 * Fy0 + c01 * Fy1 + c02 * Fy2) + Fy1 * (c03 * Fy1 + c04 * Fy2) + c05 * Fy2 * Fy2;
512 }
513
514 fvec Syyy;
515 {
516 cnst d = 1. / 181440., c000 = 7560 * d, c001 = 9 * 1008 * d, c002 = 5 * 1008 * d, c011 = 21 * 180 * d,
517 c012 = 24 * 180 * d, c022 = 7 * 180 * d, c111 = 540 * d, c112 = 945 * d, c122 = 560 * d, c222 = 112 * d;
518 fvec Fy22 = Fy2 * Fy2;
519 Syyy = Fy0 * (Fy0 * (c000 * Fy0 + c001 * Fy1 + c002 * Fy2) + Fy1 * (c011 * Fy1 + c012 * Fy2) + c022 * Fy22)
520 + Fy1 * (Fy1 * (c111 * Fy1 + c112 * Fy2) + c122 * Fy22) + c222 * Fy22 * Fy2;
521 }
522
523 fvec SA1 = Sx * xy + Sy * Ay + Sz * y;
524 fvec SA1_x = Sx * y - Sy * x2;
525 fvec SA1_y = Sx * x + Sz;
526
527 fvec SB1 = Sx * Bx - Sy * xy - Sz * x;
528 fvec SB1_x = -Sy * y - Sz;
529 fvec SB1_y = Sx * y2 - Sy * x;
530
531 fvec SA2 = Syy * Ayy + Syz * Ayz;
532 fvec SA2_x = Syy * Ayy_x - Syz * y2;
533 fvec SA2_y = -Syz * x2;
534 fvec SB2 = Syy * Byy + Syz * Byz;
535 fvec SB2_x = Syy * Byy_x + Syz * x4;
536 fvec SB2_y = Syy * xx31;
537
538 fvec SA3 = Syyy * Ayyy;
539 fvec SA3_x = Syyy * Ayyy_x;
540 fvec SB3 = Syyy * Byyy;
541 fvec SB3_x = Syyy * Byyy_x;
542 fvec SB3_y = Syyy * Byyy_y;
543
544 fvec ht1 = ht * dz;
545 fvec ht2 = ht * ht * dz2;
546 fvec ht3 = ht * ht * ht * dz3;
547 fvec ht1SA1 = ht1 * SA1;
548 fvec ht1SB1 = ht1 * SB1;
549 fvec ht2SA2 = ht2 * SA2;
550 fvec ht2SB2 = ht2 * SB2;
551 fvec ht3SA3 = ht3 * SA3;
552 fvec ht3SB3 = ht3 * SB3;
553
554 extrDx = (x + ht1SA1 + ht2SA2 + ht3SA3) * dz;
555 extrDy = (y + ht1SB1 + ht2SB2 + ht3SB3) * dz;
556
557 fvec ctdz2 = c_light * t * dz2;
558
559 fvec t2i = c1 * rcp(t2); // /t2;
560 fvec xt2i = x * t2i;
561 fvec yt2i = y * t2i;
562 fvec tmp0 = ht1SA1 + c2 * ht2SA2 + c3 * ht3SA3;
563 fvec tmp1 = ht1SB1 + c2 * ht2SB2 + c3 * ht3SB3;
564
565 extrJ[0] = dz * (c1 + xt2i * tmp0 + ht1 * SA1_x + ht2 * SA2_x + ht3 * SA3_x); // j02
566 extrJ[1] = dz * (yt2i * tmp0 + ht1 * SA1_y + ht2 * SA2_y); // j03
567 extrJ[2] = ctdz2 * (SA1 + c2 * ht1 * SA2 + c3 * ht2 * SA3); // j04
568 extrJ[3] = dz * (xt2i * tmp1 + ht1 * SB1_x + ht2 * SB2_x + ht3 * SB3_x); // j12
569 extrJ[4] = dz * (c1 + yt2i * tmp1 + ht1 * SB1_y + ht2 * SB2_y + ht3 * SB3_y); // j13
570 extrJ[5] = ctdz2 * (SB1 + c2 * ht1 * SB2 + c3 * ht2 * SB3); // j14
571}
572
573inline void L1ExtrapolateJXY0(fvec& tx,
574 fvec& ty, // input track slopes
575 fvec dz, // extrapolate to this dz position
576 L1FieldRegion& F,
577 fvec& extrDx,
578 fvec& extrDy,
579 fvec& J04,
580 fvec& J14)
581{
582 cnst c_light = 0.000299792458, c1 = 1., c2i = 0.5, c6i = 1. / 6., c12i = 1. / 12.;
583
584 fvec dz2 = dz * dz;
585 fvec dzc6i = dz * c6i;
586 fvec dz2c12i = dz2 * c12i;
587
588 fvec xx = tx * tx;
589 fvec yy = ty * ty;
590 fvec xy = tx * ty;
591
592 fvec Ay = -xx - c1;
593 fvec Bx = yy + c1;
594
595 fvec ctdz2 = c_light * sqrt(c1 + xx + yy) * dz2;
596
597 fvec Sx = F.cx0 * c2i + F.cx1 * dzc6i + F.cx2 * dz2c12i;
598 fvec Sy = F.cy0 * c2i + F.cy1 * dzc6i + F.cy2 * dz2c12i;
599 fvec Sz = F.cz0 * c2i + F.cz1 * dzc6i + F.cz2 * dz2c12i;
600
601 extrDx = (tx)*dz;
602 extrDy = (ty)*dz;
603 J04 = ctdz2 * (Sx * xy + Sy * Ay + Sz * ty);
604 J14 = ctdz2 * (Sx * Bx - Sy * xy - Sz * tx);
605}
606
607#undef cnst
608
609#endif
#define cnst
void L1Extrapolate0(L1TrackPar &T, fvec z_out, L1FieldRegion &F)
void L1ExtrapolateJXY(fvec &tx, fvec &ty, fvec &qp, fvec dz, L1FieldRegion &F, fvec &extrDx, fvec &extrDy, fvec extrJ[])
void L1ExtrapolateC10Line(const L1TrackPar &T, fvec z_out, fvec &C10)
void L1ExtrapolateLine(L1TrackPar &T, fvec z_out)
void L1ExtrapolateJXY0(fvec &tx, fvec &ty, fvec dz, L1FieldRegion &F, fvec &extrDx, fvec &extrDy, fvec &J04, fvec &J14)
void L1ExtrapolateYC11Line(const L1TrackPar &T, fvec z_out, fvec &y, fvec &C11)
void L1Extrapolate(L1TrackPar &T, fvec z_out, fvec qp0, L1FieldRegion &F, fvec *w=0)
void L1ExtrapolateXC00Line(const L1TrackPar &T, fvec z_out, fvec &x, fvec &C00)
friend F32vec4 rcp(const F32vec4 &a)
Definition P4_F32vec4.h:45
F32vec4 fvec
Definition P4_F32vec4.h:231
RVec< PromoteType< T > > sqrt(const RVec< T > &v)