* provided "as is" without express or implied warranty. *
**************************************************************************/
+/* $Id$ */
+
//-----------------------------------------------------------------
// Implementation of the derived class for track residuals
// based on linear chi2 minimization
//
//-----------------------------------------------------------------
-#include <TMinuit.h>
+#include <TMath.h>
#include <TGeoMatrix.h>
#include "AliLog.h"
ClassImp(AliTrackResidualsLinear)
//______________________________________________________________________________
-AliTrackResidualsLinear::AliTrackResidualsLinear():AliTrackResiduals()
+AliTrackResidualsLinear::AliTrackResidualsLinear():
+ AliTrackResiduals(),
+ fFitter(0),
+ fFraction(-1),
+ fChi2Orig(0)
{
// Default constructor
- fFitter = 0;
- fFraction =-1;
- fChi2Orig =0;
for (Int_t ipar=0; ipar<6; ipar++){
- fBFixed[ipar] = kFALSE;
- fFixed[ipar] = 0;;
fParams[ipar] = 0;
}
+ for (Int_t icov=0; icov<36; icov++){ fCovar[icov]=0;}
}
//______________________________________________________________________________
AliTrackResidualsLinear::AliTrackResidualsLinear(Int_t ntracks):
- AliTrackResiduals(ntracks)
+ AliTrackResiduals(ntracks),
+ fFitter(new TLinearFitter(6,"hyp6")),
+ fFraction(-1),
+ fChi2Orig(0)
{
// Constructor
- fFitter = new TLinearFitter(6,"hyp6");
- fFraction =-1;
- fChi2Orig =0;
for (Int_t ipar=0; ipar<6; ipar++){
- fBFixed[ipar] = kFALSE;
- fFixed[ipar] = 0;
fParams[ipar] = 0;
}
+ for (Int_t icov=0; icov<36; icov++){ fCovar[icov]=0;}
}
//______________________________________________________________________________
AliTrackResidualsLinear::AliTrackResidualsLinear(const AliTrackResidualsLinear &res):
- AliTrackResiduals(res)
+ AliTrackResiduals(res),
+ fFitter(new TLinearFitter(*(res.fFitter))),
+ fFraction(res.fFraction),
+ fChi2Orig(res.fChi2Orig)
{
// Copy constructor
//..
- fFitter = new TLinearFitter(*(res.fFitter));
for (Int_t ipar=0; ipar<6; ipar++){
- fBFixed[ipar] = res.fBFixed[ipar];
- fFixed[ipar] = res.fFixed[ipar];
fParams[ipar] = res.fParams[ipar];
}
+ for (Int_t icov=0; icov<36; icov++){ fCovar[icov]= res.fCovar[icov];}
fChi2Orig = res.fChi2Orig;
}
mcovp(1,0) = covp[1]; mcovp(1,1) = covp[3]; mcovp(1,2) = covp[4];
mcovp(2,0) = covp[2]; mcovp(2,1) = covp[4]; mcovp(2,2) = covp[5];
mcov+=mcovp;
- mcov.Invert();
+ //mcov.Invert();
if (!mcov.IsValid()) return;
TMatrixD mcovBack = mcov; // for debug purposes
//
TMatrixD deltaT(matrixV, TMatrixD::kTransposeMult, deltaR); // tranformed delta
TMatrixD mparamT(matrixV,TMatrixD::kTransposeMult, mparam); // tranformed linear transformation
- if (0){
+ if (AliLog::GetDebugLevel("","AliTrackResidualsLinear")>2){
//
// debug part
//
printf("Rotated param matrix\n");
mparamT.Print();
//
+ //
+ printf("Trans Matrix:\n");
+ matrixV.Print();
+ printf("Delta Orig\n");
+ deltaR.Print();
+ printf("Delta Rotated");
+ deltaT.Print();
+ //
+ //
}
//
- for (Int_t idim = 0; idim<3; idim++){
+ Double_t sumChi2=0;
+ for (Int_t idim = 1; idim<3; idim++){
Double_t yf; // input points to fit in TLinear fitter
Double_t xf[6]; // input points to fit
yf = deltaT(idim,0);
for (Int_t ipar =0; ipar<6; ipar++) xf[ipar] = mparamT(idim,ipar);
if (covDiagonal[idim]>0.){
- fFitter->AddPoint(xf,yf, TMath::Sqrt(1/covDiagonal[idim]));
+ fFitter->AddPoint(xf,yf, TMath::Sqrt(covDiagonal[idim]));
+ // accumulate chi2
+ Double_t chi2 = (yf*yf)/covDiagonal[idim];
+ fChi2Orig += (yf*yf)/covDiagonal[idim];
+ if (chi2>100 && AliLog::GetDebugLevel("","AliTrackResidualsLinear")>1){
+ printf("Too big chi2- %f\n",chi2);
+ printf("Delta Orig\n");
+ deltaR.Print();
+ printf("Delta Rotated");
+ deltaT.Print();
+ matrixV.Print();
+ printf("Too big chi2 - End\n");
+ }
+ sumChi2+=chi2;
}
- // accumulate chi2
- fChi2Orig += (yf*yf)*covDiagonal[idim];
+ else{
+ printf("Bug\n");
+ }
+ }
+ if (AliLog::GetDebugLevel("","AliTrackResidualsLinear")>1){
+ TMatrixD matChi0=(mcov.Invert()*deltaR);
+ TMatrixD matChi2=deltaR.T()*matChi0;
+ printf("Chi2:\t%f\t%f", matChi2(0,0), sumChi2);
}
- fNdf +=3;
+
+ fNdf +=2;
}
//______________________________________________________________________________
}
//
fFitter->ReleaseParameter(0);
- for (Int_t ipar=0; ipar<7; ipar++) {
+ for (Int_t ipar=0; ipar<6; ipar++) {
if (fBFixed[ipar]) fFitter->ReleaseParameter(ipar+1);
}
- //
+
fChi2 = fFitter->GetChisquare();
fNdf -= 6;
TVectorD vector(7);
fParams[3] = vector[4];
fParams[4] = vector[5];
fParams[5] = vector[6];
- //
+ TMatrixD covar(7,7);
+ fFitter->GetCovarianceMatrix(covar);
+
+ for (Int_t i0=0; i0 <6; i0++){
+ for (Int_t j0=0; j0 <6; j0++){
+ fCovar[i0*6+j0] = covar(i0+1,j0+1);
+ }
+ }
+ Double_t covmatrarray[21];
+ for(Int_t j=0;j<6;j++){
+ for(Int_t i=j;i<6;i++){
+ covmatrarray[i*(i+1)/2+j]=fCovar[i+6*j];
+ }
+ }
+
+
fAlignObj->SetPars(fParams[0], fParams[1], fParams[2],
TMath::RadToDeg()*fParams[3],
TMath::RadToDeg()*fParams[4],
TMath::RadToDeg()*fParams[5]);
+ fAlignObj->SetCorrMatrix(covmatrarray);
+
return kTRUE;
}
+
+