42 Double_t qp0 = (QP0) ?*QP0 :
GetTrack()[4];
44 Bool_t downstream_direction = ( z_out > z_in );
46 if ( downstream_direction )
58 vector <CbmKFMaterial*>::iterator
i, ibeg,iend;
62 (*iend)->ZReference-(*iend)->ZThickness/2<Z ) iend++;
63 if ( downstream_direction ){
72 for(
i = ibeg;
i!=iend; downstream_direction ?++
i :--
i )
74 Double_t zthick = (*i)->ZThickness, zcross=(*i)->ZReference;
77 double z0 = (downstream_direction) ?zcross-zthick/2. :zcross+zthick/2.;
78 double d = (downstream_direction) ?1 :-1;
79 double dz = 1.E-1*(*i)->RadLength;
81 while( z_ + dz < zthick){
82 err = err || (*i)->Pass(
z0+
d*(z_+dz/2.), dz, *
this, downstream_direction, qp0 );
86 err = err || (*i)->Pass(
z0+
d*(z_+dz/2.), dz, *
this, downstream_direction, qp0 );
108 if ( NHits==0 )
return 1;
115 const Double_t INF = 10000.;
123 C[ 1] = 0.; C[ 2] = INF;
124 C[ 3] = 0.; C[ 4] = 0.; C[ 5] = INF;
125 C[ 6] = 0.; C[ 7] = 0.; C[ 8] = 0.; C[ 9] = INF;
126 C[10] = 0.; C[11] = 0.; C[12] = 0.; C[13] = 0.; C[14] = INF;
132 err = h->
Filter( *
this, downstream, qp0 );
134 for( Int_t
i=1;
i<NHits;
i++ ){
137 for(Int_t j=istold+1; j<ist; j++)
138 err = err || KF->
vMaterial[j]->Pass( *
this, downstream, qp0 );
139 err = err || h->
Filter( *
this, downstream, qp0 );
144 err = h->
Filter( *
this, downstream, qp0 );
146 for( Int_t
i=NHits-2;
i>=0;
i-- ){
149 for(Int_t j=istold-1; j>ist; j--)
150 err = err || KF->
vMaterial[j]->Pass( *
this, downstream, qp0 );
151 err = err || h->
Filter( *
this, downstream, qp0 );
164 C[ 1] = 0.; C[ 2] = INF;
165 C[ 3] = 0.; C[ 4] = 0.; C[ 5] = INF;
166 C[ 6] = 0.; C[ 7] = 0.; C[ 8] = 0.; C[ 9] = INF;
167 C[10] = 0.; C[11] = 0.; C[12] = 0.; C[13] = 0.; C[14] = INF;
168 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
175 C[ 1] = 0.; C[ 2] = INF;
176 C[ 3] = 0.; C[ 4] = 0.; C[ 5] = INF;
177 C[ 6] = 0.; C[ 7] = 0.; C[ 8] = 0.; C[ 9] = INF;
178 C[10] = 0.; C[11] = 0.; C[12] = 0.; C[13] = 0.; C[14] = INF;
179 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
192 if ( NHits==0 )
return;
199 const Double_t INF = 100.;
207 C[ 1] = 0.; C[ 2] = INF;
208 C[ 3] = 0.; C[ 4] = 0.; C[ 5] = INF;
209 C[ 6] = 0.; C[ 7] = 0.; C[ 8] = 0.; C[ 9] = INF;
210 C[10] = 0.; C[11] = 0.; C[12] = 0.; C[13] = 0.; C[14] = INF;
216 h->
Filter( *
this, 1, qp0 );
218 for( Int_t
i=1;
i<NHits;
i++ ){
223 if( KF->
vMaterial[j]->ZReference >Z )
break;
226 if( j<ist || KF->vMaterial[h->
MaterialIndex]->ZReference >Z )
break;
227 h->
Filter( *
this, 1, qp0 );
234 double Ts[6], Cs[15];
235 for(
int k=0; k<6;k++) Ts[k] = T[k];
236 for(
int k=0; k<15;k++) Cs[k] = C[k];
238 C[ 1] = 0.; C[ 2] = INF;
239 C[ 3] = 0.; C[ 4] = 0.; C[ 5] = INF;
240 C[ 6] = 0.; C[ 7] = 0.; C[ 8] = 0.; C[ 9] = INF;
241 C[10] = 0.; C[11] = 0.; C[12] = 0.; C[13] = 0.; C[14] = INF;
246 h->
Filter( *
this, 0, qp0 );
248 for( Int_t
i=NHits-2;
i>=0;
i-- ){
253 if( KF->
vMaterial[j]->ZReference <=Z )
break;
257 h->
Filter( *
this, 0, qp0 );
267 for(
int k=0; k<15;k++) I[k] = C[k] + Cs[k];
272 for(
int k=0; k<5;k++) r[k] = T[k] - Ts[k];
273 for(
int k=0; k<5;k++ )
274 for(
int l=0;l<5;l++) T[k]-=K[k*5+l]*r[l];
278 for(
int l=0; l<5; l++ ) K[ (5+1)*l ] -= 1;
279 for(
int l=0; l<5; ++l )
280 for(
int j=0; j<=l; ++j ){
285 for(
int l=0; l<15; l++ ) C[l] = A[l];
309 Double_t a = T[2], b = T[3];
314 Double_t zeta[2] = { x-T[0], y-T[1] };
316 Double_t CHt[5][2] = { { C[0], C[1]},
322 for( Int_t iter=0; iter<MaxIter; iter++ ){
324 Double_t Cv0 = Cv[0] -a*(2*Cv[3] -a*Cv[5]);
325 Double_t Cv1 = Cv[1] -b*Cv[3] -a*(Cv[4] -b*Cv[5]);
326 Double_t Cv2 = Cv[2] -b*(2*Cv[4] -b*Cv[5]);
328 Double_t S[3] = { C[0] + Cv0, C[1] + Cv1, C[2] + Cv2 };
332 Double_t s = S[0]*S[2] - S[1]*S[1];
333 if ( s < 1.E-20 )
return;
345 if( iter<MaxIter-1 ){
347 for( Int_t
i=2;
i<4; ++
i ){
348 K[
i][0] = CHt[
i][0]*S[0] + CHt[
i][1]*S[1] ;
349 K[
i][1] = CHt[
i][0]*S[1] + CHt[
i][1]*S[2] ;
354 a = T[2] + K[2][0]*zeta[0] + K[2][1]*zeta[1];
355 b = T[3] + K[3][0]*zeta[0] + K[3][1]*zeta[1];
360 for( Int_t
i=0;
i<5; ++
i ){
361 K[
i][0] = CHt[
i][0]*S[0] + CHt[
i][1]*S[1] ;
362 K[
i][1] = CHt[
i][0]*S[1] + CHt[
i][1]*S[2] ;
369 T[2]+= K[2][0]*zeta[0] + K[2][1]*zeta[1];
370 T[3]+= K[3][0]*zeta[0] + K[3][1]*zeta[1];
371 T[4]+= K[4][0]*zeta[0] + K[4][1]*zeta[1];
375 GetRefChi2() += zeta[0]*zeta[0]*S[0] + 2*zeta[0]*zeta[1]*S[1]
376 + zeta[1]*zeta[1]*S[2] ;
380 C[ 0] -= K[0][0]*CHt[0][0] + K[0][1]*CHt[0][1];
381 C[ 1] -= K[1][0]*CHt[0][0] + K[1][1]*CHt[0][1];
382 C[ 2] -= K[1][0]*CHt[1][0] + K[1][1]*CHt[1][1];
383 C[ 3] -= K[2][0]*CHt[0][0] + K[2][1]*CHt[0][1];
384 C[ 4] -= K[2][0]*CHt[1][0] + K[2][1]*CHt[1][1];
385 C[ 5] -= K[2][0]*CHt[2][0] + K[2][1]*CHt[2][1];
386 C[ 6] -= K[3][0]*CHt[0][0] + K[3][1]*CHt[0][1];
387 C[ 7] -= K[3][0]*CHt[1][0] + K[3][1]*CHt[1][1];
388 C[ 8] -= K[3][0]*CHt[2][0] + K[3][1]*CHt[2][1];
389 C[ 9] -= K[3][0]*CHt[3][0] + K[3][1]*CHt[3][1];
390 C[10] -= K[4][0]*CHt[0][0] + K[4][1]*CHt[0][1];
391 C[11] -= K[4][0]*CHt[1][0] + K[4][1]*CHt[1][1];
392 C[12] -= K[4][0]*CHt[2][0] + K[4][1]*CHt[2][1];
393 C[13] -= K[4][0]*CHt[3][0] + K[4][1]*CHt[3][1];
394 C[14] -= K[4][0]*CHt[4][0] + K[4][1]*CHt[4][1];
static Bool_t GetThickness(Double_t z1, Double_t z2, Double_t mz, Double_t mthick, Double_t *mz_out, Double_t *mthick_out)