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