295 double dxyz[3],
xyzt[3], eigv[8];
301 double wa[6], stv[3], wgtvrtd[6], tv[3];
303 int ic, jj, it, jt, ii, kt;
306#define ader_ref(a_1,a_2) vk->ader[(a_2)*(vkalNTrkM*3+3) + (a_1) - (vkalNTrkM*3+4)]
307#define cvder_ref(a_1,a_2) vk->FVC.cvder[(a_2)*2 + (a_1) - 3]
308#define dcv_ref(a_1,a_2) vk->FVC.dcv[(a_2)*6 + (a_1) - 7]
360 std::unique_ptr<double[]> dphi = std::unique_ptr<double[]>(
new double[NTRK]);
361 std::unique_ptr<double[]> deps = std::unique_ptr<double[]>(
new double[NTRK]);
362 std::unique_ptr<double[]> drho = std::unique_ptr<double[]>(
new double[NTRK]);
363 std::unique_ptr<double[]> dtet = std::unique_ptr<double[]>(
new double[NTRK]);
364 std::unique_ptr<double[]> dzp = std::unique_ptr<double[]>(
new double[NTRK]);
366 for (
int i=0; i<3; ++i) { tv[i] = 0.; stv[i] = 0.;}
367 for (
int i=0; i<6; ++i) { vk->
wa[i] = 0.; wa[i] = 0.;}
368 for (k=0; k<2; k++) {
for(j=0; j<3; j++) drdvy[k][j] = drdpy[k][j] = 0.;};
369 for (k=0; k<3; k++) {
for(j=0; j<3; j++) pyv[k][j] = vyv[k][j] = 0.;};
382 for (ii = 1; ii <= 3; ++ii) {
383 for (jj = 1; jj <= 3; ++jj) {
392 for ( kt = 0; kt < NTRK; ++kt) {
394 double theta_ini =trk->
iniP[0];
395 double phi_ini =trk->
iniP[1];
396 double invR_ini =trk->
iniP[2];
399 double cotth = 1. / tan( theta_ini );
400 double cosf = cos(phi_ini);
401 double sinf = sin(phi_ini);
402 double uu =
xyz[0]*cosf +
xyz[1]*sinf;
403 double vv =
xyz[1]*cosf -
xyz[0]*sinf;
407 eps = -vv - uu*uu * invR_ini / 2.;
408 zp = -uu * (1. - vv * invR_ini) * cotth - 0.5*uu*uu*invR_ini*corrCz;
409 phip = -uu * invR_ini;
418 deps[kt] = trk->
a0() - eps;
419 dzp[kt] = trk->
z() -
xyz[2];
421 dtet[kt] = trk->
theta() - theta_ini;
422 dphi[kt] = trk->
phi() - phi_ini;
424 drho[kt] = trk->
invR() - invR_ini;
425 while(dphi[kt] >
M_PI)dphi[kt]-=2.*
M_PI;
426 while(dphi[kt] < -
M_PI)dphi[kt]+=2.*
M_PI;
430 double d11 = sinf - ( uu*cosf *invR_ini);
431 double d12 = -cosf - ( uu*sinf *invR_ini);
432 double d21 = -cosf * cotth + ( (vv*cosf-uu*sinf)*cotth *invR_ini) - uu*cosf*invR_ini*corrCz;
433 double d22 = -sinf * cotth + ( (vv*sinf+uu*cosf)*cotth *invR_ini) - uu*sinf*invR_ini*corrCz;
435 double d41 = -cosf * invR_ini;
436 double d42 = -sinf * invR_ini;
447 double dw11 = d11 * trk->
WgtM[0] + d21 * trk->
WgtM[1] + d41 * trk->
WgtM[6];
448 double dw12 = d11 * trk->
WgtM[1] + d21 * trk->
WgtM[2] + d41 * trk->
WgtM[7];
449 double dw13 = d11 * trk->
WgtM[3] + d21 * trk->
WgtM[4] + d41 * trk->
WgtM[8];
450 double dw14 = d11 * trk->
WgtM[6] + d21 * trk->
WgtM[7] + d41 * trk->
WgtM[9];
451 double dw15 = d11 * trk->
WgtM[10]+ d21 * trk->
WgtM[11]+ d41 * trk->
WgtM[13];
454 double dw21 = d12 * trk->
WgtM[0] + d22 * trk->
WgtM[1] + d42 * trk->
WgtM[6];
455 double dw22 = d12 * trk->
WgtM[1] + d22 * trk->
WgtM[2] + d42 * trk->
WgtM[7];
456 double dw23 = d12 * trk->
WgtM[3] + d22 * trk->
WgtM[4] + d42 * trk->
WgtM[8];
457 double dw24 = d12 * trk->
WgtM[6] + d22 * trk->
WgtM[7] + d42 * trk->
WgtM[9];
458 double dw25 = d12 * trk->
WgtM[10]+ d22 * trk->
WgtM[11]+ d42 * trk->
WgtM[13];
459 double dw31 = trk->
WgtM[1];
460 double dw32 = trk->
WgtM[2];
461 double dw33 = trk->
WgtM[4];
462 double dw34 = trk->
WgtM[7];
463 double dw35 = trk->
WgtM[11];
466 tv[0] += dw11 * deps[kt] + dw12 * dzp[kt];
467 tv[1] += dw21 * deps[kt] + dw22 * dzp[kt];
468 tv[2] += dw31 * deps[kt] + dw32 * dzp[kt];
469 tv[0] += dw13 * dtet[kt] + dw14 * dphi[kt] + dw15 * drho[kt];
470 tv[1] += dw23 * dtet[kt] + dw24 * dphi[kt] + dw25 * drho[kt];
471 tv[2] += dw33 * dtet[kt] + dw34 * dphi[kt] + dw35 * drho[kt];
473 stv[0] += dw11 * deps[kt] + dw12 * dzp[kt];
474 stv[1] += dw21 * deps[kt] + dw22 * dzp[kt];
475 stv[2] += dw31 * deps[kt] + dw32 * dzp[kt];
476 stv[0] += dw13 * dtet[kt] + dw14 * dphi[kt] + dw15*drho[kt];
477 stv[1] += dw23 * dtet[kt] + dw24 * dphi[kt] + dw25*drho[kt];
478 stv[2] += dw33 * dtet[kt] + dw34 * dphi[kt] + dw35*drho[kt];
481 double e12 = uu - invR_ini * vv * uu;
482 double e13 = -uu*uu / 2.;
483 double e21 = uu *(1. - vv*invR_ini) * (cotth*cotth + 1.);
484 double e22 = -vv*cotth + (vv*vv-uu*uu)*invR_ini*cotth - uu*vv*invR_ini*corrCz;
485 double e23 = uu*vv*cotth -0.5*uu*uu*corrCz;
486 double e43 = -uu + 2.*uu*vv*invR_ini;
492 e21 = uu * (cotth*cotth + 1.);
499 double ew11 = e21 * trk->
WgtM[1] + trk->
WgtM[3];
500 double ew12 = e21 * trk->
WgtM[2] + trk->
WgtM[4];
501 double ew13 = e21 * trk->
WgtM[4] + trk->
WgtM[5];
502 double ew14 = e21 * trk->
WgtM[7] + trk->
WgtM[8];
503 double ew15 = e21 * trk->
WgtM[11]+ trk->
WgtM[12];
504 double ew21 = e12 * trk->
WgtM[0] + e22 * trk->
WgtM[1] + trk->
WgtM[6];
505 double ew22 = e12 * trk->
WgtM[1] + e22 * trk->
WgtM[2] + trk->
WgtM[7];
506 double ew23 = e12 * trk->
WgtM[3] + e22 * trk->
WgtM[4] + trk->
WgtM[8];
507 double ew24 = e12 * trk->
WgtM[6] + e22 * trk->
WgtM[7] + trk->
WgtM[9];
508 double ew25 = e12 * trk->
WgtM[10]+ e22 * trk->
WgtM[11]+ trk->
WgtM[13];
509 double ew31 = e13 * trk->
WgtM[0] + e23 * trk->
WgtM[1] + e43 * trk->
WgtM[6] + trk->
WgtM[10];
510 double ew32 = e13 * trk->
WgtM[1] + e23 * trk->
WgtM[2] + e43 * trk->
WgtM[7] + trk->
WgtM[11];
511 double ew33 = e13 * trk->
WgtM[3] + e23 * trk->
WgtM[4] + e43 * trk->
WgtM[8] + trk->
WgtM[12];
512 double ew34 = e13 * trk->
WgtM[6] + e23 * trk->
WgtM[7] + e43 * trk->
WgtM[9] + trk->
WgtM[13];
513 double ew35 = e13 * trk->
WgtM[10]+ e23 * trk->
WgtM[11]+ e43 * trk->
WgtM[13]+ trk->
WgtM[14];
517 t_trk->
tt[0] = ew11*deps[kt] + ew12*dzp[kt];
518 t_trk->
tt[1] = ew21*deps[kt] + ew22*dzp[kt];
519 t_trk->
tt[2] = ew31*deps[kt] + ew32*dzp[kt];
520 t_trk->
tt[0] += ew13*dtet[kt] + ew14*dphi[kt] + ew15*drho[kt];
521 t_trk->
tt[1] += ew23*dtet[kt] + ew24*dphi[kt] + ew25*drho[kt];
522 t_trk->
tt[2] += ew33*dtet[kt] + ew34*dphi[kt] + ew35*drho[kt];
524 for (j = 1; j <= 2; ++j) {
540 t_trk->
tt[0] -= drdpy[0][0]*vk->
FVC.
rv0[0] + drdpy[1][0]*vk->
FVC.
rv0[1];
541 t_trk->
tt[1] -= drdpy[0][1]*vk->
FVC.
rv0[0] + drdpy[1][1]*vk->
FVC.
rv0[1];
542 t_trk->
tt[2] -= drdpy[0][2]*vk->
FVC.
rv0[0] + drdpy[1][2]*vk->
FVC.
rv0[1];
543 for (ii = 1; ii <= 3; ++ii) {
544 for (jj = 1; jj <= 3; ++jj) {
545 pyv[jj-1][ii-1] = drdpy[0][ii-1] *
cvder_ref(1, jj) + drdpy[1][ii-1] *
cvder_ref(2, jj);
551 wa[0] += dw11 * d11 + dw12 * d21 + dw14 * d41;
552 wa[1] += dw11 * d12 + dw12 * d22 + dw14 * d42;
553 wa[2] += dw21 * d12 + dw22 * d22 + dw24 * d42;
557 vk->
wa[0] = vk->
wa[0] + dw11 * d11 + dw12 * d21 + dw14 * d41;
558 vk->
wa[1] = vk->
wa[1] + dw11 * d12 + dw12 * d22 + dw14 * d42;
559 vk->
wa[2] = vk->
wa[2] + dw21 * d12 + dw22 * d22 + dw24 * d42;
565 twb[0] = dw12 * e21 + dw13;
566 twb[1] = dw22 * e21 + dw23;
567 twb[2] = dw32 * e21 + dw33;
568 twb[3] = dw11 * e12 + dw12 * e22 + dw14;
569 twb[4] = dw21 * e12 + dw22 * e22 + dw24;
570 twb[5] = dw31 * e12 + dw32 * e22 + dw34;
571 twb[6] = dw11 * e13 + dw12 * e23 + dw14 * e43 + dw15;
572 twb[7] = dw21 * e13 + dw22 * e23 + dw24 * e43 + dw25;
573 twb[8] = dw31 * e13 + dw32 * e23 + dw34 * e43 + dw35;
587 vk->
tmpArr[kt]->wc[0] = ew12 * e21 + ew13;
588 vk->
tmpArr[kt]->wc[1] = ew22 * e21 + ew23;
589 vk->
tmpArr[kt]->wc[3] = ew32 * e21 + ew33;
590 vk->
tmpArr[kt]->wc[2] = ew21 * e12 + ew22 * e22 + ew24;
591 vk->
tmpArr[kt]->wc[4] = ew31 * e12 + ew32 * e22 + ew34;
592 vk->
tmpArr[kt]->wc[5] = ew31 * e13 + ew32 * e23 + ew34 * e43 + ew35;
596 if (IERR) {IERR=
cfdinv(&(vk->
tmpArr[kt]->wc[0]), twci, 3);}
597 if (IERR)
return IERR;
600 twbci[0] = twb[0]*twci[0] + twb[3]*twci[1] + twb[6]*twci[3];
601 twbci[1] = twb[1]*twci[0] + twb[4]*twci[1] + twb[7]*twci[3];
602 twbci[2] = twb[2]*twci[0] + twb[5]*twci[1] + twb[8]*twci[3];
603 twbci[3] = twb[0]*twci[1] + twb[3]*twci[2] + twb[6]*twci[4];
604 twbci[4] = twb[1]*twci[1] + twb[4]*twci[2] + twb[7]*twci[4];
605 twbci[5] = twb[2]*twci[1] + twb[5]*twci[2] + twb[8]*twci[4];
606 twbci[6] = twb[0]*twci[3] + twb[3]*twci[4] + twb[6]*twci[5];
607 twbci[7] = twb[1]*twci[3] + twb[4]*twci[4] + twb[7]*twci[5];
608 twbci[8] = twb[2]*twci[3] + twb[5]*twci[4] + twb[8]*twci[5];
611 wa[0] = wa[0] - twbci[0]*twb[0] - twbci[3]*twb[3] - twbci[6]*twb[6];
612 wa[1] = wa[1] - twbci[0]*twb[1] - twbci[3]*twb[4] - twbci[6]*twb[7];
613 wa[2] = wa[2] - twbci[1]*twb[1] - twbci[4]*twb[4] - twbci[7]*twb[7];
614 wa[3] = wa[3] - twbci[0]*twb[2] - twbci[3]*twb[5] - twbci[6]*twb[8];
615 wa[4] = wa[4] - twbci[1]*twb[2] - twbci[4]*twb[5] - twbci[7]*twb[8];
616 wa[5] = wa[5] - twbci[2]*twb[2] - twbci[5]*twb[5] - twbci[8]*twb[8];
619 tv[0] = tv[0] - twbci[0] * vk->
tmpArr[kt]->tt[0] - twbci[3] * vk->
tmpArr[kt]->tt[1] - twbci[6] * vk->
tmpArr[kt]->tt[2];
620 tv[1] = tv[1] - twbci[1] * vk->
tmpArr[kt]->tt[0] - twbci[4] * vk->
tmpArr[kt]->tt[1] - twbci[7] * vk->
tmpArr[kt]->tt[2];
621 tv[2] = tv[2] - twbci[2] * vk->
tmpArr[kt]->tt[0] - twbci[5] * vk->
tmpArr[kt]->tt[1] - twbci[8] * vk->
tmpArr[kt]->tt[2];
623 for(
int tpn=0; tpn<9; tpn++){
624 vk->
tmpArr[kt]->wb[tpn] = twb[tpn];
625 if(tpn<6)vk->
tmpArr[kt]->wci[tpn] = twci[tpn];
626 vk->
tmpArr[kt]->wbci[tpn] = twbci[tpn];
631 for (ic = 0; ic < 6; ++ic) {wgtvrtd[ic] = vk->
apriorVWGT[ic];}
638 vk->
wa[0] += wgtvrtd[0];
639 vk->
wa[1] += wgtvrtd[1];
640 vk->
wa[2] += wgtvrtd[2];
641 vk->
wa[3] += wgtvrtd[3];
642 vk->
wa[4] += wgtvrtd[4];
643 vk->
wa[5] += wgtvrtd[5];
644 tv[0] = tv[0] +
xyzt[0] * wgtvrtd[0] +
xyzt[1] * wgtvrtd[1] +
xyzt[2] * wgtvrtd[3];
645 tv[1] = tv[1] +
xyzt[0] * wgtvrtd[1] +
xyzt[1] * wgtvrtd[2] +
xyzt[2] * wgtvrtd[4];
646 tv[2] = tv[2] +
xyzt[0] * wgtvrtd[3] +
xyzt[1] * wgtvrtd[4] +
xyzt[2] * wgtvrtd[5];
647 stv[0] = stv[0] +
xyzt[0] * wgtvrtd[0] +
xyzt[1] * wgtvrtd[1] +
xyzt[2] * wgtvrtd[3];
648 stv[1] = stv[1] +
xyzt[0] * wgtvrtd[1] +
xyzt[1] * wgtvrtd[2] +
xyzt[2] * wgtvrtd[4];
649 stv[2] = stv[2] +
xyzt[0] * wgtvrtd[3] +
xyzt[1] * wgtvrtd[4] +
xyzt[2] * wgtvrtd[5];
652 vk->
T[0]=stv[0]; vk->
T[1]=stv[1]; vk->
T[2]=stv[2];
660 double EigThreshold = 1.e-9;
662 if (eigv[0] < eigv[2] * EigThreshold) {
663 wa[0] += (eigv[2] * EigThreshold - eigv[0]);
664 wa[2] += (eigv[2] * EigThreshold - eigv[0]);
665 wa[5] += (eigv[2] * EigThreshold - eigv[0]);
669 wa[0] += eigv[2] * 1.e-12;
670 wa[2] += eigv[2] * 1.e-12;
671 wa[5] += eigv[2] * 1.e-12;
672 vk->
wa[0] += eigv[2] * 1.e-12;
673 vk->
wa[2] += eigv[2] * 1.e-12;
674 vk->
wa[5] += eigv[2] * 1.e-12;
679 for(ii=0; ii<6; ii++) {
if(std::isnan(wa[ii]))
return -2;}
680 if(wa[0]<0 || wa[2]<0 || wa[5]<0)
return -2;
690 for (j = 0; j < 3; ++j) {
691 vk->
dxyz0[j] = dxyz[j];
692 vk->
fitV[j] = xyzf[j] = vk->
iniV[j] + dxyz[j];
704 for (kt = 0; kt < NTRK; ++kt) {
705 for(
int tpn=0; tpn<9; tpn++){
706 if(tpn<6)twci[tpn] = vk->
tmpArr[kt]->wci[tpn];
707 twbci[tpn] = vk->
tmpArr[kt]->wbci[tpn];
709 double tt1=vk->
tmpArr[kt]->tt[0];
710 double tt2=vk->
tmpArr[kt]->tt[1];
711 double tt3=vk->
tmpArr[kt]->tt[2];
712 vk->
tmpArr[kt]->parf0[0] = twci[0]*tt1 + twci[1]*tt2 + twci[3]*tt3 - twbci[0]*dxyz[0] - twbci[1]*dxyz[1] - twbci[2]*dxyz[2];
713 if( !std::isfinite(vk->
tmpArr[kt]->parf0[0]) )
return -19;
714 vk->
tmpArr[kt]->parf0[1] = twci[1]*tt1 + twci[2]*tt2 + twci[4]*tt3 - twbci[3]*dxyz[0] - twbci[4]*dxyz[1] - twbci[5]*dxyz[2];
715 if( !std::isfinite(vk->
tmpArr[kt]->parf0[1]) )
return -19;
716 vk->
tmpArr[kt]->parf0[2] = twci[3]*tt1 + twci[4]*tt2 + twci[5]*tt3 - twbci[6]*dxyz[0] - twbci[7]*dxyz[1] - twbci[8]*dxyz[2];
717 if( !std::isfinite(vk->
tmpArr[kt]->parf0[2]) )
return -19;
731 stv[0] = stv[0] - drdvy[0][0] * vk->
FVC.
rv0[0] - drdvy[1][0] * vk->
FVC.
rv0[1];
732 stv[1] = stv[1] - drdvy[0][1] * vk->
FVC.
rv0[0] - drdvy[1][1] * vk->
FVC.
rv0[1];
733 stv[2] = stv[2] - drdvy[0][2] * vk->
FVC.
rv0[0] - drdvy[1][2] * vk->
FVC.
rv0[1];
735 vk->
T[0]=stv[0];vk->
T[1]=stv[1];vk->
T[2]=stv[2];
737 vk->
wa[0] += vyv[0][0];
738 vk->
wa[1] += vyv[1][0];
739 vk->
wa[2] += vyv[1][1];
740 vk->
wa[3] += vyv[2][0];
741 vk->
wa[4] += vyv[2][1];
742 vk->
wa[5] += vyv[2][2];
745 for (it = 1; it <= NTRK; ++it) {
752 for (jt = 1; jt <= NTRK; ++jt) {
753 for (k = 0; k < 3; ++k) {
754 for (l = 0; l < 3; ++l) {
756 for (j = 0; j < 2; ++j) {
757 dpipj[k][l] += vk->
tmpArr[jt-1]->drdp[j][k] * drdpy[j][l];
761 for (k = 1; k <= 3; ++k) {
762 for (l = 1; l <= 3; ++l) {
763 ader_ref(it * 3 + k, jt * 3 + l) += dpipj[l-1][k-1];
770 double ArrTmp[9];
int ktmp=0;
771 for (k=1; k<=3; ++k) {
772 for (l=1; l<=k; ++l) { ArrTmp[ktmp++] =
ader_ref(k,l); }}
775 if( eigv[0]<0 ){EigAddon=eigv[0];}
776 for (k = 1; k <=3; ++k) {
780 long int NParam = NTRK*3 + 3;
782 if ( IERR)
return IERR;
783 double *fortst =
new double[
vkalNTrkM*3+3];
784 for (j = 0; j < 3; ++j) {
786 for (ii=0; ii<NTRK; ++ii) { fortst[ii*3 +3 +j] = vk->
tmpArr[ii]->tt[j];}
788 for (j=0; j<3; ++j) {
790 for (ii=0; ii<NParam; ++ii) {dxyz[j] +=
ader_ref(j+1, ii+1) * fortst[ii];}
791 vk->
dxyz0[j] = dxyz [j];
792 vk->
fitV[j] = vk->
iniV[j] + dxyz[j];
794 double tparf0[3]={0.};
795 for (it = 1; it <= NTRK; ++it) {
797 for (j=0; j<3; ++j) {
799 for (ii = 1; ii <= NParam; ++ii) { tparf0[j] +=
ader_ref(it*3+j+1, ii)*fortst[ii-1];}
801 for (j=0; j<3; ++j) { t_trk->
parf0[j] = tparf0[j];
823 double dCoefNorm = 0;
826 if (IERR != 0)
return IERR;
832 double* tmpB=
new double[3+3*NTRK];
double* tmpA=
new double[3+3*NTRK];
833 for (ii=0; ii<3; ++ii) {
834 tmpA[ii] = vk->
fitV[ii] - vk->
iniV[ii];
835 tmpB[ii] = vk->
dxyz0[ii];
837 for ( it=0; it<NTRK; ++it) {
841 tmpB[0 +3*it+3] = vk->
tmpArr[it]->parf0[0];
842 tmpB[1 +3*it+3] = vk->
tmpArr[it]->parf0[1];
843 tmpB[2 +3*it+3] = vk->
tmpArr[it]->parf0[2];
845 double scalAA=0., scalAB=0.;
846 for (ii=0; ii<3+3*NTRK; ii++) scalAA += tmpA[ii]*tmpA[ii];
847 for (ii=0; ii<3+3*NTRK; ii++) scalAB += tmpA[ii]*tmpB[ii];
848 if(scalAB != 0.) dCoefNorm = -scalAA/scalAB;
851 delete[] tmpA;
delete[] tmpB;
865 for (it = 0; it < NTRK; ++it) {
867 double Ratio=vk->
TrackList[it]->fitP[2]/vk->
TrackList[it]->Perig[4];
if(std::abs(Ratio)<1.)Ratio=1./Ratio;
869 if(std::abs(vk->
TrackList[it]->fitP[2])<std::abs(vk->
TrackList[it]->Perig[4]) || Ratio<0 ){
878 bool improved=makePostFit( vk , wgtvrtd, dCoefNorm);
879 if(!improved)improved=makePostFit( vk , wgtvrtd, dCoefNorm);