BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
L1Field.h
Go to the documentation of this file.
1#ifndef L1Field_h
2#define L1Field_h 1
3
4#include "CbmL1Def.h"
5
6#include <iostream>
7using std::cout;
8using std::endl;
9using std::ostream;
10
12{
13
14 public:
16 : x(0)
17 , y(0)
18 , z(0) {};
19
20 fvec x, y, z;
21
23 {
24 x += w * (B.x - x);
25 y += w * (B.y - y);
26 z += w * (B.z - z);
27 }
28
29 friend ostream& operator<<(ostream& out, L1FieldValue& B)
30 {
31 return out << B.x[0] << " | " << B.y[0] << " | " << B.z[0];
32 };
34
36{
37
38 public:
39 fvec cx[21], cy[21], cz[21]; // polinom coeff.
40
42 {
43 for (int i = 0; i < 21; i++)
44 cx[i] = cy[i] = cz[i] = 0;
45 }
46
47 void GetFieldValue(const fvec& x, const fvec& y, L1FieldValue& B) const
48 {
49 fvec x2 = x * x;
50 fvec y2 = y * y;
51 fvec xy = x * y;
52
53 fvec x3 = x2 * x;
54 fvec y3 = y2 * y;
55 fvec xy2 = x * y2;
56 fvec x2y = x2 * y;
57
58 fvec x4 = x3 * x;
59 fvec y4 = y3 * y;
60 fvec xy3 = x * y3;
61 fvec x2y2 = x2 * y2;
62 fvec x3y = x3 * y;
63
64 fvec x5 = x4 * x;
65 fvec y5 = y4 * y;
66 fvec xy4 = x * y4;
67 fvec x2y3 = x2 * y3;
68 fvec x3y2 = x3 * y2;
69 fvec x4y = x4 * y;
70
71 B.x = cx[0] + cx[1] * x + cx[2] * y + cx[3] * x2 + cx[4] * xy + cx[5] * y2 + cx[6] * x3 + cx[7] * x2y
72 + cx[8] * xy2 + cx[9] * y3 + cx[10] * x4 + cx[11] * x3y + cx[12] * x2y2 + cx[13] * xy3 + cx[14] * y4
73 + cx[15] * x5 + cx[16] * x4y + cx[17] * x3y2 + cx[18] * x2y3 + cx[19] * xy4 + cx[20] * y5;
74
75 B.y = cy[0] + cy[1] * x + cy[2] * y + cy[3] * x2 + cy[4] * xy + cy[5] * y2 + cy[6] * x3 + cy[7] * x2y
76 + cy[8] * xy2 + cy[9] * y3 + cy[10] * x4 + cy[11] * x3y + cy[12] * x2y2 + cy[13] * xy3 + cy[14] * y4
77 + cy[15] * x5 + cy[16] * x4y + cy[17] * x3y2 + cy[18] * x2y3 + cy[19] * xy4 + cy[20] * y5;
78
79 B.z = cz[0] + cz[1] * x + cz[2] * y + cz[3] * x2 + cz[4] * xy + cz[5] * y2 + cz[6] * x3 + cz[7] * x2y
80 + cz[8] * xy2 + cz[9] * y3 + cz[10] * x4 + cz[11] * x3y + cz[12] * x2y2 + cz[13] * xy3 + cz[14] * y4
81 + cz[15] * x5 + cz[16] * x4y + cz[17] * x3y2 + cz[18] * x2y3 + cz[19] * xy4 + cz[20] * y5;
82 }
84
86{
87
88 public:
90 : cx0(0)
91 , cx1(0)
92 , cx2(0)
93 , cy0(0)
94 , cy1(0)
95 , cy2(0)
96 , cz0(0)
97 , cz1(0)
98 , cz2(0)
99 , z0(0)
100 {}
101
102 L1FieldRegion(float reg[10])
103 : cx0(reg[0])
104 , cx1(reg[1])
105 , cx2(reg[2])
106 , cy0(reg[3])
107 , cy1(reg[4])
108 , cy2(reg[5])
109 , cz0(reg[6])
110 , cz1(reg[7])
111 , cz2(reg[8])
112 , z0(reg[9])
113 {}
114
115 fvec cx0, cx1, cx2; // Bx(z) = cx0 + cx1*(z-z0) + cx2*(z-z0)^2
116 fvec cy0, cy1, cy2; // By(z) = cy0 + cy1*(z-z0) + cy2*(z-z0)^2
117 fvec cz0, cz1, cz2; // Bz(z) = cz0 + cz1*(z-z0) + cz2*(z-z0)^2
119
121 {
122 fvec dz = (z - z0);
123 fvec dz2 = dz * dz;
124 L1FieldValue B;
125 B.x = cx0 + cx1 * dz + cx2 * dz2;
126 B.y = cy0 + cy1 * dz + cy2 * dz2;
127 B.z = cz0 + cz1 * dz + cz2 * dz2;
128 return B;
129 }
130
131 void Set(const L1FieldValue& B0,
132 const fvec B0z,
133 const L1FieldValue& B1,
134 const fvec B1z,
135 const L1FieldValue& B2,
136 const fvec B2z)
137 {
138 z0 = B0z;
139 fvec dz1 = B1z - B0z, dz2 = B2z - B0z;
140 fvec det = rcp(fvec(dz1 * dz2 * (dz2 - dz1)));
141 fvec w21 = -dz2 * det;
142 fvec w22 = dz1 * det;
143 fvec w11 = -dz2 * w21;
144 fvec w12 = -dz1 * w22;
145
146 fvec dB1 = B1.x - B0.x;
147 fvec dB2 = B2.x - B0.x;
148 cx0 = B0.x;
149 cx1 = dB1 * w11 + dB2 * w12;
150 cx2 = dB1 * w21 + dB2 * w22;
151
152 dB1 = B1.y - B0.y;
153 dB2 = B2.y - B0.y;
154 cy0 = B0.y;
155 cy1 = dB1 * w11 + dB2 * w12;
156 cy2 = dB1 * w21 + dB2 * w22;
157
158 dB1 = B1.z - B0.z;
159 dB2 = B2.z - B0.z;
160 cz0 = B0.z;
161 cz1 = dB1 * w11 + dB2 * w12;
162 cz2 = dB1 * w21 + dB2 * w22;
163 }
164
165 void Set(const L1FieldValue& B0, const fvec B0z, const L1FieldValue& B1, const fvec B1z)
166 {
167 z0 = B0z[0];
168 fvec dzi = rcp(fvec(B1z - B0z));
169 cx0 = B0.x;
170 cy0 = B0.y;
171 cz0 = B0.z;
172 cx1 = (B1.x - B0.x) * dzi;
173 cy1 = (B1.y - B0.y) * dzi;
174 cz1 = (B1.z - B0.z) * dzi;
175 cx2 = cy2 = cz2 = 0;
176 }
177
178 void Shift(fvec z)
179 {
180 fvec dz = z - z0;
181 fvec cx2dz = cx2 * dz;
182 fvec cy2dz = cy2 * dz;
183 fvec cz2dz = cz2 * dz;
184 z0 = z[0];
185 cx0 += (cx1 + cx2dz) * dz;
186 cy0 += (cy1 + cy2dz) * dz;
187 cz0 += (cz1 + cz2dz) * dz;
188 cx1 += cx2dz + cx2dz;
189 cy1 += cy2dz + cy2dz;
190 cz1 += cz2dz + cz2dz;
191 }
192
193 void SetOneEntry(const int i0, const L1FieldRegion& f1, const int i1)
194 {
195 cx0[i0] = f1.cx0[i1];
196 cx1[i0] = f1.cx1[i1];
197 cx2[i0] = f1.cx2[i1];
198 cy0[i0] = f1.cy0[i1];
199 cy1[i0] = f1.cy1[i1];
200 cy2[i0] = f1.cy2[i1];
201 cz0[i0] = f1.cz0[i1];
202 cz1[i0] = f1.cz1[i1];
203 cz2[i0] = f1.cz2[i1];
204 z0[i0] = f1.z0[i1];
205 }
206
207 void SetOneEntry(const L1FieldRegion& f1, const int i1)
208 {
209 cx0 = f1.cx0[i1];
210 cx1 = f1.cx1[i1];
211 cx2 = f1.cx2[i1];
212 cy0 = f1.cy0[i1];
213 cy1 = f1.cy1[i1];
214 cy2 = f1.cy2[i1];
215 cz0 = f1.cz0[i1];
216 cz1 = f1.cz1[i1];
217 cz2 = f1.cz2[i1];
218 z0 = f1.z0[i1];
219 }
220
221 void GetOneEntry(float reg[10], const int iVec)
222 {
223 reg[0] = cx0[iVec];
224 reg[1] = cx1[iVec];
225 reg[2] = cx2[iVec];
226 reg[3] = cy0[iVec];
227 reg[4] = cy1[iVec];
228 reg[5] = cy2[iVec];
229 reg[6] = cz0[iVec];
230 reg[7] = cz1[iVec];
231 reg[8] = cz2[iVec];
232 reg[9] = z0[iVec];
233 }
235
236#endif
#define _fvecalignment
Definition P4_F32vec4.h:236
int i
Definition P4_F32vec4.h:22
friend F32vec4 rcp(const F32vec4 &a)
Definition P4_F32vec4.h:45
F32vec4 fvec
Definition P4_F32vec4.h:231
void Shift(fvec z)
Definition L1Field.h:178
L1FieldRegion(float reg[10])
Definition L1Field.h:102
void SetOneEntry(const L1FieldRegion &f1, const int i1)
Definition L1Field.h:207
void SetOneEntry(const int i0, const L1FieldRegion &f1, const int i1)
Definition L1Field.h:193
L1FieldValue Get(const fvec z)
Definition L1Field.h:120
void GetOneEntry(float reg[10], const int iVec)
Definition L1Field.h:221
void Set(const L1FieldValue &B0, const fvec B0z, const L1FieldValue &B1, const fvec B1z, const L1FieldValue &B2, const fvec B2z)
Definition L1Field.h:131
void Set(const L1FieldValue &B0, const fvec B0z, const L1FieldValue &B1, const fvec B1z)
Definition L1Field.h:165
void GetFieldValue(const fvec &x, const fvec &y, L1FieldValue &B) const
Definition L1Field.h:47
fvec cy[21]
Definition L1Field.h:39
fvec cx[21]
Definition L1Field.h:39
fvec cz[21]
Definition L1Field.h:39
friend ostream & operator<<(ostream &out, L1FieldValue &B)
Definition L1Field.h:29
void Combine(L1FieldValue &B, fvec w)
Definition L1Field.h:22