2 // **************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project *
4 // ALICE Experiment at CERN, All rights reserved. *
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. *
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. *
18 //***************************************************************************
21 #include "AliHLTTPCCADisplay.h"
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"
35 #include "Riostream.h"
39 #include "TApplication.h"
42 class AliHLTTPCCADisplay::AliHLTTPCCADisplayTmpHit
47 Int_t ID() const { return fHitID; }
48 Double_t S() const { return fS; }
49 Double_t Z() const { return fZ; }
51 void SetID( Int_t v ){ fHitID = v; }
52 void SetS( Double_t v){ fS = v; }
53 void SetZ( Double_t v){ fZ = v; }
55 static Bool_t CompareHitDS( const AliHLTTPCCADisplayTmpHit &a,
56 const AliHLTTPCCADisplayTmpHit &b )
61 static Bool_t CompareHitZ( const AliHLTTPCCADisplayTmpHit &a,
62 const AliHLTTPCCADisplayTmpHit &b )
69 Int_t fHitID; // hit ID
70 Double_t fS; // hit position on the XY track curve
71 Double_t fZ; // hit Z position
77 AliHLTTPCCADisplay &AliHLTTPCCADisplay::Instance()
79 // reference to static object
80 static AliHLTTPCCADisplay gAliHLTTPCCADisplay;
81 static Bool_t firstCall = 1;
83 if( !gApplication ) new TApplication("myapp",0,0);
84 gAliHLTTPCCADisplay.Init();
87 return gAliHLTTPCCADisplay;
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)
95 fPerf = &(AliHLTTPCCAPerformance::Instance());
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)
109 const AliHLTTPCCADisplay& AliHLTTPCCADisplay::operator=( const AliHLTTPCCADisplay& ) const
115 AliHLTTPCCADisplay::~AliHLTTPCCADisplay()
122 void AliHLTTPCCADisplay::Init()
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);
134 void AliHLTTPCCADisplay::Update()
140 fYX->Print("YX.pdf");
141 fZX->Print("ZX.pdf");
145 void AliHLTTPCCADisplay::ClearView()
152 void AliHLTTPCCADisplay::Ask()
154 // whait for the pressed key, when "r" pressed, don't ask anymore
158 std::cout<<"ask> "<<std::endl;
160 std::cin.get(symbol);
163 } while (symbol != '\n');
168 void AliHLTTPCCADisplay::SetSliceView()
170 // switch to slice view
174 void AliHLTTPCCADisplay::SetTPCView()
176 // switch to full TPC view
187 void AliHLTTPCCADisplay::SetGB( AliHLTTPCCAGBTracker * const GBTracker )
192 void AliHLTTPCCADisplay::SetCurrentSlice( AliHLTTPCCATracker *slice )
194 // set reference to the current CA tracker, and read the current slice geometry
196 SetSliceTransform( slice );
198 fCos = slice->Param().SinAlpha();
199 fSin = slice->Param().CosAlpha();
200 fZMin = slice->Param().ZMin();
201 fZMax = slice->Param().ZMax();
203 Double_t r0 = .5*(slice->Param().RMax()+slice->Param().RMin());
204 Double_t dr = .5*(slice->Param().RMax()-slice->Param().RMin());
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);
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);
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);
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);
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);
234 void AliHLTTPCCADisplay::SetSliceTransform( Double_t alpha )
236 fSliceCos = TMath::Cos( alpha );
237 fSliceSin = TMath::Sin( alpha );
240 void AliHLTTPCCADisplay::SetSliceTransform( AliHLTTPCCATracker *slice )
242 SetSliceTransform(slice->Param().Alpha());
246 void AliHLTTPCCADisplay::DrawTPC()
248 // schematically draw TPC detector
249 fYX->Range(-fROuterMax, -fROuterMax, fROuterMax, fROuterMax);
250 //fYX->Range( -fROuterMax*.7, -fROuterMax, fROuterMax*0., -fROuterMax*.5);
253 fArc.SetLineColor(kBlack);
254 fArc.SetFillStyle(0);
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) );
264 fZX->Range( fTPCZMin, -fROuterMax, fTPCZMax*1.1, fROuterMax );
265 //fZX->Range( fTPCZMax*.1, -fROuterMax, fTPCZMax*.3, -fROuterMax*0.5 );
269 void AliHLTTPCCADisplay::DrawSlice( AliHLTTPCCATracker *slice, Bool_t DrawRows )
271 // draw current the TPC slice
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());
283 fLatex.DrawLatex(cx-dr+dr*.05,cy-dr+dr*.05, Form("YX, Slice %2i",slice->Param().ISlice()));
285 a0+= raddeg*TMath::ATan2(fSin, fCos );
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 );
295 fLine.SetLineColor(kBlack);
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()));
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 );
315 fLine.DrawLine(vx0, vy0,vx1,vy1);
317 fLine.DrawLine(fTPCZMin, vy0,fTPCZMax,vy1);
324 void AliHLTTPCCADisplay::Set2Slices( AliHLTTPCCATracker * const slice )
326 //* Set view for two neighbouring slices
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();
335 Double_t r0 = .5*(slice->Param().RMax()+slice->Param().RMin());
336 Double_t dr = .5*(slice->Param().RMax()-slice->Param().RMin());
339 fYX->Range(cx-1.3*dr, cy-1.1*dr, cx+1.3*dr, cy+1.1*dr);
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);
350 fLatex.DrawLatex(cz-dz+dz*.05,cy-dr+dr*.05, Form("ZX, Slices %2i/%2i",islice,jslice));
353 Int_t AliHLTTPCCADisplay::GetColor( Int_t i ) const
355 // Get color with respect to Z coordinate
356 const Color_t kMyColor[9] = { kGreen, kBlue, kYellow, kCyan, kOrange,
357 kSpring, kTeal, kAzure, kViolet };
359 if( i==0 ) return kBlack;
360 return kMyColor[(i-1)%9];
363 Int_t AliHLTTPCCADisplay::GetColorZ( Double_t z ) const
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 };
369 Double_t zz = (z-fZMin)/(fZMax-fZMin);
370 Int_t iz = (int) (zz*11);
376 Int_t AliHLTTPCCADisplay::GetColorY( Double_t y ) const
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 };
382 Double_t yy = (y-fYMin)/(fYMax-fYMin);
383 Int_t iy = (int) (yy*11);
389 Int_t AliHLTTPCCADisplay::GetColorK( Double_t k ) const
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;
400 if( TMath::Abs(qPt) >1.e-4 ) pt = 1./TMath::Abs(qPt);
402 Double_t yy = (pt-0.1)/(1.-0.1);
403 Int_t iy = (int) (yy*11);
409 void AliHLTTPCCADisplay::Global2View( Double_t x, Double_t y, Double_t *xv, Double_t *yv ) const
411 // convert coordinates global->view
412 *xv = x*fCos + y*fSin;
413 *yv = y*fCos - x*fSin;
417 void AliHLTTPCCADisplay::Slice2View( Double_t x, Double_t y, Double_t *xv, Double_t *yv ) const
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;
427 void AliHLTTPCCADisplay::DrawGBHit( AliHLTTPCCAGBTracker &tracker, Int_t iHit, Int_t color, Size_t width )
430 AliHLTTPCCAGBHit &h = tracker.Hits()[iHit];
431 AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
432 SetSliceTransform(&slice);
436 Int_t lab = fPerf->HitLabels()[h.ID()].fLab[0];
437 color = GetColor(lab+1);
439 AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
440 if( mc.P()>=1. ) color = kRed;
441 else if(fDrawOnlyRef) return;
443 }else color=GetColorZ( h.Z() );
445 if( width>0 )fMarker.SetMarkerSize(width);
446 else fMarker.SetMarkerSize(.3);
447 fMarker.SetMarkerColor(color);
449 Slice2View( h.X(), h.Y(), &vx, &vy );
452 fMarker.DrawMarker(vx, vy);
454 fMarker.DrawMarker(h.Z(), vy);
457 void AliHLTTPCCADisplay::DrawGBHits( AliHLTTPCCAGBTracker &tracker, Int_t color, Size_t width )
462 if( width<0 ) width = .3;
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;
471 col = GetColor(imc+1) ;
472 if( mc && (mc->P()>=1.) ) col = kRed;
475 AliHLTTPCCATracker &slice = tracker.Slices()[h.ISlice()];
476 SetSliceTransform(&slice);
478 fMarker.SetMarkerSize(width);
479 fMarker.SetMarkerColor(col);
481 Slice2View( h.X(), h.Y(), &vx, &vy );
484 fMarker.DrawMarker(vx, vy);
486 fMarker.DrawMarker(h.Z(), vy);
490 void AliHLTTPCCADisplay::DrawSliceHit( Int_t iRow, Int_t iHit, Int_t color, Size_t width )
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];
503 Float_t y = y0 + hh.x*stepY;
504 Float_t z = z0 + hh.y*stepZ;
506 SetSliceTransform(fSlice);
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);
515 AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
516 if( mc.P()>=1. ) color = kRed;
517 else if(fDrawOnlyRef) return;
519 }else color=GetColorZ( z );
521 if( width>0 )fMarker.SetMarkerSize(width);
522 else fMarker.SetMarkerSize(.3);
523 fMarker.SetMarkerColor(color);
525 Slice2View( x, y, &vx, &vy );
527 fMarker.DrawMarker(vx, vy);
529 fMarker.DrawMarker(z, vy);
532 void AliHLTTPCCADisplay::DrawSliceHits( Int_t color, Size_t width )
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 );
546 void AliHLTTPCCADisplay::DrawSliceLink( Int_t iRow, Int_t iHit, Int_t colorUp, Int_t colorDn, Int_t width )
548 // draw link between clusters
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;
558 const AliHLTTPCCARow& row = fSlice->Row(iRow);
559 const AliHLTTPCCARow& rowUp = fSlice->Row(iRow+1);
560 const AliHLTTPCCARow& rowDn = fSlice->Row(iRow-1);
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];
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 );
575 fLine.DrawLine(vx-.1,vy,vx1-.1,vy1);
577 fLine.DrawLine(h.Z()-1.,vy,h1.Z()-1.,vy1);
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 );
587 fLine.DrawLine(vx+.1,vy,vx1+.1,vy1);
589 fLine.DrawLine(h.Z()+1.,vy,h1.Z()+1.,vy1);
594 void AliHLTTPCCADisplay::DrawSliceLinks( Int_t colorUp, Int_t colorDn, Int_t width )
596 // draw links between clusters
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 );
608 Int_t AliHLTTPCCADisplay::GetTrackMC( const AliHLTTPCCADisplayTmpHit *vHits, Int_t NHits )
610 // get MC label for the track
612 AliHLTTPCCAGBTracker &tracker = *fGB;
616 Int_t *lb = new Int_t[NHits*3];
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;
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++ ){
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;
640 if( labcur>=0 && lmax<lcurr ){
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;
657 if( labcur>=0 && lmax<lcurr ){
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
669 purity = ( (NHits>0) ?double(lmax)/double(NHits) :0 );
670 if( lb ) delete[] lb;
671 if( purity<.9 ) label = -1;
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 )
680 if(NHits<2 ) return 0;
682 AliHLTTPCCAGBTracker &tracker = *fGB;
683 if( width<0 ) width = 2;
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;
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 );
698 AliHLTTPCCAMCTrack &mc = fPerf->MCTracks()[lab];
699 if( mc.P()>=1. ) color = kRed;
703 if( t.SinPhi()>.999 ) t.SetSinPhi( .999 );
704 else if( t.SinPhi()<-.999 ) t.SetSinPhi( -.999 );
706 // Int_t iSlice = fSlice->Param().ISlice();
708 //sort(vHits, vHits + NHits, AliHLTTPCCADisplayTmpHit::CompareHitZ );
710 Double_t vx[2000], vy[2000], vz[2000];
713 //Int_t oldSlice = -1;
714 Double_t alpha = ( TMath::Abs(Alpha+1)<1.e-4 ) ?fSlice->Param().Alpha() :Alpha;
715 AliHLTTPCCATrackParam tt = t;
717 for( Int_t iHit=0; iHit<NHits; iHit++ ){
719 AliHLTTPCCAGBHit &h = tracker.Hits()[vHits[iHit].ID()];
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;
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 ) ){
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;
741 SetSliceTransform( alpha );
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;
753 Slice2View(x1, y1, &x1, &y1 );
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);
769 Slice2View(x1, y1, &x1, &y1 );
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 );
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;
797 for( Int_t i = mHits; i>0; i-- ){
810 fLine.SetLineColor(color);
811 fLine.SetLineWidth(width);
812 fArc.SetFillStyle(0);
813 fArc.SetLineColor(color);
814 fArc.SetLineWidth(width);
816 pl.SetLineColor(color);
817 pl.SetLineWidth(width);
819 plZ.SetLineColor(color);
820 plZ.SetLineWidth(width);
822 fMarker.SetMarkerSize(width/2.);
823 fMarker.SetMarkerColor(color);
826 pl.DrawPolyLine(mHits,vx,vy);
828 fMarker.DrawMarker(vx[0],vy[0]);
829 fMarker.DrawMarker(vx[mHits-1],vy[mHits-1]);
832 plZ.DrawPolyLine(mHits,vz,vy);
833 fMarker.DrawMarker(vz[0],vy[0]);
834 fMarker.DrawMarker(vz[mHits-1],vy[mHits-1]);
836 fLine.SetLineWidth(1);
841 Bool_t AliHLTTPCCADisplay::DrawTracklet( AliHLTTPCCATrackParam &track, const Int_t *hitstore, Int_t color, Int_t width, Bool_t pPoint )
844 AliHLTTPCCAGBTracker &tracker = *fGB;
845 AliHLTTPCCADisplayTmpHit vHits[200];
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() );
859 return DrawTrack( track, -1, vHits, nHits, color,width,pPoint );
863 void AliHLTTPCCADisplay::DrawSliceOutTrack( AliHLTTPCCATrackParam &t, Double_t alpha, Int_t itr, Int_t color, Int_t width )
867 AliHLTTPCCAOutTrack &track = fSlice->OutTracks()[itr];
868 if( track.NHits()<2 ) return;
870 AliHLTTPCCAGBTracker &tracker = *fGB;
871 AliHLTTPCCADisplayTmpHit vHits[200];
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 );
878 vHits[ih].SetZ( h.Z() );
881 DrawTrack( t, alpha, vHits, track.NHits(), color, width, 1 );
884 void AliHLTTPCCADisplay::DrawSliceOutTrack( Int_t itr, Int_t color, Int_t width )
888 AliHLTTPCCAOutTrack &track = fSlice->OutTracks()[itr];
889 if( track.NHits()<2 ) return;
891 AliHLTTPCCAGBTracker &tracker = *fGB;
892 AliHLTTPCCADisplayTmpHit vHits[200];
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 );
899 vHits[ih].SetZ( h.Z() );
902 DrawTrack( track.StartPoint(), -1, vHits, track.NHits(), color, width );
906 void AliHLTTPCCADisplay::DrawSliceTrack( Int_t itr, Int_t color )
910 AliHLTTPCCATrack &track = fSlice->Tracks()[itr];
911 if( track.NHits()<2 ) return;
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() );
927 DrawTrack( track.Param(), -1, vHits, track.NHits(), color,-1 );
928 //track.Param().Print();
932 void AliHLTTPCCADisplay::DrawGBTrack( Int_t itr, Int_t color, Int_t width )
936 AliHLTTPCCAGBTracker &tracker = *fGB;
937 AliHLTTPCCADisplayTmpHit vHits[1000];
939 AliHLTTPCCAGBTrack &track = tracker.Tracks()[itr];
940 if( track.NHits()<2 ) return;
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 );
947 vHits[ih].SetZ( h.Z() );
950 DrawTrack( track.Param(), track.Alpha(), vHits, track.NHits(), color, width );
954 void AliHLTTPCCADisplay::DrawGBTrackFast( AliHLTTPCCAGBTracker &tracker, Int_t itr, Int_t color )
958 AliHLTTPCCAGBTrack &track = tracker.Tracks()[itr];
959 if( track.NHits()<2 ) return;
962 AliHLTTPCCADisplayTmpHit *vHits = new AliHLTTPCCADisplayTmpHit[track.NHits()];
963 AliHLTTPCCATrackParam t = track.Param();
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 );
970 vHits[ih].SetZ( h->Z() );
973 sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
974 Int_t colorY = color;
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());
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);
994 pl.SetLineColor(colorY);
995 pl.SetLineWidth(width);
998 Double_t alpha = track.Alpha();
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;
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]) );
1013 t.GetDCAPoint( h1.X(), h1.Y(), h1.Z(), x1, y1, z1, fSlice->Param().Bz() );
1014 Slice2View(x1, y1, &vx1, &vy1 );
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]) );
1022 t.GetDCAPoint( h2.X(), h2.Y(), h2.Z(), x2, y2, z2, fSlice->Param().Bz() );
1023 Slice2View(x2, y2, &vx2, &vy2 );
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;
1032 if( TMath::Abs(k)>1.e-4 ){
1036 Double_t r = 1/TMath::Abs(k);
1037 Double_t xc = x0 -ey*(1/k);
1038 Double_t yc = y0 +ex*(1/k);
1041 Slice2View( xc, yc, &vx, &vy );
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.;
1047 if( a2<a1 ) a2+=360;
1048 Double_t da = TMath::Abs(a2-a1);
1049 if( da>360 ) da-= 360;
1054 if( a2<a1 ) a2+=360;
1056 fArc.DrawArc(vx,vy,r, a1,a2,"only");
1057 //fArc.DrawArc(vx,vy,r, 0,360,"only");
1060 fLine.DrawLine(vx1,vy1, vx2, vy2 );
1065 Double_t py[track.NHits()], pz[track.NHits()];
1067 for( Int_t iHit=0; iHit<track.NHits(); iHit++ ){
1069 AliHLTTPCCAGBHit &h1 = tracker.Hits()[vHits[iHit].ID()];
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]) );
1078 t.GetDCAPoint( h1.X(), h1.Y(), h1.Z(), x1, y1, z1, fSlice->Param().Bz() );
1079 Slice2View(x1, y1, &vx1, &vy1 );
1086 pl.DrawPolyLine(track.NHits(),pz,py);
1088 fLine.SetLineWidth(1);
1101 void AliHLTTPCCADisplay::DrawMergedHit( Int_t iRow, Int_t iHit, Int_t color )
1103 // connect two cells on display
1107 const AliHLTTPCCARow &row = fSlice->Row(iRow);
1108 AliHLTTPCCAHit &h = row.Hits()[iHit];
1109 AliHLTTPCCAHit &hyz = row.HitsYZ()[iHit];
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;
1120 if( fSlice->HitLinksDown()[]>=0 ){
1122 iHit1 = h.LinkDown();
1123 AliHLTTPCCARow &row1 = fSlice->Rows()[iRow1];
1124 AliHLTTPCCAHitYZ &h1 = row1.HitsYZ()[iHit1];
1129 if( h.LinkUp()>=0 ){
1132 AliHLTTPCCARow &row2 = fSlice->Rows()[iRow2];
1133 AliHLTTPCCAHitYZ &h2 = row2.HitsYZ()[iHit2];
1138 if( color<0 ) color = GetColorZ( (z+z1+z2)/3. );
1141 Slice2View(x,y, &x, &y );
1142 Slice2View(x1,y1, &x1, &y1 );
1143 Slice2View(x2,y2, &x2, &y2 );
1145 Double_t lx[] = { x1, x, x2 };
1146 Double_t ly[] = { y1, y, y2 };
1147 Double_t lz[] = { z1, z, z2 };
1149 fPLine.SetLineColor(color);
1150 fPLine.SetLineWidth(1);
1151 //fPLine.SetFillColor(color);
1152 fPLine.SetFillStyle(-1);
1155 fPLine.DrawPolyLine(3, lx, ly );
1157 fPLine.DrawPolyLine(3, lz, ly );
1158 DrawHit( iRow, iHit, color );
1159 DrawHit( iRow1, iHit1, color );
1160 DrawHit( iRow2, iHit2, color );
1165 void AliHLTTPCCADisplay::DrawTrack( AliHLTTPCCATrack &track, Int_t color, Bool_t DrawHits )
1169 if( track.NHits()<2 ) return;
1172 AliHLTTPCCADisplayTmpHit *vHits = new AliHLTTPCCADisplayTmpHit[track.NHits()];
1173 AliHLTTPCCATrackParam &t = track.Param();
1175 Int_t iID = track.FirstHitID();
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();
1191 sort(vHits, vHits + track.NHits(), AliHLTTPCCADisplayTmpHit::CompareHitZ );
1192 //cout<<"Draw track, nhits = "<<nhits<<endl;
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. );
1199 fMarker.SetMarkerColor(color);//kBlue);
1200 fMarker.SetMarkerSize(1.);
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]);
1206 Slice2View(row1.X(), c1.Y(), &vx1, &vy1 );
1208 fMarker.DrawMarker(vx1,vy1);
1210 fMarker.DrawMarker(c1.Z(),vy1);
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++ )
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() );
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 );
1232 fLine.SetLineColor( color );
1233 fLine.SetLineWidth( width );
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;
1242 if( TMath::Abs(k)>1.e-4 ){
1244 fArc.SetFillStyle(0);
1245 fArc.SetLineColor(color);
1246 fArc.SetLineWidth(width);
1250 Double_t r = 1/TMath::Abs(k);
1251 Double_t xc = x0 -ey*(1/k);
1252 Double_t yc = y0 +ex*(1/k);
1255 Slice2View( xc, yc, &vx, &vy );
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.;
1261 if( a2<a1 ) a2+=360;
1262 Double_t da = TMath::Abs(a2-a1);
1263 if( da>360 ) da-= 360;
1268 if( a2<a1 ) a2+=360;
1270 fArc.DrawArc(vx,vy,r, a1,a2,"only");
1271 //fArc.DrawArc(vx,vy,r, 0,360,"only");
1274 fLine.DrawLine(vx1,vy1, vx2, vy2 );
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());
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() );
1290 Double_t vx1, vy1, vx2, vy2;
1291 Slice2View(x1, y1, &vx1, &vy1 );
1292 Slice2View(x2, y2, &vx2, &vy2 );
1294 fLine.SetLineColor(color);
1295 fLine.SetLineWidth(width);
1298 fLine.DrawLine(z1,vy1, z2, vy2 );
1300 fLine.SetLineWidth(1);
1305 void AliHLTTPCCADisplay::DrawTrackletPoint( AliHLTTPCCATrackParam &t, Int_t color )
1307 // draw tracklet point
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;
1319 if( color<0 ) color = GetColorZ( t.GetZ() );
1321 fMarker.SetMarkerColor(color);
1322 fMarker.SetMarkerSize(.5);
1323 fLine.SetLineWidth(width);
1324 fLine.SetLineColor(color);
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);
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 );
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);