make Kalman propagator more flexible for testing
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Feb 2010 08:28:26 +0000 (08:28 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 4 Feb 2010 08:28:26 +0000 (08:28 +0000)
new histograms, new print-outs, etc...

PWG1/TRD/AliTRDclusterResolution.cxx
PWG1/TRD/AliTRDefficiencyMC.cxx
PWG1/TRD/AliTRDpidRefMaker.cxx
PWG1/TRD/AliTRDresolution.cxx
PWG1/TRD/info/AliTRDtrackInfo.cxx
PWG1/TRD/info/AliTRDtrackInfo.h

index fc8d264..6f7a36c 100644 (file)
@@ -202,10 +202,10 @@ const Float_t AliTRDclusterResolution::fgkTimeBinLength = 1./ AliTRDCommonParam:
 //_______________________________________________________
 AliTRDclusterResolution::AliTRDclusterResolution(const char *name, const char *title)
   : AliTRDrecoTask(name, title)
-  ,fCanvas(0x0)
-  ,fInfo(0x0)
-  ,fResults(0x0)
-  ,fAt(0x0)
+  ,fCanvas(NULL)
+  ,fInfo(NULL)
+  ,fResults(NULL)
+  ,fAt(NULL)
   ,fStatus(0)
   ,fDet(-1)
   ,fExB(0.)
@@ -262,12 +262,12 @@ Bool_t AliTRDclusterResolution::GetRefFigure(Int_t ifig)
 // Steering function to retrieve performance plots
 
   if(!fResults) return kFALSE;
-  TLegend *leg = 0x0;
-  TList *l = 0x0;
-  TObjArray *arr = 0x0;
-  TTree *t = 0x0;
-  TH2 *h2 = 0x0;TH1 *h1 = 0x0;
-  TGraphErrors *gm(0x0), *gs(0x0), *gp(0x0);
+  TLegend *leg = NULL;
+  TList *l = NULL;
+  TObjArray *arr = NULL;
+  TTree *t = NULL;
+  TH2 *h2 = NULL;TH1 *h1 = NULL;
+  TGraphErrors *gm(NULL), *gs(NULL), *gp(NULL);
   switch(ifig){
   case kQRes:
     if(!(arr = (TObjArray*)fResults->At(kQRes))) break;
@@ -392,8 +392,8 @@ TObjArray* AliTRDclusterResolution::Histos()
   fContainer = new TObjArray(kNtasks);
   //fContainer->SetOwner(kTRUE);
 
-  TH3S *h3 = 0x0;
-  TObjArray *arr = 0x0;
+  TH3S *h3 = NULL;
+  TObjArray *arr = NULL;
 
   fContainer->AddAt(arr = new TObjArray(2*AliTRDgeometry::kNlayer), kCenter);
   arr->SetName("Center");
@@ -480,7 +480,7 @@ void AliTRDclusterResolution::Exec(Option_t *)
 
   Int_t det, t;
   Float_t x, y, z, q, dy, dydx, dzdx, cov[3], covcl[3];
-  TH3S *h3 = 0x0;
+  TH3S *h3 = NULL;
 
   // define limits around ExB for which x contribution is negligible
   const Float_t kDtgPhi = 3.5e-2; //(+- 2 deg)
@@ -489,7 +489,7 @@ void AliTRDclusterResolution::Exec(Option_t *)
   TObjArray *arr1 = (TObjArray*)fContainer->At(kSigm);
   TObjArray *arr2 = (TObjArray*)fContainer->At(kMean);
 
-  const AliTRDclusterInfo *cli = 0x0;
+  const AliTRDclusterInfo *cli = NULL;
   TIterator *iter=fInfo->MakeIterator();
   while((cli=dynamic_cast<AliTRDclusterInfo*>((*iter)()))){
     cli->GetCluster(det, x, y, z, q, t, covcl);
@@ -504,7 +504,7 @@ void AliTRDclusterResolution::Exec(Option_t *)
       h3 = (TH3S*)fContainer->At(kQRes);
       h3->Fill(TMath::Log(q), dy, dy/TMath::Sqrt(covcl[0]));
 
-      printf("q=%f Log(q)=%f dy=%f pull=%f\n",q, TMath::Log(q), dy, dy/TMath::Sqrt(covcl[0]));
+      AliDebug(4, Form("q=%4.0f Log(q)=%6.4f dy[um]=%7.2f pull=%5.2f",q, TMath::Log(q), 1.e4*dy, dy/TMath::Sqrt(covcl[0])));
     }
 
     // do not use problematic clusters in resolution analysis
@@ -546,10 +546,10 @@ Bool_t AliTRDclusterResolution::PostProcess()
   if(!fContainer) return kFALSE;
   if(!HasExB()) AliWarning("ExB was not set. Call SetExB() before running the post processing.");
   
-  TObjArray *arr = 0x0;
-  TTree *t=0x0;
+  TObjArray *arr = NULL;
+  TTree *t=NULL;
   if(!fResults){
-    TGraphErrors *g = 0x0;
+    TGraphErrors *g = NULL;
     fResults = new TObjArray(kNtasks);
     fResults->SetOwner();
     fResults->AddAt(arr = new TObjArray(3), kQRes);
@@ -596,7 +596,7 @@ Bool_t AliTRDclusterResolution::PostProcess()
     t->Branch("dx", &fR[0], "dx[2]/F");
     t->Branch("dy", &fR[2], "dy[2]/F");
   } else {
-    TObject *o = 0x0;
+    TObject *o = NULL;
     TIterator *iter=fResults->MakeIterator();
     while((o=((*iter)()))) o->Clear(); // maybe it is wrong but we should never reach this point
   }
@@ -688,14 +688,14 @@ void AliTRDclusterResolution::ProcessCharge()
 // Author
 // Alexandru Bercuci <A.Bercuci@gsi.de>
 
-  TH2I *h2 = 0x0;
+  TH2I *h2 = NULL;
   if(!(h2 = (TH2I*)fContainer->At(kQRes))) {
     AliWarning("Missing dy=f(Q) histo");
     return;
   }
   TF1 f("f", "gaus", -.5, .5);
-  TAxis *ax = 0x0;
-  TH1D *h1 = 0x0;
+  TAxis *ax = NULL;
+  TH1D *h1 = NULL;
 
   // compute mean error on x
   Double_t s2x = 0.; 
@@ -800,11 +800,11 @@ void AliTRDclusterResolution::ProcessCenterPad()
   TF1 f("f", "gaus", -.5, .5);
   TF1 fp("fp", "gaus", -3.5, 3.5);
 
-  TH1D *h1 = 0x0; TH2F *h2 = 0x0; TH3S *h3r=0x0, *h3p=0x0;
+  TH1D *h1 = NULL; TH2F *h2 = NULL; TH3S *h3r=NULL, *h3p=NULL;
   TObjArray *arrRes = (TObjArray*)fResults->At(kCenter);
   TTree *t = (TTree*)arrRes->At(0);
-  TGraphErrors *gs = 0x0;
-  TAxis *ax = 0x0;
+  TGraphErrors *gs = NULL;
+  TAxis *ax = NULL;
 
   printf("  const Float_t lSy[6][24] = {\n      {");
   const Int_t nl = AliTRDgeometry::kNlayer;
@@ -963,8 +963,8 @@ void AliTRDclusterResolution::ProcessSigma()
   }
 
   // init visualization
-  TGraphErrors *ggs = 0x0;
-  TGraph *line = 0x0;
+  TGraphErrors *ggs = NULL;
+  TGraph *line = NULL;
   if(fCanvas){
     ggs = new TGraphErrors();
     line = new TGraph();
@@ -974,9 +974,9 @@ void AliTRDclusterResolution::ProcessSigma()
   // init logistic support
   TF1 f("f", "gaus", -.5, .5);
   TLinearFitter gs(1,"pol1");
-  TH1 *hFrame=0x0;
-  TH1D *h1 = 0x0; TH3S *h3=0x0;
-  TAxis *ax = 0x0;
+  TH1 *hFrame=NULL;
+  TH1D *h1 = NULL; TH3S *h3=NULL;
+  TAxis *ax = NULL;
   Double_t exb2 = fExB*fExB, x;
   AliTRDcluster c;
   TTree *t = (TTree*)fResults->At(kSigm);
@@ -1157,9 +1157,9 @@ void AliTRDclusterResolution::ProcessMean()
   TF1 f("f", "gaus", -.5, .5);
   TF1 line("l", "[0]+[1]*x", -.15, .15);
   TGraphErrors *gm = new TGraphErrors();
-  TH1 *hFrame=0x0;
-  TH1D *h1 = 0x0; TH3S *h3 =0x0;
-  TAxis *ax = 0x0;
+  TH1 *hFrame=NULL;
+  TH1D *h1 = NULL; TH3S *h3 =NULL;
+  TAxis *ax = NULL;
   Double_t x;
 
   AliTRDcluster c;
index e601c70..9ef4515 100644 (file)
@@ -27,6 +27,7 @@
 #include <TObjArray.h>
 #include <TClonesArray.h>
 #include <TPad.h>
+#include <TLegend.h>
 #include <TProfile.h>
 #include <TMath.h>
 #include <TDatabasePDG.h>
@@ -218,34 +219,59 @@ Bool_t AliTRDefficiencyMC::GetRefFigure(Int_t ifig){
     (dynamic_cast<TH1 *>(fContainer->At(ifig)))->Draw("e1");
     return kTRUE;
   }
+  TH1 *h(NULL); 
+  TLegend *leg=new TLegend(.65, .12, .85, .3);
+  leg->SetHeader("Charge");
+  leg->SetBorderSize(1);leg->SetFillColor(kWhite);
   switch(ifig){
   case 2:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+1)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+1));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   case 3:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+2)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+3)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+2));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+3));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   case 4:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+4)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+5)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+4));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+5));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   case 5:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+6)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+7)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+6));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+7));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   case 6:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+8)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+9)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+8));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+9));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   case 7:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+10)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+11)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+10));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+11));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   case 8:
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+12)))->Draw("e1");
-    (dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+13)))->Draw("e1same");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+12));
+    h->Draw("e1"); leg->AddEntry(h, "  -", "pl");
+    h=dynamic_cast<TH1 *>(fContainer->At(kEfficiencySpeciesHistogram+13));
+    h->Draw("e1same"); leg->AddEntry(h, "  +", "pl");
+    leg->Draw();
     break;
   }
   return kTRUE;
@@ -287,7 +313,7 @@ TObjArray *AliTRDefficiencyMC::Histos(){
     for(Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
       fContainer->AddAt(h=new TProfile(
         Form("hEff_%s%c", AliPID::ParticleShortName(ispec), sign[isign]), 
-        Form("Tracking Efficiency for %s%c", AliPID::ParticleName(ispec), sign[isign]), nbins, xbins), 
+        Form("Tracking Efficiency for %s", AliPID::ParticleName(ispec)), nbins, xbins), 
         kEfficiencySpeciesHistogram+ispec*2+isign);
       h->SetMarkerStyle(marker[isign][ispec]);
       h->SetLineColor(AliTRDCalPID::GetPartColor(ispec));
@@ -298,7 +324,7 @@ TObjArray *AliTRDefficiencyMC::Histos(){
       h->GetYaxis()->SetRangeUser(0.2, 1.1);
     }
 
-    fContainer->AddAt(h=new TProfile(Form("hEff_PID%c", sign[isign]), Form("Tracking Efficiency no PID %c", sign[isign]), nbins, xbins), kEfficiencySpeciesHistogram+AliPID::kSPECIES*2+isign);
+    fContainer->AddAt(h=new TProfile(Form("hEff_PID%c", sign[isign]), "Tracking Efficiency no PID", nbins, xbins), kEfficiencySpeciesHistogram+AliPID::kSPECIES*2+isign);
     h->SetMarkerStyle(marker[isign][AliPID::kSPECIES]);
     h->SetMarkerColor(kBlack);h->SetLineColor(kBlack);
     h->GetXaxis()->SetTitle("p [GeV/c]");
index b6d01e1..5adbbc1 100644 (file)
@@ -176,7 +176,7 @@ void AliTRDpidRefMaker::Exec(Option_t *)
     Double32_t *infoPID = infoESD->GetSliceIter();
     Int_t n = infoESD->GetNSlices() - AliTRDgeometry::kNlayer;
     Double32_t *p = &infoPID[n];
-
+    AliDebug(4, Form("n[%d] p[GeV/c]{%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f}", n, p[0], p[1], p[2], p[3], p[4], p[5]));
 
     ULong_t status = track->GetStatus();
     if(!(status&AliESDtrack::kTPCout)) continue;
index 44883a0..47463e1 100644 (file)
@@ -587,11 +587,11 @@ TH1* AliTRDresolution::PlotTrackTPC(const AliTRDtrackV1 *track)
   ((TH3S*)arr->At(9))->Fill(PARMC[4], (PARMC[4]-PAR[4])/TMath::Sqrt(COV(4,4)), sign*sIdx);
 
   Double_t p0 = TMath::Sqrt(1.+ PARMC[3]*PARMC[3])*pt0, p;
-  p = TMath::Sqrt(1.+ PAR[3]*PAR[3])*PAR[4];
+  p = TMath::Sqrt(1.+ PAR[3]*PAR[3])/PAR[4];
   Float_t sp = 
-    p*p*COV(4,4)/PAR[4]/PAR[4]
-   +2.*PAR[3]*PAR[4]*COV(3,4)
-   +PAR[3]*PAR[3]*PAR[4]*PAR[4]*PAR[4]*PAR[4]*COV(3,3)/p/p;
+    p*p*PAR[4]*PAR[4]*COV(4,4)
+   +2.*PAR[3]*COV(3,4)/PAR[4]
+   +PAR[3]*PAR[3]*COV(3,3)/p/p/PAR[4]/PAR[4]/PAR[4]/PAR[4];
   ((TH3S*)arr->At(10))->Fill(p0, p/p0-1., sign*sIdx);
   if(sp>0.) ((TH3S*)arr->At(11))->Fill(p0, (p0-p)/TMath::Sqrt(sp), sign*sIdx);
 
@@ -638,22 +638,15 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track)
   Double_t covR[7]/*, cov[3]*/;
 
   if(DebugLevel()>=1){
-    Double_t dX[12], dY[12], dZ[12], dPt[12], cCOV[12][15];
-    fkMC->PropagateKalman(dX, dY, dZ, dPt, cCOV);
+    TVectorD dX(12), dY(12), dZ(12), dPt(12), cCOV(12*15);
+    fkMC->PropagateKalman(&dX, &dY, &dZ, &dPt, &cCOV);
     (*DebugStream()) << "MCkalman"
-      << "pdg="  << pdg
-      << "dx0="  << dX[0]
-      << "dx1="  << dX[1]
-      << "dx2="  << dX[2]
-      << "dy0="  << dY[0]
-      << "dy1="  << dY[1]
-      << "dy2="  << dY[2]
-      << "dz0="  << dZ[0]
-      << "dz1="  << dZ[1]
-      << "dz2="  << dZ[2]
-      << "dpt0=" << dPt[0]
-      << "dpt1=" << dPt[1]
-      << "dpt2=" << dPt[2]
+      << "pdg=" << pdg
+      << "dx="  << &dX
+      << "dy="  << &dY
+      << "dz="  << &dZ
+      << "dpt=" << &dPt
+      << "cov=" << &cCOV
       << "\n";
   }
 
@@ -677,6 +670,7 @@ TH1* AliTRDresolution::PlotMC(const AliTRDtrackV1 *track)
         << "det="     << det
         << "pdg="     << pdg
         << "sgn="     << sign
+        << "barrel="  << kBarrel
         << "pt="      << pt0
         << "x="       << x0
         << "y="       << y0
@@ -1670,7 +1664,7 @@ TObjArray* AliTRDresolution::Histos()
   arr2->SetName("Pt Resolution [SA]");
   for(Int_t il=0; il<AliTRDgeometry::kNlayer; il++){
     if(!(h3 = (TH3S*)gROOT->FindObject(Form("hMcSATrkPt%d", il)))){
-      h3 = new TH3S(Form("hMcSATrkPt%d", il), "Track Pt Resolution", kPbins, 0., 12., 150, -1., 2., n, -5.5, 5.5);
+      h3 = new TH3S(Form("hMcSATrkPt%d", il), "Track Pt Resolution", kPbins, 0., 12., 150, -10., 1., n, -5.5, 5.5);
       h3->GetXaxis()->SetTitle("p_{t} [GeV/c]");
       h3->GetYaxis()->SetTitle("#Delta p_{t}/p_{t}^{MC}");
       h3->GetZaxis()->SetTitle("SPECIES");
index 7f02b8a..20a2fb6 100644 (file)
@@ -26,6 +26,7 @@
 ////////////////////////////////////////////////////////////////////////////
 
 #include "TDatabasePDG.h"
+#include "TVectorT.h"
 
 #include "AliTrackReference.h"
 #include "AliExternalTrackParam.h"
@@ -444,20 +445,21 @@ Bool_t AliTRDtrackInfo::AliMCinfo::GetDirections(Float_t &x0, Float_t &y0, Float
 }
 
 //___________________________________________________
-void AliTRDtrackInfo::AliMCinfo::PropagateKalman(Double_t dx[kNTrackRefs], Double_t dy[kNTrackRefs], Double_t dz[kNTrackRefs], Double_t dp[kNTrackRefs], Double_t c[kNTrackRefs][15], Double_t step) const
+void AliTRDtrackInfo::AliMCinfo::PropagateKalman(TVectorD *dx, TVectorD *dy, TVectorD *dz, TVectorD *dpt, TVectorD *c, Double_t step) const
 {
 // Propagate Kalman from the first TRD track reference to 
 // last one and save residuals in the y, z and pt.
 // 
 // This is to calibrate the dEdx and MS corrections
 
+  if(!fNTrackRefs) return;
   for(Int_t itr=kNTrackRefs; itr--;){
-    dx[itr] = -1.; dy[itr] = 100.; dz[itr] = 100.; dp[itr] = 100.;
+    (*dx)[itr] = -1.; (*dy)[itr] = 100.; (*dz)[itr] = 100.; (*dpt)[itr] = 100.;
   }
-  if(!fNTrackRefs) return;
 
   // Initialize TRD track to the first track reference
-  AliTrackReference *tr = fTrackRefs[0];
+  AliTrackReference *tr(NULL);
+  Int_t itr(0); while(!(tr = fTrackRefs[itr])) itr++;
   if(tr->Pt()<1.e-3) return;
 
   AliTRDtrackV1 tt;
@@ -481,19 +483,19 @@ void AliTRDtrackInfo::AliMCinfo::PropagateKalman(Double_t dx[kNTrackRefs], Doubl
   tt.Set(xyz, pxyz, cov, Short_t(pdg->Charge()));
   tt.SetMass(pdg->Mass());
   
-  Double_t x0 = tr->LocalX();
-  const Double_t *cc = NULL;
-  for(Int_t itr=1, ip=0; itr<fNTrackRefs; itr++){
-    tr = fTrackRefs[itr];
+  Double_t x0(tr->LocalX());
+  const Double_t *cc(NULL);
+  for(Int_t ip=0; itr<fNTrackRefs; itr++){
+    if(!(tr = fTrackRefs[itr])) continue;
     if(!AliTRDtrackerV1::PropagateToX(tt, tr->LocalX(), step)) continue;
 
     //if(update) ...
-    dx[ip] = tt.GetX() - x0;
-    dy[ip] = tt.GetY() - tr->LocalY();
-    dz[ip] = tt.GetZ() - tr->Z();
-    dp[ip] = tt.Pt()- tr->Pt();
+    (*dx)[ip]  = tt.GetX() - x0;
+    (*dy)[ip]  = tt.GetY() - tr->LocalY();
+    (*dz)[ip]  = tt.GetZ() - tr->Z();
+    (*dpt)[ip] = tt.Pt()- tr->Pt();
     cc = tt.GetCovariance();
-    memcpy(c[ip], cc, 15*sizeof(Double_t));
+    c->Use(ip*15, (ip+1)*15, cc);
     ip++;
   }
 }
index d6d4a5e..04f83b2 100644 (file)
 //                                                                        //
 ////////////////////////////////////////////////////////////////////////////
 
-#ifndef Root_TObject
-#include "TObject.h"
-#endif
-
 #ifndef ALIPID_H
 #include "AliPID.h"
 #endif
 
+
+template <typename Value> class TVectorT;
+typedef struct TVectorT<Double_t> TVectorD;
 class AliTRDseedV1;
 class AliTRDtrackV1;
 class AliTrackReference;
@@ -73,7 +72,9 @@ public:
     Int_t   GetPDG() const {return fPDG;}
     Bool_t  GetDirections(Float_t &x0, Float_t &y0, Float_t &z0, Float_t &dydx, Float_t &dzdx, Float_t &pt, UChar_t &s) const;
     AliTrackReference const* GetTrackRef(Int_t ref=0) const {return fTrackRefs[ref];}
-    void    PropagateKalman(Double_t dx[kNTrackRefs], Double_t dy[kNTrackRefs], Double_t dz[kNTrackRefs], Double_t dpt[kNTrackRefs], Double_t c[kNTrackRefs][15], Double_t step = 2.) const;
+    void    PropagateKalman(
+        TVectorD *dx, TVectorD *dy, TVectorD *dz, 
+        TVectorD *dpt, TVectorD *c, Double_t step = 2.) const;
 
   protected:
     Int_t   fLabel;             // MC label  
@@ -86,14 +87,11 @@ public:
   AliTRDtrackInfo();
   AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo);
   ~AliTRDtrackInfo();
-  
+
 //  void               Clear(const Option_t *){}
   void               Delete(const Option_t *);
-  
   AliTRDtrackInfo&   operator=(const AliTRDtrackInfo &trdInfo);
-  
   void               AddTrackRef(const AliTrackReference *trackRef);
-  
   Int_t              GetTrackId() const { return fESD.fId;}
   const AliESDinfo*  GetESDinfo() const { return &fESD; }
   const AliMCinfo*   GetMCinfo() const { return fMC; }