]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/TPCLib/tracking-ca/AliHLTTPCCADisplay.cxx
5ffa20d196bc3c7f6fb93f7df034836774e67509
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCADisplay.cxx
1 // $Id$
2 // **************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project          * 
4 // ALICE Experiment at CERN, All rights reserved.                           *
5 //                                                                          *
6 // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
7 //                  Ivan Kisel <kisel@kip.uni-heidelberg.de>                *
8 //                  for The ALICE HLT Project.                              *
9 //                                                                          *
10 // Permission to use, copy, modify and distribute this software and its     *
11 // documentation strictly for non-commercial purposes is hereby granted     *
12 // without fee, provided that the above copyright notice appears in all     *
13 // copies and that both the copyright notice and this permission notice     *
14 // appear in the supporting documentation. The authors make no claims       *
15 // about the suitability of this software for any purpose. It is            *
16 // provided "as is" without express or implied warranty.                    *
17 //                                                                          *
18 //***************************************************************************
19
20
21 #include "AliHLTTPCCADisplay.h"
22
23
24 #include "AliHLTTPCCATracker.h"
25 #include "AliHLTTPCCAGBTracker.h"
26 #include "AliHLTTPCCARow.h"
27 #include "AliHLTTPCCATrack.h"
28 #include "AliHLTTPCCAGBTrack.h"
29 #include "AliHLTTPCCAGBHit.h"
30 #include "AliHLTTPCCAPerformance.h"
31 #include "AliHLTTPCCAMCTrack.h"
32 #include "AliHLTTPCCAOutTrack.h"
33
34 #include "TString.h"
35 #include "Riostream.h"
36 #include "TMath.h"
37 #include "TStyle.h"
38 #include "TCanvas.h"
39 #include "TApplication.h"
40
41
42
43
44 AliHLTTPCCADisplay &AliHLTTPCCADisplay::Instance()
45 {
46   // reference to static object
47   static AliHLTTPCCADisplay gAliHLTTPCCADisplay;
48   static Bool_t firstCall = 1;
49   if( firstCall ){
50     if( !gApplication ) new TApplication("myapp",0,0);
51     gAliHLTTPCCADisplay.Init();
52     firstCall = 0;
53   }
54   return gAliHLTTPCCADisplay; 
55 }
56
57 AliHLTTPCCADisplay::AliHLTTPCCADisplay() : fYX(0), fZX(0), fAsk(1), fSliceView(1), fSlice(0),fGB(0), fPerf(0), 
58                                            fCos(1), fSin(0), fZMin(-250), fZMax(250),fYMin(-250), fYMax(250),fSliceCos(1), fSliceSin(0),
59                                            fRInnerMin(83.65), fRInnerMax(133.3), fROuterMin(133.5), fROuterMax(247.7),
60                                            fTPCZMin(-250.), fTPCZMax(250), fArc(), fLine(), fPLine(), fMarker(), fBox(), fCrown(), fLatex(), fDrawOnlyRef(0)
61 {
62   fPerf = &(AliHLTTPCCAPerformance::Instance());
63   // constructor
64
65
66
67 AliHLTTPCCADisplay::AliHLTTPCCADisplay( const AliHLTTPCCADisplay& ) 
68   : fYX(0), fZX(0), fAsk(1), fSliceView(1), fSlice(0), fGB(0), fPerf(0),
69     fCos(1), fSin(0), fZMin(-250), fZMax(250), fYMin(-250), fYMax(250), fSliceCos(1), fSliceSin(0),
70     fRInnerMin(83.65), fRInnerMax(133.3), fROuterMin(133.5), fROuterMax(247.7),
71     fTPCZMin(-250.), fTPCZMax(250), fArc(), fLine(), fPLine(), fMarker(), fBox(), fCrown(), fLatex(), fDrawOnlyRef(0)
72 {
73   // dummy
74 }
75
76 const AliHLTTPCCADisplay& AliHLTTPCCADisplay::operator=( const AliHLTTPCCADisplay& ) const 
77 {
78   // dummy
79   return *this;
80 }
81  
82 AliHLTTPCCADisplay::~AliHLTTPCCADisplay()
83 {
84   // destructor
85   delete fYX; 
86   delete fZX;
87 }
88
89 void AliHLTTPCCADisplay::Init()
90 {
91   // initialization
92   gStyle->SetCanvasBorderMode(0);
93   gStyle->SetCanvasBorderSize(1);
94   gStyle->SetCanvasColor(0);
95   fYX = new TCanvas ("YX", "YX window", -1, 0, 600, 600);
96   fZX = new TCanvas ("ZX", "ZX window", -610, 0, 590, 600);  
97   fMarker = TMarker(0.0, 0.0, 20);//6);
98   fDrawOnlyRef = 0;
99 }
100
101 void AliHLTTPCCADisplay::Update()
102 {
103   // update windows
104   if( !fAsk ) return;
105   fYX->Update();
106   fZX->Update();
107   fYX->Print("YX.pdf");
108   fZX->Print("ZX.pdf");
109  
110 }
111
112 void AliHLTTPCCADisplay::ClearView()
113 {
114   // clear windows
115   fYX->Clear();
116   fZX->Clear();
117 }
118
119 void AliHLTTPCCADisplay::Ask()
120 {
121   // whait for the pressed key, when "r" pressed, don't ask anymore
122   char symbol;
123   if (fAsk){
124     Update();
125     std::cout<<"ask> "<<std::endl;
126     do{
127       std::cin.get(symbol);
128       if (symbol == 'r')
129         fAsk = false;
130     } while (symbol != '\n');
131   }
132 }
133
134
135 void AliHLTTPCCADisplay::SetSliceView()
136 {
137   // switch to slice view
138   fSliceView = 1;
139 }
140
141 void AliHLTTPCCADisplay::SetTPCView()
142 {
143   // switch to full TPC view
144   fSliceView = 0;
145   fCos = 1;
146   fSin = 0;
147   fZMin = fTPCZMin;
148   fZMax = fTPCZMax;
149   fYMin = -fROuterMax;
150   fYMax = fROuterMax;
151 }
152
153
154 void AliHLTTPCCADisplay::SetGB( AliHLTTPCCAGBTracker * const GBTracker )
155 {
156   fGB = GBTracker;
157 }
158
159 void AliHLTTPCCADisplay::SetCurrentSlice( AliHLTTPCCATracker *slice )
160 {
161   // set reference to the current CA tracker, and read the current slice geometry
162   fSlice = slice;
163   SetSliceTransform( slice );
164   if( fSliceView ){
165     fCos = slice->Param().SinAlpha();
166     fSin = slice->Param().CosAlpha();
167     fZMin = slice->Param().ZMin();
168     fZMax = slice->Param().ZMax();
169     ClearView();
170     Double_t r0 = .5*(slice->Param().RMax()+slice->Param().RMin());
171     Double_t dr = .5*(slice->Param().RMax()-slice->Param().RMin());
172     fYMin = -dr;
173     fYMax = dr;
174     Double_t cx = 0;
175     Double_t cy = r0;    
176     Double_t cz = .5*(slice->Param().ZMax()+slice->Param().ZMin());
177     Double_t dz = .5*(slice->Param().ZMax()-slice->Param().ZMin())*1.2;
178     fYX->Range(cx-dr, cy-dr*1.05, cx+dr, cy+dr);
179     fZX->Range(cz-dz, cy-dr*1.05, cz+dz, cy+dr);
180     
181     //fYX->Range(cx-dr*.3, cy-dr*1.05, cx+dr*.3, cy-dr*.35);
182     //fZX->Range(cz-dz, cy-dr*1.05, cz+dz, cy-dr*.3);
183
184     //fYX->Range(cx-dr*.3, cy-dr*.8, cx-dr*.1, cy-dr*.75);
185     //fZX->Range(cz-dz*0, cy-dr*.8, cz+dz, cy-dr*.75);
186
187     //fYX->Range(cx-dr*.08, cy-dr*1., cx-dr*.02, cy-dr*0.7);
188     //fZX->Range(cz-dz*.2, cy-dr*1., cz-dz*.05, cy-dr*0.7);
189     
190     //Double_t x0 = cx-dr*.1, x1 = cx-dr*.05;
191     //Double_t y0 = cy-dr*1.05, y1 = cy-dr*0.7;
192     //Double_t z0 = cz-dz*.3, z1 = cz;
193     //Double_t xc = (x0+x1)/2, yc= (y0+y1)/2, zc=(z0+z1)/2;
194     //Double_t d = TMath::Max((x1-x0)/2,TMath::Max((y1-y0)/2,(z1-z0)/2));
195     //fYX->Range(xc-d, yc-d, xc+d, yc+d);
196     //fZX->Range(zc-d, yc-d, zc+d, yc+d);
197     
198    }
199 }
200
201 void AliHLTTPCCADisplay::SetSliceTransform( Double_t alpha )
202 {
203   fSliceCos = TMath::Cos( alpha );
204   fSliceSin = TMath::Sin( alpha );
205
206
207 void AliHLTTPCCADisplay::SetSliceTransform( AliHLTTPCCATracker *slice )
208 {
209   SetSliceTransform(slice->Param().Alpha());
210 }
211
212
213 void AliHLTTPCCADisplay::DrawTPC()
214 {
215   // schematically draw TPC detector
216   fYX->Range(-fROuterMax, -fROuterMax, fROuterMax, fROuterMax);
217   //fYX->Range( -fROuterMax*.7, -fROuterMax, fROuterMax*0., -fROuterMax*.5);
218   fYX->Clear();
219   {
220     fArc.SetLineColor(kBlack);
221     fArc.SetFillStyle(0);
222     fYX->cd();    
223     for( Int_t iSlice=0; iSlice<18; iSlice++){
224       fCrown.SetLineColor(kBlack);
225       fCrown.SetFillStyle(0);
226       fCrown.DrawCrown(0,0,fRInnerMin, fRInnerMax, 360./18.*iSlice, 360./18.*(iSlice+1) );
227       fCrown.DrawCrown(0,0,fROuterMin, fROuterMax, 360./18.*iSlice, 360./18.*(iSlice+1) );
228     }
229   }
230   fZX->cd();
231   fZX->Range( fTPCZMin, -fROuterMax, fTPCZMax*1.1, fROuterMax );
232   //fZX->Range( fTPCZMax*.1, -fROuterMax, fTPCZMax*.3, -fROuterMax*0.5 );
233   fZX->Clear();
234 }
235
236 void AliHLTTPCCADisplay::DrawSlice( AliHLTTPCCATracker *slice, Bool_t DrawRows )
237 {     
238   // draw current the TPC slice
239   fYX->cd();
240   Double_t r0 = .5*(slice->Param().RMax()+slice->Param().RMin());
241   Double_t dr = .5*(slice->Param().RMax()-slice->Param().RMin());
242   Double_t cx = r0*slice->Param().CosAlpha();
243   Double_t cy = r0*slice->Param().SinAlpha();
244   Double_t raddeg = 180./3.1415;
245   Double_t a0 = raddeg*.5*(slice->Param().AngleMax() + slice->Param().AngleMin());
246   Double_t da = raddeg*.5*(slice->Param().AngleMax() - slice->Param().AngleMin());
247   if( fSliceView ){
248     cx = 0; cy = r0;
249     a0 = 90.;
250     fLatex.DrawLatex(cx-dr+dr*.05,cy-dr+dr*.05, Form("YX, Slice %2i",slice->Param().ISlice()));
251   } else {
252     a0+= raddeg*TMath::ATan2(fSin, fCos );
253   }
254   fArc.SetLineColor(kBlack);
255   fArc.SetFillStyle(0);     
256   fCrown.SetLineColor(kBlack);
257   fCrown.SetFillStyle(0);
258   fCrown.DrawCrown(0,0, fRInnerMin, fRInnerMax, a0-da, a0+da );
259   fCrown.DrawCrown(0,0, fROuterMin, fROuterMax, a0-da, a0+da );
260   //fCrown.DrawCrown(0,0, slice->Param().RMin(),slice->Param().RMax(), a0-da, a0+da );
261   
262   fLine.SetLineColor(kBlack);
263  
264   fZX->cd();
265
266   Double_t cz = .5*(slice->Param().ZMax()+slice->Param().ZMin());
267   Double_t dz = .5*(slice->Param().ZMax()-slice->Param().ZMin())*1.2;
268   //fLine.DrawLine(cz+dz, cy-dr, cz+dz, cy+dr ); 
269   if( fSliceView ) fLatex.DrawLatex(cz-dz+dz*.05,cy-dr+dr*.05, Form("ZX, Slice %2i",slice->Param().ISlice()));
270
271   if( DrawRows ){
272     fLine.SetLineWidth(1);
273     fLine.SetLineColor(kBlack);    
274     SetSliceTransform(fSlice);      
275     for( Int_t iRow=0; iRow<fSlice->Param().NRows(); iRow++ ){
276       Double_t x = fSlice->Row(iRow).X();
277       Double_t y = fSlice->Row(iRow).MaxY();
278       Double_t vx0, vy0, vx1, vy1;
279       Slice2View( x, y, &vx0, &vy0 );  
280       Slice2View( x, -y, &vx1, &vy1 );    
281       fYX->cd();
282       fLine.DrawLine(vx0, vy0,vx1,vy1);
283       fZX->cd();
284       fLine.DrawLine(fTPCZMin, vy0,fTPCZMax,vy1);
285     }
286   }
287
288 }
289
290
291 void AliHLTTPCCADisplay::Set2Slices( AliHLTTPCCATracker * const slice )
292 {
293   //* Set view for two neighbouring slices
294
295   fSlice = slice;
296   fSliceView = 0;
297   fCos = TMath::Cos(TMath::Pi()/2 - (slice->Param().Alpha()+10./180.*TMath::Pi()));
298   fSin = TMath::Sin(TMath::Pi()/2 - (slice->Param().Alpha()+10./180.*TMath::Pi()));
299   fZMin = slice->Param().ZMin();
300   fZMax = slice->Param().ZMax();
301   ClearView();
302   Double_t r0 = .5*(slice->Param().RMax()+slice->Param().RMin());
303   Double_t dr = .5*(slice->Param().RMax()-slice->Param().RMin());
304   Double_t cx = 0;
305   Double_t cy = r0;    
306   fYX->Range(cx-1.3*dr, cy-1.1*dr, cx+1.3*dr, cy+1.1*dr);
307   fYX->cd();
308   Int_t islice = slice->Param().ISlice();
309   Int_t jslice = slice->Param().ISlice()+1;
310   if( islice==17 ) jslice = 0;
311   else if( islice==35 ) jslice = 18;
312   fLatex.DrawLatex(cx-1.3*dr+1.3*dr*.05,cy-dr+dr*.05, Form("YX, Slices %2i/%2i",islice,jslice));
313   Double_t cz = .5*(slice->Param().ZMax()+slice->Param().ZMin());
314   Double_t dz = .5*(slice->Param().ZMax()-slice->Param().ZMin())*1.2;
315   fZX->Range(cz-dz, cy-1.1*dr, cz+dz, cy+1.1*dr);//+dr);
316   fZX->cd();  
317   fLatex.DrawLatex(cz-dz+dz*.05,cy-dr+dr*.05, Form("ZX, Slices %2i/%2i",islice,jslice));
318 }
319
320 Int_t AliHLTTPCCADisplay::GetColor( Int_t i ) const 
321 {
322   // Get color with respect to Z coordinate
323   const Color_t kMyColor[9] = { kGreen, kBlue, kYellow, kCyan, kOrange, 
324                                  kSpring, kTeal, kAzure, kViolet };
325   if( i<0 ) i= 0;
326   if( i==0 ) return kBlack;
327   return kMyColor[(i-1)%9];
328 }
329
330 Int_t AliHLTTPCCADisplay::GetColorZ( Double_t z ) const 
331 {
332   // Get color with respect to Z coordinate
333   const Color_t kMyColor[11] = { kGreen, kBlue, kYellow, kMagenta, kCyan, 
334                                  kOrange, kSpring, kTeal, kAzure, kViolet, kPink };
335
336   Double_t zz = (z-fZMin)/(fZMax-fZMin);    
337   Int_t iz = (int) (zz*11);
338   if( iz<0 ) iz = 0;
339   if( iz>10 ) iz = 10;
340   return kMyColor[iz];
341 }
342
343 Int_t AliHLTTPCCADisplay::GetColorY( Double_t y ) const 
344 {
345   // Get color with respect to Z coordinate
346   const Color_t kMyColor[11] = { kGreen, kBlue, kYellow, kMagenta, kCyan, 
347                                  kOrange, kSpring, kTeal, kAzure, kViolet, kPink };
348
349   Double_t yy = (y-fYMin)/(fYMax-fYMin);    
350   Int_t iy = (int) (yy*11);
351   if( iy<0 ) iy = 0;
352   if( iy>10 ) iy = 10;
353   return kMyColor[iy];
354 }
355
356 Int_t AliHLTTPCCADisplay::GetColorK( Double_t k ) const 
357 {
358   // Get color with respect to Z coordinate
359   const Color_t kMyColor[11] = { kRed, kBlue, kYellow, kMagenta, kCyan, 
360                                  kOrange, kSpring, kTeal, kAzure, kViolet, kPink };
361   const Double_t kCLight = 0.000299792458;  
362   const Double_t kBz = 5;
363   Double_t k2QPt = 100;
364   if( TMath::Abs(kBz)>1.e-4 ) k2QPt= 1./(kBz*kCLight);
365   Double_t qPt = k*k2QPt;
366   Double_t pt = 100;
367   if( TMath::Abs(qPt) >1.e-4 ) pt = 1./TMath::Abs(qPt);
368   
369   Double_t yy = (pt-0.1)/(1.-0.1);
370   Int_t iy = (int) (yy*11);
371   if( iy<0 ) iy = 0;
372   if( iy>10 ) iy = 10;
373   return kMyColor[iy];
374 }
375
376 void AliHLTTPCCADisplay::Global2View( Double_t x, Double_t y, Double_t *xv, Double_t * yv ) const
377 {
378   // convert coordinates global->view
379   *xv = x*fCos + y*fSin;
380   *yv = y*fCos - x*fSin;
381 }
382
383
384 void AliHLTTPCCADisplay::Slice2View( Double_t x, Double_t y, Double_t *xv, Double_t *yv ) const
385 {
386   // convert coordinates slice->view
387   Double_t xg = x*fSliceCos - y*fSliceSin;
388   Double_t yg = y*fSliceCos + x*fSliceSin;
389   *xv = xg*fCos - yg*fSin;
390   *yv = yg*fCos + xg*fSin;
391 }
392
393
394 void AliHLTTPCCADisplay::DrawGBHit( AliHLTTPCCAGBTracker &tracker, Int_t iHit, Int_t color, Size_t width  )
395 {
396   // draw hit
397   AliHLTTPCCAGBHit &h = tracker.Hits()[iHit];
398   AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
399   SetSliceTransform(&slice);
400   
401   if( color<0 ){
402     if( fPerf ){
403       Int_t lab = fPerf->HitLabels()[h.ID()].fLab[0];
404       color = GetColor(lab+1);
405       if( lab>=0 ){
406         AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
407         if( mc.P()>=1. ) color = kRed;  
408         else if(fDrawOnlyRef) return;
409       }
410     }else color=GetColorZ( h.Z() );
411   }
412   if( width>0 )fMarker.SetMarkerSize(width);
413   else fMarker.SetMarkerSize(.3);
414   fMarker.SetMarkerColor(color);
415   Double_t vx, vy;
416   Slice2View( h.X(), h.Y(), &vx, &vy );  
417   
418   fYX->cd();
419   fMarker.DrawMarker(vx, vy);
420   fZX->cd();  
421   fMarker.DrawMarker(h.Z(), vy); 
422 }
423
424 void AliHLTTPCCADisplay::DrawGBHits( AliHLTTPCCAGBTracker &tracker, Int_t color, Size_t width )
425 {
426   // draw hits 
427
428   if( !fPerf ) return;
429   if( width<0 ) width = .3;
430     
431   for( Int_t iHit = 0; iHit<tracker.NHits(); iHit++ ){
432     AliHLTTPCCAGBHit &h = tracker.Hits()[iHit];
433     Int_t imc = fPerf->HitLabels()[h.ID()].fLab[0];
434     AliHLTTPCCAMCTrack *mc = (imc>=0) ?&(fPerf->MCTracks()[imc]) :0;
435     if(fDrawOnlyRef && (!mc || (mc->P()<1))) continue;
436     Int_t col = color;
437     if( color<0 ){
438       col = GetColor(imc+1) ;
439       if( mc && (mc->P()>=1.) ) col = kRed;         
440     }    
441
442     AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
443     SetSliceTransform(&slice);
444
445     fMarker.SetMarkerSize(width);
446     fMarker.SetMarkerColor(col);
447     Double_t vx, vy;
448     Slice2View( h.X(), h.Y(), &vx, &vy );  
449       
450     fYX->cd();
451     fMarker.DrawMarker(vx, vy);
452     fZX->cd();  
453     fMarker.DrawMarker(h.Z(), vy); 
454   }
455 }
456
457 void AliHLTTPCCADisplay::DrawSliceHit( Int_t iRow, Int_t iHit, Int_t color, Size_t width )
458 {
459   // draw hit
460   if( !fSlice ) return;
461   AliHLTTPCCAGBTracker &tracker = *fGB;
462   const AliHLTTPCCARow &row = fSlice->Row(iRow);
463   Int_t id = tracker.FirstSliceHit()[fSlice->Param().ISlice()]+fSlice->HitInputIDs()[row.FirstHit()+iHit];
464   DrawGBHit(  tracker, id, color, width );
465 }
466
467 void AliHLTTPCCADisplay::DrawSliceHits( Int_t color, Size_t width )
468 {
469   // draw hits 
470
471   if( !fPerf || !fGB) return;
472   AliHLTTPCCAGBTracker &tracker = *fGB;
473   if( width<0 ) width = .3;
474
475   for( Int_t imc=-3; imc<fPerf->NMCTracks(); imc++ ){
476     Int_t nh=0;
477     AliHLTTPCCAMCTrack *mc = (imc>=0) ?&(fPerf->MCTracks()[imc]) :0;
478  
479     if(fDrawOnlyRef && (!mc || (mc->P()<1))) continue;
480   
481     Int_t col = color;
482     if( color<0 ){
483       col = GetColor(imc+1);
484       if( imc>=0 ){
485         if( mc&&(mc->P()>=1.) ) col = kRed;     
486       }
487     }
488
489     for( Int_t ih=0; ih<fSlice->NHitsTotal(); ih++ ){   
490        Int_t id = fSlice->HitInputIDs()[ih];
491       AliHLTTPCCAGBHit &h = tracker.Hits()[tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id];
492       if( fPerf->HitLabels()[h.ID()].fLab[0] != imc ) continue;
493       nh++;
494       //AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
495       //SetSliceTransform(&slice);
496       
497       fMarker.SetMarkerSize(width);
498       fMarker.SetMarkerColor(col);
499       Double_t vx, vy;
500       Slice2View( h.X(), h.Y(), &vx, &vy );  
501       
502       fYX->cd();
503       fMarker.DrawMarker(vx, vy);
504       fZX->cd();  
505       fMarker.DrawMarker(h.Z(), vy);     
506     }
507     //if( nh<=0 ) continue;
508     //float p = mc ? mc->P() :0;  
509     //std::cout<<"lab,nhits,color= "<<imc<<" "<<nh<<" "<<col<<std::endl;
510     //Ask();
511   }
512 }
513
514
515 void AliHLTTPCCADisplay::DrawSliceLink( Int_t iRow, Int_t iHit, Int_t colorUp, Int_t colorDn, Int_t width )
516 {
517   // draw link between clusters 
518
519   if( !fPerf || !fGB) return;
520   AliHLTTPCCAGBTracker &tracker = *fGB;
521   if( width<0 ) width = 1.;
522   fLine.SetLineWidth( width );
523   Int_t colUp = colorUp>=0 ? colorUp :kMagenta;
524   Int_t colDn = colorDn>=0 ? colorDn :kBlack;
525   if( iRow<1 || iRow>=fSlice->Param().NRows()-1 ) return;
526
527   const AliHLTTPCCARow& row = fSlice->Row(iRow);
528   const AliHLTTPCCARow& rowUp = fSlice->Row(iRow+1);
529   const AliHLTTPCCARow& rowDn = fSlice->Row(iRow-1);
530     
531   Int_t id = fSlice->HitInputIDs()[row.FirstHit()+iHit];
532   AliHLTTPCCAGBHit &h = tracker.Hits()[tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id]; 
533   Short_t iUp = ((Short_t*)(fSlice->RowData() + row.FullOffset()))[row.FullLinkOffset()+iHit];
534   Short_t iDn = ((Short_t*)(fSlice->RowData() + row.FullOffset()))[row.FullLinkOffset()+row.NHits()+iHit];
535
536   if( iUp>=0){
537     Int_t id1 =fSlice->HitInputIDs()[rowUp.FirstHit()+iUp];
538     AliHLTTPCCAGBHit &h1 = tracker.Hits()[tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id1]; 
539     Double_t vx, vy, vx1, vy1;
540     Slice2View( h.X(), h.Y(), &vx, &vy );  
541     Slice2View( h1.X(), h1.Y(), &vx1, &vy1 );  
542     fLine.SetLineColor( colUp );
543     fYX->cd();
544     fLine.DrawLine(vx-.1,vy,vx1-.1,vy1);
545     fZX->cd();
546     fLine.DrawLine(h.Z()-1.,vy,h1.Z()-1.,vy1);
547   }
548   if( iDn>=0){
549     Int_t id1 =fSlice->HitInputIDs()[rowDn.FirstHit()+iDn];
550     AliHLTTPCCAGBHit &h1 = tracker.Hits()[tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id1]; 
551     Double_t vx, vy, vx1, vy1;
552     Slice2View( h.X(), h.Y(), &vx, &vy );  
553     Slice2View( h1.X(), h1.Y(), &vx1, &vy1 );  
554     fLine.SetLineColor( colDn );
555     fYX->cd();
556     fLine.DrawLine(vx+.1,vy,vx1+.1,vy1);
557     fZX->cd();
558     fLine.DrawLine(h.Z()+1.,vy,h1.Z()+1.,vy1);
559   }
560 }
561
562
563 void AliHLTTPCCADisplay::DrawSliceLinks( Int_t colorUp, Int_t colorDn, Int_t width )
564 {
565   // draw links between clusters 
566
567   for( Int_t iRow=1; iRow<fSlice->Param().NRows()-1; iRow++){
568     const AliHLTTPCCARow& row = fSlice->Row(iRow);
569     for( Int_t ih=0; ih<row.NHits(); ih++ ){
570       DrawSliceLink( iRow, ih, colorUp, colorDn, width );
571     }
572   }
573 }
574
575
576
577 Int_t AliHLTTPCCADisplay::GetTrackMC( const AliHLTTPCCADisplayTmpHit *vHits, Int_t NHits )
578 {
579   // get MC label for the track
580   
581   AliHLTTPCCAGBTracker &tracker = *fGB;
582
583   Int_t label = -1; 
584   Double_t purity = 0;
585   Int_t *lb = new Int_t[NHits*3];
586   Int_t nla=0;
587   //std::cout<<"\n\nTrack hits mc: "<<std::endl;
588   for( Int_t ihit=0; ihit<NHits; ihit++){
589     AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[ihit].ID()];
590     AliHLTTPCCAPerformance::AliHLTTPCCAHitLabel &l = fPerf->HitLabels()[h.ID()];
591     if(l.fLab[0]>=0 ) lb[nla++]= l.fLab[0];
592     if(l.fLab[1]>=0 ) lb[nla++]= l.fLab[1];
593     if(l.fLab[2]>=0 ) lb[nla++]= l.fLab[2];
594     //std::cout<<ihit<<":  "<<l.fLab[0]<<" "<<l.fLab[1]<<" "<<l.fLab[2]<<std::endl;
595   }
596   sort( lb, lb+nla );
597   Int_t labmax = -1, labcur=-1, lmax = 0, lcurr=0, nh=0;
598   //std::cout<<"MC track IDs :"<<std::endl;
599   for( Int_t i=0; i<nla; i++ ){
600     if( lb[i]!=labcur ){
601       if( 0 && i>0 && lb[i-1]>=0 ){     
602         AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lb[i-1]];
603         std::cout<<lb[i-1]<<": nhits="<<nh<<", pdg="<< mc.PDG()<<", Pt="<<mc.Pt()<<", P="<<mc.P()
604                  <<", par="<<mc.Par()[0]<<" "<<mc.Par()[1]<<" "<<mc.Par()[2]
605                  <<" "<<mc.Par()[3]<<" "<<mc.Par()[4]<<" "<<mc.Par()[5]<<" "<<mc.Par()[6]<<std::endl;
606         
607       }
608       nh=0;
609       if( labcur>=0 && lmax<lcurr ){
610         lmax = lcurr;
611         labmax = labcur;
612       }
613       labcur = lb[i];
614       lcurr = 0;
615     }
616     lcurr++;
617     nh++;
618   }
619   if( 0 && nla-1>0 && lb[nla-1]>=0 ){   
620     AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lb[nla-1]];
621     std::cout<<lb[nla-1]<<": nhits="<<nh<<", pdg="<< mc.PDG()<<", Pt="<<mc.Pt()<<", P="<<mc.P()
622              <<", par="<<mc.Par()[0]<<" "<<mc.Par()[1]<<" "<<mc.Par()[2]
623              <<" "<<mc.Par()[3]<<" "<<mc.Par()[4]<<" "<<mc.Par()[5]<<" "<<mc.Par()[6]<<std::endl;
624     
625   }
626   if( labcur>=0 && lmax<lcurr ){
627     lmax = lcurr;
628     labmax = labcur;
629   }
630   lmax = 0;
631   for( Int_t ihit=0; ihit<NHits; ihit++){
632     AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[ihit].ID()];
633     AliHLTTPCCAPerformance::AliHLTTPCCAHitLabel &l = fPerf->HitLabels()[h.ID()];
634     if( l.fLab[0] == labmax || l.fLab[1] == labmax || l.fLab[2] == labmax 
635         ) lmax++;
636   }
637   label = labmax;
638   purity = ( (NHits>0) ?double(lmax)/double(NHits) :0 );
639   if( lb ) delete[] lb;
640   if( purity<.9 ) label = -1;
641   return label;
642 }
643
644 Bool_t AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrackParam t, Double_t Alpha, const AliHLTTPCCADisplayTmpHit *vHits, 
645                                     Int_t NHits, Int_t color, Int_t width, Bool_t pPoint )
646 {
647   // draw track
648
649   if(NHits<2 ) return 0;
650
651   AliHLTTPCCAGBTracker &tracker = *fGB;
652   if( width<0 ) width = 2;
653
654   if(fDrawOnlyRef ){
655     Int_t lab = GetTrackMC(vHits, NHits);
656     if( lab<0 ) return 0;
657     AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
658     if(mc.P()<1) return 0;
659   }
660
661   if( color < 0 ){
662     //color = GetColorZ( (vz[0]+vz[mHits-1])/2. );
663     //color = GetColorK(t.GetKappa());
664     Int_t lab = GetTrackMC(vHits, NHits);
665     color = GetColor( lab +1 );
666     if( lab>=0 ){
667       AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
668       if( mc.P()>=1. ) color = kRed;    
669     }  
670   }
671
672   if( t.SinPhi()>.999 )  t.SetSinPhi( .999 );
673   else if( t.SinPhi()<-.999 )  t.SetSinPhi( -.999 );
674   if( t.CosPhi()>=0 ) t.SetCosPhi( TMath::Sqrt(1-t.SinPhi()*t.SinPhi() ));
675   else t.SetCosPhi( -TMath::Sqrt(1-t.SinPhi()*t.SinPhi() ));
676
677   //  Int_t iSlice = fSlice->Param().ISlice();
678
679   //sort(vHits, vHits + NHits, AliHLTTPCCADisplayTmpHit::CompareHitZ );
680
681   Double_t vx[2000], vy[2000], vz[2000];
682   Int_t mHits = 0;
683
684   //Int_t oldSlice = -1;
685   Double_t alpha = ( TMath::Abs(Alpha+1)<1.e-4 ) ?fSlice->Param().Alpha() :Alpha;
686   AliHLTTPCCATrackParam tt = t;
687
688   for( Int_t iHit=0; iHit<NHits; iHit++ ){
689
690     AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[iHit].ID()];
691
692     Double_t hCos = TMath::Cos( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
693     Double_t hSin = TMath::Sin( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
694     Double_t x0=h.X(), y0=h.Y(), z1=h.Z();
695     Double_t x1 = x0*hCos + y0*hSin;
696     Double_t y1 = y0*hCos - x0*hSin;      
697
698     {
699       Double_t dx = x1-tt.X();
700       Double_t dy = y1-tt.Y();
701       if( dx*dx+dy*dy>1. ){
702         Double_t dalpha = TMath::ATan2( dy, dx );
703         if( tt.Rotate(dalpha ) ){
704           alpha+=dalpha;
705           hCos = TMath::Cos( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
706           hSin = TMath::Sin( alpha - tracker.Slices()[h.ISlice()].Param().Alpha());
707           x1 = x0*hCos + y0*hSin;
708           y1 = y0*hCos - x0*hSin;      
709         }
710       }
711     }
712     SetSliceTransform( alpha );
713
714     //t.GetDCAPoint( x1, y1, z1, x1, y1, z1 );      
715     Bool_t ok = tt.TransportToX(x1,.999);
716     if( 0&&ok ){    
717       x1 = tt.X();
718       y1 = tt.Y();
719       z1 = tt.Z();
720     }
721
722     Slice2View(x1, y1, &x1, &y1 );
723     vx[mHits] = x1;
724     vy[mHits] = y1;
725     vz[mHits] = z1;
726     mHits++;
727     for( int j=0; j<0; j++ ){
728       x0=h.X()+j; y0=h.Y(); z1=h.Z();
729       x1 = x0*hCos + y0*hSin;
730       y1 = y0*hCos - x0*hSin;
731
732       ok = tt.TransportToX(x1,.999);
733       if( 1||ok ){    
734         x1 = tt.X();
735         y1 = tt.Y();
736         z1 = tt.Z();
737       }
738
739       Slice2View(x1, y1, &x1, &y1 );
740       vx[mHits] = x1;
741       vy[mHits] = y1;
742       vz[mHits] = z1;
743       mHits++;
744     }
745   }
746   if( pPoint ){
747     Double_t x1=t.X(), y1=t.Y(), z1=t.Z();
748     Double_t a = ( TMath::Abs(Alpha+1)<1.e-4 ) ?fSlice->Param().Alpha() :Alpha;
749     SetSliceTransform( a );
750
751     Slice2View(x1, y1, &x1, &y1 );
752     Double_t dx = x1 - vx[0];
753     Double_t dy = y1 - vy[0];
754     //std::cout<<x1<<" "<<y1<<" "<<vx[0]<<" "<<vy[0]<<" "<<dx<<" "<<dy<<std::endl;
755     Double_t d0 = dx*dx + dy*dy;
756     dx = x1 - vx[mHits-1];
757     dy = y1 - vy[mHits-1];
758     //std::cout<<x1<<" "<<y1<<" "<<vx[mHits-1]<<" "<<vy[mHits-1]<<" "<<dx<<" "<<dy<<std::endl;
759     Double_t d1 = dx*dx + dy*dy;
760     //std::cout<<"d0, d1="<<d0<<" "<<d1<<std::endl;
761     if( d1<d0 ){
762       vx[mHits] = x1;
763       vy[mHits] = y1;
764       vz[mHits] = z1;   
765       mHits++;
766     } else {
767       for( Int_t i = mHits; i>0; i-- ){
768         vx[i] = vx[i-1];
769         vy[i] = vy[i-1];
770         vz[i] = vz[i-1];
771       }
772       vx[0] = x1;
773       vy[0] = y1;
774       vz[0] = z1;   
775       mHits++;
776     }  
777   }
778   
779
780   fLine.SetLineColor(color);
781   fLine.SetLineWidth(width);    
782   fArc.SetFillStyle(0);
783   fArc.SetLineColor(color);    
784   fArc.SetLineWidth(width);        
785   TPolyLine pl;   
786   pl.SetLineColor(color); 
787   pl.SetLineWidth(width);
788   TPolyLine plZ;
789   plZ.SetLineColor(color); 
790   plZ.SetLineWidth(width);
791    
792   fMarker.SetMarkerSize(width/2.);
793   fMarker.SetMarkerColor(color);
794
795   fYX->cd();
796   pl.DrawPolyLine(mHits,vx,vy);
797   {
798     fMarker.DrawMarker(vx[0],vy[0]);
799     fMarker.DrawMarker(vx[mHits-1],vy[mHits-1]);
800   }
801   fZX->cd();
802   plZ.DrawPolyLine(mHits,vz,vy);
803   fMarker.DrawMarker(vz[0],vy[0]);
804   fMarker.DrawMarker(vz[mHits-1],vy[mHits-1]);
805   
806   fLine.SetLineWidth(1);   
807   return 1;
808 }
809
810
811 Bool_t AliHLTTPCCADisplay::DrawTracklet( AliHLTTPCCATrackParam &track, const Int_t *hitstore, Int_t color, Int_t width, Bool_t pPoint )
812 {
813   // draw tracklet
814   AliHLTTPCCAGBTracker &tracker = *fGB;
815   AliHLTTPCCADisplayTmpHit vHits[200];
816   Int_t nHits = 0; 
817   for( Int_t iRow=0; iRow<fSlice->Param().NRows(); iRow++ ){
818     Int_t iHit = hitstore[iRow];
819     if( iHit<0 ) continue;    
820     const AliHLTTPCCARow &row = fSlice->Row(iRow);
821     Int_t id = fSlice->HitInputIDs()[row.FirstHit()+iHit];
822     Int_t iGBHit = tracker.FirstSliceHit()[fSlice->Param().ISlice()]+id;
823     AliHLTTPCCAGBHit &h = tracker.Hits()[iGBHit];
824     vHits[nHits].SetID( iGBHit );
825     vHits[nHits].SetS( 0 );
826     vHits[nHits].SetZ( h.Z() );
827     nHits++;
828   }
829   return DrawTrack( track, -1, vHits, nHits, color,width,pPoint );
830 }
831
832
833 void AliHLTTPCCADisplay::DrawSliceOutTrack( AliHLTTPCCATrackParam &t, Double_t alpha, Int_t itr, Int_t color, Int_t width )
834 {
835   // draw slice track
836   
837   AliHLTTPCCAOutTrack &track = fSlice->OutTracks()[itr];
838   if( track.NHits()<2 ) return;
839
840   AliHLTTPCCAGBTracker &tracker = *fGB;
841   AliHLTTPCCADisplayTmpHit vHits[200];
842
843   for( Int_t ih=0; ih<track.NHits(); ih++ ){
844     Int_t id = tracker.FirstSliceHit()[fSlice->Param().ISlice()] + fSlice->OutTrackHits()[track.FirstHitRef()+ih];  
845     AliHLTTPCCAGBHit &h = tracker.Hits()[id];
846     vHits[ih].SetID( id );
847     vHits[ih].SetS( 0 );
848     vHits[ih].SetZ( h.Z() );
849   }
850
851   DrawTrack( t, alpha, vHits, track.NHits(), color, width, 1 );
852 }
853
854 void AliHLTTPCCADisplay::DrawSliceOutTrack( Int_t itr, Int_t color, Int_t width )
855 {
856   // draw slice track
857   
858   AliHLTTPCCAOutTrack &track = fSlice->OutTracks()[itr];
859   if( track.NHits()<2 ) return;
860
861   AliHLTTPCCAGBTracker &tracker = *fGB;
862   AliHLTTPCCADisplayTmpHit vHits[200];
863
864   for( Int_t ih=0; ih<track.NHits(); ih++ ){
865     Int_t id = tracker.FirstSliceHit()[fSlice->Param().ISlice()] + fSlice->OutTrackHits()[track.FirstHitRef()+ih];  
866     AliHLTTPCCAGBHit &h = tracker.Hits()[id];
867     vHits[ih].SetID( id );
868     vHits[ih].SetS( 0 );
869     vHits[ih].SetZ( h.Z() );
870   }
871
872   DrawTrack( track.StartPoint(), -1, vHits, track.NHits(), color, width );
873 }
874
875
876 void AliHLTTPCCADisplay::DrawSliceTrack( Int_t itr, Int_t color )
877 {
878   // draw slice track
879   
880   AliHLTTPCCATrack &track = fSlice->Tracks()[itr];
881   if( track.NHits()<2 ) return;
882
883   AliHLTTPCCAGBTracker &tracker = *fGB;
884   AliHLTTPCCADisplayTmpHit vHits[200];  
885   for( Int_t ith=0; ith<track.NHits(); ith++ ){
886     Int_t ic = (fSlice->TrackHits()[track.FirstHitID()+ith]);
887     const AliHLTTPCCARow &row = fSlice->ID2Row(ic);
888     Int_t ih = fSlice->ID2IHit(ic);
889     int id = fSlice->HitInputIDs()[row.FirstHit()+ih];
890     Int_t gbID = tracker.FirstSliceHit()[fSlice->Param().ISlice()] + id;
891     AliHLTTPCCAGBHit &h = tracker.Hits()[gbID];
892     vHits[ith].SetID( gbID );
893     vHits[ith].SetS( 0 );
894     vHits[ith].SetZ( h.Z() );
895   }
896
897   DrawTrack( track.Param(), -1, vHits, track.NHits(), color,-1 );
898   //track.Param().Print();
899 }
900
901
902 void AliHLTTPCCADisplay::DrawGBTrack( Int_t itr, Int_t color, Int_t width )
903 {
904   // draw global track
905
906   AliHLTTPCCAGBTracker &tracker = *fGB;
907   AliHLTTPCCADisplayTmpHit vHits[1000];
908   
909   AliHLTTPCCAGBTrack &track = tracker.Tracks()[itr];
910   if( track.NHits()<2 ) return;
911
912   for( Int_t ih=0; ih<track.NHits(); ih++ ){
913     Int_t i = tracker.TrackHits()[ track.FirstHitRef() + ih];
914     AliHLTTPCCAGBHit &h = tracker.Hits()[i];
915     vHits[ih].SetID( i );
916     vHits[ih].SetS( 0 );
917     vHits[ih].SetZ( h.Z() );
918   }
919
920   DrawTrack( track.Param(), track.Alpha(), vHits, track.NHits(), color, width );
921 }
922
923
924 void AliHLTTPCCADisplay::DrawGBTrackFast( AliHLTTPCCAGBTracker &tracker, Int_t itr, Int_t color )
925 {
926   // draw global track
927   
928   AliHLTTPCCAGBTrack &track = tracker.Tracks()[itr];
929   if( track.NHits()<2 ) return;
930   Int_t width = 1;
931
932   AliHLTTPCCADisplayTmpHit *vHits = new AliHLTTPCCADisplayTmpHit[track.NHits()];
933   AliHLTTPCCATrackParam t = track.Param();
934   
935   for( Int_t ih=0; ih<track.NHits(); ih++ ){
936     Int_t i = tracker.TrackHits()[ track.FirstHitRef() + ih];
937     AliHLTTPCCAGBHit *h = &(tracker.Hits()[i]);
938     vHits[ih].SetID( i );
939     vHits[ih].SetS( 0 );
940     vHits[ih].SetZ( h->Z() );
941   }  
942
943   sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
944   Int_t colorY = color;
945   {
946     AliHLTTPCCAGBHit &h1 = tracker.Hits()[ vHits[0].ID()];
947     AliHLTTPCCAGBHit &h2 = tracker.Hits()[ vHits[track.NHits()-1].ID()];
948     if( color<0 ) color = GetColorZ( (h1.Z()+h2.Z())/2. );
949     Double_t gx1, gy1, gx2, gy2;
950     Slice2View(h1.X(), h1.Y(), &gx1, &gy1 );
951     Slice2View(h2.X(), h2.Y(), &gx2, &gy2 );
952     if( colorY<0 ) colorY = GetColorY( (gy1+gy2)/2. );
953     color = colorY = GetColorK(t.GetKappa());
954   }
955
956   fMarker.SetMarkerColor(color);//kBlue);
957   fMarker.SetMarkerSize(1.);
958   fLine.SetLineColor(color);
959   fLine.SetLineWidth(width);    
960   fArc.SetFillStyle(0);
961   fArc.SetLineColor(color);    
962   fArc.SetLineWidth(width);        
963   TPolyLine pl;
964   pl.SetLineColor(colorY);
965   pl.SetLineWidth(width);
966
967   Int_t oldSlice = -1;
968   Double_t alpha = track.Alpha();
969   // YX
970   {
971
972     AliHLTTPCCAGBHit &h1 = tracker.Hits()[vHits[0].ID()];
973     AliHLTTPCCAGBHit &h2 = tracker.Hits()[vHits[track.NHits()-1].ID()];
974     Float_t x1, y1, z1, x2, y2, z2;
975     Double_t vx1, vy1, vx2, vy2;
976     
977     if( h1.ISlice() != oldSlice ){
978       t.Rotate( tracker.Slices()[h1.ISlice()].Param().Alpha() - alpha);
979       oldSlice = h1.ISlice();
980       alpha = tracker.Slices()[h1.ISlice()].Param().Alpha();
981       SetSliceTransform( &(tracker.Slices()[oldSlice]) );
982     }
983     t.GetDCAPoint( h1.X(), h1.Y(), h1.Z(), x1, y1, z1 );  
984     Slice2View(x1, y1, &vx1, &vy1 );
985
986     if( h2.ISlice() != oldSlice ){
987       t.Rotate( tracker.Slices()[h2.ISlice()].Param().Alpha() - alpha);
988       oldSlice = h2.ISlice();
989       alpha = tracker.Slices()[h2.ISlice()].Param().Alpha();
990       SetSliceTransform( &(tracker.Slices()[oldSlice]) );
991     }
992     t.GetDCAPoint( h2.X(), h2.Y(), h2.Z(), x2, y2, z2 );
993     Slice2View(x2, y2, &vx2, &vy2 );
994     
995     Double_t x0 = t.GetX();
996     Double_t y0 = t.GetY();
997     Double_t sinPhi = t.GetSinPhi();
998     Double_t k = t.GetKappa();
999     Double_t ex = t.GetCosPhi();
1000     Double_t ey = sinPhi;
1001  
1002     if( TMath::Abs(k)>1.e-4 ){
1003       
1004       fYX->cd();
1005
1006       Double_t r = 1/TMath::Abs(k);
1007       Double_t xc = x0 -ey*(1/k);
1008       Double_t yc = y0 +ex*(1/k);
1009      
1010       Double_t vx, vy;
1011       Slice2View( xc, yc, &vx, &vy );
1012       
1013       Double_t a1 = TMath::ATan2(vy1-vy, vx1-vx)/TMath::Pi()*180.;
1014       Double_t a2 = TMath::ATan2(vy2-vy, vx2-vx)/TMath::Pi()*180.;
1015       if( a1<0 ) a1+=360;
1016       if( a2<0 ) a2+=360;
1017       if( a2<a1 ) a2+=360;
1018       Double_t da = TMath::Abs(a2-a1);
1019       if( da>360 ) da-= 360;
1020       if( da>180 ){
1021         da = a1;
1022         a1 = a2;
1023         a2 = da;
1024         if( a2<a1 ) a2+=360;    
1025       }
1026       fArc.DrawArc(vx,vy,r, a1,a2,"only");
1027       //fArc.DrawArc(vx,vy,r, 0,360,"only");
1028    } else {
1029       fYX->cd();
1030       fLine.DrawLine(vx1,vy1, vx2, vy2 );
1031     }
1032   }
1033
1034   // ZX
1035   Double_t py[track.NHits()], pz[track.NHits()];
1036
1037   for( Int_t iHit=0; iHit<track.NHits(); iHit++ ){
1038
1039     AliHLTTPCCAGBHit &h1 = tracker.Hits()[vHits[iHit].ID()];
1040     Float_t x1, y1, z1;
1041     Double_t vx1, vy1;    
1042     if( h1.ISlice() != oldSlice ){
1043       t.Rotate( tracker.Slices()[h1.ISlice()].Param().Alpha() - alpha);
1044       oldSlice = h1.ISlice();
1045       alpha = tracker.Slices()[h1.ISlice()].Param().Alpha();
1046       SetSliceTransform( &(tracker.Slices()[oldSlice]) );
1047     }
1048     t.GetDCAPoint( h1.X(), h1.Y(), h1.Z(), x1, y1, z1 );  
1049     Slice2View(x1, y1, &vx1, &vy1 );
1050     py[iHit] = vy1;
1051     pz[iHit] = z1;
1052   }
1053
1054
1055   fZX->cd();
1056   pl.DrawPolyLine(track.NHits(),pz,py);    
1057   
1058   fLine.SetLineWidth(1);     
1059   delete[] vHits;  
1060 }
1061
1062
1063
1064
1065
1066 #ifdef XXXX
1067  
1068
1069
1070
1071 void AliHLTTPCCADisplay::DrawMergedHit( Int_t iRow, Int_t iHit, Int_t color )
1072 {
1073   // connect two cells on display
1074
1075 #ifdef XXX
1076   
1077   const AliHLTTPCCARow &row = fSlice->Row(iRow);
1078   AliHLTTPCCAHit &h = row.Hits()[iHit];
1079   AliHLTTPCCAHit &hyz = row.HitsYZ()[iHit];
1080
1081   Double_t x = row.X();
1082   Double_t y = hyz.Y();
1083   Double_t z = hyz.Z();
1084   Double_t x1 = x, x2 = x;
1085   Double_t y1 = y, y2 = y;
1086   Double_t z1 = z, z2 = z;
1087   Int_t iRow1 = iRow, iHit1 = iHit;
1088   Int_t iRow2 = iRow, iHit2 = iHit;
1089
1090   if( fSlice->HitLinksDown()[]>=0 ){    
1091     iRow1 = iRow - 1;
1092     iHit1 = h.LinkDown();
1093     AliHLTTPCCARow &row1 = fSlice->Rows()[iRow1];
1094     AliHLTTPCCAHitYZ &h1 = row1.HitsYZ()[iHit1];
1095     x1 = row1.X();
1096     y1 = h1.Y();
1097     z1 = h1.Z();
1098   }
1099   if( h.LinkUp()>=0 ){    
1100     iRow2 = iRow+1;
1101     iHit2 = h.LinkUp();
1102     AliHLTTPCCARow &row2 = fSlice->Rows()[iRow2];
1103     AliHLTTPCCAHitYZ &h2 = row2.HitsYZ()[iHit2];
1104     x2 = row2.X();
1105     y2 = h2.Y();
1106     z2 = h2.Z();
1107   }
1108   if( color<0 ) color = GetColorZ( (z+z1+z2)/3. );
1109
1110
1111   Slice2View(x,y, &x, &y );
1112   Slice2View(x1,y1, &x1, &y1 );
1113   Slice2View(x2,y2, &x2, &y2 );
1114
1115   Double_t lx[] = { x1, x, x2 };
1116   Double_t ly[] = { y1, y, y2 };
1117   Double_t lz[] = { z1, z, z2 };
1118
1119   fPLine.SetLineColor(color);    
1120   fPLine.SetLineWidth(1);        
1121   //fPLine.SetFillColor(color);
1122   fPLine.SetFillStyle(-1);
1123  
1124   fYX->cd();
1125   fPLine.DrawPolyLine(3, lx, ly );
1126   fZX->cd();
1127   fPLine.DrawPolyLine(3, lz, ly );   
1128   DrawHit( iRow, iHit, color );
1129   DrawHit( iRow1, iHit1, color );
1130   DrawHit( iRow2, iHit2, color ); 
1131 #endif
1132 }
1133
1134
1135 void AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrack &track, Int_t color, Bool_t DrawHits )
1136 {
1137   // draw track
1138   
1139   if( track.NHits()<2 ) return;
1140   Int_t width = 2;
1141
1142   AliHLTTPCCADisplayTmpHit *vHits = new AliHLTTPCCADisplayTmpHit[track.NHits()];
1143   AliHLTTPCCATrackParam &t = track.Param();
1144
1145   Int_t iID = track.FirstHitID();
1146   Int_t nhits = 0;
1147   { 
1148     Int_t iHit = 0;
1149     for( Int_t ih=0; ih<track.NHits(); ih++ ){
1150       Int_t i = fSlice->TrackHits()[iID];
1151       AliHLTTPCCAHit *h = &(fSlice->ID2Hit( i )); 
1152       AliHLTTPCCARow &row = fSlice->ID2Row(i);
1153       vHits[iHit].ID() = i;    
1154       vHits[iHit].S() = t.GetS( row.X(), h->Y() );
1155       vHits[iHit].Z() = h->Z();
1156       iHit++;
1157       nhits++;
1158       iID++;
1159     }
1160   }
1161   sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
1162   //cout<<"Draw track, nhits = "<<nhits<<endl;
1163   {
1164     AliHLTTPCCAHit &c1 = fSlice->ID2Hit(vHits[0].ID());
1165     AliHLTTPCCAHit &c2 = fSlice->ID2Hit(vHits[track.NHits()-1].ID());
1166     if( color<0 ) color = GetColorZ( (c1.Z()+c2.Z())/2. );
1167   }
1168   
1169   fMarker.SetMarkerColor(color);//kBlue);
1170   fMarker.SetMarkerSize(1.);
1171   /*
1172   for( Int_t i=0; i<3; i++){    
1173     AliHLTTPCCAHit &c1 = fSlice->ID2Hit(track.HitID()[i]);    
1174     AliHLTTPCCARow &row1 = fSlice->ID2Row(track.HitID()[i]);
1175     Double_t vx1, vy1;
1176     Slice2View(row1.X(), c1.Y(), &vx1, &vy1 ); 
1177     fYX->cd();
1178     fMarker.DrawMarker(vx1,vy1);
1179     fZX->cd();
1180     fMarker.DrawMarker(c1.Z(),vy1);
1181   }
1182   */
1183   
1184   //DrawTrackletPoint( fSlice->ID2Point(track.PointID()[0]).Param(), kBlack);//color );
1185   //DrawTrackletPoint( fSlice->ID2Point(track.PointID()[1]).Param(), kBlack);//color );
1186   //cout<<"DrawTrack end points x = "<<fSlice->ID2Point(track.PointID()[0]).Param().GetX()<<" "<<fSlice->ID2Point(track.PointID()[1]).Param().GetX()<<endl;
1187   for( Int_t iHit=0; iHit<track.NHits()-1; iHit++ )
1188   {
1189     AliHLTTPCCAHit &c1 = fSlice->ID2Hit(vHits[iHit].ID());
1190     AliHLTTPCCAHit &c2 = fSlice->ID2Hit(vHits[iHit+1].ID());
1191     AliHLTTPCCARow &row1 = fSlice->ID2Row(vHits[iHit].ID());
1192     AliHLTTPCCARow &row2 = fSlice->ID2Row(vHits[iHit+1].ID());
1193     Float_t x1, y1, z1, x2, y2, z2;    
1194     t.GetDCAPoint( row1.X(), c1.Y(), c1.Z(), x1, y1, z1 );
1195     t.GetDCAPoint( row2.X(), c2.Y(), c2.Z(), x2, y2, z2 );
1196
1197     //if( color<0 ) color = GetColorZ( (z1+z2)/2. );
1198     Double_t vx1, vy1, vx2, vy2;
1199     Slice2View(x1, y1, &vx1, &vy1 );
1200     Slice2View(x2, y2, &vx2, &vy2 );
1201     
1202     fLine.SetLineColor( color );
1203     fLine.SetLineWidth( width );
1204     
1205     Double_t x0 = t.GetX();
1206     Double_t y0 = t.GetY();
1207     Double_t sinPhi = t.GetSinPhi();
1208     Double_t k = t.GetKappa();
1209     Double_t ex = t.GetCosPhi();
1210     Double_t ey = sinPhi;
1211  
1212     if( TMath::Abs(k)>1.e-4 ){
1213
1214       fArc.SetFillStyle(0);
1215       fArc.SetLineColor(color);    
1216       fArc.SetLineWidth(width);        
1217       
1218       fYX->cd();
1219
1220       Double_t r = 1/TMath::Abs(k);
1221       Double_t xc = x0 -ey*(1/k);
1222       Double_t yc = y0 +ex*(1/k);
1223      
1224       Double_t vx, vy;
1225       Slice2View( xc, yc, &vx, &vy );
1226       
1227       Double_t a1 = TMath::ATan2(vy1-vy, vx1-vx)/TMath::Pi()*180.;
1228       Double_t a2 = TMath::ATan2(vy2-vy, vx2-vx)/TMath::Pi()*180.;
1229       if( a1<0 ) a1+=360;
1230       if( a2<0 ) a2+=360;
1231       if( a2<a1 ) a2+=360;
1232       Double_t da = TMath::Abs(a2-a1);
1233       if( da>360 ) da-= 360;
1234       if( da>180 ){
1235         da = a1;
1236         a1 = a2;
1237         a2 = da;
1238         if( a2<a1 ) a2+=360;    
1239       }
1240       fArc.DrawArc(vx,vy,r, a1,a2,"only");
1241       //fArc.DrawArc(vx,vy,r, 0,360,"only");
1242    } else {
1243       fYX->cd();
1244       fLine.DrawLine(vx1,vy1, vx2, vy2 );
1245     }
1246   }
1247
1248   for( Int_t iHit=0; iHit<track.NHits()-1; iHit++ ){
1249     AliHLTTPCCAHit &c1 = fSlice->ID2Hit(vHits[iHit].ID());
1250     AliHLTTPCCAHit &c2 = fSlice->ID2Hit(vHits[iHit+1].ID());
1251     AliHLTTPCCARow &row1 = fSlice->ID2Row(vHits[iHit].ID());
1252     AliHLTTPCCARow &row2 = fSlice->ID2Row(vHits[iHit+1].ID());
1253     
1254     //if( DrawHits ) ConnectHits( fSlice->ID2IRow(vHits[iHit].ID()),c1,
1255     //fSlice->ID2IRow(vHits[iHit+1].ID()),c2, color );
1256     Float_t x1, y1, z1, x2, y2, z2;
1257     t.GetDCAPoint( row1.X(), c1.Y(), c1.Z(), x1, y1, z1 );
1258     t.GetDCAPoint( row2.X(), c2.Y(), c2.Z(), x2, y2, z2 );
1259
1260     Double_t vx1, vy1, vx2, vy2;
1261     Slice2View(x1, y1, &vx1, &vy1 );
1262     Slice2View(x2, y2, &vx2, &vy2 );
1263     
1264     fLine.SetLineColor(color);
1265     fLine.SetLineWidth(width);    
1266     
1267     fZX->cd();
1268     fLine.DrawLine(z1,vy1, z2, vy2 ); 
1269   }
1270   fLine.SetLineWidth(1);     
1271   delete[] vHits;  
1272 }
1273
1274
1275 void AliHLTTPCCADisplay::DrawTrackletPoint( AliHLTTPCCATrackParam &t, Int_t color )
1276 {
1277   // draw tracklet point
1278
1279   Double_t x = t.GetX();
1280   Double_t y = t.GetY();
1281   Double_t sinPhi = t.GetSinPhi();
1282   Double_t z = t.GetZ();
1283   Double_t dzds = t.GetDzDs();
1284   Double_t ex = t.GetCosPhi();
1285   Double_t ey = sinPhi;
1286
1287   Int_t width = 1;
1288
1289   if( color<0 ) color = GetColorZ( t.GetZ() );
1290     
1291   fMarker.SetMarkerColor(color);
1292   fMarker.SetMarkerSize(.5);
1293   fLine.SetLineWidth(width);  
1294   fLine.SetLineColor(color);
1295
1296   Double_t vx, vy, vex, vey, vdx, vdy;
1297   Double_t dz = TMath::Sqrt(t.GetErr2Z());
1298   Slice2View( x, y, &vx, &vy ); 
1299   Slice2View( ex, ey, &vex, &vey ); 
1300   Slice2View( 0, TMath::Sqrt(t.GetErr2Y())*3.5, &vdx, &vdy);
1301   Double_t d = TMath::Sqrt(vex*vex+vey*vey);
1302   vex/=d;
1303   vey/=d;
1304   fYX->cd();
1305   fMarker.DrawMarker(vx,vy);
1306   fLine.DrawLine(vx,vy,vx+vex*4, vy+vey*4);
1307   fLine.DrawLine(vx-vdx,vy-vdy, vx+vdx, vy+vdy );
1308   fZX->cd();
1309   fMarker.DrawMarker(z,vy);
1310   fLine.DrawLine(z,vy,z+dzds*4, vy+vey*4);
1311   fLine.DrawLine(z-3.5*dz,vy-vdy, z+3.5*dz, vy+vdy ); 
1312   fLine.SetLineWidth(1);
1313 }
1314 #endif //XXXX