24 #include "AliHLTTPCCASliceTrack.h"
25 #include "AliHLTTPCCATracker.h"
26 #include "AliHLTTPCCAGBTrack.h"
27 #include "AliHLTTPCCATrackParam.h"
29 #include "AliHLTTPCCAMerger.h"
31 #include "AliHLTTPCCAMath.h"
32 #include "Stopwatch.h"
34 #include "AliHLTTPCCATrackParam.h"
35 #include "AliHLTTPCCASliceTrack.h"
36 #include "AliHLTTPCCASliceOutput.h"
37 #include "AliHLTTPCCAMergedTrack.h"
38 #include "AliHLTTPCCAMergerOutput.h"
39 #include "AliHLTTPCCADataCompressor.h"
40 #include "AliHLTTPCCAParam.h"
41 #include "AliHLTTPCCATrackLinearisation.h"
48 #include "AliHLTTPCCADisplay.h"
51 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
56 #endif //DO_TPCCATRACKER_EFF_PERFORMANCE
58 #include "AliHLTTPCCATrackParamVector.h"
59 #include "AliHLTTPCCATrackLinearisationVector.h"
83 int AliHLTTPCCAMerger::fgDoNotMergeBorders = 0;
90 float InnerAlpha()
const {
return fInnerAlpha; }
91 float OuterAlpha()
const {
return fOuterAlpha; }
92 unsigned short NClusters()
const {
return fNClusters; }
93 int FirstClusterRef()
const {
return fFirstClusterRef; }
94 int PrevNeighbour()
const {
return fPrevNeighbour; }
95 int NextNeighbour()
const {
return fNextNeighbour; }
96 unsigned char SlicePrevNeighbour()
const {
return fSlicePrevNeighbour; }
97 unsigned char SliceNextNeighbour()
const {
return fSliceNextNeighbour; }
98 bool Used()
const {
return fUsed; }
102 void SetInnerAlpha(
float v ) { fInnerAlpha = v; }
103 void SetOuterAlpha(
float v ) { fOuterAlpha = v; }
104 void SetNClusters (
unsigned short v ) { fNClusters = v; }
105 void SetFirstClusterRef(
int v ) { fFirstClusterRef = v; }
106 void SetPrevNeighbour(
int v ) { fPrevNeighbour = v; }
107 void SetNextNeighbour(
int v ) { fNextNeighbour = v; }
108 void SetSlicePrevNeighbour(
unsigned char v ) { fSlicePrevNeighbour = v; }
109 void SetSliceNextNeighbour(
unsigned char v ) { fSliceNextNeighbour = v; }
110 void SetUsed(
bool v ) { fUsed = v; }
111 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
113 unsigned char fSlice;
115 #endif // DO_TPCCATRACKER_EFF_PERFORMANCE
121 unsigned char fInnerRow;
122 unsigned char fOuterRow;
130 unsigned short fNClusters;
131 int fFirstClusterRef;
134 unsigned char fSlicePrevNeighbour;
135 unsigned char fSliceNextNeighbour;
140 AliHLTTPCCAMerger::AliHLTTPCCAMerger()
144 fMaxClusterInfos( 0 ),
155 for(
int iSlice=0; iSlice<fgkNSlices; iSlice++)
178 AliHLTTPCCAMerger::~AliHLTTPCCAMerger()
181 if ( fTrackInfos )
delete[] fTrackInfos;
182 if ( fClusterInfos )
delete[] fClusterInfos;
183 if ( fOutput )
delete[] ( (
char* )( fOutput ) );
186 void AliHLTTPCCAMerger::Clear()
188 for (
int i = 0; i < fgkNSlices; ++i ) {
191 for (
int i = 0; i < fNTimers; i++) fTimers[i] = 0;
203 fkSlices[index] = sliceData;
206 void AliHLTTPCCAMerger::Reconstruct()
218 fTimers[0] = timer.RealTime();
221 #ifdef DO_MERGER_PERF
222 AliHLTTPCCAPerformance::Instance().CreateHistos(
"Merger");
223 ((AliHLTTPCCAMergerPerformance*)(AliHLTTPCCAPerformance::Instance().GetSubPerformance(
"Merger")))->SetNewEvent(
224 AliHLTTPCCAPerformance::Instance().GetTracker(),
225 AliHLTTPCCAPerformance::Instance().GetHitLabels(),
226 AliHLTTPCCAPerformance::Instance().GetMCTracks(),
227 AliHLTTPCCAPerformance::Instance().GetMCPoints());
228 ((AliHLTTPCCAMergerPerformance*)(AliHLTTPCCAPerformance::Instance().GetSubPerformance(
"Merger")))->FillMC();
229 #endif //DO_MERGER_PERF
240 fTimers[1] = timer.RealTime();
250 fTimers[2] = timer.RealTime();
254 void AliHLTTPCCAMerger::UnpackSlices()
259 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
261 #endif // DO_TPCCATRACKER_EFF_PERFORMANCE
262 int nTracksTotal = 0;
263 int nTrackClustersTotal = 0;
264 for (
int iSlice = 0; iSlice < fgkNSlices; iSlice++ ) {
265 if ( !fkSlices[iSlice] )
continue;
266 nTracksTotal += fkSlices[iSlice]->NTracks();
267 nTrackClustersTotal += fkSlices[iSlice]->NTrackClusters();
268 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
269 slices[iSlice]->fNOutTracks1 = 0;
270 #endif //DO_TPCCATRACKER_EFF_PERFORMANCE
277 if ( fTrackInfos )
delete[] fTrackInfos;
278 fMaxTrackInfos = ( int ) ( nTracksTotal );
279 fTrackInfos =
new AliHLTTPCCASliceTrackInfo[fMaxTrackInfos];
284 if ( fClusterInfos )
delete[] fClusterInfos;
285 fMaxClusterInfos = ( int ) ( nTrackClustersTotal );
289 if ( fOutput )
delete[] ( (
char* )( fOutput ) );
290 int size = AliHLTTPCCAMergerOutput::EstimateSize( nTracksTotal, nTrackClustersTotal );
329 int nTracksCurrent = 0;
330 int nClustersCurrent = 0;
332 for (
int iSlice = 0; iSlice < fgkNSlices; iSlice++ ) {
334 fSliceTrackInfoStart[ iSlice ] = nTracksCurrent;
335 fSliceNTrackInfos[ iSlice ] = 0;
337 if ( !fkSlices[iSlice] )
continue;
341 for (
int itr = 0; itr < slice.NTracks(); itr += ushort_v::Size ) {
343 int nTracksVector = ushort_v::Size;
344 if(slice.NTracks() - itr < ushort_v::Size )
345 nTracksVector = slice.NTracks() - itr;
347 sfloat_v::Memory startAlpha;
348 sfloat_v::Memory endAlpha;
350 int hits[1000][ushort_v::Size];
351 ushort_v::Memory nHits;
354 unsigned short nCluNew = 0;
356 for(
int iV=0; iV < nTracksVector; iV++)
361 for (
int iTrClu = 0; iTrClu < sTrack.NClusters(); iTrClu++ ) {
364 int ic = sTrack.FirstClusterRef() + iTrClu;
366 clu.SetISlice( iSlice );
367 clu.SetIRow( slice.ClusterIDrc( ic ).Row() );
368 clu.SetIClu( slice.ClusterIDrc( ic ).Cluster() );
369 float2 yz = slice.ClusterUnpackedYZ( ic );
370 clu.SetX( slice.ClusterUnpackedX( ic ) );
373 hits[iTrClu][iV] = nClustersCurrent + nCluNew + iTrClu;
376 nCluNew += nHits[iV];
378 startPoint[iV] = sTrack.Param();
379 endPoint[iV] = startPoint[iV];
380 startAlpha[iV] = slices[iSlice]->Param().Alpha();
381 endAlpha[iV] = startAlpha[iV];
386 sfloat_m fitted = sfloat_m(
true);
387 fitted &=
static_cast<sfloat_m
>(
static_cast<ushort_v
>(nHits) >= 3);
390 #ifdef DISABLE_HIT_SEARCH
392 fitted &= FitTrack( startPoint, startAlpha, endPoint, endAlpha, hits, nHits, nTracksVector, 1 );
393 for(
int iV=0; iV < nTracksVector; iV++)
395 endPoint[iV] = startPoint[iV];
396 endAlpha[iV] = startAlpha[iV];
398 fitted &= FitTrack( endPoint, endAlpha, startPoint, startAlpha, hits, nHits, nTracksVector, 0 );
403 ConvertTrackParamToVector(startPoint,vStartPoint,nTracksVector);
404 sfloat_v vStartAlpha(Vc::Zero);
405 vStartAlpha.load(startAlpha);
406 sfloat_v vEndAlpha(Vc::Zero);
408 fitted &=
static_cast<sfloat_m
>( ushort_v( Vc::IndexesFromZero ) < nTracksVector );
410 ushort_v firstHits(Vc::Zero);
412 vEndPoint = vStartPoint;
413 vEndAlpha = vStartAlpha;
415 fitted &= FitTrack( vEndPoint, vEndAlpha, hits, firstHits, nHits, nTracksVector,fitted, 0 );
417 fitted &= vEndPoint.Chi2()/
static_cast<sfloat_v
>(vEndPoint.NDF()) < 9.f;
419 vStartPoint = vEndPoint;
420 vStartAlpha = vEndAlpha;
422 fitted &= FitTrack( vStartPoint, vStartAlpha, hits, firstHits, nHits, nTracksVector,fitted, 1 );
424 fitted &= vStartPoint.Chi2()/
static_cast<sfloat_v
>(vStartPoint.NDF()) < 9.f;
426 for(
int iV=0; iV < nTracksVector; iV++)
428 if ( !fitted[iV] )
continue;
432 vStartAlpha.store(&(startAlpha[0]));
433 vEndAlpha.store(&(endAlpha[0]));
435 for(
int iV=0; iV < nTracksVector; iV++)
438 if ( !(fitted[iV]) )
continue;
439 if ( nHits[iV] < AliHLTTPCCAParameters::MinTrackPurity*sTrack.NClusters() )
continue;
441 AliHLTTPCCASliceTrackInfo &
track = fTrackInfos[nTracksCurrent];
443 track.SetInnerParam( startPoint[iV] );
444 track.SetInnerAlpha( startAlpha[iV] );
445 track.SetOuterParam( endPoint[iV] );
446 track.SetOuterAlpha( endAlpha[iV] );
447 track.SetFirstClusterRef( nClustersCurrent );
448 track.SetNClusters( nHits[iV] );
449 track.SetPrevNeighbour( -1 );
450 track.SetNextNeighbour( -1 );
451 track.SetSlicePrevNeighbour( -1 );
452 track.SetSliceNextNeighbour( -1 );
453 track.ChiPrev = 10000000;
454 track.ChiNext = 10000000;
457 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
458 track.orig_track_id = itr+iV;
459 track.fSlice = iSlice;
460 track.number = nTracksCurrent - fSliceTrackInfoStart[iSlice];
461 #endif // DO_TPCCATRACKER_EFF_PERFORMANCE
462 track.fInnerRow = (fClusterInfos[hits[0][iV]]).IRow();
463 track.fOuterRow = (fClusterInfos[hits[nHits[iV]-1][iV]]).IRow();
465 for (
int i = 0; i < nHits[iV]; i++ )
466 fClusterInfos[nClustersCurrent + i] = fClusterInfos[hits[i][iV]];
468 fSliceNTrackInfos[ iSlice ]++;
469 nClustersCurrent += nHits[iV];
473 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
474 if (slices[iSlice]->fOutTracks1)
delete[] slices[iSlice]->fOutTracks1;
476 for (
int i=0; i<nTracksCurrent-NTracksPrev; i++)
478 slices[iSlice]->fOutTracks1[i].SetStartPoint(fTrackInfos[i+NTracksPrev].InnerParam());
479 slices[iSlice]->fOutTracks1[i].SetEndPoint(fTrackInfos[i+NTracksPrev].OuterParam());
480 slices[iSlice]->fOutTracks1[i].SetOrigTrackID(fTrackInfos[i+NTracksPrev].orig_track_id);
481 slices[iSlice]->fNOutTracks1++;
483 NTracksPrev = nTracksCurrent;
484 #endif // DO_TPCCATRACKER_EFF_PERFORMANCE
490 int hits[2000][ushort_v::Size], ushort_v &firstHits,ushort_v::Memory &NTrackHits,
491 int &nTracksV, sfloat_m active0,
bool dir )
505 t.CalculateFitParameters( fitPar );
507 int hitsNew[AliHLTTPCCAParameters::MaxNumberOfRows8*4][ushort_v::Size];
508 ushort_v::Memory nHitsNew;
509 for(
int iV=0; iV<ushort_v::Size; iV++)
512 ushort_v nHits(NTrackHits);
513 nHits.setZero(static_cast<ushort_m>(!active0));
515 int nHitsMax = nHits.max();
517 sfloat_m active = active0;
518 for (
unsigned short ihit = 0; ihit < nHitsMax; ihit++ ) {
520 active &=
static_cast<sfloat_m
>( ihit < nHits );
521 if(active.isEmpty())
continue;
522 sfloat_v::Memory xH, yH, zH, sliceAlpha;
523 ushort_v::Memory Row;
525 for(
int iV=0; iV < nTracksV; iV++)
527 if( !(active[iV]) )
continue;
528 if( ihit > NTrackHits[iV] - 1)
continue;
529 const int jhit = dir ? ( NTrackHits[iV] - 1 - ihit ) : ihit;
531 sliceAlpha[iV] = slices[h.ISlice()]->Param().Alpha();
538 const sfloat_v xV(xH);
539 const sfloat_v yV(yH);
540 const sfloat_v zV(zH);
541 const sfloat_v sliceAlphaV(sliceAlpha);
542 const ushort_v RowV(Row);
544 const sfloat_m savedActive = active;
545 const sfloat_v rotateA = sliceAlphaV - Alpha0V;
546 const sfloat_m &rotated = t.Rotate( rotateA, l, .999f, active);
548 const sfloat_v xLast = t.X();
550 Alpha0V(active) = sliceAlphaV;
552 const sfloat_m &transported = t.TransportToXWithMaterial( xV, l, fitPar, fSliceParam.cBz( ), 0.999f, active);
553 active &= transported;
556 t.SetCov( 0, 10.f, active );
557 t.SetCov( 1, 0.f, active );
558 t.SetCov( 2, 10.f, active );
559 t.SetCov( 3, 0.f, active );
560 t.SetCov( 4, 0.f, active );
561 t.SetCov( 5, 1.f, active );
562 t.SetCov( 6, 0.f, active );
563 t.SetCov( 7, 0.f, active );
564 t.SetCov( 8, 0.f, active );
565 t.SetCov( 9, 1.f, active );
566 t.SetCov( 10, 0.f, active );
567 t.SetCov( 11, 0.f, active );
568 t.SetCov( 12, 0.f, active );
569 t.SetCov( 13, 0.f, active );
570 t.SetCov( 14, 10.f, active );
571 t.SetChi2( 0.f, active);
572 t.SetNDF( short_v(-5), static_cast<short_m>(active) );
573 t.CalculateFitParameters( fitPar );
576 sfloat_v err2Y, err2Z;
579 const sfloat_m &filtered = t.FilterWithMaterial(yV, zV, err2Y, err2Z, 0.999f,active);
581 const sfloat_m broken = savedActive && (!rotated || !transported || !filtered);
582 if ( !broken.isEmpty() ) {
583 t.TransportToXWithMaterial( xLast, l, fitPar, fSliceParam.cBz( ), 0.999f, transported && !filtered );
584 t.Rotate( -rotateA, l, .999f, rotated && !transported );
588 if(active.isEmpty())
continue;
591 for(
int iV=0; iV < nTracksV; iV++)
593 if( !(active[iV]) )
continue;
594 const int jhit = dir ? ( NTrackHits[iV] - 1 - ihit ) : ihit;
595 hitsNew[nHitsNew[iV]][iV] = hits[static_cast <
unsigned short>(firstHits[iV]) + jhit][iV];
599 t.SetQPt( sfloat_v(1.e-8f), CAMath::Abs( t.QPt() ) < 1.e-8f );
601 sfloat_m ok = active0 && ushort_v(nHitsNew) >= 3;
604 const sfloat_v *c = t.Cov();
605 for (
unsigned char i = 0; i < 15; i++ ) ok &= CAMath::Finite( c[i] );
606 for (
unsigned char i = 0; i < 5; i++ ) ok &= CAMath::Finite( t.Par()[i] );
608 ok &= (c[0] > Vc::Zero) && (c[2] > Vc::Zero) && (c[5] > Vc::Zero) && (c[9] > Vc::Zero) && (c[14] > Vc::Zero);
610 ok &= CAMath::Abs( t.SinPhi() ) < .999f;
612 t.SetSignCosPhi( sfloat_v(1.f), ok && static_cast<sfloat_m>(l.CosPhi() >= Vc::Zero) );
613 t.SetSignCosPhi( sfloat_v(-1.f), ok && static_cast<sfloat_m>(l.CosPhi() < Vc::Zero) );
615 for(
int iV=0; iV < nTracksV; iV++)
617 if ( !ok[iV] )
continue;
618 NTrackHits[iV] = nHitsNew[iV];
619 for (
unsigned char i = 0; i < NTrackHits[iV]; i++ ) {
620 hits[static_cast <
unsigned short>(firstHits[iV]) + (dir ?( NTrackHits[iV]-1-i ) :i)][iV] = hitsNew[i][iV];
627 void AliHLTTPCCAMerger::InvertCholetsky(
float a[15])
629 float d[5], uud, u[5][5];
630 for(
int i=0; i<5; i++)
633 for(
int j=0; j<5; j++)
637 for(
int i=0; i<5; i++)
640 for(
int j=0; j<i; j++)
641 uud += u[j][i]*u[j][i]*d[j];
642 uud = a[i*(i+3)/2] - uud;
644 if(fabs(uud)<1.e-12) uud = 1.e-12;
645 d[i] = uud/fabs(uud);
646 u[i][i] = sqrt(fabs(uud));
648 for(
int j=i+1; j<5; j++)
651 for(
int k=0; k<i; k++)
652 uud += u[k][i]*u[k][j]*d[k];
653 uud = a[j*(j+1)/2+i] - uud;
654 u[i][j] = d[i]/u[i][i]*uud;
660 for(
int i=0; i<5; i++)
663 u[i][i] = 1.f/u[i][i];
665 for(
int i=0; i<4; i++)
667 u[i][i+1] = - u[i][i+1]*u[i][i]*u[i+1][i+1];
669 for(
int i=0; i<3; i++)
671 u[i][i+2] = u[i][i+1]*u1[i+1]*u[i+1][i+2]-u[i][i+2]*u[i][i]*u[i+2][i+2];
673 for(
int i=0; i<2; i++)
675 u[i][i+3] = u[i][i+2]*u1[i+2]*u[i+2][i+3] - u[i][i+3]*u[i][i]*u[i+3][i+3];
676 u[i][i+3] -= u[i][i+1]*u1[i+1]*(u[i+1][i+2]*u1[i+2]*u[i+2][i+3] - u[i+1][i+3]);
678 u[0][4] = u[0][2]*u1[2]*u[2][4] - u[0][4]*u[0][0]*u[4][4];
679 u[0][4] += u[0][1]*u1[1]*(u[1][4] - u[1][3]*u1[3]*u[3][4] - u[1][2]*u1[2]*u[2][4]);
680 u[0][4] += u[3][4]*u1[3]*(u[0][3] - u1[2]*u[2][3]*(u[0][2] - u[0][1]*u1[1]*u[1][2]));
682 for(
int i=0; i<5; i++)
683 a[i+10] = u[i][4]*d[4]*u[4][4];
684 for(
int i=0; i<4; i++)
685 a[i+6] = u[i][3]*u[3][3]*d[3] + u[i][4]*u[3][4]*d[4];
686 for(
int i=0; i<3; i++)
687 a[i+3] = u[i][2]*u[2][2]*d[2] + u[i][3]*u[2][3]*d[3] + u[i][4]*u[2][4]*d[4];
688 for(
int i=0; i<2; i++)
689 a[i+1] = u[i][1]*u[1][1]*d[1] + u[i][2]*u[1][2]*d[2] + u[i][3]*u[1][3]*d[3] + u[i][4]*u[1][4]*d[4];
690 a[0] = u[0][0]*u[0][0]*d[0] + u[0][1]*u[0][1]*d[1] + u[0][2]*u[0][2]*d[2] + u[0][3]*u[0][3]*d[3] + u[0][4]*u[0][4]*d[4];
693 void AliHLTTPCCAMerger::MultiplySS(
float const C[15],
float const V[15],
float K[5][5])
696 K[0][0] = C[0]*V[ 0] + C[1]*V[ 1] + C[3]*V[ 3] + C[6]*V[ 6] + C[10]*V[10];
697 K[0][1] = C[0]*V[ 1] + C[1]*V[ 2] + C[3]*V[ 4] + C[6]*V[ 7] + C[10]*V[11];
698 K[0][2] = C[0]*V[ 3] + C[1]*V[ 4] + C[3]*V[ 5] + C[6]*V[ 8] + C[10]*V[12];
699 K[0][3] = C[0]*V[ 6] + C[1]*V[ 7] + C[3]*V[ 8] + C[6]*V[ 9] + C[10]*V[13];
700 K[0][4] = C[0]*V[10] + C[1]*V[11] + C[3]*V[12] + C[6]*V[13] + C[10]*V[14];
702 K[1][0] = C[1]*V[ 0] + C[2]*V[ 1] + C[4]*V[ 3] + C[7]*V[ 6] + C[11]*V[10];
703 K[1][1] = C[1]*V[ 1] + C[2]*V[ 2] + C[4]*V[ 4] + C[7]*V[ 7] + C[11]*V[11];
704 K[1][2] = C[1]*V[ 3] + C[2]*V[ 4] + C[4]*V[ 5] + C[7]*V[ 8] + C[11]*V[12];
705 K[1][3] = C[1]*V[ 6] + C[2]*V[ 7] + C[4]*V[ 8] + C[7]*V[ 9] + C[11]*V[13];
706 K[1][4] = C[1]*V[10] + C[2]*V[11] + C[4]*V[12] + C[7]*V[13] + C[11]*V[14];
708 K[2][0] = C[3]*V[ 0] + C[4]*V[ 1] + C[5]*V[ 3] + C[8]*V[ 6] + C[12]*V[10];
709 K[2][1] = C[3]*V[ 1] + C[4]*V[ 2] + C[5]*V[ 4] + C[8]*V[ 7] + C[12]*V[11];
710 K[2][2] = C[3]*V[ 3] + C[4]*V[ 4] + C[5]*V[ 5] + C[8]*V[ 8] + C[12]*V[12];
711 K[2][3] = C[3]*V[ 6] + C[4]*V[ 7] + C[5]*V[ 8] + C[8]*V[ 9] + C[12]*V[13];
712 K[2][4] = C[3]*V[10] + C[4]*V[11] + C[5]*V[12] + C[8]*V[13] + C[12]*V[14];
714 K[3][0] = C[6]*V[ 0] + C[7]*V[ 1] + C[8]*V[ 3] + C[9]*V[ 6] + C[13]*V[10];
715 K[3][1] = C[6]*V[ 1] + C[7]*V[ 2] + C[8]*V[ 4] + C[9]*V[ 7] + C[13]*V[11];
716 K[3][2] = C[6]*V[ 3] + C[7]*V[ 4] + C[8]*V[ 5] + C[9]*V[ 8] + C[13]*V[12];
717 K[3][3] = C[6]*V[ 6] + C[7]*V[ 7] + C[8]*V[ 8] + C[9]*V[ 9] + C[13]*V[13];
718 K[3][4] = C[6]*V[10] + C[7]*V[11] + C[8]*V[12] + C[9]*V[13] + C[13]*V[14];
720 K[4][0] = C[10]*V[ 0] + C[11]*V[ 1] + C[12]*V[ 3] + C[13]*V[ 6] + C[14]*V[10];
721 K[4][1] = C[10]*V[ 1] + C[11]*V[ 2] + C[12]*V[ 4] + C[13]*V[ 7] + C[14]*V[11];
722 K[4][2] = C[10]*V[ 3] + C[11]*V[ 4] + C[12]*V[ 5] + C[13]*V[ 8] + C[14]*V[12];
723 K[4][3] = C[10]*V[ 6] + C[11]*V[ 7] + C[12]*V[ 8] + C[13]*V[ 9] + C[14]*V[13];
724 K[4][4] = C[10]*V[10] + C[11]*V[11] + C[12]*V[12] + C[13]*V[13] + C[14]*V[14];
727 void AliHLTTPCCAMerger::MultiplyMS(
float const C[5][5],
float const V[15],
float K[15])
730 K[0] = C[0][0]*V[0] + C[0][1]*V[1] + C[0][2]*V[3] + C[0][3]*V[6] + C[0][4]*V[10];
732 K[1] = C[1][0]*V[0] + C[1][1]*V[1] + C[1][2]*V[3] + C[1][3]*V[6] + C[1][4]*V[10];
733 K[2] = C[1][0]*V[1] + C[1][1]*V[2] + C[1][2]*V[4] + C[1][3]*V[7] + C[1][4]*V[11];
735 K[3] = C[2][0]*V[0] + C[2][1]*V[1] + C[2][2]*V[3] + C[2][3]*V[6] + C[2][4]*V[10];
736 K[4] = C[2][0]*V[1] + C[2][1]*V[2] + C[2][2]*V[4] + C[2][3]*V[7] + C[2][4]*V[11];
737 K[5] = C[2][0]*V[3] + C[2][1]*V[4] + C[2][2]*V[5] + C[2][3]*V[8] + C[2][4]*V[12];
739 K[6] = C[3][0]*V[0] + C[3][1]*V[1] + C[3][2]*V[3] + C[3][3]*V[6] + C[3][4]*V[10];
740 K[7] = C[3][0]*V[1] + C[3][1]*V[2] + C[3][2]*V[4] + C[3][3]*V[7] + C[3][4]*V[11];
741 K[8] = C[3][0]*V[3] + C[3][1]*V[4] + C[3][2]*V[5] + C[3][3]*V[8] + C[3][4]*V[12];
742 K[9] = C[3][0]*V[6] + C[3][1]*V[7] + C[3][2]*V[8] + C[3][3]*V[9] + C[3][4]*V[13];
744 K[10] = C[4][0]*V[ 0] + C[4][1]*V[ 1] + C[4][2]*V[ 3] + C[4][3]*V[ 6] + C[4][4]*V[10];
745 K[11] = C[4][0]*V[ 1] + C[4][1]*V[ 2] + C[4][2]*V[ 4] + C[4][3]*V[ 7] + C[4][4]*V[11];
746 K[12] = C[4][0]*V[ 3] + C[4][1]*V[ 4] + C[4][2]*V[ 5] + C[4][3]*V[ 8] + C[4][4]*V[12];
747 K[13] = C[4][0]*V[ 6] + C[4][1]*V[ 7] + C[4][2]*V[ 8] + C[4][3]*V[ 9] + C[4][4]*V[13];
748 K[14] = C[4][0]*V[10] + C[4][1]*V[11] + C[4][2]*V[12] + C[4][3]*V[13] + C[4][4]*V[14];
751 void AliHLTTPCCAMerger::MultiplySR(
float const C[15],
float const r_in[5],
float r_out[5])
754 r_out[0] = r_in[0]*C[ 0] + r_in[1]*C[ 1] + r_in[2]*C[ 3] +r_in[3]*C[ 6] + r_in[4]*C[10];
755 r_out[1] = r_in[0]*C[ 1] + r_in[1]*C[ 2] + r_in[2]*C[ 4] +r_in[3]*C[ 7] + r_in[4]*C[11];
756 r_out[2] = r_in[0]*C[ 3] + r_in[1]*C[ 4] + r_in[2]*C[ 5] +r_in[3]*C[ 8] + r_in[4]*C[12];
757 r_out[3] = r_in[0]*C[ 6] + r_in[1]*C[ 7] + r_in[2]*C[ 8] +r_in[3]*C[ 9] + r_in[4]*C[13];
758 r_out[4] = r_in[0]*C[10] + r_in[1]*C[11] + r_in[2]*C[12] +r_in[3]*C[13] + r_in[4]*C[14];
761 void AliHLTTPCCAMerger::FilterTracks(
float const r[5],
float const C[15],
float const m[5],
float const V[15],
float R[5],
float W[15],
float &chi2)
764 for(
int i=0; i<15; i++)
769 for(
int i=0; i<5; i++)
777 for(
int i=0; i<5; i++) dzeta[i] = m[i] - r[i];
780 for(
int i=0; i< 15; i++)
784 for(
int i=0; i<5; i++)
787 for(
int j=0; j<5; j++)
788 kd += K[i][j]*dzeta[j];
792 MultiplySR(S, dzeta, S_dzeta);
793 chi2 = dzeta[0]*S_dzeta[0] + dzeta[1]*S_dzeta[1] + dzeta[2]*S_dzeta[2] + dzeta[3]*S_dzeta[3] + dzeta[4]*S_dzeta[4];
796 void AliHLTTPCCAMerger::MakeBorderTracks(AliHLTTPCCABorderTrack B[],
unsigned short &nB,
unsigned char &iSlice)
800 for (
unsigned short itr = 0; itr < fSliceNTrackInfos[iSlice]; itr++ )
802 const AliHLTTPCCASliceTrackInfo &track = fTrackInfos[ fSliceTrackInfoStart[iSlice] + itr ];
806 AliHLTTPCCABorderTrack &bTr = B[nB];
808 bTr.SetTrackID( itr );
809 bTr.Setb(track.InnerParam().DzDs());
810 bTr.SetbErr2(track.InnerParam().Err2DzDs());
811 bTr.Setp(track.InnerParam().QPt());
812 bTr.SetpErr2(track.InnerParam().Err2QPt());
814 bTr.SetInnerRow( track.fInnerRow );
815 bTr.SetOuterRow( track.fOuterRow );
822 void AliHLTTPCCAMerger::MergeBorderTracks( AliHLTTPCCABorderTrack B1[],
int N1,
int iSlice1, AliHLTTPCCABorderTrack B2[],
int N2,
int iSlice2,
int number,
unsigned short FirstTrIR[],
unsigned short LastTrIR[])
827 const float factor2k = 64.f;
829 sfloat_v dr_min2_localv(10000000.f);
831 for (
int i1 = 0; i1 < N1; i1++ ) {
833 AliHLTTPCCABorderTrack &b1 = B1[i1];
835 int lastIRow = fSliceParam.NRows()-1;
844 firstIRow = b1.OuterRow() + 0;
845 lastIRow = b1.OuterRow() + 11;
846 lastIRow = (lastIRow < fSliceParam.NRows()) ? lastIRow : fSliceParam.NRows()-1;
850 for(; firstIRow < fSliceParam.NRows(); firstIRow++)
851 if (LastTrIR[firstIRow] != 50000) {
852 ifirst2 = LastTrIR[firstIRow];
857 for(; lastIRow >= firstIRow; lastIRow--)
858 if(FirstTrIR[lastIRow] != 50000) {
859 ilast2 = FirstTrIR[lastIRow];
865 else if(number == 0) {
866 #ifdef BACK_ORDER_FOR_0
869 firstIRow = b1.OuterRow() - 1;
870 lastIRow = b1.OuterRow() - 7;
871 if ( firstIRow < 0 ) {
875 else if ( lastIRow < 0 ){
881 for(; firstIRow >= 0; firstIRow--)
882 if (FirstTrIR[firstIRow] != 50000) {
883 ifirst2 = FirstTrIR[firstIRow];
888 for(; lastIRow <= firstIRow; lastIRow++)
889 if(LastTrIR[lastIRow] != 50000) {
890 ilast2 = LastTrIR[lastIRow];
893 #else // BACK_ORDER_FOR_0
896 firstIRow = b1.OuterRow() - 7;
897 lastIRow = b1.OuterRow() - 1;
898 if ( lastIRow < 0 ) {
902 else if ( firstIRow < 0 ){
908 for(; firstIRow < fSliceParam.NRows(); firstIRow++)
909 if (LastTrIR[firstIRow] != 50000) {
910 ifirst2 = LastTrIR[firstIRow];
915 for(; lastIRow >= firstIRow; lastIRow--)
916 if(FirstTrIR[lastIRow] != 50000) {
917 ilast2 = FirstTrIR[lastIRow];
920 #endif // BACK_ORDER_FOR_0
927 const AliHLTTPCCASliceTrackInfo *Tt1 = &fTrackInfos[fSliceTrackInfoStart[iSlice1] + b1.TrackID() ];
928 const float k1 = Tt1->InnerParam().QPt() * fSliceParam.cBz();
930 sfloat_v maxLv(1e10f);
931 sfloat_v maxL2v(1e10f);
933 float Tt2OuterAlpha=0;
934 float Tt2InnerAlpha=0;
935 float xE1_E2=0, xS1_S2=0, xS1_E2=0;
936 float yE1_E2=0, yS1_S2=0, yS1_E2=0;
937 float sinE1_E2=0, sinS1_S2=0, sinS1_E2=0;
939 if (dir*ifirst2 <= dir*ilast2) {
940 Tt2OuterAlpha = fTrackInfos[fSliceTrackInfoStart[iSlice2] + B2[ifirst2].TrackID() ].OuterAlpha();
941 Tt2InnerAlpha = fTrackInfos[fSliceTrackInfoStart[iSlice2] + B2[ifirst2].TrackID() ].InnerAlpha();
943 Tt1->OuterParam().RotateXY(Tt2OuterAlpha - Tt1->OuterAlpha(),xE1_E2,yE1_E2,sinE1_E2);
944 Tt1->InnerParam().RotateXY(Tt2InnerAlpha - Tt1->InnerAlpha(),xS1_S2,yS1_S2,sinS1_S2);
945 Tt1->InnerParam().RotateXY(Tt2OuterAlpha - Tt1->InnerAlpha(),xS1_E2,yS1_E2,sinS1_E2);
948 sfloat_v xE1_E2v(xE1_E2), xS1_S2v(xS1_S2), xS1_E2v(xS1_E2);
949 sfloat_v yE1_E2v(yE1_E2), yS1_S2v(yS1_S2), yS1_E2v(yS1_E2);
950 sfloat_v sinE1_E2v(sinE1_E2), sinS1_S2v(sinS1_S2), sinS1_E2v(sinS1_E2);
951 sfloat_v vTt2OuterAlpha(Tt2OuterAlpha), vTt2InnerAlpha(Tt2InnerAlpha);
952 int nVecElements = 0;
954 ushort_v::Memory b2index;
957 sfloat_v OutAlphaT1( Tt1->OuterAlpha() ), OutAlphaT2, InAlphaT1( Tt1->InnerAlpha() ),InAlphaT2;
959 sfloat_v::Memory T2InnerAlphaMemory,T2OuterAlphaMemory;
961 OutParT1.SetX( sfloat_v( Tt1->OuterParam().X() ) );
962 OutParT1.SetSignCosPhi(sfloat_v( Tt1->OuterParam().SignCosPhi() ));
963 for(
int iP=0; iP<5; iP++) { OutParT1.SetPar(iP,sfloat_v( Tt1->OuterParam().Par()[iP] )); }
964 for(
int iC=0; iC<15; iC++){ OutParT1.SetCov(iC,sfloat_v( Tt1->OuterParam().Cov()[iC] )); }
965 OutParT1.SetChi2(sfloat_v( Tt1->OuterParam().Chi2() ));
966 OutParT1.SetNDF( Tt1->OuterParam().NDF() );
968 InParT1.SetX(sfloat_v( Tt1->InnerParam().X() ));
969 InParT1.SetSignCosPhi(sfloat_v( Tt1->InnerParam().SignCosPhi() ));
970 for(
int iP=0; iP<5; iP++) { InParT1.SetPar(iP,sfloat_v( Tt1->InnerParam().Par()[iP] )); }
971 for(
int iC=0; iC<15; iC++){ InParT1.SetCov(iC,sfloat_v( Tt1->InnerParam().Cov()[iC] )); }
972 InParT1.SetChi2(sfloat_v( Tt1->InnerParam().Chi2() ));
973 InParT1.SetNDF(Tt1->InnerParam().NDF());
975 const sfloat_v &yE1v = OutParT1.Y();
976 const sfloat_v &xE1v = OutParT1.X();
978 for (
int i2 = ifirst2; dir*i2 <= dir*ilast2; i2 += dir ) {
980 AliHLTTPCCABorderTrack &b2 = B2[i2];
983 float db2 = (b1.b()) - (b2.b());
985 const float ddb2 = b1.bErr2() + b2.bErr2();
986 if( db2 > factor2k * ddb2 )
988 if(dir*i2 < dir*ilast2)
continue;
992 float dp2 = (b1.p()) - (b2.p());
994 const float ddp2 = b1.pErr2() + b2.pErr2();
995 if( dp2 > factor2k * ddp2 )
997 if(dir*i2 < dir*ilast2)
continue;
1001 if( ISUNLIKELY( iSlice1 == iSlice2 && b1.TrackID() == b2.TrackID() ) )
1003 if(dir*i2 < dir*ilast2)
continue;
1007 AliHLTTPCCASliceTrackInfo *Tt2 = &fTrackInfos[fSliceTrackInfoStart[iSlice2] + b2.TrackID() ];
1011 T2InnerParamMemory[nVecElements] = Tt2->InnerParam();
1012 T2OuterParamMemory[nVecElements] = Tt2->OuterParam();
1013 T2InnerAlphaMemory[nVecElements] = Tt2->InnerAlpha();
1014 T2OuterAlphaMemory[nVecElements] = Tt2->OuterAlpha();
1015 b2index[nVecElements] = i2;
1018 if(nVecElements == ushort_v::Size || (dir*i2 == dir*ilast2 && nVecElements > 0))
1021 sfloat_m active =
static_cast<sfloat_m
>( ushort_v( Vc::IndexesFromZero ) < nVecElements );
1023 ConvertTrackParamToVector(T2InnerParamMemory,InParT2,nVecElements);
1024 ConvertTrackParamToVector(T2OuterParamMemory,OutParT2,nVecElements);
1026 OutAlphaT2.load(T2OuterAlphaMemory);
1027 InAlphaT2.load(T2InnerAlphaMemory);
1029 const sfloat_v &yE2v = OutParT2.Y();
1030 const sfloat_v &yS2v = InParT2.Y();
1032 const sfloat_v &xE2v = OutParT2.X();
1033 const sfloat_v &xS2v = InParT2.X();
1035 sfloat_v xS2_E1v(Vc::Zero);
1036 sfloat_v yS2_E1v(Vc::Zero);
1037 sfloat_v sinS2_E1v(Vc::Zero);
1038 InParT2.RotateXY(OutAlphaT1 - InAlphaT2,xS2_E1v,yS2_E1v,sinS2_E1v);
1040 const sfloat_m &rotate = active && (CAMath::Abs(vTt2OuterAlpha - OutAlphaT2) > 0.01f || CAMath::Abs(vTt2InnerAlpha - InAlphaT2)>0.01f);
1042 if(!(rotate.isEmpty()))
1044 vTt2OuterAlpha(rotate) = OutAlphaT2;
1045 vTt2InnerAlpha(rotate) = InAlphaT2;
1047 OutParT1.RotateXY(vTt2OuterAlpha - OutAlphaT1,xE1_E2v,yE1_E2v,sinE1_E2v,rotate);
1048 InParT1.RotateXY(vTt2InnerAlpha - InAlphaT1,xS1_S2v,yS1_S2v,sinS1_S2v,rotate);
1049 InParT1.RotateXY(vTt2OuterAlpha - InAlphaT1,xS1_E2v,yS1_E2v,sinS1_E2v,rotate);
1052 const sfloat_v dxArr[4] = {(xE1_E2v - xE2v),
1056 const sfloat_v dyArr[4] = {(yE1_E2v - yE2v),
1061 for(
int iCycl=0; iCycl<1; iCycl++)
1063 const sfloat_v dx_1 = xE2v - xS1_E2v;
1064 const sfloat_v t_sin1 = k1 * dx_1 + sinS1_E2v;
1066 const sfloat_v k2 = InParT2.QPt() * fSliceParam.cBz();
1067 const sfloat_v dx_2 = xE1v - xS2_E1v;
1068 const sfloat_v t_sin2 = k2 * dx_2 + sinS2_E1v;
1069 active &= CAMath::Abs( t_sin1 ) <= 0.999f && CAMath::Abs(t_sin2) <= 0.999f;
1070 if(active.isEmpty())
continue;
1072 const sfloat_v dxyArr[4] = {dxArr[0]*dxArr[0] + dyArr[0]*dyArr[0],
1073 dxArr[1]*dxArr[1] + dyArr[1]*dyArr[1],
1074 dxArr[2]*dxArr[2] + dyArr[2]*dyArr[2],
1075 dxArr[3]*dxArr[3] + dyArr[3]*dyArr[3]};
1077 short_v idx(Vc::Zero), idx_temp1(Vc::Zero), idx_temp2((
short int)2);
1078 sfloat_v dx = CAMath::Abs(dxyArr[0]);
1079 sfloat_v dx_temp1 = CAMath::Abs(dxyArr[0]), dx_temp2 = CAMath::Abs(dxyArr[2]);
1080 const sfloat_m &tmp1mask = dxyArr[1] < dx_temp1;
1081 const sfloat_m &tmp2mask = dxyArr[3] < dx_temp2;
1082 dx_temp1(tmp1mask) = dxyArr[1];
1083 idx_temp1(static_cast<short_m>(tmp1mask)) = 1;
1084 dx_temp2(tmp2mask) = dxyArr[3];
1085 idx_temp2(static_cast<short_m>(tmp2mask)) = 3;
1088 { dx = dx_temp2; idx = idx_temp2; }
1089 else if (number == 0)
1091 const sfloat_m &Isdx2 = dx_temp2 < dx_temp1;
1092 const short_m &Isdx2_short =
static_cast<short_m
>(Isdx2);
1094 dx(Isdx2) = dx_temp2;
1095 idx(Isdx2_short) = idx_temp2;
1096 dx(!Isdx2) = dx_temp1;
1097 idx(!Isdx2_short) = idx_temp1;
1101 sfloat_v a1(Vc::Zero);
1102 sfloat_v a2(Vc::Zero);
1106 const sfloat_m &IsIdx0 = active && CAMath::Abs(static_cast<sfloat_v>(idx) - 0.f) < 0.1f;
1107 const sfloat_m &IsIdx1 = active && CAMath::Abs(static_cast<sfloat_v>(idx) - 1.f) < 0.1f;
1108 Thelp.SetTrackParam(OutParT1, IsIdx0 );
1109 Thelp1.SetTrackParam(OutParT2, IsIdx0 );
1110 a1( IsIdx0 ) = OutAlphaT1;
1111 a2( IsIdx0 ) = OutAlphaT2;
1112 dx( IsIdx0 ) = dxArr[0];
1113 Thelp.SetTrackParam(InParT1, IsIdx1 );
1114 Thelp1.SetTrackParam(InParT2, IsIdx1 );
1115 a1( IsIdx1 ) = InAlphaT1;
1116 a2( IsIdx1 ) = InAlphaT2;
1117 dx( IsIdx1 ) = dxArr[1];
1119 const sfloat_m &IsIdx2 = active && CAMath::Abs(static_cast<sfloat_v>(idx) - 2.f) < 0.1f;
1120 const sfloat_m &IsIdx3 = active && CAMath::Abs(static_cast<sfloat_v>(idx) - 3.f) < 0.1f;
1121 Thelp.SetTrackParam(InParT1, IsIdx2 );
1122 Thelp1.SetTrackParam(OutParT2, IsIdx2 );
1123 a1( IsIdx2 ) = InAlphaT1;
1124 a2( IsIdx2 ) = OutAlphaT2;
1125 dx( IsIdx2 ) = dxArr[2];
1127 Thelp.SetTrackParam(OutParT1, IsIdx3 );
1128 Thelp1.SetTrackParam(InParT2, IsIdx3 );
1129 a1( IsIdx3 ) = OutAlphaT1;
1130 a2( IsIdx3 ) = InAlphaT2;
1131 dx( IsIdx3 ) = dxArr[3];
1133 if(number == 1) active &= (CAMath::Abs(dx)<0.1f || dx > 0.f);
1135 if(number == 0) active &= (CAMath::Abs(dx)<0.1f || dx < 0.f);
1136 if(active.isEmpty())
continue;
1138 active &= Thelp.Rotate( a2 - a1 , 0.999f, active);
1139 if(active.isEmpty())
continue;
1141 dr_min2_localv = (Thelp.Y()-Thelp1.Y())*(Thelp.Y()-Thelp1.Y()) + (Thelp.Z()-Thelp1.Z())*(Thelp.Z()-Thelp1.Z()) + dx*dx;
1143 if ( number == 1 ) active &= (dr_min2_localv <= maxLv*maxLv);
1144 if(active.isEmpty())
continue;
1145 maxL2v(active) = dr_min2_localv;
1147 const sfloat_v &ToX = 0.5f * (Thelp.X() + Thelp1.X());
1148 active &= Thelp.TransportToX( ToX, sfloat_v(fSliceParam.cBz()), 0.999f, active);
1149 if(active.isEmpty())
continue;
1150 active &= Thelp1.TransportToX( ToX, sfloat_v(fSliceParam.cBz()), 0.999f, active);
1151 if(active.isEmpty())
continue;
1153 active &= CAMath::Abs(Thelp1.Y() - Thelp.Y()) <= 10.f;
1154 active &= CAMath::Abs(Thelp1.Z() - Thelp.Z()) <= 10.f;
1155 active &= CAMath::Abs(Thelp1.SinPhi() - Thelp.SinPhi()) <= 0.15f;
1156 if(active.isEmpty())
continue;
1158 sfloat_v C[15], r[5], chi2(Vc::Zero);
1159 FilterTracks(Thelp.GetPar(), Thelp.GetCov(), Thelp1.GetPar(), Thelp1.GetCov(), r, C, chi2, active);
1161 for (
int i = 0; i < 15; i++ ) active &= CAMath::Finite( C[i] );
1162 for (
int i = 0; i < 5; i++ ) active &= CAMath::Finite( r[i] );
1163 active &= ( C[0] > 0 ) && ( C[2] > 0 ) && ( C[5] > 0 ) && ( C[9] > 0 ) && ( C[14] > 0 );
1165 if(number == 1) active &= (chi2<=100.f);
1167 active &= (chi2<=300.f);
1168 dr_min2_localv(active) = chi2;
1170 if(active.isEmpty())
continue;
1172 for(
int iV=0; iV < nVecElements; iV++)
1175 if(!active[iV])
continue;
1176 AliHLTTPCCASliceTrackInfo *T1, *T2;
1177 int NextNew, SliceNextNew, PrevNew, SlicePrevNew;
1179 bool IsNext = (b1.InnerRow() < B2[b2index[iV]].InnerRow()) ||
1180 (b1.InnerRow() == B2[b2index[iV]].InnerRow() &&
1181 b1.OuterRow() < B2[b2index[iV]].OuterRow()) ||
1182 (b1.InnerRow() == B2[b2index[iV]].InnerRow() &&
1183 b1.OuterRow() == B2[b2index[iV]].OuterRow() &&
1184 b1.TrackID() < B2[b2index[iV]].TrackID());
1187 T1 = &fTrackInfos[fSliceTrackInfoStart[iSlice1] + b1.TrackID() ];
1188 T2 = &fTrackInfos[fSliceTrackInfoStart[iSlice2] + B2[b2index[iV]].TrackID() ];
1190 NextNew = B2[b2index[iV]].TrackID();
1191 SliceNextNew = iSlice2;
1192 PrevNew = b1.TrackID();
1193 SlicePrevNew = iSlice1;
1197 T2 = &fTrackInfos[fSliceTrackInfoStart[iSlice1] + b1.TrackID() ];
1198 T1 = &fTrackInfos[fSliceTrackInfoStart[iSlice2] + B2[b2index[iV]].TrackID() ];
1200 NextNew = b1.TrackID();
1201 SliceNextNew = iSlice1;
1202 PrevNew = B2[b2index[iV]].TrackID();
1203 SlicePrevNew = iSlice2;
1206 if(T1->ChiNext > dr_min2_localv[iV] && T2->ChiPrev > dr_min2_localv[iV])
1209 maxLv = sqrt(maxL2v[iV]);
1212 const float x0 = fSliceParam.RowX(b1.OuterRow());
1213 for (; fSliceParam.RowX(lastIRow) - x0 > maxLv[iV]; lastIRow--);
1215 for(; lastIRow >= firstIRow; lastIRow--)
1216 if(FirstTrIR[lastIRow] != 50000) {
1217 ilast2 = FirstTrIR[lastIRow];
1221 #ifdef BACK_ORDER_FOR_0
1222 else if (number == 0) {
1224 const float x0 = fSliceParam.RowX(b1.OuterRow());
1225 for (; x0 - fSliceParam.RowX(lastIRow) > maxL; lastIRow++);
1227 for(; lastIRow <= firstIRow; lastIRow++)
1228 if(LastTrIR[lastIRow] != 50000) {
1235 if(T1->NextNeighbour() > -1)
1237 AliHLTTPCCASliceTrackInfo *T3 = &fTrackInfos[fSliceTrackInfoStart[T1->SliceNextNeighbour()] + T1->NextNeighbour() ];
1238 T3->SetPrevNeighbour(-2);
1239 T3->ChiPrev = 10000000;
1241 if(T2->PrevNeighbour() > -1)
1243 AliHLTTPCCASliceTrackInfo *T3 = &fTrackInfos[fSliceTrackInfoStart[T2->SlicePrevNeighbour()] + T2->PrevNeighbour() ];
1244 T3->SetNextNeighbour(-2);
1245 T3->ChiNext = 10000000;
1247 T1->SetNextNeighbour( NextNew );
1248 T1->SetSliceNextNeighbour( SliceNextNew );
1249 T1->ChiNext = dr_min2_localv[iV];
1251 T2->SetPrevNeighbour( PrevNew );
1252 T2->SetSlicePrevNeighbour( SlicePrevNew );
1253 T2->ChiPrev = dr_min2_localv[iV];
1264 void AliHLTTPCCAMerger::Merging(
int number)
1269 #endif // USE_TIMERS
1273 fOutput->SetNTracks( 0 );
1274 fOutput->SetNTrackClusters( 0 );
1275 fOutput->SetPointers();
1278 int nextSlice[fgkNSlices], oppSlice[fgkNSlices/2];
1281 int mid = fgkNSlices / 2 - 1 ;
1282 int last = fgkNSlices - 1 ;
1284 for (
int iSlice = 0; iSlice < fgkNSlices/2; iSlice++ ) {
1285 nextSlice[iSlice] = iSlice + 1;
1287 oppSlice [iSlice] = 22 - iSlice;
1288 if(iSlice == 11) oppSlice[iSlice]=23;
1291 for (
int iSlice = fgkNSlices/2; iSlice < fgkNSlices; iSlice++ ) {
1292 nextSlice[iSlice] = iSlice - 1;
1296 if ( mid < 0 ) mid = 0;
1297 if ( last < 0 ) last = 0;
1298 nextSlice[ mid ] = 0;
1301 nextSlice[ fgkNSlices/2 ] = last;
1303 int maxNSliceTracks = 0;
1304 for (
int iSlice = 0; iSlice < fgkNSlices; iSlice++ ) {
1305 if ( maxNSliceTracks < fSliceNTrackInfos[iSlice] ) maxNSliceTracks = fSliceNTrackInfos[iSlice];
1308 AliHLTTPCCABorderTrack *bCurrIR =
new AliHLTTPCCABorderTrack[maxNSliceTracks*fgkNSlices];
1309 AliHLTTPCCABorderTrack *bCurrOR =
new AliHLTTPCCABorderTrack[maxNSliceTracks*fgkNSlices];
1310 unsigned short FirstTrIR[fgkNSlices][AliHLTTPCCAParameters::MaxNumberOfRows8];
1311 unsigned short LastTrIR[fgkNSlices][AliHLTTPCCAParameters::MaxNumberOfRows8];
1313 unsigned short nCurr[fgkNSlices];
1314 for(
unsigned char iSl=0; iSl<fgkNSlices; iSl++)
1316 for(
unsigned char iRow=0; iRow<fSliceParam.NRows(); iRow++)
1318 FirstTrIR[iSl][iRow] = 50000;
1319 LastTrIR[iSl][iRow] = 50000;
1324 MakeBorderTracks(bCurrIR + maxNSliceTracks*iSl, nCurr[iSl], iSl);
1325 std::sort(bCurrIR+maxNSliceTracks*iSl, bCurrIR+maxNSliceTracks*iSl+nCurr[iSl], CompareInnerRow);
1327 for(
unsigned short itr=0; itr < nCurr[iSl]; itr++)
1328 bCurrOR[itr + maxNSliceTracks*iSl] = bCurrIR[itr + maxNSliceTracks*iSl];
1334 unsigned char curRow = bCurrIR[maxNSliceTracks*iSl].InnerRow();
1335 FirstTrIR[iSl][curRow] = 0;
1336 for(
unsigned short itr = 1; itr < nCurr[iSl]; itr++)
1338 if( bCurrIR[maxNSliceTracks*iSl+itr].InnerRow() < curRow )
1342 LastTrIR[iSl][curRow] = itr - 1;
1343 curRow = bCurrIR[maxNSliceTracks*iSl + itr].InnerRow();
1344 FirstTrIR[iSl][curRow] = itr;
1347 LastTrIR[iSl][curRow] = nCurr[iSl] - 1;
1355 MergeBorderTracks(bCurrOR + maxNSliceTracks*iSl, nCurr[iSl], iSl,
1356 bCurrIR + maxNSliceTracks*iSl, nCurr[iSl], iSl,
1357 number, FirstTrIR[iSl], LastTrIR[iSl]);
1360 if (! fgDoNotMergeBorders )
1361 for(
int iSl=0; iSl<fgkNSlices; iSl++)
1364 MergeBorderTracks( bCurrOR+maxNSliceTracks*iSl, nCurr[iSl], iSl,
1365 bCurrIR+maxNSliceTracks*nextSlice[iSl], nCurr[nextSlice[iSl]], nextSlice[iSl],
1366 number, FirstTrIR[nextSlice[iSl]], LastTrIR[nextSlice[iSl]] );
1367 MergeBorderTracks( bCurrOR+maxNSliceTracks*nextSlice[iSl], nCurr[nextSlice[iSl]], nextSlice[iSl],
1368 bCurrIR+maxNSliceTracks*iSl, nCurr[iSl], iSl,
1369 number, FirstTrIR[iSl], LastTrIR[iSl] );
1371 if(iSl < fgkNSlices / 2)
1374 MergeBorderTracks(bCurrOR+maxNSliceTracks*iSl, nCurr[iSl], iSl,
1375 bCurrIR+maxNSliceTracks*oppSlice[iSl], nCurr[oppSlice[iSl]], oppSlice[iSl],
1376 number, FirstTrIR[oppSlice[iSl]], LastTrIR[oppSlice[iSl]]);
1377 MergeBorderTracks(bCurrOR+maxNSliceTracks*oppSlice[iSl], nCurr[oppSlice[iSl]], oppSlice[iSl],
1378 bCurrIR+maxNSliceTracks*iSl, nCurr[iSl], iSl,
1379 number, FirstTrIR[iSl], LastTrIR[iSl]);
1383 if ( bCurrIR )
delete[] bCurrIR;
1384 if ( bCurrOR )
delete[] bCurrOR;
1388 fTimers[3+(1-number)] = timer.RealTime();
1390 #endif // USE_TIMERS
1393 int nOutTrackClusters = 0;
1396 DataCompressor::SliceRowCluster *outClusterIDsrc = 0;
1397 UChar_t *outClusterPackedAmp = 0;
1402 outClusterIDsrc =
new DataCompressor::SliceRowCluster[fMaxClusterInfos];
1403 outClusterPackedAmp =
new UChar_t [fMaxClusterInfos];
1407 AliHLTTPCCASliceTrackInfo *tmpT =
new AliHLTTPCCASliceTrackInfo[fMaxTrackInfos];
1409 int tmpSliceTrackInfoStart[fgkNSlices];
1411 int nTrNew[fgkNSlices];
1413 for(
int iSlice=0; iSlice < fgkNSlices; iSlice++) nTrNew[iSlice]=0;
1420 for (
int iSlice = 0; iSlice < fgkNSlices; iSlice++ ) {
1422 tmpSliceTrackInfoStart[iSlice] = nEndTracks;
1423 assert( iSlice == 0 || nEndTracks == tmpSliceTrackInfoStart[iSlice-1] + nTrNew[iSlice-1] );
1425 AliHLTTPCCASliceTrackInfo *vTrackOld[short_v::Size];
1428 sfloat_v::Memory StartAlpha, EndAlpha;
1429 int nVecElements = 0;
1431 sfloat_v vStartAlpha(Vc::Zero);
1432 sfloat_v vEndAlpha(Vc::Zero);
1436 AliHLTTPCCASliceTrackInfo *TInfos[10000];
1437 bool IsSorted[10000];
1441 for(
int i=0; i< fSliceNTrackInfos[iSlice]; i++)
1445 AliHLTTPCCASliceTrackInfo *tr = fTrackInfos + fSliceTrackInfoStart[iSlice] + i;
1446 if(tr->PrevNeighbour() > -1)
1448 TInfos[nSorted] = tr;
1454 for(
int i=0; i< fSliceNTrackInfos[iSlice]; i++)
1456 AliHLTTPCCASliceTrackInfo *tr = fTrackInfos + fSliceTrackInfoStart[iSlice] + i;
1457 if(tr->PrevNeighbour() < 0 && tr->NextNeighbour() < 0 && !IsSorted[i])
1459 TInfos[nSorted] = tr;
1465 for(
int i=0; i< fSliceNTrackInfos[iSlice]; i++)
1467 AliHLTTPCCASliceTrackInfo *tr = fTrackInfos + fSliceTrackInfoStart[iSlice] + i;
1470 TInfos[nSorted] = tr;
1476 for (
int itr = 0; itr < fSliceNTrackInfos[iSlice]; itr++ ) {
1478 AliHLTTPCCASliceTrackInfo &trackOld = *TInfos[itr];
1482 if ( trackOld.Used() ) Continue = 1;
1483 if ( trackOld.PrevNeighbour() > -1 ) Continue = 1;
1487 vTrackOld[nVecElements] = &trackOld;
1488 StartPoint[nVecElements] = trackOld.InnerParam();
1489 EndPoint[nVecElements] = trackOld.OuterParam();
1490 StartAlpha[nVecElements] = trackOld.InnerAlpha();
1491 EndAlpha[nVecElements] = trackOld.OuterAlpha();
1494 if((nVecElements == short_v::Size) || (itr == fSliceNTrackInfos[iSlice]-1))
1497 ushort_m active_short = ushort_v( Vc::IndexesFromZero ) < nVecElements;
1498 sfloat_m active =
static_cast<sfloat_m
>( active_short );
1500 int hits[2000][ushort_v::Size];
1501 ushort_v::Memory nHits;
1502 ushort_v firstHit = (
unsigned short int)1000;
1503 ushort_v::Memory SliceNextNeighbour;
1504 short_v::Memory NextNeighbour;
1505 ushort_v jSlice(iSlice);
1506 short_v jtr = (
short int) -1;
1507 ushort_v vNHits(Vc::Zero);
1509 short_v vNextNeighbour;
1510 ushort_v vSliceNextNeighbour;
1512 ConvertTrackParamToVector(StartPoint,vStartPoint,nVecElements);
1513 ConvertTrackParamToVector(EndPoint,vEndPoint,nVecElements);
1514 vStartAlpha.load(StartAlpha);
1515 vEndAlpha.load(EndAlpha);
1517 const sfloat_m &invert1 = active && (vEndPoint.X() < vStartPoint.X());
1518 if( !(invert1.isEmpty()))
1521 vEndPoint.SetTrackParam(vStartPoint, invert1);
1522 vStartPoint.SetTrackParam(helpPoint, invert1);
1523 sfloat_v helpAlpha = vEndAlpha;
1524 vEndAlpha(invert1) = vStartAlpha;
1525 vStartAlpha(invert1) = helpAlpha;
1528 for(
int iV=0; iV<ushort_v::Size; iV++)
1530 if(!active[iV])
continue;
1531 vTrackOld[iV]->SetUsed( 1 );
1533 for (
int jhit = 0; jhit < vTrackOld[iV]->NClusters(); jhit++ ) {
1534 int id = vTrackOld[iV]->FirstClusterRef() + jhit;
1535 hits[static_cast <
unsigned short>(firstHit[iV])+jhit][iV] =
id;
1537 nHits[iV] = vTrackOld[iV]->NClusters();
1538 NextNeighbour[iV] = vTrackOld[iV]->NextNeighbour();
1539 SliceNextNeighbour[iV] = vTrackOld[iV]->SliceNextNeighbour();
1542 vNextNeighbour.load(NextNeighbour);
1543 vSliceNextNeighbour.load(SliceNextNeighbour);
1545 const sfloat_m &isMerged = active && (
static_cast<sfloat_v
>(vNextNeighbour) > -1);
1546 sfloat_m IsNeighbour = isMerged;
1548 if(!(isMerged.isEmpty()))
1550 jtr(static_cast<short_m>(isMerged)) = vNextNeighbour;
1551 jSlice(static_cast<ushort_m>(isMerged)) = vSliceNextNeighbour;
1554 while ( !(IsNeighbour.isEmpty()) )
1558 sfloat_v::Memory InnerAlpha;
1559 sfloat_v::Memory OuterAlpha;
1562 sfloat_v vInnerAlpha(Vc::Zero);
1563 sfloat_v vOuterAlpha(Vc::Zero);
1565 ushort_v::Memory NClusters;
1566 ushort_v vNClusters;
1568 ushort_v::Memory SegmSliceNextNeighbour;
1569 short_v::Memory SegmNextNeighbour;
1570 short_v vSegmNextNeighbour;
1571 ushort_v vSegmSliceNextNeighbour;
1573 AliHLTTPCCASliceTrackInfo *segment[ushort_v::Size];
1574 short_v::Memory Used;
1576 short_m vUsed(
false);
1578 for(
int iV=0; iV<ushort_v::Size; iV++)
1580 if(!IsNeighbour[iV])
continue;
1581 segment[iV] = &fTrackInfos[fSliceTrackInfoStart[jSlice[iV]] + jtr[iV]];
1582 InnerParam[iV] = segment[iV]->InnerParam();
1583 OuterParam[iV] = segment[iV]->OuterParam();
1584 InnerAlpha[iV] = segment[iV]->InnerAlpha();
1585 OuterAlpha[iV] = segment[iV]->OuterAlpha();
1586 Used[iV] = segment[iV]->Used();
1587 NClusters[iV] = segment[iV]->NClusters();
1588 SegmNextNeighbour[iV] = segment[iV]->NextNeighbour();
1589 SegmSliceNextNeighbour[iV] = segment[iV]->SliceNextNeighbour();
1592 vNClusters.load(NClusters);
1594 vSegmNextNeighbour.load(SegmNextNeighbour);
1595 vSegmSliceNextNeighbour.load(SegmSliceNextNeighbour);
1597 IsNeighbour &= !(
static_cast<sfloat_m
>(vUsed));
1598 if ( IsNeighbour.isEmpty() )
break;
1600 ConvertTrackParamToVector(InnerParam,vInnerParam,nVecElements);
1601 ConvertTrackParamToVector(OuterParam,vOuterParam,nVecElements);
1602 vInnerAlpha.load(InnerAlpha);
1603 vOuterAlpha.load(OuterAlpha);
1605 for(
int iV=0; iV<ushort_v::Size; iV++)
1607 if(!IsNeighbour[iV])
continue;
1608 segment[iV]->SetUsed( 1 );
1610 sfloat_m dir(
false);
1611 ushort_v startHit = firstHit + vNHits;
1612 const sfloat_v d00 = vStartPoint.GetDistXZ2( vInnerParam );
1613 const sfloat_v d01 = vStartPoint.GetDistXZ2( vOuterParam );
1614 const sfloat_v d10 = vEndPoint.GetDistXZ2( vInnerParam );
1615 const sfloat_v d11 = vEndPoint.GetDistXZ2( vOuterParam );
1616 const sfloat_v dz00 = abs( vStartPoint.Z() - vInnerParam.Z() );
1617 const sfloat_v dz01 = abs( vStartPoint.Z() - vOuterParam.Z() );
1618 const sfloat_v dz10 = abs( vEndPoint.Z() - vInnerParam.Z() );
1619 const sfloat_v dz11 = abs( vEndPoint.Z() - vOuterParam.Z() );
1621 const sfloat_m &case1 = IsNeighbour &&
1622 (d00 <= d01 && d00 <= d10 && d00 <= d11) &&
1623 (dz11 >= dz00 && dz11 >= dz01 && dz11 >= dz10 );
1628 const sfloat_m &case2 = IsNeighbour &&
1629 (d01 < d00 && d01 <= d10 && d01 <= d11) &&
1630 (dz10 > dz00 && dz10 >= dz01 && dz10 >= dz11 );
1635 const sfloat_m &case3 = IsNeighbour &&
1636 (d10 < d00 && d10 <= d01 && d10 <= d11) &&
1637 (dz01 > dz00 && dz01 >= dz10 && dz01 >= dz11 );
1642 const sfloat_m &case4 = IsNeighbour &&
1643 (d11 < d00 && d11 <= d10 && d10 <= d01) &&
1644 (dz00 > dz01 && dz00 >= dz10 && dz00 > dz11);
1649 IsNeighbour &= case1 || case2 || case3 || case4;
1651 if(!(case1.isEmpty()))
1653 vStartPoint.SetTrackParam( vOuterParam, case1);
1654 vStartAlpha(case1) = vOuterAlpha;
1655 firstHit(static_cast<ushort_m>(case1)) -= vNClusters;
1656 startHit(static_cast<ushort_m>(case1)) = firstHit;
1658 if(!(case2.isEmpty()))
1660 vStartPoint.SetTrackParam( vInnerParam, case2);
1661 vStartAlpha(case2) = vInnerAlpha;
1662 firstHit(static_cast<ushort_m>(case2)) -= vNClusters;
1663 startHit(static_cast<ushort_m>(case2)) = firstHit;
1665 if(!(case3.isEmpty()))
1667 vEndPoint.SetTrackParam( vOuterParam, case3);
1668 vEndAlpha(case3) = vOuterAlpha;
1670 if(!(case4.isEmpty()))
1672 vEndPoint.SetTrackParam( vInnerParam, case4);
1673 vEndAlpha(case4) = vInnerAlpha;
1676 const sfloat_m &m1 = IsNeighbour && (vEndPoint.X() < vOuterParam.X());
1677 vEndPoint.SetTrackParam( vOuterParam, m1);
1678 vEndAlpha(m1) = vOuterAlpha;
1680 const sfloat_m &m2 = IsNeighbour && (vEndPoint.X() < vInnerParam.X());
1681 vEndPoint.SetTrackParam( vInnerParam, m2);
1682 vEndAlpha(m2) = vInnerAlpha;
1684 const sfloat_m &m3 = IsNeighbour && (vStartPoint.X() > vInnerParam.X());
1685 vStartPoint.SetTrackParam( vInnerParam, m3 );
1686 vStartAlpha(m3) = vInnerAlpha;
1688 const sfloat_m &m4 = IsNeighbour && (vStartPoint.X() > vOuterParam.X());
1689 vStartPoint.SetTrackParam( vOuterParam, m4 );
1690 vStartAlpha(m4) = vOuterAlpha;
1692 const sfloat_m dir_float = (case1 || case4);
1695 for(
int iV=0; iV<ushort_v::Size; iV++)
1697 if(!IsNeighbour[iV])
continue;
1698 for (
int jhit = 0; jhit < segment[iV]->NClusters(); jhit++ ) {
1699 int id = segment[iV]->FirstClusterRef() + jhit;
1700 hits[static_cast <
unsigned short>(startHit[iV])+( dir[iV] ?( static_cast <unsigned short>(vNClusters[iV])-1-jhit ) :jhit )][iV] = id;
1703 vNHits(static_cast<ushort_m>(IsNeighbour)) += vNClusters;
1706 IsNeighbour &= (
static_cast<sfloat_v
>(vSegmNextNeighbour) > -1);
1707 if(!(IsNeighbour.isEmpty()))
1709 jtr(static_cast<ushort_m>(IsNeighbour)) = vSegmNextNeighbour;
1710 jSlice(static_cast<short_m>(IsNeighbour)) = vSegmSliceNextNeighbour;
1714 for(
int iV=0; iV<ushort_v::Size; iV++)
1716 if(!active[iV])
continue;
1717 if ( vEndPoint.X()[iV] < vStartPoint.X()[iV] ) {
1718 for (
int i = 0; i < vNHits[iV]; i++ ) hits[i][iV] = hits[firstHit[iV]+vNHits[iV]-1-i][iV];
1723 const sfloat_m &invert2 = isMerged && (vEndPoint.X() < vStartPoint.X());
1724 if( !(invert2.isEmpty()))
1727 vEndPoint.SetTrackParam(vStartPoint, invert2);
1728 vStartPoint.SetTrackParam(helpPoint, invert2);
1729 sfloat_v helpAlpha = vEndAlpha;
1730 vEndAlpha(invert2) = vStartAlpha;
1731 vStartAlpha(invert2) = helpAlpha;
1734 sfloat_m fitted = isMerged;
1736 vNHits.store(nHits);
1738 sfloat_v vHelpEndAlpha = vStartAlpha;
1739 fitted &= FitTrack( vHelpEndPoint, vHelpEndAlpha, hits, firstHit, nHits, nVecElements,fitted, 0 );
1741 sfloat_v vHelpStartAlpha = vHelpEndAlpha;
1742 fitted &= FitTrack( vHelpStartPoint, vHelpStartAlpha, hits, firstHit, nHits, nVecElements,fitted, 1 );
1744 active &= (!isMerged);
1747 for(
int iV=0; iV < ushort_v::Size; iV++)
1749 if ( !active[iV] )
continue;
1759 vHelpStartAlpha.store(&(StartAlpha[0]), active && fitted );
1760 vHelpEndAlpha.store(&(EndAlpha[0]), active && fitted );
1761 vStartAlpha.store(&(StartAlpha[0]), active && !fitted );
1762 vEndAlpha.store(&(EndAlpha[0]), active && !fitted );
1764 for(
int iV=0; iV<ushort_v::Size; iV++)
1766 if ( !active[iV] )
continue;
1768 for(
int iClu = 0; iClu < vNHits[iV]; iClu++) h[iClu] = hits[iClu + firstHit[iV]][iV];
1775 for(
int ihit = 1; ihit < vNHits[iV]; ihit++)
1777 if( ISUNLIKELY(usedHits[ihit2] == usedHits[ihit]) )
continue;
1779 if( ISUNLIKELY( ihit2 != ihit ) )
1780 usedHits[ihit2] = usedHits[ihit];
1782 nHits[iV] = ihit2+1;
1788 mergedTrack.SetNClusters( nHits[iV] );
1789 mergedTrack.SetFirstClusterRef( nOutTrackClusters );
1790 mergedTrack.SetInnerParam( StartPoint[iV] );
1791 mergedTrack.SetInnerAlpha( StartAlpha[iV] );
1792 mergedTrack.SetOuterParam( EndPoint[iV] );
1793 mergedTrack.SetOuterAlpha( EndAlpha[iV] );
1795 for (
int i = 0; i < nHits[iV]; i++ ) {
1797 outClusterIDsrc[nOutTrackClusters+i] =
1798 DataCompressor::SliceRowCluster( clu.ISlice(), clu.IRow(), clu.IClu() );
1801 nOutTrackClusters += nHits[iV];
1806 AliHLTTPCCASliceTrackInfo &track = tmpT[nEndTracks];
1808 track = *vTrackOld[iV];
1810 track.SetFirstClusterRef(nH);
1811 track.SetNClusters(nHits[iV]);
1813 track.SetPrevNeighbour(-1);
1814 track.SetNextNeighbour(-1);
1815 track.SetSlicePrevNeighbour(-1);
1816 track.SetSliceNextNeighbour(-1);
1817 track.ChiPrev = 10000000;
1818 track.ChiNext = 10000000;
1819 track.SetInnerParam( StartPoint[iV] );
1820 track.SetInnerAlpha( StartAlpha[iV] );
1821 track.SetOuterParam( EndPoint[iV] );
1822 track.SetOuterAlpha( EndAlpha[iV] );
1824 track.fInnerRow = (fClusterInfos[usedHits[0]]).IRow();
1825 track.fOuterRow = (fClusterInfos[usedHits[nHits[iV]-1]]).IRow();
1827 for(
int iClu=0; iClu < nHits[iV]; iClu++) tmpH[nH + iClu] = fClusterInfos[usedHits[iClu]];
1840 if (fClusterInfos)
delete[] fClusterInfos;
1841 fClusterInfos = tmpH;
1843 if (fClusterInfos)
delete[] fTrackInfos;
1845 for(
int iSlice=0; iSlice < fgkNSlices; iSlice++ )
1847 fSliceNTrackInfos[iSlice] = nTrNew[iSlice];
1848 fSliceTrackInfoStart[iSlice] = tmpSliceTrackInfoStart[iSlice];
1853 fOutput->SetNTracks( nOutTracks );
1854 fOutput->SetNTrackClusters( nOutTrackClusters );
1855 fOutput->SetPointers();
1857 for (
int itr = 0; itr < nOutTracks; itr++ ) fOutput->SetTrack( itr, outTracks[itr] );
1859 for (
int ic = 0; ic < nOutTrackClusters; ic++ ) {
1860 fOutput->SetClusterIDsrc( ic, outClusterIDsrc[ic] );
1861 fOutput->SetClusterPackedAmp( ic, outClusterPackedAmp[ic] );
1864 if (outTracks)
delete[] outTracks;
1865 if (outClusterIDsrc)
delete[] outClusterIDsrc;
1866 if (outClusterPackedAmp)
delete[] outClusterPackedAmp;
1871 fTimers[5+(1-number)] = timer.RealTime();
1872 #endif // USE_TIMERS
void GetClusterErrors2(int iRow, const AliHLTTPCCATrackParam &t, float &Err2Y, float &Err2Z) const
mvz start 20.01.2010