51 #include "TLinearFitter.h"
53 #include "THnSparse.h"
57 #include "TTreeStream.h"
58 #include "AliTrackPointArray.h"
83 for (Int_t ihis=0; ihis<12; ihis++){
84 fLinearTrackDelta[ihis]=0;
85 fLinearTrackPull[ihis]=0;
93 for (Int_t icalib=0;icalib<ncalibs; icalib++){
103 for (Int_t i=0;i<12;i++){
122 for (Int_t icalib=0;icalib<ncalibs; icalib++){
124 (*fCalibParam)(icalib,0) = transform->
GetParam();
125 for (Int_t jcalib=0;jcalib<ncalibs; jcalib++){
126 if (icalib!=jcalib) (*fCalibCovar)(icalib,jcalib)= 0;
127 if (icalib==jcalib) (*fCalibCovar)(icalib,jcalib) = transform->
GetSigma()*transform->
GetSigma();
133 Double_t mpi = TMath::Pi();
136 Int_t binsQA[6] = {300, 36*4, 30, 25, 20, 20};
137 Double_t xminQA[6] = {-0.5, -mpi, -120, -250, -1, -1.};
138 Double_t xmaxQA[6] = { 0.5, mpi, 120, 250, 1, 1.};
139 TString axisName[6]={
"#Delta",
146 TString deltaName[12]={
"#Delta_{y}(cm)",
147 "100*#Delta_{#phi}(cm)",
148 "100^{2}dy0^{2}/dx0^{2}(cm)",
149 "100^{2}dy1^{2}/dx1^{2}(cm)",
151 "100*#Delta_{#theta}(cm)",
152 "100^{2}*dz0^{2}/dx0^{2}(cm)",
153 "100^{2}*dz1^{2}/dx1^{2}(cm)",
159 TString pullName[12]={
"#Delta_{y}(unit)",
160 "100*#Delta_{#phi}(unit)",
161 "100^{2}dy0^{2}/dx0^{2}(unit)",
162 "100^{2}dy1^{2}/dx1^{2}(unit)",
164 "100*#Delta_{#theta}(unit)",
165 "100^{2}*dz0^{2}/dx0^{2}(unit)",
166 "100^{2}*dz1^{2}/dx1^{2}(unit)"
174 for (Int_t ihis=0; ihis<12; ihis++){
177 xminQA[0]=-0.5; xmaxQA[0] = 0.5;
178 fLinearTrackDelta[ihis] =
new THnSparseS(deltaName[ihis],deltaName[ihis], 6, binsQA,xminQA, xmaxQA);
179 xminQA[0]=-10; xmaxQA[0] = 10;
180 fLinearTrackPull[ihis] =
new THnSparseS(pullName[ihis],pullName[ihis], 6, binsQA,xminQA, xmaxQA);
181 for (Int_t iaxis=1; iaxis<6; iaxis++){
203 for (Int_t i=0; i<ncalibs;i++){
209 for (Int_t i=0; i<ncalibs;i++){
211 TString strName(transform->GetName());
212 if (strName.Contains(mask)){
230 TMatrixD matHk(ncalibs,ncalibs);
231 TMatrixD vecYk(ncalibs,1);
232 TMatrixD matHkT(ncalibs,ncalibs);
233 TMatrixD matSk(ncalibs,ncalibs);
234 TMatrixD matKk(ncalibs,ncalibs);
235 TMatrixD covXk2(ncalibs,ncalibs);
236 TMatrixD covXk3(ncalibs,ncalibs);
238 for (Int_t i=0;i<ncalibs;i++){
239 for (Int_t j=0;j<ncalibs;j++) matHk(i,j)=0;
242 vecYk = vecZk-matHk*vecXk;
243 matHkT=matHk.T(); matHk.T();
244 matSk = (matHk*(covXk*matHkT))+measR;
246 matKk = (covXk*matHkT)*matSk;
247 vecXk += matKk*vecYk;
248 covXk2= (matHk-(matKk*matHk));
249 covXk3 = covXk2*covXk;
251 (*fCalibParam) = vecXk;
252 (*fCalibCovar) = covXk;
263 AliError(
"Kalman Fit not initialized");
269 TLinearFitter lfitY(2,
"pol1");
270 TLinearFitter lfitZ(2,
"pol1");
274 lfitY.StoreData(kTRUE);
275 lfitZ.StoreData(kTRUE);
278 Int_t
npoints = points.GetNPoints();
279 if (npoints<2)
return;
280 const Double_t kFac=npoints*npoints*100;
281 const Double_t kOff0=0.01*0.01;
282 const Double_t kOff1=kOff0/(250.*250.);
291 fCurrentAlpha = TMath::ATan2(points.GetY()[npoints-1]-points.GetY()[0], points.GetX()[npoints-1]-points.GetX()[0]);
297 for (Int_t ipoint=0; ipoint<npoints-1; ipoint++){
298 Double_t rx = fCA*points.GetX()[ipoint]+
fSA*points.GetY()[ipoint];
299 Double_t ry = -
fSA*points.GetX()[ipoint]+fCA*points.GetY()[ipoint];
300 Double_t rz = points.GetZ()[ipoint];
301 lfitY.AddPoint(&rx,ry,1);
302 lfitZ.AddPoint(&rx,rz,1);
306 lfitY.GetParameters(vecY);
307 lfitZ.GetParameters(vecZ);
317 for (Int_t i=0; i<ncalibs+4;i++){
318 (*fLinearParam)(i,0)=0;
319 if (i<ncalibs) (*fLinearParam)(i,0) = (*
fCalibParam)(i,0);
320 for (Int_t j=0; j<ncalibs+4;j++){
321 (*fLinearCovar)(i,j)=0;
322 if (i<ncalibs&&j<ncalibs) (*fLinearCovar)(i,j) = (*
fCalibCovar)(i,j);
325 Double_t chi2Y = lfitY.GetChisquare()/lfitY.GetNpoints();
326 Double_t chi2Z = lfitZ.GetChisquare()/lfitZ.GetNpoints();
327 (*fLinearParam)(ncalibs+0,0) = lfitY.GetParameter(0);
328 (*fLinearCovar)(ncalibs+0,ncalibs+0)= lfitY.GetCovarianceMatrixElement(0,0)*chi2Y*kFac+kOff0;
329 (*fLinearParam)(ncalibs+1,0) = lfitY.GetParameter(1);
330 (*fLinearCovar)(ncalibs+1,ncalibs+1)= lfitY.GetCovarianceMatrixElement(1,1)*chi2Y*kFac+kOff1;
332 (*fLinearParam)(ncalibs+2,0) = lfitZ.GetParameter(0);
333 (*fLinearCovar)(ncalibs+2,ncalibs+2)= lfitZ.GetCovarianceMatrixElement(0,0)*chi2Z*kFac+kOff0;
334 (*fLinearParam)(ncalibs+3,0) = lfitZ.GetParameter(1);
335 (*fLinearCovar)(ncalibs+3,ncalibs+3)= lfitZ.GetCovarianceMatrixElement(1,1)*chi2Z*kFac+kOff1;
340 for (Int_t ipoint=0; ipoint<npoints-1; ipoint++){
342 if (!points.GetPoint(point,ipoint))
continue;
343 Double_t erry2 = chi2Y;
344 Double_t errz2 = chi2Z;
346 Float_t *cov = (Float_t*) point.GetCov();
347 cov[1] = (erry2+kOff0)*scalingRMSY;
348 cov[2] = (errz2+kOff0)*scalingRMSZ;
350 if (!points.GetPoint(point,npoints-1-ipoint))
continue;
352 cov = (Float_t*) point.GetCov();
353 cov[1] = (erry2+kOff0)*scalingRMSY;
354 cov[2] = (errz2+kOff0)*scalingRMSZ;
359 for (Int_t i=0; i<ncalibs;i++){
363 for (Int_t j=0; j<ncalibs;j++){
368 (*debug)<<
"fitLinear"<<
388 AliError(
"Kalman Fit not initialized");
394 TLinearFitter *fitters[16];
395 TVectorD *params[16];
398 Int_t
npoints = points.GetNPoints();
399 AliTrackPointArray pointsTrans(points);
401 for (Int_t ifit=0; ifit<8;ifit++){
402 fitters[ifit] =
new TLinearFitter(2,
"pol1");
403 params[ifit] =
new TVectorD(2);
404 fitters[ifit+8]=
new TLinearFitter(3,
"pol2");
405 params[ifit+8] =
new TVectorD(3);
406 errs[ifit] =
new TVectorD(2);
407 errs[ifit+8] =
new TVectorD(3);
412 fCurrentAlpha = TMath::ATan2(points.GetY()[npoints-1]-points.GetY()[0], points.GetX()[npoints-1]-points.GetX()[0]);
415 Double_t xmean=0,
sum=0;
416 for (Int_t ipoint=0; ipoint<npoints-1; ipoint++){
417 Double_t rx = fCA*points.GetX()[ipoint]+
fSA*points.GetY()[ipoint];
423 for (Int_t ipoint=0; ipoint<npoints-1; ipoint++){
424 Double_t rx = fCA*points.GetX()[ipoint]+
fSA*points.GetY()[ipoint];
425 Double_t ry = -
fSA*points.GetX()[ipoint]+fCA*points.GetY()[ipoint];
426 Double_t rz = points.GetZ()[ipoint];
428 Double_t rxT = fCA*pointsTrans.GetX()[ipoint]+
fSA*pointsTrans.GetY()[ipoint];
429 Double_t ryT = -
fSA*pointsTrans.GetX()[ipoint]+fCA*pointsTrans.GetY()[ipoint];
430 Double_t rzT = pointsTrans.GetZ()[ipoint];
432 fitters[0]->AddPoint(&rxT, ryT,1);
433 fitters[2]->AddPoint(&rxT, rzT,1);
434 fitters[4]->AddPoint(&rx, ry,1);
435 fitters[6]->AddPoint(&rx, rz,1);
436 fitters[8]->AddPoint(&rxT, ryT,1);
437 fitters[10]->AddPoint(&rxT, rzT,1);
438 fitters[12]->AddPoint(&rx, ry,1);
439 fitters[14]->AddPoint(&rx, rz,1);
441 fitters[1]->AddPoint(&rxT, ryT,1);
442 fitters[3]->AddPoint(&rxT, rzT,1);
443 fitters[5]->AddPoint(&rx, ry,1);
444 fitters[7]->AddPoint(&rx, rz,1);
445 fitters[9]->AddPoint(&rxT, ryT,1);
446 fitters[11]->AddPoint(&rxT, rzT,1);
447 fitters[13]->AddPoint(&rx, ry,1);
448 fitters[15]->AddPoint(&rx, rz,1);
451 for (Int_t ifit=0;ifit<16;ifit++){
452 fitters[ifit]->Eval();
453 fitters[ifit]->GetParameters(*(params[ifit]));
454 fitters[ifit]->GetErrors(*(errs[ifit]));
455 chi2N[ifit] = TMath::Sqrt(fitters[ifit]->GetChisquare()/(fitters[ifit]->GetNpoints()-1));
456 (*(errs[ifit]))[0]*=chi2N[ifit];
457 (*(errs[ifit]))[1]*=chi2N[ifit];
458 if (ifit>=8) (*(errs[ifit]))[2]*=chi2N[ifit];
461 (*debug)<<
"dumpLinear"<<
472 "y0T2.="<<params[8]<<
473 "y1T2.="<<params[9]<<
474 "z0T2.="<<params[10]<<
475 "z1T2.="<<params[11]<<
476 "y0O2.="<<params[12]<<
477 "y1O2.="<<params[13]<<
478 "z0O2.="<<params[14]<<
479 "z1O2.="<<params[15]<<
480 "y0TErr.="<<errs[0]<<
481 "y1TErr.="<<errs[1]<<
482 "z0TErr.="<<errs[2]<<
483 "z1TErr.="<<errs[3]<<
484 "y0OErr.="<<errs[4]<<
485 "y1OErr.="<<errs[5]<<
486 "z0OErr.="<<errs[6]<<
487 "z1OErr.="<<errs[7]<<
488 "y0T2Err.="<<errs[8]<<
489 "y1T2Err.="<<errs[9]<<
490 "z0T2Err.="<<errs[10]<<
491 "z1T2Err.="<<errs[11]<<
492 "y0O2Err.="<<errs[12]<<
493 "y1O2Err.="<<errs[13]<<
494 "z0O2Err.="<<errs[14]<<
495 "z1O2Err.="<<errs[15]<<
501 Double_t x[6]={0,0,0,0,0,0};
503 x[2]=(*params[0])[0];
504 x[3]=(*params[2])[0];
505 x[4]=(*params[0])[1];
506 x[5]=(*params[2])[1];
510 x[0]= (*params[1])[0]-(*params[0])[0];
512 x[0]/=TMath::Sqrt((*errs[1])[0]*(*errs[1])[0]+(*errs[0])[0]*(*errs[0])[0]);
517 x[0]= 100*((*params[1])[1]-(*params[0])[1]);
519 x[0]/=100*TMath::Sqrt((*errs[1])[1]*(*errs[1])[1]+(*errs[0])[1]*(*errs[0])[1]);
524 x[0]= 100*100*((*params[8])[2]);
526 x[0]/=100*100*TMath::Sqrt((*errs[8])[2]*(*errs[8])[2]);
531 x[0]= 100*100*((*params[9])[2]);
533 x[0]/=100*100*TMath::Sqrt((*errs[9])[2]*(*errs[9])[2]);
539 x[0]= (*params[3])[0]-(*params[2])[0];
541 x[0]/=TMath::Sqrt((*errs[3])[0]*(*errs[3])[0]+(*errs[2])[0]*(*errs[2])[0]);
546 x[0]= 100*((*params[3])[1]-(*params[2])[1]);
548 x[0]/=100*TMath::Sqrt((*errs[3])[1]*(*errs[3])[1]+(*errs[2])[1]*(*errs[2])[1]);
553 x[0]= 100*100*((*params[10])[2]);
555 x[0]/=100*100*TMath::Sqrt((*errs[10])[2]*(*errs[10])[2]);
560 x[0]= 100*100*((*params[11])[2]);
562 x[0]/=100*100*TMath::Sqrt((*errs[11])[2]*(*errs[11])[2]);
579 for (Int_t ifit=0; ifit<8;ifit++){
580 delete fitters[ifit];
582 delete fitters[ifit+8];
583 delete params[ifit+8];
602 TString strVar(varName);
603 for (Int_t icalib=0;icalib<ncalibs; icalib++){
605 if (strVar.CompareTo(transform->GetName())==0){
606 (*fCalibCovar)(icalib,icalib)+=sigma*sigma;
621 for (Int_t icalib=0;icalib<ncalibs; icalib++){
634 Int_t nelem = ncalibs+4;
638 TMatrixD matHk(kNmeas,nelem);
639 TMatrixD vecYk(kNmeas,1);
640 TMatrixD vecZk(kNmeas,1);
641 TMatrixD measR(kNmeas,kNmeas);
642 TMatrixD matHkT(nelem,kNmeas);
643 TMatrixD matSk(kNmeas,kNmeas);
644 TMatrixD matKk(nelem,kNmeas);
645 TMatrixD covXk2(nelem,nelem);
646 TMatrixD covXk3(nelem,nelem);
647 TMatrixD mat1(nelem,nelem);
650 for (Int_t iel=0;iel<nelem;iel++){
651 for (Int_t ip=0;ip<kNmeas;ip++) {
655 for (Int_t iel0=0;iel0<nelem;iel0++)
656 for (Int_t iel1=0;iel1<nelem;iel1++){
657 if (iel0!=iel1) mat1(iel0,iel1)=0;
658 if (iel0==iel1) mat1(iel0,iel1)=1;
663 Int_t volId = point.GetVolumeID();
664 Double_t gxyz[3]={point.GetX(), point.GetY(),point.GetZ()};
665 Double_t rxyz[3]={
fCA*gxyz[0]+
fSA*gxyz[1],-
fSA*gxyz[0]+
fCA*gxyz[1] ,point.GetZ()};
667 Double_t dxdydz[3]={0,0,0};
668 Double_t rdxdydz[3]={0,0,0};
670 for (Int_t icalib=0;icalib<ncalibs;icalib++){
672 dxdydz[0] = transform->
GetDeltaXYZ(0,volId, 1, gxyz[0], gxyz[1], gxyz[2]);
673 dxdydz[1] = transform->
GetDeltaXYZ(1,volId, 1, gxyz[0], gxyz[1], gxyz[2]);
674 dxdydz[2] = transform->
GetDeltaXYZ(2,volId, 1, gxyz[0], gxyz[1], gxyz[2]);
675 rdxdydz[0] =
fCA*dxdydz[0]+
fSA*dxdydz[1];
676 rdxdydz[1] = -
fSA*dxdydz[0]+
fCA*dxdydz[1];
677 rdxdydz[2] = dxdydz[2];
679 matHk(0,icalib)= rdxdydz[1]-rdxdydz[0]*(*fLinearParam)(ncalibs+1,0);
680 matHk(1,icalib)= rdxdydz[2]-rdxdydz[0]*(*fLinearParam)(ncalibs+3,0);
682 matHk(0,ncalibs+0)=1;
683 matHk(0,ncalibs+1)=rxyz[0];
684 matHk(1,ncalibs+2)=1;
685 matHk(1,ncalibs+3)=rxyz[0];
689 vecZk(0,0) = rxyz[1];
690 vecZk(1,0) = rxyz[2];
691 measR(0,0) = point.GetCov()[1]; measR(0,1)=0;
692 measR(1,1) = point.GetCov()[2]; measR(1,0)=0;
694 vecYk = vecZk-matHk*vecXk;
695 matHkT=matHk.T(); matHk.T();
696 matSk = (matHk*(covXk*matHkT))+measR;
698 matKk = (covXk*matHkT)*matSk;
700 covXk2= (mat1-(matKk*matHk));
701 covXk3 = covXk2*covXk;
704 vecXk += matKk*vecYk;
707 (*debug)<<
"updateLinear"<<
714 "matHkT.="<<&matHkT<<
717 "covXk2.="<<&covXk2<<
730 Int_t
npoints = points.GetNPoints();
731 if (npoints<1)
return 0;
732 Double_t currentAlpha = TMath::ATan2(points.GetY()[npoints-1]-points.GetY()[0], points.GetX()[npoints-1]-points.GetX()[0]);
733 Double_t ca = TMath::Cos(currentAlpha);
734 Double_t sa = TMath::Sin(currentAlpha);
738 Double_t *rxvector =
new Double_t[
npoints];
739 Int_t *indexes =
new Int_t[
npoints];
740 for (Int_t ipoint=0; ipoint<npoints-1; ipoint++){
741 rxvector[ipoint]=ca*points.GetX()[ipoint]+sa*points.GetY()[ipoint];
743 TMath::Sort(npoints, rxvector,indexes,kFALSE);
745 AliTrackPointArray *pointsSorted=
new AliTrackPointArray(npoints);
746 for (Int_t ipoint=0; ipoint<
npoints; ipoint++){
747 if (!points.GetPoint(point,indexes[ipoint]))
continue;
748 pointsSorted->AddPoint(ipoint,&point);
760 AliTrackPointArray
array(500);
763 for (Int_t i=0;i<6;i++) cov[i]=0.001;
764 for (Int_t i=0;i<500;i++){
765 AliTrackPoint point(0, 0, 0, cov, 0,0,0);
766 array.AddPoint(npoints, &point);
770 for (Float_t ir = -245; ir<245; ir++){
773 if (TMath::Abs(ir)<80)
continue;
774 Double_t ca = TMath::Cos(alpha);
775 Double_t sa = TMath::Sin(alpha);
777 Double_t ly = y0+lx*ky+gRandom->Gaus(0,err);
778 Double_t lz = z0+lx*kz+gRandom->Gaus(0,err);
779 Double_t gx = lx*ca-ly*sa;
780 Double_t gy = lx*sa+ly*ca;
782 Double_t galpha = TMath::ATan2(gy,gx);
783 Int_t isec = TMath::Nint((9*galpha/TMath::Pi()+0.5));
784 if (isec<0) isec+=18;
786 if (ir>130) isec+=36;
788 AliTrackPoint point(gx, gy, gz, cov, isec,0,0);
789 array.AddPoint(npoints, &point);
792 AliTrackPointArray *parray =
new AliTrackPointArray(npoints);
795 array.GetPoint(point,i);
796 parray->AddPoint(i,&point);
816 TString strVar(trName);
817 for (Int_t icalib=0;icalib<ncalibs; icalib++){
819 if (strVar.CompareTo(transform->GetName())==0){
833 if (ncalibs==0)
return;
834 Int_t
npoints = array->GetNPoints();
835 for (Int_t ipoint=0; ipoint<
npoints; ipoint++){
836 Int_t volId = array->GetVolumeID()[ipoint];
837 Double_t xyz[3]={array->GetX()[ipoint], array->GetY()[ipoint],array->GetZ()[ipoint]};
838 Double_t dxdydz[3]={0,0,0};
839 for (Int_t icalib=0; icalib<ncalibs; icalib++){
841 dxdydz[0] += transform->
GetDeltaXYZ(0,volId, transform->
GetParam(), xyz[0], xyz[1], xyz[2]);
842 dxdydz[1] += transform->
GetDeltaXYZ(1,volId, transform->
GetParam(), xyz[0], xyz[1], xyz[2]);
843 dxdydz[2] += transform->
GetDeltaXYZ(2,volId, transform->
GetParam(), xyz[0], xyz[1], xyz[2]);
845 ((Float_t*)array->GetX())[ipoint]+=csign*dxdydz[0];
846 ((Float_t*)array->GetY())[ipoint]+=csign*dxdydz[1];
847 ((Float_t*)array->GetZ())[ipoint]+=csign*dxdydz[2];
855 Int_t nrow= mat.GetNrows();
856 for (Int_t irow=0; irow<nrow; irow++){
858 TString strName0(trans0->GetName());
860 if (!strName0.Contains(mask0))
continue;
862 for (Int_t icol=irow+1; icol<nrow; icol++){
864 TString strName1(trans1->GetName());
866 if (!strName1.Contains(mask1))
continue;
869 Double_t diag = TMath::Sqrt(TMath::Abs(
mat(irow,irow)*
mat(icol,icol)));
871 printf(
"Negative covariance\t%d\t%d\t%f\n",irow,icol,
mat(irow,icol));
874 Double_t corr0 =
mat(irow,icol)/diag;
875 if (TMath::Abs(corr0)>threshold){
876 printf(
"%d\t%d\t%s\t%s\t%f\t%f\t%f\n", irow,icol, trans0->GetName(), trans1->GetName(),
877 TMath::Sqrt(
mat(irow,irow)), TMath::Sqrt(
mat(icol,icol)), corr0);
888 Int_t nrow= mat.GetNrows();
889 TString strMask(mask);
890 TVectorD vecCorrSum(nrow);
891 for (Int_t irow=0; irow<nrow; irow++){
893 for (Int_t icol=0; icol<nrow; icol++){
894 if (icol==irow)
continue;
895 Double_t diag = TMath::Sqrt(TMath::Abs(
mat(irow,irow)*
mat(icol,icol)));
896 Double_t corr0 =
mat(irow,icol)/diag;
897 vecCorrSum[irow]+=TMath::Abs(corr0);
899 vecCorrSum[irow]*=0.5;
902 for (Int_t irow=0; irow<nrow; irow++){
904 TString strName(trans0->GetName());
906 if (!strName.Contains(mask))
continue;
908 if (vecCorrSum[irow]<correlationCut)
continue;
909 printf(
"%d\t%s\t%f\t%f\t%f\n",
912 (*fCalibParam)(irow,0),
913 TMath::Sqrt(
mat(irow,irow)), vecCorrSum[irow]);
924 Int_t nrow= mat.GetNrows();
925 for (Int_t irow=0; irow<nrow; irow++){
926 if (
mat(irow,irow)<=0){
927 printf(
"Negative covariance\t%d\t%f\n",irow,
mat(irow,irow));
935 for (Int_t icol=0; icol<nrow; icol++){
937 Double_t diag = TMath::Sqrt(TMath::Abs(
mat(irow,irow)*
mat(icol,icol)));
939 printf(
"Negative covariance\t%d\t%d\t%f\n",irow,icol,
mat(irow,icol));
943 Double_t cov0 =
mat(irow,icol)/diag;
944 Double_t cov1 =
mat(icol,irow)/diag;
945 if (TMath::Abs(cov0)>1 || TMath::Abs(cov1)>1 ){
946 printf(
"Covariance Problem %d\t%d\t%f\t%f\n",irow,icol, cov0, cov1);
949 if (TMath::Abs(cov0-cov1)>0.0000001){
950 printf(
"Asymetry problem %d\t%d\t%f\t%f\n",irow,icol, cov0, cov1);
955 Double_t mean = (
mat(irow,icol)+
mat(icol,irow))*0.5;
979 for (Int_t iside=0; iside<=1; iside++)
980 for (Int_t ipar0=0; ipar0<3; ipar0++)
981 for (Int_t ipar1=0; ipar1<3; ipar1++){
984 if (ipar0+ipar1==0)
continue;
985 Double_t param = (gRandom->Rndm()-0.5)*0.5;
987 snprintf(tname,100,
"tscalingR%d%dSide%d",ipar0,ipar1,iside);
989 transformation->
SetParams(0,5*0.25,0,&fpar);
992 transformation->
SetParams(param,0.25,0,&fpar);
1006 Int_t ncalibs = kalmanFit0->
fCalibration->GetEntries();
1007 TVectorD err(ncalibs);
1008 TTreeSRedirector *
pcstream =
new TTreeSRedirector(
"kalmanfitTest.root");
1009 for (Int_t i=0;i<ntracks;i++){
1010 if (i%100==0)
printf(
"%d\n",i);
1011 Double_t alpha = gRandom->Rndm()*TMath::TwoPi();
1012 Double_t y0 = (gRandom->Rndm()-0.5)*180;
1013 Double_t z0 = (gRandom->Rndm()-0.5)*250*2;
1014 Double_t ky = (gRandom->Rndm()-0.5)*1;
1015 Double_t kz = (gRandom->Rndm()-0.5)*1;
1018 AliTrackPointArray * arrayB =
new AliTrackPointArray(*array);
1020 for (Int_t icalib=0; icalib<ncalibs; icalib++){
1021 err[icalib] = TMath::Sqrt((*kalmanFit0->
fCalibCovar)(icalib,icalib));
1024 (*pcstream)<<
"dump0"<<
1045 pcstream->GetFile()->cd();
1046 kalmanFit0->Write(
"kalmanFit");
1106 if (ncalibs==0)
return 0;
1107 Double_t xyz[3]={0,0,0};
1108 Double_t dxdydz[6]={0,0,0,0,0,0};
1111 if(icoordsys==0){alpha=TMath::ATan2(y,x); r =TMath::Sqrt(y*y+x*x);}
1112 if(icoordsys==1){alpha=y; r=x;}
1113 Double_t ca = TMath::Cos(alpha);
1114 Double_t sa = TMath::Sin(alpha);
1115 if(icoordsys==0){xyz[0]=x; xyz[1]=y; xyz[2]=z;}
1116 if(icoordsys==1){xyz[0]=x*ca; xyz[1]=x*sa; xyz[2]=z;}
1121 volID = TMath::Nint(9*alpha/TMath::Pi()-0.5);
1122 if (volID<0) volID+=18;
1124 if (r>120) volID+=36;
1126 for (Int_t icalib=0; icalib<ncalibs; icalib++){
1128 Double_t param = (*fCalibParam)(icalib,0);
1129 for (Int_t icoord=0;icoord<6;icoord++){
1130 dxdydz[icoord] += transform->
GetDeltaXYZ(icoord,volID, param, xyz[0],xyz[1],xyz[2]);
1134 return dxdydz[coord];
1152 if (calibID>=ncalibs)
return 0;
1157 if(icoordsys==0){r=TMath::Sqrt(x*x+y*y); alpha = TMath::ATan2(y,x);}
1158 if(icoordsys==1){r=x; alpha = y;}
1159 Double_t ca = TMath::Cos(alpha);
1160 Double_t sa = TMath::Sin(alpha);
1161 Double_t xyz[3]={0,0,0};
1162 if(icoordsys==0){xyz[0]=x;xyz[1]=y;xyz[2]=z;}
1163 if(icoordsys==1){xyz[0]=x*ca; xyz[1]=x*sa; xyz[2]=z;}
1169 volID = TMath::Nint(9*alpha/TMath::Pi()-0.5);
1170 if (volID<0) volID+=18;
1171 if (xyz[2]<0) volID+=18;
1172 if (r>120) volID+=36;
1176 Double_t param = (*fCalibParam)(calibID,0);
1177 Double_t delta = (Double_t)transform->
GetDeltaXYZ(coord,volID, param, xyz[0],xyz[1],xyz[2]);
1194 AliError(
"Kalman Fit not initialized");
1201 TMatrixD dxdydz(ncalibs,5);
1202 Double_t * adx =
new Double_t[ncalibs];
1203 Double_t * ady =
new Double_t[ncalibs];
1204 Double_t * adz =
new Double_t[ncalibs];
1205 Double_t * adr =
new Double_t[ncalibs];
1206 Double_t * adrphi =
new Double_t[ncalibs];
1209 for (x[0]=-250.;x[0]<=250.;x[0]+=10.){
1210 for (x[1]=-250.;x[1]<=250.;x[1]+=10.){
1211 for (x[2]=-250.;x[2]<=250.;x[2]+=20.) {
1212 Double_t r=TMath::Sqrt(x[0]*x[0]+x[1]*x[1]);
1214 if (r>260)
continue;
1216 Double_t phi=TMath::ATan2(x[1],x[0]);
1217 Double_t ca=TMath::Cos(phi);
1218 Double_t sa=TMath::Sin(phi);
1225 Int_t volID= TMath::Nint(9*phi/TMath::Pi()-0.5);
1226 if (volID<0) volID+=18;
1227 if (x[2]<0) volID+=18;
1228 if (r>120) volID+=36;
1229 Double_t volalpha=(volID+0.5)*TMath::Pi()/9;
1230 Double_t cva=TMath::Cos(volalpha);
1231 Double_t sva=TMath::Sin(volalpha);
1233 Double_t lx=x[0]*cva+x[1]*sva;
1234 Double_t ly=-x[0]*sva+x[1]*cva;
1237 for(Int_t icalib=0;icalib<ncalibs;icalib++){
1238 for(Int_t icoord=0;icoord<5;icoord++){
1239 dxdydz(icalib,icoord)=
GetTPCtransXYZ(icoord, -1, icalib, 0, x[0], x[1], x[2]);
1250 TTreeStream &cstream=
1251 (*debug)<<treeName<<
1267 "dxdydz.="<<&dxdydz;
1268 for (Int_t icalib=0;icalib<ncalibs;icalib++){
1272 snprintf(tname,1000,
"dx%s=",transform->GetName());
1273 adx[icalib] =dxdydz(icalib,0);
1274 cstream<<tname<<adx[icalib];
1275 snprintf(tname,1000,
"dy%s=",transform->GetName());
1276 ady[icalib] =dxdydz(icalib,1);
1277 cstream<<tname<<ady[icalib];
1278 snprintf(tname,1000,
"dz%s=",transform->GetName());
1279 adz[icalib] =dxdydz(icalib,2);
1280 cstream<<tname<<adz[icalib];
1282 snprintf(tname,1000,
"dr%s=",transform->GetName());
1283 adr[icalib] =dxdydz(icalib,3);
1284 cstream<<tname<<adr[icalib];
1285 snprintf(tname,1000,
"rdphi%s=",transform->GetName());
1286 adrphi[icalib] =dxdydz(icalib,4);
1287 cstream<<tname<<adrphi[icalib];
1293 Printf(
"x0=%f finished",x[0]);
THnSparse * fLinearTrackDelta[12]
linear tracks matching residuals - delta
AliTPCkalmanFit * Test(Int_t ntracks)
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
void FitTrackLinear(AliTrackPointArray &points, TTreeSRedirector *debug=0, Float_t scalingRMSY=1., Float_t scalingRMSZ=1.)
Double_t GetTPCDeltaXYZ(Int_t coord, Int_t volID, Int_t icoordsys, Double_t x, Double_t y, Double_t z)
void Propagate(TTreeSRedirector *debug=0)
Double_t fCA
! cosine of current angle
static AliTrackPointArray * MakePointArrayLinear(Double_t alpha, Double_t y0, Double_t z0, Double_t ky, Double_t kz, Double_t err=0.02)
TMatrixD * fCalibCovar
calibration parameters
TMatrixD * fLinearCovar
linear covariance
Int_t fLastTimeStamp
last time stamp - used for propagation of parameters
TTreeSRedirector * pcstream
static Double_t SGetTPCDeltaXYZ(Int_t coord, Int_t volID, Int_t icoordsys, Double_t x, Double_t y, Double_t z)
void AddCovariance(const char *varName, Double_t sigma)
void PropagateTime(Int_t time)
void ApplyCalibration(AliTrackPointArray *array, Double_t csign)
void UpdateLinear(AliTrackPoint &point, TTreeSRedirector *debug=0)
Bool_t DumpCorelation(Double_t threshold, const char *mask0=0, const char *mask1=0)
void InitTransformation()
Int_t GetTransformationIndex(const char *trName)
static Double_t SGetTPCtransXYZ(Int_t coord, Int_t volID, Int_t calibID, Int_t icoordsys, Double_t x, Double_t y, Double_t z)
THnSparse * fLinearTrackPull[12]
linear tracks matching residuals - pull
Double_t GetTPCtransXYZ(Int_t coord, Int_t volID, Int_t calibID, Int_t icoordsys, Double_t x, Double_t y, Double_t z)
static AliTPCkalmanFit * fgInstance
! Instance of this class (singleton implementation)
Bool_t DumpCalib(const char *mask=0, Float_t correlationCut=-1)
void DumpTrackLinear(AliTrackPointArray &points, TTreeSRedirector *debug)
static AliTrackPointArray * SortPoints(AliTrackPointArray &points)
void AddCalibration(AliTPCTransformation *calib)
TMatrixD * fCalibParam
calibration parameters
AliTPCTransformation * GetTransformation(Int_t i)
Double_t fSA
! sinus of current angle
void Update(const AliTPCkalmanFit *kalman)
TObjArray * fCalibration
array of calibrations
TMatrixD * fLinearParam
linear parameters
Double_t fCurrentAlpha
! current rotation frame
void Add(const AliTPCkalmanFit *kalman)
void SetStatus(const char *name, Bool_t setOn, Bool_t isOr=kTRUE)
void MakeTreeTrans(TTreeSRedirector *debug, const char *treeName="all")
Bool_t CheckCovariance(TMatrixD &covar, Float_t maxEl)