]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLTTPCCADisplay.cxx
Update of the HLT CA tracker
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCADisplay.cxx
index f3e47da1ef175e9b18c60ad72cd9c53d0306fdb6..2575c4a45f1d950c9153ff4a0b874fea94f9683f 100644 (file)
@@ -26,6 +26,9 @@
 #include "AliHLTTPCCATrack.h"
 #include "AliHLTTPCCAGBTrack.h"
 #include "AliHLTTPCCAGBHit.h"
+#include "AliHLTTPCCAPerformance.h"
+#include "AliHLTTPCCAMCTrack.h"
+#include "AliHLTTPCCAOutTrack.h"
 
 #include "TString.h"
 #include "Riostream.h"
@@ -41,20 +44,21 @@ AliHLTTPCCADisplay &AliHLTTPCCADisplay::Instance()
   return gAliHLTTPCCADisplay; 
 }
 
-AliHLTTPCCADisplay::AliHLTTPCCADisplay() : fYX(0), fZX(0), fAsk(1), fSliceView(1), fSlice(0), 
+AliHLTTPCCADisplay::AliHLTTPCCADisplay() : fYX(0), fZX(0), fAsk(1), fSliceView(1), fSlice(0),fGB(0), fPerf(0), 
                                           fCos(1), fSin(0), fZMin(-250), fZMax(250),fYMin(-250), fYMax(250),fSliceCos(1), fSliceSin(0),
                                           fRInnerMin(83.65), fRInnerMax(133.3), fROuterMin(133.5), fROuterMax(247.7),
-                                          fTPCZMin(-250.), fTPCZMax(250), fArc(), fLine(), fPLine(), fMarker(), fBox(), fCrown(), fLatex()
+                                          fTPCZMin(-250.), fTPCZMax(250), fArc(), fLine(), fPLine(), fMarker(), fBox(), fCrown(), fLatex(), fDrawOnlyRef(0)
 {
+  fPerf = &(AliHLTTPCCAPerformance::Instance());
   // constructor
 } 
 
 
 AliHLTTPCCADisplay::AliHLTTPCCADisplay( const AliHLTTPCCADisplay& ) 
-  : fYX(0), fZX(0), fAsk(1), fSliceView(1), fSlice(0), 
+  : fYX(0), fZX(0), fAsk(1), fSliceView(1), fSlice(0), fGB(0), fPerf(0),
     fCos(1), fSin(0), fZMin(-250), fZMax(250), fYMin(-250), fYMax(250), fSliceCos(1), fSliceSin(0),
     fRInnerMin(83.65), fRInnerMax(133.3), fROuterMin(133.5), fROuterMax(247.7),
-    fTPCZMin(-250.), fTPCZMax(250), fArc(), fLine(), fPLine(), fMarker(), fBox(), fCrown(), fLatex()
+    fTPCZMin(-250.), fTPCZMax(250), fArc(), fLine(), fPLine(), fMarker(), fBox(), fCrown(), fLatex(), fDrawOnlyRef(0)
 {
   // dummy
 }
@@ -81,6 +85,7 @@ void AliHLTTPCCADisplay::Init()
   fYX = new TCanvas ("YX", "YX window", -1, 0, 600, 600);
   fZX = new TCanvas ("ZX", "ZX window", -610, 0, 590, 600);  
   fMarker = TMarker(0.0, 0.0, 20);//6);
+  fDrawOnlyRef = 1;
 }
 
 void AliHLTTPCCADisplay::Update()
@@ -89,6 +94,9 @@ void AliHLTTPCCADisplay::Update()
   if( !fAsk ) return;
   fYX->Update();
   fZX->Update();
+  fYX->Print("YX.pdf");
+  fZX->Print("ZX.pdf");
 }
 
 void AliHLTTPCCADisplay::ClearView()
@@ -132,6 +140,12 @@ void AliHLTTPCCADisplay::SetTPCView()
   fYMax = fROuterMax;
 }
 
+
+void AliHLTTPCCADisplay::SetGB( AliHLTTPCCAGBTracker *GBTracker )
+{
+  fGB = GBTracker;
+}
+
 void AliHLTTPCCADisplay::SetCurrentSlice( AliHLTTPCCATracker *slice )
 {
   // set reference to the current CA tracker, and read the current slice geometry
@@ -153,16 +167,18 @@ void AliHLTTPCCADisplay::SetCurrentSlice( AliHLTTPCCATracker *slice )
     Double_t dz = .5*(slice->Param().ZMax()-slice->Param().ZMin())*1.2;
     fYX->Range(cx-dr, cy-dr*1.05, cx+dr, cy+dr);
     fZX->Range(cz-dz, cy-dr*1.05, cz+dz, cy+dr);
-
-    fYX->Range(cx, cy-dr*0.8, cx+dr/2, cy+dr*0.1);
-    fZX->Range(cz, cy-dr*.8, cz+dz, cy+dr*0.1);
-   //fYX->Range(cx-dr/6, cy-dr, cx+dr/8, cy-dr + dr/8);
-    //fZX->Range(cz+dz/2+dz/6, cy-dr , cz+dz-dz/8, cy-dr + dr/8);
-
-    //fYX->Range(cx-dr/3, cy-dr/3, cx+dr, cy+dr);
-    //fZX->Range(cz-dz/3, cy-dr/3, cz+dz, cy+dr);//+dr);
-    //fYX->Range(cx-dr/3, cy-dr/2*1.3, cx+dr/3, cy-dr/2*1.1);//+dr);
-    //fZX->Range(cz-dz*0.65, cy-dr/2*1.3, cz+dz*0-dz*0.55, cy-dr/2*1.1);//+dr);
+    
+    //fYX->Range(cx-dr*0., cy-dr*1., cx+dr*.2, cy-dr*0.2);
+    //fZX->Range(cz-dz   , cy-dr*1., cz+dz, cy-dr*0.2);
+    
+    //Double_t x0 = cx-dr*.1, x1 = cx-dr*.05;
+    //Double_t y0 = cy-dr*1.05, y1 = cy-dr*0.7;
+    //Double_t z0 = cz-dz*.3, z1 = cz;
+    //Double_t xc = (x0+x1)/2, yc= (y0+y1)/2, zc=(z0+z1)/2;
+    //Double_t d = TMath::Max((x1-x0)/2,TMath::Max((y1-y0)/2,(z1-z0)/2));
+    //fYX->Range(xc-d, yc-d, xc+d, yc+d);
+    //fZX->Range(zc-d, yc-d, zc+d, yc+d);
+    
    }
 }
 
@@ -182,6 +198,7 @@ void AliHLTTPCCADisplay::DrawTPC()
 {
   // schematically draw TPC detector
   fYX->Range(-fROuterMax, -fROuterMax, fROuterMax, fROuterMax);
+  //fYX->Range( -fROuterMax*.7, -fROuterMax, fROuterMax*0., -fROuterMax*.5);
   fYX->Clear();
   {
     fArc.SetLineColor(kBlack);
@@ -195,11 +212,12 @@ void AliHLTTPCCADisplay::DrawTPC()
     }
   }
   fZX->cd();
-  fZX->Range( fTPCZMin, -fROuterMax, fTPCZMax, fROuterMax );
+  fZX->Range( fTPCZMin, -fROuterMax, fTPCZMax*1.1, fROuterMax );
+  //fZX->Range( fTPCZMax*.1, -fROuterMax, fTPCZMax*.3, -fROuterMax*0.5 );
   fZX->Clear();
 }
 
-void AliHLTTPCCADisplay::DrawSlice( AliHLTTPCCATracker *slice )
+void AliHLTTPCCADisplay::DrawSlice( AliHLTTPCCATracker *slice, Bool_t DrawRows )
 {     
   // draw current the TPC slice
   fYX->cd();
@@ -221,9 +239,10 @@ void AliHLTTPCCADisplay::DrawSlice( AliHLTTPCCATracker *slice )
   fArc.SetFillStyle(0);     
   fCrown.SetLineColor(kBlack);
   fCrown.SetFillStyle(0);
-    
-  fCrown.DrawCrown(0,0, slice->Param().RMin(),slice->Param().RMax(), a0-da, a0+da );
-
+  fCrown.DrawCrown(0,0, fRInnerMin, fRInnerMax, a0-da, a0+da );
+  fCrown.DrawCrown(0,0, fROuterMin, fROuterMax, a0-da, a0+da );
+  //fCrown.DrawCrown(0,0, slice->Param().RMin(),slice->Param().RMax(), a0-da, a0+da );
+  
   fLine.SetLineColor(kBlack);
  
   fZX->cd();
@@ -232,6 +251,24 @@ void AliHLTTPCCADisplay::DrawSlice( AliHLTTPCCATracker *slice )
   Double_t dz = .5*(slice->Param().ZMax()-slice->Param().ZMin())*1.2;
   //fLine.DrawLine(cz+dz, cy-dr, cz+dz, cy+dr ); 
   if( fSliceView ) fLatex.DrawLatex(cz-dz+dz*.05,cy-dr+dr*.05, Form("ZX, Slice %2i",slice->Param().ISlice()));
+
+  if( DrawRows ){
+    fLine.SetLineWidth(1);
+    fLine.SetLineColor(kBlack);    
+    SetSliceTransform(fSlice);      
+    for( Int_t iRow=0; iRow<fSlice->Param().NRows(); iRow++ ){
+      Double_t x = fSlice->Row(iRow).X();
+      Double_t y = fSlice->Row(iRow).MaxY();
+      Double_t vx0, vy0, vx1, vy1;
+      Slice2View( x, y, &vx0, &vy0 );  
+      Slice2View( x, -y, &vx1, &vy1 );    
+      fYX->cd();
+      fLine.DrawLine(vx0, vy0,vx1,vy1);
+      fZX->cd();
+      fLine.DrawLine(fTPCZMin, vy0,fTPCZMax,vy1);
+    }
+  }
+
 }
 
 
@@ -264,8 +301,17 @@ void AliHLTTPCCADisplay::Set2Slices( AliHLTTPCCATracker *slice )
   fLatex.DrawLatex(cz-dz+dz*.05,cy-dr+dr*.05, Form("ZX, Slices %2i/%2i",islice,jslice));
 }
 
+Int_t AliHLTTPCCADisplay::GetColor( Int_t i ) const 
+{
+  // Get color with respect to Z coordinate
+  const Color_t kMyColor[9] = { kGreen, kBlue, kYellow, kCyan, kOrange, 
+                                kSpring, kTeal, kAzure, kViolet };
+  if( i<0 ) i= 0;
+  if( i==0 ) return kBlack;
+  return kMyColor[(i-1)%9];
+}
 
-Int_t AliHLTTPCCADisplay::GetColor( Double_t z ) const 
+Int_t AliHLTTPCCADisplay::GetColorZ( Double_t z ) const 
 {
   // Get color with respect to Z coordinate
   const Color_t kMyColor[11] = { kGreen, kBlue, kYellow, kMagenta, kCyan, 
@@ -329,16 +375,26 @@ void AliHLTTPCCADisplay::Slice2View( Double_t x, Double_t y, Double_t *xv, Doubl
 }
 
 
-void AliHLTTPCCADisplay::DrawGBHit( AliHLTTPCCAGBTracker &tracker, Int_t iHit, Int_t color )
+void AliHLTTPCCADisplay::DrawGBHit( AliHLTTPCCAGBTracker &tracker, Int_t iHit, Int_t color, Double_t width  )
 {
   // draw hit
   AliHLTTPCCAGBHit &h = tracker.Hits()[iHit];
   AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
   SetSliceTransform(&slice);
-
-  if( color<0 ) color = GetColor( h.Z() );
   
-  fMarker.SetMarkerSize(.3);
+  if( color<0 ){
+    if( fPerf ){
+      Int_t lab = fPerf->HitLabels()[h.ID()].fLab[0];
+      color = GetColor(lab+1);
+      if( lab>=0 ){
+       AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
+       if( mc.P()>=1. ) color = kRed;  
+       else if(fDrawOnlyRef) return;
+      }
+    }else color=GetColorZ( h.Z() );
+  }
+  if( width>0 )fMarker.SetMarkerSize(width);
+  else fMarker.SetMarkerSize(.3);
   fMarker.SetMarkerColor(color);
   Double_t vx, vy;
   Slice2View( h.X(), h.Y(), &vx, &vy );  
@@ -349,41 +405,299 @@ void AliHLTTPCCADisplay::DrawGBHit( AliHLTTPCCAGBTracker &tracker, Int_t iHit, I
   fMarker.DrawMarker(h.Z(), vy); 
 }
 
-void AliHLTTPCCADisplay::DrawGBTrack( AliHLTTPCCAGBTracker &tracker, Int_t itr, Int_t color )
+void AliHLTTPCCADisplay::DrawGBHits( AliHLTTPCCAGBTracker &tracker, Int_t color, Double_t width )
 {
-  // draw global track
-  
-  AliHLTTPCCAGBTrack &track = tracker.Tracks()[itr];
-  if( track.NHits()<2 ) return;
-  Int_t width = 1;
+  // draw hits 
 
-  AliHLTTPCCADisplayTmpHit vHits[track.NHits()];
-  AliHLTTPCCATrackParam t = track.Param();
+  if( !fPerf ) return;
+  if( width<0 ) width = .3;
+    
+  for( Int_t iHit = 0; iHit<tracker.NHits(); iHit++ ){
+    AliHLTTPCCAGBHit &h = tracker.Hits()[iHit];
+    Int_t imc = fPerf->HitLabels()[h.ID()].fLab[0];
+    AliHLTTPCCAMCTrack *mc = (imc>=0) ?&(fPerf->MCTracks()[imc]) :0;
+    if(fDrawOnlyRef && (!mc || (mc->P()<1))) continue;
+    Int_t col = color;
+    if( color<0 ){
+      col = GetColor(imc+1) ;
+      if( mc && (mc->P()>=1.) ) col = kRed;        
+    }    
+
+    AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
+    SetSliceTransform(&slice);
+
+    fMarker.SetMarkerSize(width);
+    fMarker.SetMarkerColor(col);
+    Double_t vx, vy;
+    Slice2View( h.X(), h.Y(), &vx, &vy );  
+      
+    fYX->cd();
+    fMarker.DrawMarker(vx, vy);
+    fZX->cd();  
+    fMarker.DrawMarker(h.Z(), vy); 
+  }
+}
+
+void AliHLTTPCCADisplay::DrawSliceHit( Int_t iRow, Int_t iHit, Int_t color, Double_t width )
+{
+  // draw hit
+  if( !fSlice ) return;
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  const AliHLTTPCCARow &row = fSlice->Row(iRow);
+  Int_t id = tracker.FirstSliceHit()[fSlice->Param().ISlice()]+fSlice->HitInputIDs()[row.FirstHit()+iHit];
+  DrawGBHit(  tracker, id, color, width );
+}
+
+void AliHLTTPCCADisplay::DrawSliceHits( Int_t color, Double_t width )
+{
+  // draw hits 
+
+  if( !fPerf || !fGB) return;
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  if( width<0 ) width = .3;
+
+  for( Int_t imc=-3; imc<fPerf->NMCTracks(); imc++ ){
+    Int_t nh=0;
+    AliHLTTPCCAMCTrack *mc = (imc>=0) ?&(fPerf->MCTracks()[imc]) :0;
+    if(fDrawOnlyRef && (!mc || (mc->P()<1))) continue;
   
-  for( Int_t ih=0; ih<track.NHits(); ih++ ){
-    Int_t i = tracker.TrackHits()[ track.FirstHitRef() + ih];
-    AliHLTTPCCAGBHit *h = &(tracker.Hits()[i]);
-    vHits[ih].ID() = i;
-    vHits[ih].S() = 0;
-    vHits[ih].Z() = h->Z();
-  }  
+    Int_t col = color;
+    if( color<0 ){
+      col = GetColor(imc+1);
+      if( imc>=0 ){
+       if( mc&&(mc->P()>=1.) ) col = kRed;     
+      }
+    }
+
+    for( Int_t ih=0; ih<fSlice->NHitsTotal(); ih++ ){   
+       Int_t id = fSlice->HitInputIDs()[ih];
+      AliHLTTPCCAGBHit &h = tracker.Hits()[tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id];
+      if( fPerf->HitLabels()[h.ID()].fLab[0] != imc ) continue;
+      nh++;
+      //AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
+      //SetSliceTransform(&slice);
+      
+      fMarker.SetMarkerSize(width);
+      fMarker.SetMarkerColor(col);
+      Double_t vx, vy;
+      Slice2View( h.X(), h.Y(), &vx, &vy );  
+      
+      fYX->cd();
+      fMarker.DrawMarker(vx, vy);
+      fZX->cd();  
+      fMarker.DrawMarker(h.Z(), vy);     
+    }
+    //if( nh<=0 ) continue;
+    //float p = mc ? mc->P() :0;  
+    //std::cout<<"lab,nhits,color= "<<imc<<" "<<nh<<" "<<col<<std::endl;
+    //Ask();
+  }
+}
+
+Int_t AliHLTTPCCADisplay::GetTrackMC( AliHLTTPCCADisplayTmpHit *vHits, Int_t NHits )
+{
+  // get MC label for the track
   
-  //sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
-  Int_t colorY = color;
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+
+  Int_t label = -1; 
+  Double_t purity = 0;
+  Int_t *lb = new Int_t[NHits*3];
+  Int_t nla=0;
+  //std::cout<<"\n\nTrack hits mc: "<<std::endl;
+  for( Int_t ihit=0; ihit<NHits; ihit++){
+    AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[ihit].ID()];
+    AliHLTTPCCAPerformance::AliHLTTPCCAHitLabel &l = fPerf->HitLabels()[h.ID()];
+    if(l.fLab[0]>=0 ) lb[nla++]= l.fLab[0];
+    if(l.fLab[1]>=0 ) lb[nla++]= l.fLab[1];
+    if(l.fLab[2]>=0 ) lb[nla++]= l.fLab[2];
+    //std::cout<<ihit<<":  "<<l.fLab[0]<<" "<<l.fLab[1]<<" "<<l.fLab[2]<<std::endl;
+  }
+  sort( lb, lb+nla );
+  Int_t labmax = -1, labcur=-1, lmax = 0, lcurr=0, nh=0;
+  //std::cout<<"MC track IDs :"<<std::endl;
+  for( Int_t i=0; i<nla; i++ ){
+    if( lb[i]!=labcur ){
+      if( 0 && i>0 && lb[i-1]>=0 ){    
+       AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lb[i-1]];
+       std::cout<<lb[i-1]<<": nhits="<<nh<<", pdg="<< mc.PDG()<<", Pt="<<mc.Pt()<<", P="<<mc.P()
+                <<", par="<<mc.Par()[0]<<" "<<mc.Par()[1]<<" "<<mc.Par()[2]
+                <<" "<<mc.Par()[3]<<" "<<mc.Par()[4]<<" "<<mc.Par()[5]<<" "<<mc.Par()[6]<<std::endl;
+       
+      }
+      nh=0;
+      if( labcur>=0 && lmax<lcurr ){
+       lmax = lcurr;
+       labmax = labcur;
+      }
+      labcur = lb[i];
+      lcurr = 0;
+    }
+    lcurr++;
+    nh++;
+  }
+  if( 0 && nla-1>0 && lb[nla-1]>=0 ){  
+    AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lb[nla-1]];
+    std::cout<<lb[nla-1]<<": nhits="<<nh<<", pdg="<< mc.PDG()<<", Pt="<<mc.Pt()<<", P="<<mc.P()
+            <<", par="<<mc.Par()[0]<<" "<<mc.Par()[1]<<" "<<mc.Par()[2]
+            <<" "<<mc.Par()[3]<<" "<<mc.Par()[4]<<" "<<mc.Par()[5]<<" "<<mc.Par()[6]<<std::endl;
+    
+  }
+  if( labcur>=0 && lmax<lcurr ){
+    lmax = lcurr;
+    labmax = labcur;
+  }
+  lmax = 0;
+  for( Int_t ihit=0; ihit<NHits; ihit++){
+    AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[ihit].ID()];
+    AliHLTTPCCAPerformance::AliHLTTPCCAHitLabel &l = fPerf->HitLabels()[h.ID()];
+    if( l.fLab[0] == labmax || l.fLab[1] == labmax || l.fLab[2] == labmax 
+       ) lmax++;
+  }
+  label = labmax;
+  purity = ( (NHits>0) ?double(lmax)/double(NHits) :0 );
+  if( lb ) delete[] lb;
+  if( purity<.9 ) label = -1;
+  return label;
+}
 
-  {
-    AliHLTTPCCAGBHit &h1 = tracker.Hits()[ vHits[0].ID()];
-    AliHLTTPCCAGBHit &h2 = tracker.Hits()[ vHits[track.NHits()-1].ID()];
-    if( color<0 ) color = GetColor( (h1.Z()+h2.Z())/2. );
-    Double_t gx1, gy1, gx2, gy2;
-    Slice2View(h1.X(), h1.Y(), &gx1, &gy1 );
-    Slice2View(h2.X(), h2.Y(), &gx2, &gy2 );
-    if( colorY<0 ) colorY = GetColorY( (gy1+gy2)/2. );
-    color = colorY = GetColorK(t.GetKappa());
+Bool_t AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrackParam t, Double_t Alpha, AliHLTTPCCADisplayTmpHit *vHits, 
+                                   Int_t NHits, Int_t color, Double_t width, Bool_t pPoint )
+{
+  // draw track
+
+  if(NHits<2 ) return 0;
+
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  if( width<0 ) width = 2;
+
+  if(fDrawOnlyRef ){
+    Int_t lab = GetTrackMC(vHits, NHits);
+    if( lab<0 ) return 0;
+    AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
+    if(mc.P()<1) return 0;
+  }
+
+  if( color < 0 ){
+    //color = GetColorZ( (vz[0]+vz[mHits-1])/2. );
+    //color = GetColorK(t.GetKappa());
+    Int_t lab = GetTrackMC(vHits, NHits);
+    color = GetColor( lab +1 );
+    if( lab>=0 ){
+      AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
+      if( mc.P()>=1. ) color = kRed;   
+    }  
+  }
+
+  if( t.SinPhi()>.999 )  t.SetSinPhi( .999 );
+  else if( t.SinPhi()<-.999 )  t.SetSinPhi( -.999 );
+  if( t.CosPhi()>=0 ) t.SetCosPhi( TMath::Sqrt(1-t.SinPhi()*t.SinPhi() ));
+  else t.SetCosPhi( -TMath::Sqrt(1-t.SinPhi()*t.SinPhi() ));
+
+  //  Int_t iSlice = fSlice->Param().ISlice();
+
+  //sort(vHits, vHits + NHits, AliHLTTPCCADisplayTmpHit::CompareHitZ );
+
+  Double_t vx[2000], vy[2000], vz[2000];
+  Int_t mHits = 0;
+
+  //Int_t oldSlice = -1;
+  Double_t alpha = (Alpha==-1) ?fSlice->Param().Alpha() :Alpha;
+  AliHLTTPCCATrackParam tt = t;
+
+  for( Int_t iHit=0; iHit<NHits; iHit++ ){
+
+    AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[iHit].ID()];
+
+    Double_t hCos = TMath::Cos( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
+    Double_t hSin = TMath::Sin( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
+    Double_t x0=h.X(), y0=h.Y(), z1=h.Z();
+    Double_t x1 = x0*hCos + y0*hSin;
+    Double_t y1 = y0*hCos - x0*hSin;      
+
+    {
+      Double_t dx = x1-tt.X();
+      Double_t dy = y1-tt.Y();
+      if( dx*dx+dy*dy>1. ){
+       Double_t dalpha = TMath::ATan2( dy, dx );
+       if( tt.Rotate(dalpha ) ){
+         alpha+=dalpha;
+         hCos = TMath::Cos( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
+         hSin = TMath::Sin( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
+         x1 = x0*hCos + y0*hSin;
+         y1 = y0*hCos - x0*hSin;      
+       }
+      }
+    }
+    SetSliceTransform( alpha );
+
+    //t.GetDCAPoint( x1, y1, z1, x1, y1, z1 );      
+    Bool_t ok = tt.TransportToX(x1,.999);
+    if( 0&&ok ){    
+      x1 = tt.X();
+      y1 = tt.Y();
+      z1 = tt.Z();
+    }
+
+    Slice2View(x1, y1, &x1, &y1 );
+    vx[mHits] = x1;
+    vy[mHits] = y1;
+    vz[mHits] = z1;
+    mHits++;
+    for( int j=0; j<0; j++ ){
+      x0=h.X()+j; y0=h.Y(); z1=h.Z();
+      x1 = x0*hCos + y0*hSin;
+      y1 = y0*hCos - x0*hSin;
+
+      ok = tt.TransportToX(x1,.999);
+      if( 1||ok ){    
+       x1 = tt.X();
+       y1 = tt.Y();
+       z1 = tt.Z();
+      }
+
+      Slice2View(x1, y1, &x1, &y1 );
+      vx[mHits] = x1;
+      vy[mHits] = y1;
+      vz[mHits] = z1;
+      mHits++;
+    }
+  }
+  if( pPoint ){
+    Double_t x1=t.X(), y1=t.Y(), z1=t.Z();
+    Double_t a = (Alpha==-1) ?fSlice->Param().Alpha() :Alpha;
+    SetSliceTransform( a );
+
+    Slice2View(x1, y1, &x1, &y1 );
+    Double_t dx = x1 - vx[0];
+    Double_t dy = y1 - vy[0];
+    //std::cout<<x1<<" "<<y1<<" "<<vx[0]<<" "<<vy[0]<<" "<<dx<<" "<<dy<<std::endl;
+    Double_t d0 = dx*dx + dy*dy;
+    dx = x1 - vx[mHits-1];
+    dy = y1 - vy[mHits-1];
+    //std::cout<<x1<<" "<<y1<<" "<<vx[mHits-1]<<" "<<vy[mHits-1]<<" "<<dx<<" "<<dy<<std::endl;
+    Double_t d1 = dx*dx + dy*dy;
+    //std::cout<<"d0, d1="<<d0<<" "<<d1<<std::endl;
+    if( d1<d0 ){
+      vx[mHits] = x1;
+      vy[mHits] = y1;
+      vz[mHits] = z1;   
+      mHits++;
+    } else {
+      for( Int_t i = mHits; i>0; i-- ){
+       vx[i] = vx[i-1];
+       vy[i] = vy[i-1];
+       vz[i] = vz[i-1];
+      }
+      vx[0] = x1;
+      vy[0] = y1;
+      vz[0] = z1;   
+      mHits++;
+    }  
   }
+  
 
-  //fMarker.SetMarkerColor(color);//kBlue);
-  //fMarker.SetMarkerSize(1.);
   fLine.SetLineColor(color);
   fLine.SetLineWidth(width);    
   fArc.SetFillStyle(0);
@@ -393,95 +707,141 @@ void AliHLTTPCCADisplay::DrawGBTrack( AliHLTTPCCAGBTracker &tracker, Int_t itr,
   pl.SetLineColor(color);
   pl.SetLineWidth(width);
   TPolyLine plZ;
-  plZ.SetLineColor(colorY);
+  plZ.SetLineColor(color);
   plZ.SetLineWidth(width);
+  
+  fMarker.SetMarkerSize(width/2.);
+  fMarker.SetMarkerColor(color);
 
-  Int_t oldSlice = -1;
-  //Double_t alpha = track.Alpha();
-  Double_t px[track.NHits()], py[track.NHits()], pz[track.NHits()];
+  fYX->cd();
+  pl.DrawPolyLine(mHits,vx,vy);
+  {
+    fMarker.DrawMarker(vx[0],vy[0]);
+    fMarker.DrawMarker(vx[mHits-1],vy[mHits-1]);
+  }
+  fZX->cd();
+  plZ.DrawPolyLine(mHits,vz,vy);
+  fMarker.DrawMarker(vz[0],vy[0]);
+  fMarker.DrawMarker(vz[mHits-1],vy[mHits-1]);
+  
+  fLine.SetLineWidth(1);   
+  return 1;
+}
 
-  // YX
-  for( Int_t iHit=0; iHit<track.NHits()-1; iHit++ ){
 
-    AliHLTTPCCAGBHit &h1 = tracker.Hits()[vHits[iHit].ID()];
-    AliHLTTPCCAGBHit &h2 = tracker.Hits()[vHits[iHit+1].ID()];
-    Double_t vx1, vy1, vx2, vy2;
-    
-    if( h1.ISlice() != oldSlice ){
-      //t.Rotate( tracker.Slices()[h1.ISlice()].Param().Alpha() - alpha);
-      oldSlice = h1.ISlice();
-      //alpha = tracker.Slices()[h1.ISlice()].Param().Alpha();
-      SetSliceTransform( &(tracker.Slices()[oldSlice]) );
-    }
-    Float_t x1=h1.X(), y1=h1.Y(), z1=h1.Z();
-    //t.GetDCAPoint( x1, y1, z1, x1, y1, z1 );  
-    Slice2View(x1, y1, &vx1, &vy1 );
-    px[iHit] = vx1;
-    py[iHit] = vy1;
-    pz[iHit] = z1;
+Bool_t AliHLTTPCCADisplay::DrawTracklet( AliHLTTPCCATrackParam &track, Int_t *hitstore, Int_t color,Double_t width, Bool_t pPoint )
+{
+  // draw tracklet
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  AliHLTTPCCADisplayTmpHit vHits[200];
+  Int_t nHits = 0; 
+  for( Int_t iRow=0; iRow<fSlice->Param().NRows(); iRow++ ){
+    Int_t iHit = hitstore[iRow];
+    if( iHit<0 ) continue;    
+    const AliHLTTPCCARow &row = fSlice->Row(iRow);
+    Int_t id = fSlice->HitInputIDs()[row.FirstHit()+iHit];
+    Int_t iGBHit = tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id;
+    AliHLTTPCCAGBHit &h = tracker.Hits()[iGBHit];
+    vHits[nHits].SetID( iGBHit );
+    vHits[nHits].SetS( 0 );
+    vHits[nHits].SetZ( h.Z() );
+    nHits++;
+  }
+  return DrawTrack( track, -1, vHits, nHits, color,width,pPoint );
+}
 
-    if( h2.ISlice() != oldSlice ){
-      //t.Rotate( tracker.Slices()[h2.ISlice()].Param().Alpha() - alpha);
-      oldSlice = h2.ISlice();
-      //alpha = tracker.Slices()[h2.ISlice()].Param().Alpha();
-      SetSliceTransform( &(tracker.Slices()[oldSlice]) );
-    }
-    Float_t x2=h2.X(), y2=h2.Y(), z2=h2.Z();
-    //t.GetDCAPoint( h2.X(), h2.Y(), h2.Z(), x2, y2, z2 );
-    Slice2View(x2, y2, &vx2, &vy2 );
-    px[iHit+1] = vx2;
-    py[iHit+1] = vy2;
-    pz[iHit+1] = z2;
 
-    continue;
+void AliHLTTPCCADisplay::DrawSliceOutTrack( AliHLTTPCCATrackParam &t, Double_t alpha, Int_t itr, Int_t color, Double_t width )
+{
+  // draw slice track
+  
+  AliHLTTPCCAOutTrack &track = fSlice->OutTracks()[itr];
+  if( track.NHits()<2 ) return;
 
-    Double_t x0 = t.GetX();
-    Double_t y0 = t.GetY();
-    Double_t sinPhi = t.GetSinPhi();
-    Double_t k = t.GetKappa();
-    Double_t ex = t.GetCosPhi();
-    Double_t ey = sinPhi;
-    if( TMath::Abs(k)>1.e-4 ){
-      
-      fYX->cd();
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  AliHLTTPCCADisplayTmpHit vHits[200];
 
-      Double_t r = 1/TMath::Abs(k);
-      Double_t xc = x0 -ey*(1/k);
-      Double_t yc = y0 +ex*(1/k);
-     
-      Double_t vx, vy;
-      Slice2View( xc, yc, &vx, &vy );
-      
-      Double_t a1 = TMath::ATan2(vy1-vy, vx1-vx)/TMath::Pi()*180.;
-      Double_t a2 = TMath::ATan2(vy2-vy, vx2-vx)/TMath::Pi()*180.;
-      if( a1<0 ) a1+=360;
-      if( a2<0 ) a2+=360;
-      if( a2<a1 ) a2+=360;
-      Double_t da = TMath::Abs(a2-a1);
-      if( da>360 ) da-= 360;
-      if( da>180 ){
-       da = a1;
-       a1 = a2;
-       a2 = da;
-       if( a2<a1 ) a2+=360;    
-      }
-      fArc.DrawArc(vx,vy,r, a1,a2,"only");
-      //fArc.DrawArc(vx,vy,r, 0,360,"only");
-   } else {
-      fYX->cd();
-      fLine.DrawLine(vx1,vy1, vx2, vy2 );
-   }
+  for( Int_t ih=0; ih<track.NHits(); ih++ ){
+    Int_t id = tracker.FirstSliceHit()[fSlice->Param().ISlice()] + fSlice->OutTrackHits()[track.FirstHitRef()+ih];  
+    AliHLTTPCCAGBHit &h = tracker.Hits()[id];
+    vHits[ih].SetID( id );
+    vHits[ih].SetS( 0 );
+    vHits[ih].SetZ( h.Z() );
   }
+
+  DrawTrack( t, alpha, vHits, track.NHits(), color, width, 1 );
+}
+
+void AliHLTTPCCADisplay::DrawSliceOutTrack( Int_t itr, Int_t color, Double_t width )
+{
+  // draw slice track
   
-  fYX->cd();
-  pl.DrawPolyLine(track.NHits(),px,py);    
-  fZX->cd();
-  plZ.DrawPolyLine(track.NHits(),pz,py);
+  AliHLTTPCCAOutTrack &track = fSlice->OutTracks()[itr];
+  if( track.NHits()<2 ) return;
+
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  AliHLTTPCCADisplayTmpHit vHits[200];
+
+  for( Int_t ih=0; ih<track.NHits(); ih++ ){
+    Int_t id = tracker.FirstSliceHit()[fSlice->Param().ISlice()] + fSlice->OutTrackHits()[track.FirstHitRef()+ih];  
+    AliHLTTPCCAGBHit &h = tracker.Hits()[id];
+    vHits[ih].SetID( id );
+    vHits[ih].SetS( 0 );
+    vHits[ih].SetZ( h.Z() );
+  }
+
+  DrawTrack( track.StartPoint(), -1, vHits, track.NHits(), color, width );
+}
+
+
+void AliHLTTPCCADisplay::DrawSliceTrack( Int_t itr, Int_t color )
+{
+  // draw slice track
   
-  fLine.SetLineWidth(1);     
+  AliHLTTPCCATrack &track = fSlice->Tracks()[itr];
+  if( track.NHits()<2 ) return;
+
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  AliHLTTPCCADisplayTmpHit vHits[200];  
+  for( Int_t ith=0; ith<track.NHits(); ith++ ){
+    Int_t ic = (fSlice->TrackHits()[track.FirstHitID()+ith]);
+    const AliHLTTPCCARow &row = fSlice->ID2Row(ic);
+    Int_t ih = fSlice->ID2IHit(ic);
+    int id = fSlice->HitInputIDs()[row.FirstHit()+ih];
+    Int_t gbID = tracker.FirstSliceHit()[fSlice->Param().ISlice()] + id;
+    AliHLTTPCCAGBHit &h = tracker.Hits()[gbID];
+    vHits[ith].SetID( gbID );
+    vHits[ith].SetS( 0 );
+    vHits[ith].SetZ( h.Z() );
+  }
+
+  DrawTrack( track.Param(), -1, vHits, track.NHits(), color,-1 );
+  //track.Param().Print();
+}
+
+
+void AliHLTTPCCADisplay::DrawGBTrack( Int_t itr, Int_t color, Double_t width )
+{
+  // draw global track
+
+  AliHLTTPCCAGBTracker &tracker = *fGB;
+  AliHLTTPCCADisplayTmpHit vHits[1000];
+  
+  AliHLTTPCCAGBTrack &track = tracker.Tracks()[itr];
+  if( track.NHits()<2 ) return;
+
+  for( Int_t ih=0; ih<track.NHits(); ih++ ){
+    Int_t i = tracker.TrackHits()[ track.FirstHitRef() + ih];
+    AliHLTTPCCAGBHit &h = tracker.Hits()[i];
+    vHits[ih].SetID( i );
+    vHits[ih].SetS( 0 );
+    vHits[ih].SetZ( h.Z() );
+  }
+
+  DrawTrack( track.Param(), track.Alpha(), vHits, track.NHits(), color, width );
 }
 
+
 void AliHLTTPCCADisplay::DrawGBTrackFast( AliHLTTPCCAGBTracker &tracker, Int_t itr, Int_t color )
 {
   // draw global track
@@ -491,14 +851,14 @@ void AliHLTTPCCADisplay::DrawGBTrackFast( AliHLTTPCCAGBTracker &tracker, Int_t i
   Int_t width = 1;
 
   AliHLTTPCCADisplayTmpHit *vHits = new AliHLTTPCCADisplayTmpHit[track.NHits()];
-  AliHLTTPCCATrackParam &t = track.Param();
+  AliHLTTPCCATrackParam t = track.Param();
   
   for( Int_t ih=0; ih<track.NHits(); ih++ ){
     Int_t i = tracker.TrackHits()[ track.FirstHitRef() + ih];
     AliHLTTPCCAGBHit *h = &(tracker.Hits()[i]);
-    vHits[ih].ID() = i;
-    vHits[ih].S() = 0;
-    vHits[ih].Z() = h->Z();
+    vHits[ih].SetID( i );
+    vHits[ih].SetS( 0 );
+    vHits[ih].SetZ( h->Z() );
   }  
 
   sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
@@ -506,7 +866,7 @@ void AliHLTTPCCADisplay::DrawGBTrackFast( AliHLTTPCCAGBTracker &tracker, Int_t i
   {
     AliHLTTPCCAGBHit &h1 = tracker.Hits()[ vHits[0].ID()];
     AliHLTTPCCAGBHit &h2 = tracker.Hits()[ vHits[track.NHits()-1].ID()];
-    if( color<0 ) color = GetColor( (h1.Z()+h2.Z())/2. );
+    if( color<0 ) color = GetColorZ( (h1.Z()+h2.Z())/2. );
     Double_t gx1, gy1, gx2, gy2;
     Slice2View(h1.X(), h1.Y(), &gx1, &gy1 );
     Slice2View(h2.X(), h2.Y(), &gx2, &gy2 );
@@ -622,44 +982,9 @@ void AliHLTTPCCADisplay::DrawGBTrackFast( AliHLTTPCCAGBTracker &tracker, Int_t i
 
 
 
-#ifdef XXXX
-
-
-void AliHLTTPCCADisplay::DrawHit( Int_t iRow, Int_t iHit, Int_t color )
-{
-  // draw hit
-  if( !fSlice ) return;
-  AliHLTTPCCARow &row = fSlice->Rows()[iRow];
-  AliHLTTPCCAHit *h = &(fSlice->Hits()[row.FirstHit()+iHit]);
-  if( color<0 ) color = GetColor( h->Z() );
-  
-  //Double_t dgy = 3.5*TMath::Abs(h->ErrY()*fSlice->Param().CosAlpha() - fSlice->Param().ErrX()*fSlice->Param().SinAlpha() );
-  Double_t dx = 0.1;//fSlice->Param().ErrX()*TMath::Sqrt(12.)/2.;
-  Double_t dy = 0.35;//h->ErrY()*3.5;
-  //Double_t dz = h->ErrZ()*3.5;
-  fMarker.SetMarkerSize(.5);
-  //fMarker.SetMarkerSize(.3);
-  fMarker.SetMarkerColor(color);
-  fArc.SetLineColor(color);
-  fArc.SetFillStyle(0);
-  Double_t vx, vy, dvx, dvy;
-  Slice2View( row.X(), h->Y(), &vx, &vy );
-  Slice2View( dx, dy, &dvx, &dvy );
-  
-  fYX->cd();
-  //if( fSliceView ) fArc.DrawEllipse( vx, vy, dvx, dvy, 0,360, 0);
-  //else  fArc.DrawEllipse( vx, vy, dx, dy, 0,360, fSlice->Param().Alpha()*180./3.1415);
-  fMarker.DrawMarker(vy, vx);
-  fZX->cd();
-  //if( fSliceView ) fArc.DrawEllipse( h->Z(), vy, dz, dvy, 0,360, 0 );
-  //else fArc.DrawEllipse( h->Z(), vy, dz, dgy, 0,360, fSlice->Param().Alpha()*180./3.1415);
-  fMarker.DrawMarker(h->Z(), vx); 
-}
-
-
 
 
+#ifdef XXXX
  
 
 
@@ -669,7 +994,7 @@ void AliHLTTPCCADisplay::DrawMergedHit( Int_t iRow, Int_t iHit, Int_t color )
 #ifdef XXX
   // connect two cells on display, kind of row is drawing
   
-  AliHLTTPCCARow &row = fSlice->Rows()[iRow];
+  const AliHLTTPCCARow &row = fSlice->Row(iRow);
   AliHLTTPCCAHit &h = row.Hits()[iHit];
   AliHLTTPCCAHit &hyz = row.HitsYZ()[iHit];
 
@@ -700,7 +1025,7 @@ void AliHLTTPCCADisplay::DrawMergedHit( Int_t iRow, Int_t iHit, Int_t color )
     y2 = h2.Y();
     z2 = h2.Z();
   }
-  if( color<0 ) color = GetColor( (z+z1+z2)/3. );
+  if( color<0 ) color = GetColorZ( (z+z1+z2)/3. );
 
 
   Slice2View(x,y, &x, &y );
@@ -754,11 +1079,11 @@ void AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrack &track, Int_t color, Bool_t
     }
   }
   sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
-  cout<<"Draw track, nhits = "<<nhits<<endl;
+  //cout<<"Draw track, nhits = "<<nhits<<endl;
   {
     AliHLTTPCCAHit &c1 = fSlice->ID2Hit(vHits[0].ID());
     AliHLTTPCCAHit &c2 = fSlice->ID2Hit(vHits[track.NHits()-1].ID());
-    if( color<0 ) color = GetColor( (c1.Z()+c2.Z())/2. );
+    if( color<0 ) color = GetColorZ( (c1.Z()+c2.Z())/2. );
   }
   
   fMarker.SetMarkerColor(color);//kBlue);
@@ -789,7 +1114,7 @@ void AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrack &track, Int_t color, Bool_t
     t.GetDCAPoint( row1.X(), c1.Y(), c1.Z(), x1, y1, z1 );
     t.GetDCAPoint( row2.X(), c2.Y(), c2.Z(), x2, y2, z2 );
 
-    //if( color<0 ) color = GetColor( (z1+z2)/2. );
+    //if( color<0 ) color = GetColorZ( (z1+z2)/2. );
     Double_t vx1, vy1, vx2, vy2;
     Slice2View(x1, y1, &vx1, &vy1 );
     Slice2View(x2, y2, &vx2, &vy2 );
@@ -845,7 +1170,7 @@ void AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrack &track, Int_t color, Bool_t
     AliHLTTPCCAHit &c2 = fSlice->ID2Hit(vHits[iHit+1].ID());
     AliHLTTPCCARow &row1 = fSlice->ID2Row(vHits[iHit].ID());
     AliHLTTPCCARow &row2 = fSlice->ID2Row(vHits[iHit+1].ID());
-
+    
     //if( DrawHits ) ConnectHits( fSlice->ID2IRow(vHits[iHit].ID()),c1,
     //fSlice->ID2IRow(vHits[iHit+1].ID()),c2, color );
     Float_t x1, y1, z1, x2, y2, z2;
@@ -881,7 +1206,7 @@ void AliHLTTPCCADisplay::DrawTrackletPoint( AliHLTTPCCATrackParam &t, Int_t colo
 
   Int_t width = 1;
 
-  if( color<0 ) color = GetColor( t.GetZ() );
+  if( color<0 ) color = GetColorZ( t.GetZ() );
     
   fMarker.SetMarkerColor(color);
   fMarker.SetMarkerSize(.5);