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