X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=HLT%2FTPCLib%2Ftracking-ca%2FAliHLTTPCCATracker.cxx;h=0b6ce041ba08019f5e0f6ce079ff43d19cedb57c;hb=13627b46d87baee0f017612d506f798de4a7f2cf;hp=acc467682ef9456d4e789878bd7c3ffe134a30cf;hpb=d54804bff0545cf449c527fcc1c05cd01fdc6744;p=u%2Fmrichter%2FAliRoot.git diff --git a/HLT/TPCLib/tracking-ca/AliHLTTPCCATracker.cxx b/HLT/TPCLib/tracking-ca/AliHLTTPCCATracker.cxx index acc467682ef..0b6ce041ba0 100644 --- a/HLT/TPCLib/tracking-ca/AliHLTTPCCATracker.cxx +++ b/HLT/TPCLib/tracking-ca/AliHLTTPCCATracker.cxx @@ -1,6 +1,6 @@ // @(#) $Id$ -//*************************************************************************** -// This file is property of and copyright by the ALICE HLT Project * +// ************************************************************************** +// This file is property of and copyright by the ALICE HLT Project * // ALICE Experiment at CERN, All rights reserved. * // * // Primary Authors: Sergey Gorbunov * @@ -14,1068 +14,805 @@ // appear in the supporting documentation. The authors make no claims * // about the suitability of this software for any purpose. It is * // provided "as is" without express or implied warranty. * +// * //*************************************************************************** #include "AliHLTTPCCATracker.h" - -#include "AliHLTTPCCAHit.h" -#include "AliHLTTPCCACell.h" -#include "AliHLTTPCCAEndPoint.h" -#include "AliHLTTPCCAOutTrack.h" -#include "AliHLTTPCCAGrid.h" #include "AliHLTTPCCARow.h" #include "AliHLTTPCCATrack.h" +#include "AliHLTTPCCATracklet.h" +#include "AliHLTTPCCAMath.h" +#include "MemoryAssignmentHelpers.h" -#include "TMath.h" -#include "Riostream.h" -//#include #include "TStopwatch.h" +#include "AliHLTTPCCAHitArea.h" +#include "AliHLTTPCCANeighboursFinder.h" +#include "AliHLTTPCCANeighboursCleaner.h" +#include "AliHLTTPCCAStartHitsFinder.h" +#include "AliHLTTPCCATrackletConstructor.h" +#include "AliHLTTPCCATrackletSelector.h" +#include "AliHLTTPCCAProcess.h" +#include "AliHLTTPCCAClusterData.h" + +#include "AliHLTTPCCATrackParam.h" + +#include "AliHLTTPCCAGPUConfig.h" + +#if !defined(HLTCA_GPUCODE) +#include +#include +#include +#endif -//#define DRAW +//#define DRAW1 -#ifdef DRAW - #include "AliHLTTPCCADisplay.h" - #include "TApplication.h" -#endif //DRAW +#ifdef DRAW1 +#include "AliHLTTPCCADisplay.h" +#endif //DRAW1 -ClassImp(AliHLTTPCCATracker) +#ifdef HLTCA_INTERNAL_PERFORMANCE +//#include "AliHLTTPCCAPerformance.h" +#endif +#ifdef HLTCA_STANDALONE +#include "AliHLTTPCCAStandaloneFramework.h" +#endif -AliHLTTPCCATracker::AliHLTTPCCATracker() - :fParam(),fRows(0),fOutTrackHits(0),fNOutTrackHits(0),fOutTracks(0),fNOutTracks(0),fNHitsTotal(0),fTracks(0),fNTracks(0),fCellHitPointers(0),fCells(0),fEndPoints(0) -{ - // constructor - fRows = new AliHLTTPCCARow[fParam.NRows()]; - Initialize( fParam ); -} +ClassImp( AliHLTTPCCATracker ) -AliHLTTPCCATracker::AliHLTTPCCATracker( const AliHLTTPCCATracker& ) - :fParam(),fRows(0),fOutTrackHits(0),fNOutTrackHits(0),fOutTracks(0),fNOutTracks(0),fNHitsTotal(0),fTracks(0),fNTracks(0),fCellHitPointers(0),fCells(0),fEndPoints(0) -{ - // dummy -} -AliHLTTPCCATracker &AliHLTTPCCATracker::operator=( const AliHLTTPCCATracker& ) -{ - // dummy - fRows=0; - fOutTrackHits=0; - fOutTracks=0; - fNOutTracks=0; - return *this; -} +#if !defined(HLTCA_GPUCODE) AliHLTTPCCATracker::~AliHLTTPCCATracker() { // destructor - StartEvent(); - delete[] fRows; + if (!fIsGPUTracker) + { + if (fCommonMem) delete fCommonMem; + if (fHitMemory) delete[] fHitMemory; + if (fTrackletMemory) delete[] fTrackletMemory; + if (fTrackMemory) delete[] fTrackMemory; + fCommonMem = NULL; + fHitMemory = fTrackMemory = NULL; + } } // ---------------------------------------------------------------------------------- -void AliHLTTPCCATracker::Initialize( AliHLTTPCCAParam ¶m ) +void AliHLTTPCCATracker::Initialize( const AliHLTTPCCAParam ¶m ) { - // initialosation - StartEvent(); - delete[] fRows; - fRows = 0; + // initialisation fParam = param; fParam.Update(); - fRows = new AliHLTTPCCARow[fParam.NRows()]; - Float_t xStep = 1; - Float_t deltaY = TMath::Tan(fParam.CellConnectionAngleXY()); - Float_t deltaZ = TMath::Tan(fParam.CellConnectionAngleXZ()); - for( Int_t irow=0; irownext ){ - Int_t jh = bin->h-row.Hits(); - THitCont &cont1 = hitCont[jh]; - if( cont1.used ) continue; - //cout<<"["< ymax ) continue; - if( cont1.Zmax < zmin ) break;// in the grid cell hit Y is decreasing - if( cont1.Zmin > zmax ) continue; - - if( cont1.Ymin < ymin ){ ymin = cont1.Ymin; repeat = 1; } - if( cont1.Ymax > ymax ){ ymax = cont1.Ymax; repeat = 1; } - if( cont1.Zmin < zmin ){ zmin = cont1.Zmin; repeat = 1; } - if( cont1.Zmax > zmax ){ zmax = cont1.Zmax; repeat = 1; } - if( cont1.binYmin < binYmin ){ binYmin = cont1.binYmin; repeat = 1; } - if( cont1.binYmax > binYmax ){ binYmax = cont1.binYmax; repeat = 1; } - if( cont1.binZmin < binZmin ){ binZmin = cont1.binZmin; repeat = 1; } - if( cont1.binZmax > binZmax ){ binZmax = cont1.binZmax; repeat = 1; } - - row.CellHitPointers()[nPointers++] = jh; - cell.NHits()++; - cont1.used = 1; -#ifdef DRAW - //AliHLTTPCCADisplay::Instance().DrawHit( irow, jh, kRed ); - //AliHLTTPCCADisplay::Instance().Ask(); + for (int i = 0;i < Tracks()[j].NHits();i++) + { + out << TrackHits()[Tracks()[j].FirstHitID() + i].RowIndex() << "-" << TrackHits()[Tracks()[j].FirstHitID() + i].HitIndex() << ", "; + } + out << "(Track: " << j << ")" << std::endl; +#ifdef HLTCA_GPU_SORT_DUMPDATA + } + } #endif - } - } + } +#ifdef HLTCA_GPU_SORT_DUMPDATA } - } - - cell.Y() = .5*(ymin+ymax); - cell.Z() = .5*(zmin+zmax); - cell.ErrY() = .5*( ymax - ymin - 2*deltaY)/3.5; - cell.ErrZ() = .5*( zmax - zmin -2*deltaZ)/3.5; - cell.ZMin() = zmin; - cell.ZMax() = zmax; -#ifdef DRAW - //AliHLTTPCCADisplay::Instance().DrawCell( irow, nCells-1 ); - //AliHLTTPCCADisplay::Instance().Ask(); #endif +} + +void AliHLTTPCCATracker::DumpTrackletHits(std::ostream &out) +{ + //dump tracklets to file + out << "Tracklets: (Slice" << Param().ISlice() << ") (" << *NTracklets() << ")" << std::endl; +#ifdef HLTCA_GPU_SORT_DUMPDATA + AliHLTTPCCAHitId* tmpIds = new AliHLTTPCCAHitId[*NTracklets()]; + AliHLTTPCCATracklet* tmpTracklets = new AliHLTTPCCATracklet[*NTracklets()]; + memcpy(tmpIds, TrackletStartHits(), *NTracklets() * sizeof(AliHLTTPCCAHitId)); + memcpy(tmpTracklets, Tracklets(), *NTracklets() * sizeof(AliHLTTPCCATracklet)); +#ifdef EXTERN_ROW_HITS + int* tmpHits = new int[*NTracklets() * Param().NRows()]; + memcpy(tmpHits, TrackletRowHits(), *NTracklets() * Param().NRows() * sizeof(int)); +#endif + qsort(TrackletStartHits(), *NTracklets(), sizeof(AliHLTTPCCAHitId), StarthitSortComparison); + for (int i = 0;i < *NTracklets();i++) + { + for (int j = 0;j < *NTracklets();j++) + { + if (tmpIds[i].RowIndex() == TrackletStartHit(j).RowIndex() && tmpIds[i].HitIndex() == TrackletStartHit(j).HitIndex()) + { + memcpy(&Tracklets()[j], &tmpTracklets[i], sizeof(AliHLTTPCCATracklet)); +#ifdef EXTERN_ROW_HITS + if (tmpTracklets[i].NHits()) + { + for (int k = tmpTracklets[i].FirstRow();k <= tmpTracklets[i].LastRow();k++) + { + fTrackletRowHits[k * *NTracklets() + j] = tmpHits[k * *NTracklets() + i]; + } + } +#endif + break; + } + } + } + delete[] tmpIds; + delete[] tmpTracklets; +#ifdef EXTERN_ROW_HITS + delete[] tmpHits; +#endif +#endif + for (int j = 0;j < *NTracklets();j++) + { + out << "Tracklet " << std::setw(4) << j << " (Hits: " << std::setw(3) << Tracklets()[j].NHits() << ", Start: " << std::setw(3) << TrackletStartHit(j).RowIndex() << "-" << std::setw(3) << TrackletStartHit(j).HitIndex() << ", Rows: " << (Tracklets()[j].NHits() ? Tracklets()[j].FirstRow() : -1) << " - " << (Tracklets()[j].NHits() ? Tracklets()[j].LastRow() : -1) << ") "; + if (Tracklets()[j].NHits() == 0); + else if (Tracklets()[j].LastRow() > Tracklets()[j].FirstRow() && (Tracklets()[j].FirstRow() >= Param().NRows() || Tracklets()[j].LastRow() >= Param().NRows())) + { +#ifdef HLTCA_STANDALONE + printf("\nError: Tracklet %d First %d Last %d Hits %d", j, Tracklets()[j].FirstRow(), Tracklets()[j].LastRow(), Tracklets()[j].NHits()); + out << " (Error: Tracklet " << j << " First " << Tracklets()[j].FirstRow() << " Last " << Tracklets()[j].LastRow() << " Hits " << Tracklets()[j].NHits() << ") "; + for (int i = 0;i < Param().NRows();i++) + { + //if (Tracklets()[j].RowHit(i) != -1) +#ifdef EXTERN_ROW_HITS + out << i << "-" << fTrackletRowHits[i * fCommonMem->fNTracklets + j] << ", "; +#else + out << i << "-" << Tracklets()[j].RowHit(i) << ", "; +#endif + } +#endif + } + else if (Tracklets()[j].NHits() && Tracklets()[j].LastRow() > Tracklets()[j].FirstRow()) + { + for (int i = Tracklets()[j].FirstRow();i <= Tracklets()[j].LastRow();i++) + { + //if (Tracklets()[j].RowHit(i) != -1) +#ifdef EXTERN_ROW_HITS + out << i << "-" << fTrackletRowHits[i * fCommonMem->fNTracklets + j] << ", "; +#else + out << i << "-" << Tracklets()[j].RowHit(i) << ", "; +#endif + } + } + out << std::endl; + } +} + + +void AliHLTTPCCATracker::SetupCommonMemory() +{ + // set up common memory + + if (!fIsGPUTracker) + { + if ( !fCommonMem ) { + // the 1600 extra bytes are not used unless fCommonMemorySize increases with a later event + //fCommonMemory = reinterpret_cast ( new uint4 [ fCommonMemorySize/sizeof( uint4 ) + 100] ); + fCommonMem = new commonMemoryStruct; } - //cout<fNTracklets = 0; + fCommonMem->fNTracks = 0 ; + fCommonMem->fNTrackHits = 0; +} -void AliHLTTPCCATracker::MergeCells() +void AliHLTTPCCATracker::ReadEvent( AliHLTTPCCAClusterData *clusterData ) { - // First step: - // for each Cell find one neighbour in the next row (irow+1) - // when there are no neighbours, look to the rows (irow+2),(irow+3) - // - // Initial state: - // cell.Link =-1 - // cell.Link1 =-1 - // cell.Track =-1 - // - // Intermediate state: same as final - // - // Final state: - // cell.Link = Neighbour ID, if there is a neighbour - // = -1, if no neighbours found - // = -2, if there was more than one neighbour - // cell.Link1 = ID of the cell which has this Cell as a forward neighbour - // = -1 there are no backward neighbours - // = -2 there are more than one neighbour - // cell.Track = -1 - // + // read event - TStopwatch timer1; + fClusterData = clusterData; - Int_t nStartCells = 0; - for( Int_t iRow1=0; iRow1=fParam.NRows() ) lastRow2 = fParam.NRows()-1; - - for (Int_t i1 = 0; i1 yMax ) continue; - if( y2Max < yMin ) continue; - if( z2Min > zMax ) break; - if( z2Max < zMin ) continue; - - // c1 & c2 are neighbours - - found = 1; - - if( c1.Link() ==-1 && c2.Status()==0 ){ - // one-to-one connection - OK - c1.Link() = IRowICell2ID(iRow2,i2); - c2.Status() = 1; - }else{ - // multi-connection - break all links - if( c1.Link()>=0 ) ID2Cell(c1.Link()).Status() = -1; - c1.Link() = -2; - c2.Status() = -1; - } + StartEvent(); + + //* Convert input hits, create grids, etc. + fData.InitFromClusterData( *clusterData ); + { + if (!fIsGPUTracker) + { + SetPointersHits( fData.NumberOfHits() ); // to calculate the size + fHitMemory = reinterpret_cast ( new uint4 [ fHitMemorySize/sizeof( uint4 ) + 100] ); } - }//row2 - } - }//row1 + SetPointersHits( fData.NumberOfHits() ); // set pointers for hits + } +} - timer1.Stop(); - fTimers[1] = timer1.CpuTime(); - - // Second step: create tracks - // for each sequence of neighbouring Cells create Track object - // - // Final state: - // cell.Track = TrackNumber for first and last track cell - // = -1 for other cells - // cell.Link = Neighbour ID, if there is a neighbour - // = -1, if no neighbour (last cell on the track ) - // cell.Link1 = backward neighbour ID, if there is a neighbour - // = -1 for first and last track cells - - TStopwatch timer2; - - fTracks = new AliHLTTPCCATrack[nStartCells]; - fNTracks = 0; - - for( Int_t iRow=0; iRow0 ) continue; // not a starting cell - - Int_t firstID = IRowICell2ID( iRow, iCell ); - Int_t midID = firstID; - Int_t lastID = firstID; - - AliHLTTPCCATrack &track = fTracks[fNTracks]; - track.Alive() = 1; - track.NCells() = 1; - AliHLTTPCCACell *last = &c; - while( last->Link() >=0 ){ - Int_t nextID = last->Link(); - AliHLTTPCCACell *next = & ID2Cell(nextID); - if(next->Status()!=1 ){ - last->Link() = -1; - break; - } - track.NCells()++; - last = next; - lastID = nextID; - } - Int_t nCells05 = (track.NCells()-1)/2; - for( Int_t i=0; iTrackID() = fNTracks; - track.FirstCellID() = firstID; - track.CellID()[0] = firstID; - track.CellID()[1] = midID; - track.CellID()[2] = lastID; - track.PointID()[0] = -1; - track.PointID()[1] = -1; - //cout<<"Track N "<0 ){ - AliHLTTPCCADisplay::Instance().Ask(); } +#endif //DRAW1 - - AliHLTTPCCADisplay::Instance().Clear(); - AliHLTTPCCADisplay::Instance().DrawSector( this ); - for( Int_t iRow=0; iRowfNTracklets = fCommonMem->fNTracks = fCommonMem->fNTrackHits = 0; - cout<<"draw initial tracks"<= 6) + { + *fGPUDebugOut << std::endl << std::endl << "Slice: " << Param().ISlice() << std::endl; + *fGPUDebugOut << "Slice Data:" << std::endl; + DumpSliceData(*fGPUDebugOut); } - //if( fNTracks>0 ) - AliHLTTPCCADisplay::Instance().Ask(); -#endif - TStopwatch timer4; + StandalonePerfTime(1); + + RunNeighboursFinder(); + + StandalonePerfTime(2); - Bool_t doMerging=1; +#ifdef TRACKER_KEEP_TEMPDATA + if (fLinkTmpMemory) delete[] fLinkTmpMemory; + fLinkTmpMemory = new char[fData.MemorySize()]; + memcpy(fLinkTmpMemory, fData.Memory(), fData.MemorySize()); +#endif + + if (fGPUDebugLevel >= 6) DumpLinks(*fGPUDebugOut); - Float_t factor2 = fParam.TrackConnectionFactor()*fParam.TrackConnectionFactor(); - Int_t *refEndPoints = new Int_t[fNHitsTotal]; - Int_t nRefEndPoints = 0; - for( Int_t iRow=0; iRow 0 ) { + AliHLTTPCCADisplay::Instance().DrawSliceLinks( -1, -1, 1 ); + AliHLTTPCCADisplay::Instance().Ask(); } - bool first = 1; - while( doMerging ){ +#endif //DRAW1 - //cout<<"do merging"<("<fNTracklets * 2 ); // to calculate the size + fTrackletMemory = reinterpret_cast ( new uint4 [ fTrackletMemorySize/sizeof( uint4 ) + 100] ); + SetPointersTracklets( fCommonMem->fNTracklets * 2 ); // set pointers for hits - timer5.Stop(); - if(first) fTimers[5] += timer5.CpuTime(); + SetPointersTracks( fCommonMem->fNTracklets * 2, NHitsTotal() ); // to calculate the size + fTrackMemory = reinterpret_cast ( new uint4 [ fTrackMemorySize/sizeof( uint4 ) + 100] ); + SetPointersTracks( fCommonMem->fNTracklets * 2, NHitsTotal() ); // set pointers for hits - //cout<<"merge neighbours"<= 6) DumpTrackletHits(*fGPUDebugOut); + if (fGPUDebugLevel >= 6) DumpHitWeights(*fGPUDebugOut); - Int_t ipID = IRowICell2ID(iRow,iPoint); - Int_t jpID = ip.Link(); - AliHLTTPCCAEndPoint &jp = ID2Point(jpID); - - if( jp.Link()!=ipID ){ - //cout<<"broken link: jp.Link()!=iID"<("<jTrack - ic.Link() = jcID; - iTrack.PointID()[1] = jTrack.PointID()[1]; - ID2Point(iTrack.PointID()[1]).TrackID() = itr; - if( jTrack.NCells()<3 ){ - refEndPoints[nRefEndPointsNew++] = iTrack.PointID()[1]; - doMerging = 1; - ID2Point(iTrack.PointID()[1]).Param() = ip.Param();// just to set phi direction - } - if( iTrack.NCells()<3 ){ - refEndPoints[nRefEndPointsNew++] = iTrack.PointID()[0]; - doMerging = 1; - ID2Point(iTrack.PointID()[0]).Param() = jp.Param();// just to set phi direction - } + StandalonePerfTime(9); - if( TMath::Abs(ID2Cell(jTrack.CellID()[2]).Z()-ID2Cell(iTrack.CellID()[0]).Z())> - TMath::Abs(ID2Cell(iTrack.CellID()[2]).Z()-ID2Cell(iTrack.CellID()[0]).Z()) ){ - iTrack.CellID()[2] = jTrack.CellID()[2]; - } - }else{ //match jTrack->iTrack - jc.Link() = icID; - iTrack.FirstCellID()=jTrack.FirstCellID(); - iTrack.PointID()[0] = jTrack.PointID()[0]; - ID2Point(iTrack.PointID()[0]).TrackID() = itr; - if( jTrack.NCells()<3 ){ - refEndPoints[nRefEndPointsNew++] = iTrack.PointID()[0]; - doMerging = 1; - ID2Point(iTrack.PointID()[0]).Param() = ip.Param(); // just to set phi direction - } - if( iTrack.NCells()<3 ){ - refEndPoints[nRefEndPointsNew++] = iTrack.PointID()[1]; - doMerging = 1; - ID2Point(iTrack.PointID()[1]).Param() = jp.Param();// just to set phi direction - } - if( TMath::Abs(ID2Cell(jTrack.CellID()[0]).Z()-ID2Cell(iTrack.CellID()[2]).Z())> - TMath::Abs(ID2Cell(iTrack.CellID()[0]).Z()-ID2Cell(iTrack.CellID()[2]).Z()) ){ - iTrack.CellID()[0] = jTrack.CellID()[0]; - } - } + //std::cout<<"Slice "<= 6) DumpTrackHits(*fGPUDebugOut); - if( jTrack.NCells()>iTrack.NCells() ){ - iTrack.CellID()[1] = jTrack.CellID()[1]; - } - - AliHLTTPCCAEndPoint &p0 = ID2Point(iTrack.PointID()[0]); - AliHLTTPCCAEndPoint &p1 = ID2Point(iTrack.PointID()[1]); - - if( p0.Link() == iTrack.PointID()[1] ){ - p0.Link() = -1; - p1.Link() = -1; - } - //cout<<" NCells itr/jtr= "<0 ) AliHLTTPCCADisplay::Instance().Ask(); -#endif + timer0.Stop(); + fTimers[0] = timer0.CpuTime() / 100.; +} +GPUh() void AliHLTTPCCATracker::WriteOutput() +{ + // write output + TStopwatch timer; -#ifdef DRAW - AliHLTTPCCADisplay::Instance().Clear(); - AliHLTTPCCADisplay::Instance().DrawSector( this ); - for( Int_t iRow=0; iRowfNTracks, fCommonMem->fNTrackHits, fOutputControl); + AliHLTTPCCASliceOutput* useOutput = *fOutput; + if (useOutput == NULL) return; + + useOutput->SetNTracks( fCommonMem->fNTracks ); + useOutput->SetNTrackClusters( fCommonMem->fNTrackHits ); + + int nStoredHits = 0; - for( Int_t itr=0; itrFirstTrack(); - // write output - //cout<<"write output"<Link()>=0; iID = ic->Link(), ic = &ID2Cell(iID) ){ - //cout<<"itr="<NHits(); iHit++ ){ - AliHLTTPCCAHit &h = row.GetCellHit(*ic,iHit); - - // check for wrong hits - - { - if( !t.TransportToX( row.X() ) ) continue; - Float_t dy = t.GetY() - h.Y(); - Float_t dz = t.GetZ() - h.Z(); - if( dy*dy > 3.5*3.5*(t.GetErr2Y() + h.ErrY()*h.ErrY() ) ) continue; - if( dz*dz > 3.5*3.5*(t.GetErr2Z() + h.ErrZ()*h.ErrZ() ) ) continue; - /* - Float_t m[3] = {row.X(), h.Y(), h.Z() }; - Float_t mV[6] = {fParam.ErrX()*fParam.ErrX(), 0, h.ErrY()*h.ErrY(), 0, 0, h.ErrZ()*h.ErrZ() }; - Float_t mG[6]; - t.TransportBz(fParam.Bz(),m); - t.GetConnectionMatrix(fParam.Bz(),m, mG); - Float_t chi2 = t.GetChi2( m, mV, mG )/2.; - if( chi2>10. ) continue; - */ - } - - fOutTrackHits[fNOutTrackHits] = h.ID(); - fNOutTrackHits++; - if( fNOutTrackHits>fNHitsTotal ){ - //cout<<"fNOutTrackHits>fNHitsTotal"<fNTracks; iTr++ ) { + AliHLTTPCCATrack &iTrack = fTracks[iTr]; + + out->SetParam( iTrack.Param() ); + int nClu = 0; + int iID = iTrack.FirstHitID(); + + for ( int ith = 0; ith < iTrack.NHits(); ith++ ) { + const AliHLTTPCCAHitId &ic = fTrackHits[iID + ith]; + int iRow = ic.RowIndex(); + int ih = ic.HitIndex(); + + const AliHLTTPCCARow &row = fData.Row( iRow ); + + int clusterIndex = fData.ClusterDataIndex( row, ih ); + int clusterRowIndex = clusterIndex - fClusterData->RowOffset( iRow ); + + if ( clusterIndex < 0 || clusterIndex >= fClusterData->NumberOfClusters() ) { + //std::cout << inpIDtot << ", " << fClusterData->NumberOfClusters() + //<< "; " << inpID << ", " << fClusterData->NumberOfClusters( iRow ) << std::endl; + //abort(); + continue; } + if ( clusterRowIndex < 0 || clusterRowIndex >= fClusterData->NumberOfClusters( iRow ) ) { + //std::cout << inpIDtot << ", " << fClusterData->NumberOfClusters() + //<< "; " << inpID << ", " << fClusterData->NumberOfClusters( iRow ) << std::endl; + //abort(); + continue; + } + + float origX = fClusterData->X( clusterIndex ); + float origY = fClusterData->Y( clusterIndex ); + float origZ = fClusterData->Z( clusterIndex ); + int id = fClusterData->Id( clusterIndex ); + AliHLTTPCCASliceOutCluster c; + c.Set( id, iRow, origX, origY, origZ ); + out->SetCluster( nClu, c ); + nClu++; + nStoredHits++; } - if( out.NHits() > 3 ){ - fNOutTracks++; - }else { - fNOutTrackHits = fNOutTrackHitsOld; - } + + out->SetNClusters( nClu ); + out = out->NextTrack(); } - //cout<<"end writing"< 3.5*3.5*(/*t0.GetErr2Y() + */h.ErrY()*h.ErrY() ) ) continue;//SG!!! + //if( dz*dz > 3.5*3.5*(/*t0.GetErr2Z() + */h.ErrZ()*h.ErrZ() ) ) continue; + } + + if ( !t.TransportToX( row.X() ) ) continue; + + //* Update the track + + if ( first ) { + t.Cov()[ 0] = .5 * .5; + t.Cov()[ 1] = 0; + t.Cov()[ 2] = .5 * .5; + t.Cov()[ 3] = 0; + t.Cov()[ 4] = 0; + t.Cov()[ 5] = .2 * .2; + t.Cov()[ 6] = 0; + t.Cov()[ 7] = 0; + t.Cov()[ 8] = 0; + t.Cov()[ 9] = .2 * .2; + t.Cov()[10] = 0; + t.Cov()[11] = 0; + t.Cov()[12] = 0; + t.Cov()[13] = 0; + t.Cov()[14] = .2 * .2; + t.Chi2() = 0; + t.NDF() = -5; + } + float err2Y, err2Z; + GetErrors2( iRow, t, err2Y, err2Z ); - AliHLTTPCCAEndPoint &p0 = ID2Point(track.PointID()[0]); - AliHLTTPCCAEndPoint &p2 = ID2Point(track.PointID()[1]); - AliHLTTPCCACell &c0 = ID2Cell(p0.CellID()); - AliHLTTPCCACell &c1 = ID2Cell(track.CellID()[1]); - AliHLTTPCCACell &c2 = ID2Cell(p2.CellID()); - AliHLTTPCCARow &row0 = ID2Row(p0.CellID()); - AliHLTTPCCARow &row1 = ID2Row(track.CellID()[1]); - AliHLTTPCCARow &row2 = ID2Row(p2.CellID()); + if ( !t.Filter2( h.Y(), h.Z(), err2Y, err2Z ) ) continue; + first = 0; + } + /* + float cosPhi = iTrack.Param().GetCosPhi(); + p0.Param().TransportToX(ID2Row( iTrack.PointID()[0] ).X()); + p2.Param().TransportToX(ID2Row( iTrack.PointID()[1] ).X()); + if( p0.Param().GetCosPhi()*cosPhi<0 ){ // change direction + float *par = p0.Param().Par(); + float *cov = p0.Param().Cov(); + par[2] = -par[2]; // sin phi + par[3] = -par[3]; // DzDs + par[4] = -par[4]; // kappa + cov[3] = -cov[3]; + cov[4] = -cov[4]; + cov[6] = -cov[6]; + cov[7] = -cov[7]; + cov[10] = -cov[10]; + cov[11] = -cov[11]; + p0.Param().CosPhi() = -p0.Param().GetCosPhi(); + } + */ +#endif +} - Float_t sp0[5] = {row0.X(), c0.Y(), c0.Z(), c0.ErrY(), c0.ErrZ() }; - Float_t sp1[5] = {row1.X(), c1.Y(), c1.Z(), c1.ErrY(), c1.ErrZ() }; - Float_t sp2[5] = {row2.X(), c2.Y(), c2.Z(), c2.ErrY(), c2.ErrZ() }; - if( track.NCells()>=3 ){ - p0.Param().ConstructXYZ3(sp0,sp1,sp2,p0.Param().CosPhi(), t0); - p2.Param().ConstructXYZ3(sp2,sp1,sp0,p2.Param().CosPhi(), t0); +GPUh() void AliHLTTPCCATracker::FitTrack( const AliHLTTPCCATrack &/*track*/, float * /*t0[]*/ ) const +{ + //* Fit the track +#ifdef XXX + AliHLTTPCCAEndPoint &p2 = ID2Point( track.PointID()[1] ); + const AliHLTTPCCAHit &c0 = ID2Hit( fTrackHits[p0.TrackHitID()].HitID() ); + const AliHLTTPCCAHit &c1 = ID2Hit( fTrackHits[track.HitID()[1]].HitID() ); + const AliHLTTPCCAHit &c2 = ID2Hit( fTrackHits[p2.TrackHitID()].HitID() ); + const AliHLTTPCCARow &row0 = ID2Row( fTrackHits[p0.TrackHitID()].HitID() ); + const AliHLTTPCCARow &row1 = ID2Row( fTrackHits[track.HitID()[1]].HitID() ); + const AliHLTTPCCARow &row2 = ID2Row( fTrackHits[p2.TrackHitID()].HitID() ); + float sp0[5] = {row0.X(), c0.Y(), c0.Z(), c0.ErrY(), c0.ErrZ() }; + float sp1[5] = {row1.X(), c1.Y(), c1.Z(), c1.ErrY(), c1.ErrZ() }; + float sp2[5] = {row2.X(), c2.Y(), c2.Z(), c2.ErrY(), c2.ErrZ() }; + //std::cout<<"Fit track, points ="<= 3 ) { + p0.Param().ConstructXYZ3( sp0, sp1, sp2, p0.Param().CosPhi(), t0 ); + p2.Param().ConstructXYZ3( sp2, sp1, sp0, p2.Param().CosPhi(), t0 ); //p2.Param() = p0.Param(); //p2.Param().TransportToX(row2.X()); //p2.Param().Par()[1] = -p2.Param().Par()[1]; @@ -1084,12 +821,75 @@ void AliHLTTPCCATracker::FitTrack( AliHLTTPCCATrack &track, Float_t t0[] ) const p0.Param().X() = row0.X(); p0.Param().Y() = c0.Y(); p0.Param().Z() = c0.Z(); - p0.Param().Err2Y() = c0.ErrY()*c0.ErrY(); - p0.Param().Err2Z() = c0.ErrZ()*c0.ErrZ(); + p0.Param().Err2Y() = c0.ErrY() * c0.ErrY(); + p0.Param().Err2Z() = c0.ErrZ() * c0.ErrZ(); p2.Param().X() = row2.X(); p2.Param().Y() = c2.Y(); p2.Param().Z() = c2.Z(); - p2.Param().Err2Y() = c2.ErrY()*c2.ErrY(); - p2.Param().Err2Z() = c2.ErrZ()*c2.ErrZ(); + p2.Param().Err2Y() = c2.ErrY() * c2.ErrY(); + p2.Param().Err2Z() = c2.ErrZ() * c2.ErrZ(); } +#endif +} + + +GPUdi() void AliHLTTPCCATracker::GetErrors2( int iRow, float z, float sinPhi, float cosPhi, float DzDs, float &Err2Y, float &Err2Z ) const +{ + // + // Use calibrated cluster error from OCDB + // + + fParam.GetClusterErrors2( iRow, z, sinPhi, cosPhi, DzDs, Err2Y, Err2Z ); + Err2Y*=fParam.ClusterError2CorrectionY(); + Err2Z*=fParam.ClusterError2CorrectionZ(); } + +GPUdi() void AliHLTTPCCATracker::GetErrors2( int iRow, const AliHLTTPCCATrackParam &t, float &Err2Y, float &Err2Z ) const +{ + // + // Use calibrated cluster error from OCDB + // + + fParam.GetClusterErrors2( iRow, t.GetZ(), t.SinPhi(), t.GetCosPhi(), t.DzDs(), Err2Y, Err2Z ); +} + + +#if !defined(HLTCA_GPUCODE) + +GPUh() void AliHLTTPCCATracker::WriteEvent( std::ostream &out ) +{ + // write event to the file + for ( int iRow = 0; iRow < fParam.NRows(); iRow++ ) { + out << fData.Row( iRow ).HitNumberOffset() << " " << fData.Row( iRow ).NHits() << std::endl; + } + out << NHitsTotal() << std::endl; + + AliHLTResizableArray y( NHitsTotal() ), z( NHitsTotal() ); + + for ( int iRow = 0; iRow < fParam.NRows(); iRow++ ) { + const AliHLTTPCCARow &row = Row( iRow ); + float y0 = row.Grid().YMin(); + float z0 = row.Grid().ZMin(); + float stepY = row.HstepY(); + float stepZ = row.HstepZ(); + for ( int ih = 0; ih < fData.Row( iRow ).NHits(); ih++ ) { + int id = HitInputID( row, ih ); + y[id] = y0 + HitDataY( row, ih ) * stepY; + z[id] = z0 + HitDataZ( row, ih ) * stepZ; + } + } + for ( int ih = 0; ih < NHitsTotal(); ih++ ) { + out << y[ih] << " " << z[ih] << std::endl; + } +} + +GPUh() void AliHLTTPCCATracker::WriteTracks( std::ostream &/*out*/ ) +{ + //* Write tracks to file --- dummy +} + +GPUh() void AliHLTTPCCATracker::ReadTracks( std::istream &/*in*/ ) +{ + //* Read tracks from file -- dummy +} +#endif