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