12 #include "TDecompLU.h"
30 dpar[0]=0.01; dpar[1]=0.001; dpar[2]=0.001; dpar[3]=0.01; dpar[4]=0.01;
31 resolution[0]=0.140*2.00; resolution[1]=0.140*1.00;
32 resolution[2]=0.140*2.00; resolution[3]=0.140*1.00;
33 resolution[4]=0.140*2.00; resolution[5]=0.140*1.00;
34 resolution[6]=0.140*2.00; resolution[7]=0.140*1.00;
35 for(Int_t i=0;i<8;i++) {sig[i]=resolution[i];}
44 for(Int_t m=0; m<4; m++) {
45 for(Int_t s=0; s<6; s++) {
46 mdcInstalled[m][s]=kFALSE;
50 normVecMdc[m][s][0]=0.;
51 normVecMdc[m][s][1]=0.;
52 normVecMdc[m][s][2]=0.;
68 mdcInstalled[m][s]=kTRUE;
70 mdcPos[m][s][0] = aTransl.
getX();
71 mdcPos[m][s][1] = aTransl.
getY();
72 mdcPos[m][s][2] = aTransl.
getZ();
77 normVecMdc[m][s][0]=norm.
getX();
78 normVecMdc[m][s][1]=norm.
getY();
79 normVecMdc[m][s][2]=norm.
getZ();
81 dzfacMdc[m][s]=tan(acos(norm.
getZ()));
83 if (m==1 && mdcInstalled[0][s]==kFALSE) v.
setZ(-650.);
85 pointForVertexRec[s][0]=vs.
getX();
86 pointForVertexRec[s][1]=vs.
getY();
87 pointForVertexRec[s][2]=vs.
getZ();
93 Double_t* u2pos, Double_t* u2dir,
94 Float_t* sigMult, Int_t sec, Double_t pGuess) {
104 findMdcIntersectionPoint(u1pos,u1dir,0,&
hit[0][0]);
105 findMdcIntersectionPoint(u1pos,u1dir,1,&
hit[1][0]);
106 findMdcIntersectionPoint(u2pos,u2dir,2,&
hit[2][0]);
107 findMdcIntersectionPoint(u2pos,u2dir,3,&
hit[3][0]);
108 for(Int_t i=0;i<4;i++) {
111 sig[2*i]=sigMult[2*i]*resolution[2*i];
112 sig[2*i+1]=sigMult[2*i+1]*resolution[2*i+1];
119 Double_t* u2pos, Double_t* u2dir,
120 Float_t* sigMult, Int_t sec, Double_t pGuess) {
133 for (Int_t i=0;i<2;i++) {
134 if (sigMult[2*i]>0) {
135 findMdcIntersectionPoint(u1pos,u1dir,i,&
hit[m][0]);
138 sig[2*m]=sigMult[2*i]*resolution[2*i];
139 sig[2*m+1]=sigMult[2*i+1]*resolution[2*i+1];
141 }
else mdcLookup[i]=-1;
143 for (Int_t i=2;i<4;i++) {
144 if (sigMult[2*i]>0) {
145 findMdcIntersectionPoint(u2pos,u2dir,i,&
hit[m][0]);
148 sig[2*m]=sigMult[2*i]*resolution[2*i];
149 sig[2*m+1]=sigMult[2*i+1]*resolution[2*i+1];
151 }
else mdcLookup[i]=-1;
160 if (fabs(pfit)<10.)
return kFALSE;
164 for(Int_t i=0;i<3;i++) fit[0][i]=
hit[0][i];
165 Float_t dist=distance(&
hit[0][0],&
hit[1][0]);
166 if (dist==0.) {
return kFALSE; }
167 Float_t uh=(
hit[1][0]-
hit[0][0])/dist;
168 Float_t uv=(
hit[1][1]-
hit[0][1])/dist;
169 for(Int_t iter=0;iter<11;iter++) {
170 polbending=fieldScalFact*pfit;
172 parSetNew0(uh,uv,iter);
173 if (jstep>=maxNumSteps) {
return kFALSE; }
174 for(Int_t m=0;m<nMaxMod;m++) {
175 for(Int_t i=0;i<2;i++) {
176 Float_t chi=(
hit[m][i]-fit[m][i])/sig[(m*2)+i];
180 if (finite(pfit)==0||finite(chi2)==0) {
181 Warning(
"HRungeKuttta::fitMdc()",
"NaN or Inf value received for pFit or chi2...skipped!");
184 if (chi2==0.) chi2=0.001;
185 if ((TMath::Abs(chi2-chi2old)/chi2)<0.005||iter==10||(iter>5&&chi2old>1.e+06&&chi2>chi2old))
break;
189 if (jstep>=maxNumSteps) {
return kFALSE; }
191 derive(&fitdp[0][0],0);
192 derive(&fitdh[0][0],1);
193 derive(&fitdv[0][0],2);
194 derive(&fit1h[0][0],3);
195 derive(&fit1v[0][0],4);
197 for(Int_t i=0;i<nMaxMod;i++) {
198 for(Int_t k=0;k<2;k++) {
199 ydata[i*2+k]=fit[i][k]-
hit[i][k];
203 if (!(rc=linSys()))
break;
204 Double_t dpp=fitpar[0]/pfit;
206 pfit+=fitpar[0]*(1+dpp);
208 pfit+=fitpar[0]/(1-dpp);
212 fit[0][0]+=fitpar[3];
213 fit[0][1]+=fitpar[4];
214 fit[0][2]-=fitpar[4]*dzfacMdc[(mdcModules[0])][sector];
215 if (pfit==0.) pfit=10.;
227 Double_t* normplane=&normVecMdc[mdcN][sector][0];
228 Double_t* pplane=&mdcPos[mdcN][sector][0];
229 findIntersectionPoint(upos,udir,pplane,normplane,xyz);
235 if (p0Guess!=999999999.) {
241 Double_t dir1[3],dir2[3];
242 for(Int_t i=0;i<3;i++) {
243 dir1[i]=
hit[1][i]-
hit[0][i];
244 dir2[i]=hit[3][i]-hit[2][i];
246 Float_t temp=sqrt((dir1[1]*dir1[1]+dir1[2]*dir1[2])*(dir2[1]*dir2[1]+dir2[2]*dir2[2]));
247 if (temp==0.) temp=1.;
248 Float_t cosxi=(dir1[1]*dir2[1]+dir1[2]*dir2[2])/temp;
249 if (cosxi> 1.0) cosxi=1;
250 if (cosxi<-1.0) cosxi=-1;
251 Float_t xi=acos(cosxi);
252 Float_t vprod=(dir1[1]*dir2[2]-dir1[2]*dir2[1]);
254 if (temp==0.) temp=0.001;
255 Float_t temp1=TMath::Abs(vprod);
256 if (temp1==0.) temp1=0.001;
257 pfit=75./(2*temp)*vprod/temp1;
264 Float_t dist=sqrt((p1[0]-p2[0])*(p1[0]-p2[0])+
265 (p1[1]-p2[1])*(p1[1]-p2[1])+
266 (p1[2]-p2[2])*(p1[2]-p2[2]));
275 Double_t upos[3], udir[3];
276 for(Int_t i=0;i<3;i++) {
282 findMdcIntersectionPoint(upos,udir,mdcModules[0],&fit[0][0]);
283 for(Int_t i=0;i<3;i++) { upos[i]=fit[0][i]; }
285 for(Int_t i=0;i<3;i++) {
286 dirAtFirstMDC[i]=udir[i];
289 gentrkNew(pfit,&upos[0],&udir[0],&fit[0][0],1);
297 Double_t upos[3], udir[3];
302 gentrkNew(pfit+dpar[0],&upos[0],&udir[0],&fitdp[0][0],2);
307 cosines(uh+dpar[1],uv,udir);
308 gentrkNew(pfit,&upos[0],&udir[0],&fitdh[0][0],3);
313 cosines(uh,uv+dpar[2],udir);
314 gentrkNew(pfit,&upos[0],&udir[0],&fitdv[0][0],4);
316 upos[0]=fit[0][0]+dpar[3];
320 gentrkNew(pfit,&upos[0],&udir[0],&fit1h[0][0],5);
323 upos[1]=fit[0][1]+dpar[4];
324 upos[2]=fit[0][2]-dpar[4]*dzfacMdc[(mdcModules[0])][sector];
326 gentrkNew(pfit,&upos[0],&udir[0],&fit1v[0][0],6);
332 Float_t prod=sqrt(uh*uh+uv*uv);
333 if (prod==0.) prod=0.0001;
337 dir[2]=sqrt(1.-prod*prod);
348 Double_t
dp=dpar[kind];
349 for(Int_t i=0;i<nMaxMod;i++) {
350 Double_t* h=&hitpar[i*3];
351 for(Int_t k=0;k<2;k++) {
352 dydpar[kind][i*2+k]=(h[k]-fit[i][k])/dp;
360 Double_t data[5][5], elements[5];
361 Int_t kMax=nMaxMod*2;
362 for(Int_t i=0;i<5;i++) {
363 for(Int_t j=0;j<5;j++) {
365 for(Int_t k=0;k<kMax;k++) {
366 data[j][i]+=dydpar[j][k]*dydpar[i][k]/(sig[k]*sig[k]);
370 for(Int_t i=0;i<5;i++) {
372 for(Int_t k=0;k<kMax;k++) {
373 elements[i]-= ydata[k]*dydpar[i][k]/(sig[k]*sig[k]);
380 TMatrixD test(5,5,(Double_t*)data,NULL);
383 if(!decompose(test,sign,mTol,nrZeros)||nrZeros>0){
return kFALSE;}
386 TMatrixD m(5,5,(Double_t*)data,NULL);
388 TMatrixD b(5,1,(Double_t*)elements,NULL);
393 for(Int_t i=0;i<5;i++) {
408 Double_t* pHit=&hitxyz[0];
409 for(Int_t i=0;i<3;i++) pHit[i]=upos[i];
412 Float_t step=initialStepSize;
413 Float_t nextStep=step;
415 for(Int_t nMod=1;nMod<nMaxMod;nMod++) {
416 pHit=&hitxyz[nMod*3];
418 stepFac=rkgtrk(step,p,upos,udir,kind);
419 findMdcIntersectionPoint(upos,udir,mdcModules[nMod],pHit);
420 d=distance(upos,pHit);
422 if (stepFac<1.) nextStep=step*stepFac;
423 }
else nextStep*=stepFac;
424 if (d>nextStep||d<maxDist) step=nextStep;
426 }
while (d>=maxDist&&((polbending>=0&&upos[2]<pHit[2])||(polbending<0&&upos[1]<pHit[1]))&&jstep<maxNumSteps);
432 for(Int_t i=0;i<3;i++) {
433 posNearLastMDC[i] = upos[i];
434 dirAtLastMDC[i] = udir[i];
436 stepSizeAtLastMDC=nextStep;
443 Float_t k1[3],k2[3],k3[3],k4[3],hstep,qstep;
444 Double_t u1pos[3], u1dir[3], u2pos[3], u2dir[3], ucm[3], b[3];
446 Float_t step=totStep;
448 for(Int_t i=0;i<3;i++) ucm[i]=upos[i]/10.;
449 fieldMap->calcField(ucm,b,fieldScalFact);
455 qstep=step*step*0.125;
457 for(Int_t i=0;i<3;i++) {
458 u1pos[i]=upos[i]+hstep*udir[i]+qstep*k1[i];
459 u1dir[i]=udir[i]+hstep*k1[i];
461 for(Int_t i=0;i<3;i++) ucm[i]=u1pos[i]/10.;
462 fieldMap->calcField(ucm,b,fieldScalFact);
463 rkeqfw(b,p,u1dir,k2);
465 for(Int_t i=0;i<3;i++) {
466 u1dir[i] = udir[i] + hstep*k2[i];
468 rkeqfw(b,p,u1dir,k3);
470 for(Int_t i=0;i<3;i++) {
471 u2pos[i]=upos[i]+step*udir[i]+2.*hstep*hstep*k3[i];
472 u2dir[i]=udir[i]+step*k3[i];
474 for(Int_t i=0;i<3;i++) ucm[i]=u2pos[i]/10.;
475 fieldMap->calcField(ucm,b,fieldScalFact);
476 rkeqfw(b,p,u2dir,k4);
479 for(Int_t i=0;i<3;i++) {
480 est+=fabs(k1[i]+k4[i]-k2[i]-k3[i])*hstep;
482 if (est<minPrecision||step<=minStepSize) {
485 stepFac*=stepSizeDec;
488 }
while (jstep<maxNumSteps);
489 for(Int_t i=0;i<3;i++) {
490 upos[i]=upos[i]+step*udir[i]+step*step*(k1[i]+k2[i]+k3[i])/6.;
491 udir[i]=udir[i]+step*(k1[i]+2.*k2[i]+2.*k3[i]+k4[i])/6.;
496 if (est<maxPrecision&&step<maxStepSize) {
497 stepFac*=stepSizeInc;
505 Double_t con=0.2997925;
506 duds[0]=con*(udir[1]*b[2]-udir[2]*b[1])/p;
507 duds[1]=con*(udir[2]*b[0]-udir[0]*b[2])/p;
508 duds[2]=con*(udir[0]*b[1]-udir[1]*b[0])/p;
515 Float_t step=initialStepSize;
519 Double_t* normplane=&normVecMdc[(mdcModules[0])][sector][0];
520 Double_t* pplane=&pointForVertexRec[sector][0];
521 Double_t upos[3], udir[3], xyz[3];
522 for(Int_t i=0;i<3;i++) {
524 udir[i]=-dirAtFirstMDC[i];
527 findIntersectionPoint(upos,udir,pplane,normplane,&xyz[0]);
528 dist=distance(upos,xyz);
529 if (dist<maxDist||upos[2]<=xyz[2]) {
532 if (dist<step) { step=dist; }
533 stepFac=rkgtrk(step,-pfit,upos,udir,1);
535 }
while (jstep<maxNumSteps);
537 upos[0]-udir[0],upos[1]-udir[1],upos[2]-udir[2],
538 zSeg1,rSeg1,thetaSeg1,phiSeg1);
541 xyz[0]=target.
getX();
542 xyz[1]=target.
getY();
543 xyz[2]=target.
getZ();
544 dist=distance(xyz,upos);
546 trackLengthAtLastMDC=trackLength;
555 trackLength=trackLengthAtLastMDC;
556 Double_t pointOnMETA[3], normVectorOfMETA[3];
557 pointOnMETA[0]=metaHit.
getX();
558 pointOnMETA[1]=metaHit.
getY();
559 pointOnMETA[2]=metaHit.
getZ();
560 normVectorOfMETA[0] = metaNormVec.
getX();
561 normVectorOfMETA[1] = metaNormVec.
getY();
562 normVectorOfMETA[2] = metaNormVec.
getZ();
564 Float_t step = stepSizeAtLastMDC;
567 Double_t upos[3], udir[3];
568 for(Int_t i=0;i<3;i++) {
569 upos[i]=posNearLastMDC[i];
570 udir[i]=dirAtLastMDC[i];
575 rc=findIntersectionPoint(upos,udir,pointOnMETA,normVectorOfMETA,&trackPosOnMETA[0]);
577 dist=distance(upos,trackPosOnMETA);
578 if ((polbending>=0&&upos[2]>trackPosOnMETA[2])||(polbending<0&&upos[1]>trackPosOnMETA[1])) {
581 }
else if (dist<maxDist) {
584 }
else if (upos[1]>=2475.||upos[1]<=0.) {
588 if (dist<step) { step=dist; }
589 stepFac=rkgtrk(step,pfit,upos,udir,1);
591 }
while (jstep<maxNumSteps);
592 if (!rc&&jstep>=maxNumSteps) {
596 upos[0]+udir[0],upos[1]+udir[1],upos[2]+udir[2],
597 zSeg2,rSeg2,thetaSeg2,phiSeg2);
598 if (pathCorrPos!=0&&pathCorrNorm!=0&&trackLength>0.) {
599 Double_t
p1[3], pn[3],
p2[3];
600 p1[0]=pathCorrPos->
getX();
601 p1[1]=pathCorrPos->
getY();
602 p1[2]=pathCorrPos->
getZ();
603 pn[0]=pathCorrNorm->
getX();
604 pn[1]=pathCorrNorm->
getY();
605 pn[2]=pathCorrNorm->
getZ();
606 findIntersectionPoint(trackPosOnMETA,udir,p1,pn,&p2[0]);
607 trackLength-=distance(trackPosOnMETA,p2);
613 Double_t* planeR0, Double_t* planeNorm,
614 Double_t* pointIntersect) {
619 Double_t denom = (planeNorm[0]*udir[0] + planeNorm[1]*udir[1] + planeNorm[2]*udir[2]);
621 Double_t t = ((planeR0[0]-upos[0])*planeNorm[0] +
622 (planeR0[1]-upos[1])*planeNorm[1] +
623 (planeR0[2]-upos[2])*planeNorm[2]) / denom;
624 for(Int_t i=0;i<3;i++) pointIntersect[i] = upos[i] + udir[i]*t;
627 Warning(
"findIntersectionPoint",
"No intersection point found : (plane || track)");
645 Int_t fNIndex = lu.GetNcols();
646 Int_t* index =
new Int_t[fNIndex];
647 memset(index,0,fNIndex*
sizeof(Int_t));
649 const Int_t kWorkMax = 100;
652 const Int_t
n = lu.GetNcols();
653 Double_t *pLU = lu.GetMatrixArray();
655 Double_t work[kWorkMax];
656 Bool_t isAllocated = kFALSE;
657 Double_t *scale = work;
660 scale =
new Double_t[
n];
666 for (Int_t i = 0; i <
n ; i++) {
667 const Int_t off_i = i*
n;
669 for (Int_t j = 0; j <
n; j++) {
670 const Double_t tmp = TMath::Abs(pLU[off_i+j]);
674 scale[i] = (max == 0.0 ? 0.0 : 1.0/max);
677 for (Int_t j = 0; j <
n; j++) {
678 const Int_t off_j = j*
n;
681 for (i = 0; i < j; i++) {
682 const Int_t off_i = i*
n;
683 Double_t r = pLU[off_i+j];
684 for (Int_t k = 0; k < i; k++) {
685 const Int_t off_k = k*
n;
686 r -= pLU[off_i+k]*pLU[off_k+j];
698 for (i = j; i <
n; i++) {
699 const Int_t off_i = i*
n;
700 Double_t r = pLU[off_i+j];
701 for (Int_t k = 0; k < j; k++) {
702 const Int_t off_k = k*
n;
703 r -= pLU[off_i+k]*pLU[off_k+j];
706 const Double_t tmp = scale[i]*TMath::Abs(r);
715 const Int_t off_imax = imax*
n;
716 for (Int_t k = 0; k <
n; k++ ) {
717 const Double_t tmp = pLU[off_imax+k];
718 pLU[off_imax+k] = pLU[off_j+k];
722 scale[imax] = scale[j];
727 if (pLU[off_j+j] != 0.0) {
728 if (TMath::Abs(pLU[off_j+j]) < tol)
731 const Double_t tmp = 1.0/pLU[off_j+j];
732 for (Int_t i = j+1; i <
n; i++) {
733 const Int_t off_i = i*
n;
738 if (isAllocated)
delete [] scale;
void setField(HMdcTrackGField *, Float_t)
ClassImp(HRungeKutta) HRungeKutta
Bool_t fit3Hits(Double_t *, Double_t *, Double_t *, Double_t *, Float_t *, Int_t, Double_t pGuess=999999999.)
Bool_t fit4Hits(Double_t *, Double_t *, Double_t *, Double_t *, Float_t *, Int_t, Double_t pGuess=999999999.)
void traceToMETA(HGeomVector &, HGeomVector &, HGeomVector *point=NULL, HGeomVector *norm=NULL)
TGraph p2(xdim, pgrid, respme)
void setZ(const Double_t a)
Float_t rkgtrk(Float_t, Float_t, Double_t *, Double_t *, Int_t kind=0)
void findMdcIntersectionPoint(Double_t *, Double_t *, Int_t, Double_t *)
Float_t distance(Double_t *, Double_t *)
static void calcMdcSeg(Double_t x1, Double_t y1, Double_t z1, Double_t x2, Double_t y2, Double_t z2, Double_t &zm, Double_t &r0, Double_t &theta, Double_t &phi)
void parSetNewVar(Float_t, Float_t)
void rkeqfw(Double_t *, Float_t, Double_t *, Float_t *)
void gentrkNew(Float_t, Double_t *, Double_t *, Double_t *, Int_t)
Bool_t decompose(TMatrixD &lu, Double_t &sign, Double_t tol, Int_t &nrZeros)
TGraph p1(xdim, pgrid, resplo)
void traceToVertex(HMdcSizesCells *)
void derive(Double_t *, Int_t)
void setMdcPosition(Int_t, Int_t, HGeomTransform &)
const HGeomVector & getTargetMiddlePoint(void) const
void cosines(Float_t, Float_t, Double_t *)
void parSetNew0(Float_t, Float_t, Int_t)
Bool_t findIntersectionPoint(Double_t *, Double_t *, Double_t *, Double_t *, Double_t *)