]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/tracking-ca/AliHLTTPCCATracker.cxx
Changed constness of the AliHLTCaloClusterDataStruct::GetTracksMatched function.
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCATracker.cxx
CommitLineData
326c2d4b 1// @(#) $Id$
ce565086 2// **************************************************************************
fbb9b71b 3// This file is property of and copyright by the ALICE HLT Project *
d54804bf 4// ALICE Experiment at CERN, All rights reserved. *
5// *
6// Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
7// Ivan Kisel <kisel@kip.uni-heidelberg.de> *
8// for The ALICE HLT Project. *
9// *
10// Permission to use, copy, modify and distribute this software and its *
11// documentation strictly for non-commercial purposes is hereby granted *
12// without fee, provided that the above copyright notice appears in all *
13// copies and that both the copyright notice and this permission notice *
14// appear in the supporting documentation. The authors make no claims *
15// about the suitability of this software for any purpose. It is *
16// provided "as is" without express or implied warranty. *
ce565086 17// *
d54804bf 18//***************************************************************************
326c2d4b 19
20#include "AliHLTTPCCATracker.h"
326c2d4b 21#include "AliHLTTPCCAOutTrack.h"
d54804bf 22#include "AliHLTTPCCARow.h"
23#include "AliHLTTPCCATrack.h"
4687b8fc 24#include "AliHLTTPCCATracklet.h"
00d07bcd 25#include "AliHLTTPCCAMath.h"
4acc2401 26#include "MemoryAssignmentHelpers.h"
326c2d4b 27
dc4788ec 28#include "TStopwatch.h"
00d07bcd 29#include "AliHLTTPCCAHitArea.h"
30#include "AliHLTTPCCANeighboursFinder.h"
31#include "AliHLTTPCCANeighboursCleaner.h"
32#include "AliHLTTPCCAStartHitsFinder.h"
33#include "AliHLTTPCCATrackletConstructor.h"
34#include "AliHLTTPCCATrackletSelector.h"
35#include "AliHLTTPCCAProcess.h"
63d8b79d 36#include "AliHLTTPCCASliceTrack.h"
37#include "AliHLTTPCCASliceOutput.h"
4acc2401 38#include "AliHLTTPCCAClusterData.h"
70e4a065 39#include "AliHLTTPCCADataCompressor.h"
00d07bcd 40
41#include "AliHLTTPCCATrackParam.h"
00d07bcd 42
b22af1bf 43#include "AliHLTTPCCAGPUConfig.h"
b22af1bf 44
00d07bcd 45#if !defined(HLTCA_GPUCODE)
4687b8fc 46#include <iostream>
a59a784e 47#include <iomanip>
b22af1bf 48#include <string.h>
00d07bcd 49#endif
d54804bf 50
6de2bc40 51//#define DRAW1
326c2d4b 52
6de2bc40 53#ifdef DRAW1
fbb9b71b 54#include "AliHLTTPCCADisplay.h"
31649d4b 55#endif //DRAW1
326c2d4b 56
ce565086 57#ifdef HLTCA_INTERNAL_PERFORMANCE
a59a784e 58//#include "AliHLTTPCCAPerformance.h"
ce565086 59#endif
60
b22af1bf 61#ifdef HLTCA_STANDALONE
62#include "AliHLTTPCCAStandaloneFramework.h"
63#endif
ce565086 64
fbb9b71b 65ClassImp( AliHLTTPCCATracker )
326c2d4b 66
b22af1bf 67
68#if !defined(HLTCA_GPUCODE)
69
70AliHLTTPCCATracker::~AliHLTTPCCATracker()
326c2d4b 71{
72 // destructor
7be9b0d7 73 if (!fIsGPUTracker)
74 {
b22af1bf 75 if (fCommonMem) delete fCommonMem;
76 if (fHitMemory) delete[] fHitMemory;
77 if (fTrackletMemory) delete[] fTrackletMemory;
78 if (fTrackMemory) delete[] fTrackMemory;
79 fCommonMem = NULL;
80 fHitMemory = fTrackMemory = NULL;
7be9b0d7 81 }
326c2d4b 82}
00d07bcd 83
326c2d4b 84// ----------------------------------------------------------------------------------
7be9b0d7 85void AliHLTTPCCATracker::Initialize( const AliHLTTPCCAParam &param )
326c2d4b 86{
75192f26 87 // initialisation
00d07bcd 88 fParam = param;
4687b8fc 89 fParam.Update();
4acc2401 90 fData.InitializeRows( fParam );
91
326c2d4b 92 StartEvent();
93}
94
7be9b0d7 95void AliHLTTPCCATracker::StartEvent()
326c2d4b 96{
fbb9b71b 97 // start new event and fresh the memory
d54804bf 98
4acc2401 99 SetupCommonMemory();
4acc2401 100}
101
7be9b0d7 102void AliHLTTPCCATracker::SetGPUTracker()
103{
8566066c 104 //Make this a GPU Tracker
7be9b0d7 105 fIsGPUTracker = true;
b22af1bf 106 fData.SetGpuSliceData();
7be9b0d7 107}
108
8566066c 109char* AliHLTTPCCATracker::SetGPUTrackerCommonMemory(char* const pGPUMemory)
7be9b0d7 110{
8566066c 111 //Set up common Memory Pointer for GPU Tracker
a59a784e 112 fCommonMem = (commonMemoryStruct*) pGPUMemory;
113 return(pGPUMemory + sizeof(commonMemoryStruct));
7be9b0d7 114}
115
116
b22af1bf 117char* AliHLTTPCCATracker::SetGPUTrackerHitsMemory(char* pGPUMemory, int MaxNHits)
7be9b0d7 118{
8566066c 119 //Set up Hits Memory Pointers for GPU Tracker
7be9b0d7 120 fHitMemory = (char*) pGPUMemory;
121 SetPointersHits(MaxNHits);
b22af1bf 122 pGPUMemory += fHitMemorySize;
123 AssignMemory(fTrackletTmpStartHits, pGPUMemory, NHitsTotal());
124 AssignMemory(fRowStartHitCountOffset, pGPUMemory, Param().NRows());
125
126 return(pGPUMemory);
7be9b0d7 127}
128
b22af1bf 129char* AliHLTTPCCATracker::SetGPUTrackerTrackletsMemory(char* pGPUMemory, int MaxNTracks)
130{
8566066c 131 //Set up Tracklet Memory Pointers for GPU Tracker
b22af1bf 132 fTrackletMemory = (char*) pGPUMemory;
133 SetPointersTracklets(MaxNTracks);
134 pGPUMemory += fTrackletMemorySize;
135 AssignMemory(fGPUTrackletTemp, pGPUMemory, MaxNTracks);
136 AssignMemory(fRowBlockTracklets, pGPUMemory, MaxNTracks * 2 * (Param().NRows() / HLTCA_GPU_SCHED_ROW_STEP + 1));
137 AssignMemory(fRowBlockPos, pGPUMemory, 2 * (Param().NRows() / HLTCA_GPU_SCHED_ROW_STEP + 1));
138 AssignMemory(fBlockStartingTracklet, pGPUMemory, HLTCA_GPU_BLOCK_COUNT);
139
140 return(pGPUMemory);
141}
7be9b0d7 142
143char* AliHLTTPCCATracker::SetGPUTrackerTracksMemory(char* pGPUMemory, int MaxNTracks, int MaxNHits )
144{
8566066c 145 //Set up Tracks Memory Pointer for GPU Tracker
7be9b0d7 146 fTrackMemory = (char*) pGPUMemory;
147 SetPointersTracks(MaxNTracks, MaxNHits);
b22af1bf 148 pGPUMemory += fTrackMemorySize;
149
150 return(pGPUMemory);
7be9b0d7 151}
152
b22af1bf 153void AliHLTTPCCATracker::DumpSliceData(std::ostream &out)
7be9b0d7 154{
8566066c 155 //Dump Slice Input Data to File
156 out << "Slice Data:" << std::endl;
7be9b0d7 157 for (int i = 0;i < Param().NRows();i++)
158 {
8566066c 159 out << "Row: " << i << std::endl;
7be9b0d7 160 for (int j = 0;j < Row(i).NHits();j++)
161 {
b22af1bf 162 if (j && j % 16 == 0) out << std::endl;
163 out << j << '-' << Data().HitDataY(Row(i), j) << '-' << Data().HitDataZ(Row(i), j) << ", ";
7be9b0d7 164 }
8566066c 165 out << std::endl;
7be9b0d7 166 }
167}
168
b22af1bf 169void AliHLTTPCCATracker::DumpLinks(std::ostream &out)
7be9b0d7 170{
8566066c 171 //Dump Links (after Neighbours Finder / Cleaner) to file
172 out << "Hit Links:" << std::endl;
b22af1bf 173 for (int i = 0;i < Param().NRows();i++)
7be9b0d7 174 {
8566066c 175 out << "Row: " << i << std::endl;
b22af1bf 176 for (int j = 0;j < Row(i).NHits();j++)
7be9b0d7 177 {
8566066c 178 if (j && j % 32 == 0) out << std::endl;
b22af1bf 179 out << HitLinkUpData(Row(i), j) << "/" << HitLinkDownData(Row(i), j) << ", ";
7be9b0d7 180 }
8566066c 181 out << std::endl;
7be9b0d7 182 }
7be9b0d7 183}
184
b22af1bf 185void AliHLTTPCCATracker::DumpHitWeights(std::ostream &out)
7be9b0d7 186{
8566066c 187 //dump hit weights to file
188 out << "Hit Weights:" << std::endl;
b22af1bf 189 for (int i = 0;i < Param().NRows();i++)
190 {
8566066c 191 out << "Row: " << i << ":" << std::endl;
b22af1bf 192 for (int j = 0;j < Row(i).NHits();j++)
7be9b0d7 193 {
8566066c 194 if (j && j % 32 == 0) out << std::endl;
b22af1bf 195 out << HitWeight(Row(i), j) << ", ";
7be9b0d7 196 }
8566066c 197 out << std::endl;
b22af1bf 198 }
199}
200
a59a784e 201int AliHLTTPCCATracker::StarthitSortComparison(const void*a, const void* b)
b22af1bf 202{
8566066c 203 //qsort helper function to sort start hits
b22af1bf 204 AliHLTTPCCAHitId* aa = (AliHLTTPCCAHitId*) a;
205 AliHLTTPCCAHitId* bb = (AliHLTTPCCAHitId*) b;
206
207 if (aa->RowIndex() != bb->RowIndex()) return(aa->RowIndex() - bb->RowIndex());
208 return(aa->HitIndex() - bb->HitIndex());
7be9b0d7 209}
210
b22af1bf 211void AliHLTTPCCATracker::DumpStartHits(std::ostream &out)
7be9b0d7 212{
8566066c 213 //sort start hits and dump to file
214 out << "Start Hits: (" << *NTracklets() << ")" << std::endl;
b22af1bf 215#ifdef HLTCA_GPU_SORT_DUMPDATA
a59a784e 216 qsort(TrackletStartHits(), *NTracklets(), sizeof(AliHLTTPCCAHitId), StarthitSortComparison);
b22af1bf 217#endif
218 for (int i = 0;i < *NTracklets();i++)
7be9b0d7 219 {
8566066c 220 out << TrackletStartHit(i).RowIndex() << "-" << TrackletStartHit(i).HitIndex() << std::endl;
7be9b0d7 221 }
8566066c 222 out << std::endl;
b22af1bf 223}
224
225void AliHLTTPCCATracker::DumpTrackHits(std::ostream &out)
226{
8566066c 227 //dump tracks to file
228 out << "Tracks: (" << *NTracks() << ")" << std::endl;
b22af1bf 229#ifdef HLTCA_GPU_SORT_DUMPDATA
230 for (int k = 0;k < Param().NRows();k++)
7be9b0d7 231 {
b22af1bf 232 for (int l = 0;l < Row(k).NHits();l++)
7be9b0d7 233 {
b22af1bf 234#endif
235 for (int j = 0;j < *NTracks();j++)
236 {
237 if (Tracks()[j].NHits() == 0 || !Tracks()[j].Alive()) continue;
238#ifdef HLTCA_GPU_SORT_DUMPDATA
239 if (TrackHits()[Tracks()[j].FirstHitID()].RowIndex() == k && TrackHits()[Tracks()[j].FirstHitID()].HitIndex() == l)
240 {
241#endif
242 for (int i = 0;i < Tracks()[j].NHits();i++)
243 {
244 out << TrackHits()[Tracks()[j].FirstHitID() + i].RowIndex() << "-" << TrackHits()[Tracks()[j].FirstHitID() + i].HitIndex() << ", ";
245 }
8566066c 246 out << "(Track: " << j << ")" << std::endl;
b22af1bf 247#ifdef HLTCA_GPU_SORT_DUMPDATA
248 }
249 }
250#endif
251 }
252#ifdef HLTCA_GPU_SORT_DUMPDATA
7be9b0d7 253 }
b22af1bf 254#endif
7be9b0d7 255}
256
257void AliHLTTPCCATracker::DumpTrackletHits(std::ostream &out)
258{
8566066c 259 //dump tracklets to file
260 out << "Tracklets: (" << *NTracklets() << ")" << std::endl;
b22af1bf 261#ifdef HLTCA_GPU_SORT_DUMPDATA
262 AliHLTTPCCAHitId* tmpIds = new AliHLTTPCCAHitId[*NTracklets()];
263 AliHLTTPCCATracklet* tmpTracklets = new AliHLTTPCCATracklet[*NTracklets()];
264 memcpy(tmpIds, TrackletStartHits(), *NTracklets() * sizeof(AliHLTTPCCAHitId));
265 memcpy(tmpTracklets, Tracklets(), *NTracklets() * sizeof(AliHLTTPCCATracklet));
266#ifdef EXTERN_ROW_HITS
267 int* tmpHits = new int[*NTracklets() * Param().NRows()];
268 memcpy(tmpHits, TrackletRowHits(), *NTracklets() * Param().NRows() * sizeof(int));
269#endif
a59a784e 270 qsort(TrackletStartHits(), *NTracklets(), sizeof(AliHLTTPCCAHitId), StarthitSortComparison);
b22af1bf 271 for (int i = 0;i < *NTracklets();i++)
7be9b0d7 272 {
273 for (int j = 0;j < *NTracklets();j++)
274 {
b22af1bf 275 if (tmpIds[i].RowIndex() == TrackletStartHit(j).RowIndex() && tmpIds[i].HitIndex() == TrackletStartHit(j).HitIndex())
7be9b0d7 276 {
b22af1bf 277 memcpy(&Tracklets()[j], &tmpTracklets[i], sizeof(AliHLTTPCCATracklet));
278#ifdef EXTERN_ROW_HITS
279 if (tmpTracklets[i].NHits())
7be9b0d7 280 {
b22af1bf 281 for (int k = tmpTracklets[i].FirstRow();k <= tmpTracklets[i].LastRow();k++)
282 {
283 fTrackletRowHits[k * *NTracklets() + j] = tmpHits[k * *NTracklets() + i];
284 }
7be9b0d7 285 }
b22af1bf 286#endif
287 break;
288 }
289 }
290 }
291 delete[] tmpIds;
292 delete[] tmpTracklets;
293#ifdef EXTERN_ROW_HITS
294 delete[] tmpHits;
295#endif
296#endif
297 for (int j = 0;j < *NTracklets();j++)
298 {
8566066c 299 out << "Tracklet " << j << " (Hits: " << std::setw(3) << Tracklets()[j].NHits() << ", Start: " << std::setw(3) << TrackletStartHit(j).RowIndex() << "-" << std::setw(3) << TrackletStartHit(j).HitIndex() << ") ";
b22af1bf 300 if (Tracklets()[j].NHits() == 0);
301 else if (Tracklets()[j].LastRow() > Tracklets()[j].FirstRow() && (Tracklets()[j].FirstRow() >= Param().NRows() || Tracklets()[j].LastRow() >= Param().NRows()))
302 {
303#ifdef HLTCA_STANDALONE
304 printf("\nError: First %d Last %d Num %d", Tracklets()[j].FirstRow(), Tracklets()[j].LastRow(), Tracklets()[j].NHits());
305#endif
306 }
307 else if (Tracklets()[j].NHits() && Tracklets()[j].LastRow() > Tracklets()[j].FirstRow())
308 {
309 for (int i = Tracklets()[j].FirstRow();i <= Tracklets()[j].LastRow();i++)
310 {
311 //if (Tracklets()[j].RowHit(i) != -1)
312#ifdef EXTERN_ROW_HITS
313 out << i << "-" << fTrackletRowHits[i * fCommonMem->fNTracklets + j] << ", ";
314#else
315 out << i << "-" << Tracklets()[j].RowHit(i) << ", ";
316#endif
7be9b0d7 317 }
318 }
8566066c 319 out << std::endl;
7be9b0d7 320 }
321}
322
323
b22af1bf 324void AliHLTTPCCATracker::SetupCommonMemory()
4acc2401 325{
6de2bc40 326 // set up common memory
327
7be9b0d7 328 if (!fIsGPUTracker)
329 {
b22af1bf 330 if ( !fCommonMem ) {
7be9b0d7 331 // the 1600 extra bytes are not used unless fCommonMemorySize increases with a later event
b22af1bf 332 //fCommonMemory = reinterpret_cast<char*> ( new uint4 [ fCommonMemorySize/sizeof( uint4 ) + 100] );
333 fCommonMem = new commonMemoryStruct;
7be9b0d7 334 }
fbb9b71b 335
b22af1bf 336 if (fHitMemory) delete[] fHitMemory;
337 if (fTrackletMemory) delete[] fTrackletMemory;
338 if (fTrackMemory) delete[] fTrackMemory;
7be9b0d7 339 }
c259f7e4 340
b22af1bf 341 fHitMemory = fTrackletMemory = fTrackMemory = 0;
342
4acc2401 343 fData.Clear();
b22af1bf 344 fCommonMem->fNTracklets = 0;
345 fCommonMem->fNTracks = 0 ;
346 fCommonMem->fNTrackHits = 0;
326c2d4b 347}
348
7be9b0d7 349void AliHLTTPCCATracker::ReadEvent( AliHLTTPCCAClusterData *clusterData )
350{
351 // read event
352
353 fClusterData = clusterData;
354
355 StartEvent();
356
357 //* Convert input hits, create grids, etc.
358 fData.InitFromClusterData( *clusterData );
7be9b0d7 359 {
b22af1bf 360 if (!fIsGPUTracker)
361 {
362 SetPointersHits( fData.NumberOfHits() ); // to calculate the size
363 fHitMemory = reinterpret_cast<char*> ( new uint4 [ fHitMemorySize/sizeof( uint4 ) + 100] );
364 }
7be9b0d7 365 SetPointersHits( fData.NumberOfHits() ); // set pointers for hits
7be9b0d7 366 }
367}
368
fbb9b71b 369GPUhd() void AliHLTTPCCATracker::SetPointersHits( int MaxNHits )
c259f7e4 370{
371 // set all pointers to the event memory
372
4acc2401 373 char *mem = fHitMemory;
c259f7e4 374
375 // extra arrays for tpc clusters
c259f7e4 376
b22af1bf 377#ifdef HLTCA_GPU_SORT_STARTHITS_2
378 AssignMemory( fTrackletStartHits, mem, MaxNHits + 32);
379#else
380 AssignMemory( fTrackletStartHits, mem, MaxNHits);
381#endif
382
383 // calculate the size
c259f7e4 384
b22af1bf 385 fHitMemorySize = mem - fHitMemory;
386}
c259f7e4 387
b22af1bf 388GPUhd() void AliHLTTPCCATracker::SetPointersTracklets( int MaxNTracklets )
389{
390 // set all pointers to the tracklets memory
391 char *mem = fTrackletMemory;
fbb9b71b 392
b22af1bf 393 // memory for tracklets
c259f7e4 394
b22af1bf 395 AssignMemory( fTracklets, mem, MaxNTracklets );
396#ifdef EXTERN_ROW_HITS
397 AssignMemory( fTrackletRowHits, mem, MaxNTracklets * Param().NRows());
398#endif
c259f7e4 399
b22af1bf 400 fTrackletMemorySize = mem - fTrackletMemory;
c259f7e4 401}
402
403
fbb9b71b 404GPUhd() void AliHLTTPCCATracker::SetPointersTracks( int MaxNTracks, int MaxNHits )
c259f7e4 405{
406 // set all pointers to the tracks memory
4acc2401 407 char *mem = fTrackMemory;
fbb9b71b 408
c259f7e4 409 // memory for selected tracks
fbb9b71b 410
4acc2401 411 AssignMemory( fTracks, mem, MaxNTracks );
b22af1bf 412 AssignMemory( fTrackHits, mem, 2 * MaxNHits );
c259f7e4 413
414 // calculate the size
415
4acc2401 416 fTrackMemorySize = mem - fTrackMemory;
c259f7e4 417}
418
a59a784e 419GPUh() int AliHLTTPCCATracker::CheckEmptySlice() const
7be9b0d7 420{
8566066c 421 //Check if the Slice is empty, if so set the output apropriate and tell the reconstuct procesdure to terminate
7be9b0d7 422 if ( NHitsTotal() < 1 ) {
423 {
a59a784e 424 AliHLTTPCCASliceOutput::Allocate(*fOutput, 0, 0, fOutputControl);
425 AliHLTTPCCASliceOutput* useOutput = *fOutput;
90da1ad5 426 if (useOutput == NULL) return(1);
98512261 427 useOutput->SetNTracks( 0 );
428 useOutput->SetNTrackClusters( 0 );
a59a784e 429 useOutput->SetNOutTracks(0);
430 useOutput->SetNOutTrackHits(0);
7be9b0d7 431 }
326c2d4b 432
7be9b0d7 433 return 1;
434 }
435 return 0;
436}
437
438void AliHLTTPCCATracker::RunNeighboursFinder()
326c2d4b 439{
8566066c 440 //Run the CPU Neighbours Finder
7be9b0d7 441 AliHLTTPCCAProcess<AliHLTTPCCANeighboursFinder>( Param().NRows(), 1, *this );
442}
6de2bc40 443
7be9b0d7 444void AliHLTTPCCATracker::RunNeighboursCleaner()
445{
8566066c 446 //Run the CPU Neighbours Cleaner
7be9b0d7 447 AliHLTTPCCAProcess<AliHLTTPCCANeighboursCleaner>( Param().NRows() - 2, 1, *this );
448}
d54804bf 449
7be9b0d7 450void AliHLTTPCCATracker::RunStartHitsFinder()
451{
8566066c 452 //Run the CPU Start Hits Finder
7be9b0d7 453 AliHLTTPCCAProcess<AliHLTTPCCAStartHitsFinder>( Param().NRows() - 4, 1, *this );
454}
fbb9b71b 455
7be9b0d7 456void AliHLTTPCCATracker::RunTrackletConstructor()
457{
8566066c 458 //Run CPU Tracklet Constructor
a59a784e 459 AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorNewCPU(*this);
7be9b0d7 460}
fbb9b71b 461
7be9b0d7 462void AliHLTTPCCATracker::RunTrackletSelector()
463{
8566066c 464 //Run CPU Tracklet Selector
b22af1bf 465 AliHLTTPCCAProcess<AliHLTTPCCATrackletSelector>( 1, fCommonMem->fNTracklets, *this );
d54804bf 466}
467
b22af1bf 468#ifdef HLTCA_STANDALONE
469void AliHLTTPCCATracker::StandalonePerfTime(int i)
470{
8566066c 471 //Query Performance Timer for Standalone Version of Tracker
b22af1bf 472 if (fGPUDebugLevel >= 1)
473 {
a59a784e 474 AliHLTTPCCAStandaloneFramework::StandaloneQueryTime(&fPerfTimers[i]);
b22af1bf 475 }
476}
477#else
478void AliHLTTPCCATracker::StandalonePerfTime(int /*i*/) {}
479#endif
480
00d07bcd 481GPUh() void AliHLTTPCCATracker::Reconstruct()
482{
483 //* reconstruction of event
4acc2401 484 //std::cout<<"Reconstruct slice "<<fParam.ISlice()<<", nHits="<<NHitsTotal()<<std::endl;
326c2d4b 485
00d07bcd 486 fTimers[0] = 0; // find neighbours
487 fTimers[1] = 0; // construct tracklets
488 fTimers[2] = 0; // fit tracklets
489 fTimers[3] = 0; // prolongation of tracklets
490 fTimers[4] = 0; // selection
491 fTimers[5] = 0; // write output
492 fTimers[6] = 0;
493 fTimers[7] = 0;
fbb9b71b 494
693d2443 495 //if( fParam.ISlice()<1 ) return; //SG!!!
00d07bcd 496
00d07bcd 497 TStopwatch timer0;
b22af1bf 498
499 StandalonePerfTime(0);
500
7be9b0d7 501 if (CheckEmptySlice()) return;
4687b8fc 502
6de2bc40 503#ifdef DRAW1
f0fb467d 504 //if( fParam.ISlice()==2 || fParam.ISlice()==3)
505 {
fbb9b71b 506 AliHLTTPCCADisplay::Instance().ClearView();
693d2443 507 AliHLTTPCCADisplay::Instance().SetSliceView();
508 AliHLTTPCCADisplay::Instance().SetCurrentSlice( this );
fbb9b71b 509 AliHLTTPCCADisplay::Instance().DrawSlice( this, 1 );
4acc2401 510 if ( NHitsTotal() > 0 ) {
fbb9b71b 511 AliHLTTPCCADisplay::Instance().DrawSliceHits( kRed, .5 );
693d2443 512 AliHLTTPCCADisplay::Instance().Ask();
513 }
f0fb467d 514 }
31649d4b 515#endif //DRAW1
693d2443 516
b22af1bf 517 fCommonMem->fNTracklets = fCommonMem->fNTracks = fCommonMem->fNTrackHits = 0;
4687b8fc 518
fbb9b71b 519#if !defined(HLTCA_GPUCODE)
520
31649d4b 521 if (fGPUDebugLevel >= 6)
7be9b0d7 522 {
31649d4b 523 *fGPUDebugOut << std::endl << std::endl << "Slice: " << Param().ISlice() << std::endl;
524 *fGPUDebugOut << "Slice Data:" << std::endl;
b22af1bf 525 DumpSliceData(*fGPUDebugOut);
31649d4b 526 }
b22af1bf 527
528 StandalonePerfTime(1);
693d2443 529
7be9b0d7 530 RunNeighboursFinder();
531
b22af1bf 532 StandalonePerfTime(2);
533
534 if (fGPUDebugLevel >= 6) DumpLinks(*fGPUDebugOut);
535
fbb9b71b 536#ifdef HLTCA_INTERNAL_PERFORMANCE
537 //if( Param().ISlice()<=2 )
ce565086 538 //AliHLTTPCCAPerformance::Instance().LinkPerformance( Param().ISlice() );
539#endif
540
541
f0fb467d 542#ifdef DRAW1
4acc2401 543 if ( NHitsTotal() > 0 ) {
fbb9b71b 544 AliHLTTPCCADisplay::Instance().DrawSliceLinks( -1, -1, 1 );
ce565086 545 AliHLTTPCCADisplay::Instance().Ask();
546 }
31649d4b 547#endif //DRAW1
ce565086 548
7be9b0d7 549 RunNeighboursCleaner();
ce565086 550
b22af1bf 551 StandalonePerfTime(3);
552
553 if (fGPUDebugLevel >= 6) DumpLinks(*fGPUDebugOut);
fbb9b71b 554
7be9b0d7 555 RunStartHitsFinder();
c259f7e4 556
b22af1bf 557 StandalonePerfTime(4);
558 StandalonePerfTime(5);
d54804bf 559
b22af1bf 560 if (fGPUDebugLevel >= 6) DumpStartHits(*fGPUDebugOut);
561
7be9b0d7 562 fData.ClearHitWeights();
d54804bf 563
b22af1bf 564 SetPointersTracklets( fCommonMem->fNTracklets * 2 ); // to calculate the size
565 fTrackletMemory = reinterpret_cast<char*> ( new uint4 [ fTrackletMemorySize/sizeof( uint4 ) + 100] );
566 SetPointersTracklets( fCommonMem->fNTracklets * 2 ); // set pointers for hits
567
568 SetPointersTracks( fCommonMem->fNTracklets * 2, NHitsTotal() ); // to calculate the size
7be9b0d7 569 fTrackMemory = reinterpret_cast<char*> ( new uint4 [ fTrackMemorySize/sizeof( uint4 ) + 100] );
b22af1bf 570 SetPointersTracks( fCommonMem->fNTracklets * 2, NHitsTotal() ); // set pointers for hits
571
572 StandalonePerfTime(6);
573 StandalonePerfTime(7);
d54804bf 574
7be9b0d7 575 RunTrackletConstructor();
ce565086 576
b22af1bf 577 StandalonePerfTime(8);
578
579 if (fGPUDebugLevel >= 6) DumpTrackletHits(*fGPUDebugOut);
580 if (fGPUDebugLevel >= 6) DumpHitWeights(*fGPUDebugOut);
d54804bf 581
7be9b0d7 582 //std::cout<<"Slice "<<Param().ISlice()<<": NHits="<<NHitsTotal()<<", NTracklets="<<*NTracklets()<<std::endl;
d54804bf 583
7be9b0d7 584 RunTrackletSelector();
d54804bf 585
b22af1bf 586 StandalonePerfTime(9);
587
7be9b0d7 588 //std::cout<<"Slice "<<Param().ISlice()<<": N start hits/tracklets/tracks = "<<nStartHits<<" "<<nStartHits<<" "<<*fNTracks<<std::endl;
d54804bf 589
b22af1bf 590 if (fGPUDebugLevel >= 6) DumpTrackHits(*fGPUDebugOut);
c259f7e4 591
592 //std::cout<<"Memory used for slice "<<fParam.ISlice()<<" : "<<fCommonMemorySize/1024./1024.<<" + "<<fHitMemorySize/1024./1024.<<" + "<<fTrackMemorySize/1024./1024.<<" = "<<( fCommonMemorySize+fHitMemorySize+fTrackMemorySize )/1024./1024.<<" Mb "<<std::endl;
593
fbb9b71b 594 WriteOutput();
595
b22af1bf 596 StandalonePerfTime(10);
597
693d2443 598#endif
599
f0fb467d 600#ifdef DRAW1
fbb9b71b 601 {
602 AliHLTTPCCADisplay &disp = AliHLTTPCCADisplay::Instance();
603 AliHLTTPCCATracker &slice = *this;
b22af1bf 604 std::cout << "N out tracks = " << slice.NOutTracks() << std::endl;
f0fb467d 605 AliHLTTPCCADisplay::Instance().SetSliceView();
fbb9b71b 606 AliHLTTPCCADisplay::Instance().SetCurrentSlice( this );
607 AliHLTTPCCADisplay::Instance().DrawSlice( this, 1 );
f0fb467d 608 disp.DrawSliceHits( kRed, .5 );
609 disp.Ask();
b22af1bf 610 for ( int itr = 0; itr < slice.NOutTracks(); itr++ ) {
fbb9b71b 611 std::cout << "track N " << itr << ", nhits=" << slice.OutTracks()[itr].NHits() << std::endl;
f0fb467d 612 disp.DrawSliceOutTrack( itr, kBlue );
fbb9b71b 613 //disp.Ask();
614 //int id = slice.OutTracks()[itr].OrigTrackID();
615 //AliHLTTPCCATrack &tr = Tracks()[id];
616 //for( int ih=0; ih<tr.NHits(); ih++ ){
617 //int ic = (fTrackHits[tr.FirstHitID()+ih]);
618 //std::cout<<ih<<" "<<ID2IRow(ic)<<" "<<ID2IHit(ic)<<std::endl;
619 //}
620 //disp.DrawSliceTrack( id, kBlue );
621 //disp.Ask();
622 }
623 disp.Ask();
624 }
31649d4b 625#endif //DRAW1
dc4788ec 626
fbb9b71b 627 timer0.Stop();
628 fTimers[0] = timer0.CpuTime() / 100.;
326c2d4b 629
fbb9b71b 630}
326c2d4b 631
00d07bcd 632GPUh() void AliHLTTPCCATracker::WriteOutput()
633{
d54804bf 634 // write output
eb30eb49 635
00d07bcd 636 TStopwatch timer;
63d8b79d 637
4acc2401 638 //cout<<"output: nTracks = "<<*fNTracks<<", nHitsTotal="<<NHitsTotal()<<std::endl;
63d8b79d 639
d4594e7d 640 if (fOutputControl == NULL) fOutputControl = new AliHLTTPCCASliceOutput::outputControlStruct;
641 AliHLTTPCCASliceOutput::Allocate(*fOutput, fCommonMem->fNTracks, fCommonMem->fNTrackHits, fOutputControl);
98512261 642 AliHLTTPCCASliceOutput* useOutput = *fOutput;
d4594e7d 643 if (useOutput == NULL) return;
98512261 644
d4594e7d 645 if (fOutputControl->fDefaultOutput)
646 {
647 useOutput->SetNTracks( fCommonMem->fNTracks );
648 useOutput->SetNTrackClusters( fCommonMem->fNTrackHits );
649
650 int nStoredHits = 0;
651
652 for ( int iTr = 0; iTr < fCommonMem->fNTracks; iTr++ ) {
653 AliHLTTPCCATrack &iTrack = fTracks[iTr];
654
655 AliHLTTPCCASliceTrack out;
656 out.SetFirstClusterRef( nStoredHits );
657 out.SetNClusters( iTrack.NHits() );
658 out.SetParam( iTrack.Param() );
659
660 useOutput->SetTrack( iTr, out );
661
662 int iID = iTrack.FirstHitID();
663 for ( int ith = 0; ith < iTrack.NHits(); ith++ ) {
664 const AliHLTTPCCAHitId &ic = fTrackHits[iID + ith];
665 int iRow = ic.RowIndex();
666 int ih = ic.HitIndex();
667
668 const AliHLTTPCCARow &row = fData.Row( iRow );
669
670 //float y0 = row.Grid().YMin();
671 //float z0 = row.Grid().ZMin();
672 //float stepY = row.HstepY();
673 //float stepZ = row.HstepZ();
674 //float x = row.X();
675
676 //const uint4 *tmpint4 = RowData() + row.FullOffset();
677 //const ushort2 *hits = reinterpret_cast<const ushort2*>(tmpint4);
678 //ushort2 hh = hits[ih];
679 //float y = y0 + hh.x*stepY;
680 //float z = z0 + hh.y*stepZ;
681
682 int clusterIndex = fData.ClusterDataIndex( row, ih );
683 int clusterRowIndex = clusterIndex - fClusterData->RowOffset( iRow );
684
685 if ( clusterIndex < 0 || clusterIndex >= fClusterData->NumberOfClusters() ) {
686 //std::cout << inpIDtot << ", " << fClusterData->NumberOfClusters()
687 //<< "; " << inpID << ", " << fClusterData->NumberOfClusters( iRow ) << std::endl;
688 //abort();
689 continue;
690 }
691 if ( clusterRowIndex < 0 || clusterRowIndex >= fClusterData->NumberOfClusters( iRow ) ) {
692 //std::cout << inpIDtot << ", " << fClusterData->NumberOfClusters()
693 //<< "; " << inpID << ", " << fClusterData->NumberOfClusters( iRow ) << std::endl;
694 //abort();
695 continue;
696 }
697
698 float origX = fClusterData->X( clusterIndex );
699 float origY = fClusterData->Y( clusterIndex );
700 float origZ = fClusterData->Z( clusterIndex );
701
702
703 int id = fClusterData->Id( clusterIndex );
70e4a065 704 AliHLTTPCCACompressedCluster cXYZ = AliHLTTPCCADataCompressor::PackXYZ( iRow, origX, origY, origZ );
d4594e7d 705
70e4a065 706 //float2 hUnpackedYZ;
707 //hUnpackedYZ.x = origY;
708 //hUnpackedYZ.y = origZ;
709 //float hUnpackedX = origX;
d4594e7d 710
711 useOutput->SetClusterId( nStoredHits, id );
712 useOutput->SetClusterRow( nStoredHits, ( unsigned char ) iRow );
70e4a065 713 useOutput->SetClusterPackedXYZ( nStoredHits, cXYZ );
d4594e7d 714 nStoredHits++;
715 }
716 }
63d8b79d 717 }
fbb9b71b 718
719
720 // old stuff
d4594e7d 721 if (fOutputControl->fObsoleteOutput)
722 {
723 useOutput->SetNOutTrackHits(0);
724 useOutput->SetNOutTracks(0);
725
726
727 for ( int iTr = 0; iTr < fCommonMem->fNTracks; iTr++ ) {
728
729 const AliHLTTPCCATrack &iTrack = fTracks[iTr];
730
731 //std::cout<<"iTr = "<<iTr<<", nHits="<<iTrack.NHits()<<std::endl;
732
733 //if( !iTrack.Alive() ) continue;
734 if ( iTrack.NHits() < 3 ) continue;
735 AliHLTTPCCAOutTrack &out = useOutput->OutTracks()[useOutput->NOutTracks()];
736 out.SetFirstHitRef( useOutput->NOutTrackHits() );
737 out.SetNHits( 0 );
738 out.SetOrigTrackID( iTr );
73a33d2e 739 AliHLTTPCCATrackParam tmpParam;
740 tmpParam.InitParam();
741 tmpParam.SetParam(iTrack.Param());
742 out.SetStartPoint( tmpParam );
743 out.SetEndPoint( tmpParam );
d4594e7d 744
745 int iID = iTrack.FirstHitID();
746 int nOutTrackHitsOld = useOutput->NOutTrackHits();
747
748 for ( int ith = 0; ith < iTrack.NHits(); ith++ ) {
749 const AliHLTTPCCAHitId &ic = fTrackHits[iID + ith];
750 const AliHLTTPCCARow &row = Row( ic );
751 int ih = ic.HitIndex();
752 useOutput->SetOutTrackHit(useOutput->NOutTrackHits(), HitInputID( row, ih ));
753 useOutput->SetNOutTrackHits(useOutput->NOutTrackHits() + 1 );
754 //std::cout<<"write i,row,hit,id="<<ith<<", "<<ID2IRow(ic)<<", "<<ih<<", "<<HitInputID( row, ih )<<std::endl;
755 if ( useOutput->NOutTrackHits() >= 10*NHitsTotal() ) {
756 std::cout << "fNOutTrackHits>NHitsTotal()" << std::endl;
757 //exit(0);
758 return;//SG!!!
759 }
760 out.SetNHits( out.NHits() + 1 );
761 }
762 if ( out.NHits() >= 2 ) {
763 useOutput->SetNOutTracks(useOutput->NOutTracks() + 1);
764 } else {
765 useOutput->SetNOutTrackHits(nOutTrackHitsOld);
766 }
767 }
d54804bf 768 }
63d8b79d 769
00d07bcd 770 timer.Stop();
fbb9b71b 771 fTimers[5] += timer.CpuTime();
326c2d4b 772}
773
7be9b0d7 774#endif
775
4acc2401 776GPUh() void AliHLTTPCCATracker::FitTrackFull( const AliHLTTPCCATrack &/**/, float * /**/ ) const
fbb9b71b 777{
00d07bcd 778 // fit track with material
fbb9b71b 779#ifdef XXX
780 //* Fit the track
00d07bcd 781 FitTrack( iTrack, tt0 );
fbb9b71b 782 if ( iTrack.NHits() <= 3 ) return;
783
00d07bcd 784 AliHLTTPCCATrackParam &t = iTrack.Param();
785 AliHLTTPCCATrackParam t0 = t;
786
787 t.Chi2() = 0;
fbb9b71b 788 t.NDF() = -5;
789 bool first = 1;
790
791 int iID = iTrack.FirstHitID();
792 for ( int ih = 0; ih < iTrack.NHits(); ih++, iID++ ) {
4acc2401 793 const AliHLTTPCCAHitId &ic = fTrackHits[iID];
794 int iRow = ic.rowIndex();
795 const AliHLTTPCCARow &row = fData.Row( iRow );
fbb9b71b 796 if ( !t0.TransportToX( row.X() ) ) continue;
797 float dy, dz;
4acc2401 798 const AliHLTTPCCAHit &h = ic.hitIndex();
fbb9b71b 799
800 // check for wrong hits
801 if ( 0 ) {
00d07bcd 802 dy = t0.GetY() - h.Y();
803 dz = t0.GetZ() - h.Z();
fbb9b71b 804
00d07bcd 805 //if( dy*dy > 3.5*3.5*(/*t0.GetErr2Y() + */h.ErrY()*h.ErrY() ) ) continue;//SG!!!
fbb9b71b 806 //if( dz*dz > 3.5*3.5*(/*t0.GetErr2Z() + */h.ErrZ()*h.ErrZ() ) ) continue;
00d07bcd 807 }
326c2d4b 808
fbb9b71b 809 if ( !t.TransportToX( row.X() ) ) continue;
dc4788ec 810
00d07bcd 811 //* Update the track
fbb9b71b 812
813 if ( first ) {
814 t.Cov()[ 0] = .5 * .5;
00d07bcd 815 t.Cov()[ 1] = 0;
fbb9b71b 816 t.Cov()[ 2] = .5 * .5;
00d07bcd 817 t.Cov()[ 3] = 0;
818 t.Cov()[ 4] = 0;
fbb9b71b 819 t.Cov()[ 5] = .2 * .2;
00d07bcd 820 t.Cov()[ 6] = 0;
821 t.Cov()[ 7] = 0;
822 t.Cov()[ 8] = 0;
fbb9b71b 823 t.Cov()[ 9] = .2 * .2;
00d07bcd 824 t.Cov()[10] = 0;
825 t.Cov()[11] = 0;
826 t.Cov()[12] = 0;
827 t.Cov()[13] = 0;
fbb9b71b 828 t.Cov()[14] = .2 * .2;
00d07bcd 829 t.Chi2() = 0;
830 t.NDF() = -5;
831 }
fbb9b71b 832 float err2Y, err2Z;
00d07bcd 833 GetErrors2( iRow, t, err2Y, err2Z );
834
fbb9b71b 835 if ( !t.Filter2( h.Y(), h.Z(), err2Y, err2Z ) ) continue;
00d07bcd 836
fbb9b71b 837 first = 0;
838 }
00d07bcd 839 /*
fbb9b71b 840 float cosPhi = iTrack.Param().GetCosPhi();
00d07bcd 841 p0.Param().TransportToX(ID2Row( iTrack.PointID()[0] ).X());
fbb9b71b 842 p2.Param().TransportToX(ID2Row( iTrack.PointID()[1] ).X());
00d07bcd 843 if( p0.Param().GetCosPhi()*cosPhi<0 ){ // change direction
fbb9b71b 844 float *par = p0.Param().Par();
845 float *cov = p0.Param().Cov();
00d07bcd 846 par[2] = -par[2]; // sin phi
847 par[3] = -par[3]; // DzDs
848 par[4] = -par[4]; // kappa
849 cov[3] = -cov[3];
850 cov[4] = -cov[4];
851 cov[6] = -cov[6];
852 cov[7] = -cov[7];
853 cov[10] = -cov[10];
854 cov[11] = -cov[11];
855 p0.Param().CosPhi() = -p0.Param().GetCosPhi();
856 }
857 */
858#endif
859}
dc4788ec 860
4acc2401 861GPUh() void AliHLTTPCCATracker::FitTrack( const AliHLTTPCCATrack &/*track*/, float * /*t0[]*/ ) const
fbb9b71b 862{
863 //* Fit the track
00d07bcd 864#ifdef XXX
fbb9b71b 865 AliHLTTPCCAEndPoint &p2 = ID2Point( track.PointID()[1] );
4acc2401 866 const AliHLTTPCCAHit &c0 = ID2Hit( fTrackHits[p0.TrackHitID()].HitID() );
867 const AliHLTTPCCAHit &c1 = ID2Hit( fTrackHits[track.HitID()[1]].HitID() );
868 const AliHLTTPCCAHit &c2 = ID2Hit( fTrackHits[p2.TrackHitID()].HitID() );
869 const AliHLTTPCCARow &row0 = ID2Row( fTrackHits[p0.TrackHitID()].HitID() );
870 const AliHLTTPCCARow &row1 = ID2Row( fTrackHits[track.HitID()[1]].HitID() );
871 const AliHLTTPCCARow &row2 = ID2Row( fTrackHits[p2.TrackHitID()].HitID() );
fbb9b71b 872 float sp0[5] = {row0.X(), c0.Y(), c0.Z(), c0.ErrY(), c0.ErrZ() };
873 float sp1[5] = {row1.X(), c1.Y(), c1.Z(), c1.ErrY(), c1.ErrZ() };
874 float sp2[5] = {row2.X(), c2.Y(), c2.Z(), c2.ErrY(), c2.ErrZ() };
4acc2401 875 //std::cout<<"Fit track, points ="<<sp0[0]<<" "<<sp0[1]<<" / "<<sp1[0]<<" "<<sp1[1]<<" / "<<sp2[0]<<" "<<sp2[1]<<std::endl;
fbb9b71b 876 if ( track.NHits() >= 3 ) {
877 p0.Param().ConstructXYZ3( sp0, sp1, sp2, p0.Param().CosPhi(), t0 );
878 p2.Param().ConstructXYZ3( sp2, sp1, sp0, p2.Param().CosPhi(), t0 );
d54804bf 879 //p2.Param() = p0.Param();
880 //p2.Param().TransportToX(row2.X());
881 //p2.Param().Par()[1] = -p2.Param().Par()[1];
882 //p2.Param().Par()[4] = -p2.Param().Par()[4];
883 } else {
884 p0.Param().X() = row0.X();
885 p0.Param().Y() = c0.Y();
886 p0.Param().Z() = c0.Z();
fbb9b71b 887 p0.Param().Err2Y() = c0.ErrY() * c0.ErrY();
888 p0.Param().Err2Z() = c0.ErrZ() * c0.ErrZ();
d54804bf 889 p2.Param().X() = row2.X();
890 p2.Param().Y() = c2.Y();
891 p2.Param().Z() = c2.Z();
fbb9b71b 892 p2.Param().Err2Y() = c2.ErrY() * c2.ErrY();
893 p2.Param().Err2Z() = c2.ErrZ() * c2.ErrZ();
326c2d4b 894 }
00d07bcd 895#endif
896}
897
898
fbb9b71b 899GPUd() void AliHLTTPCCATracker::GetErrors2( int iRow, float z, float sinPhi, float cosPhi, float DzDs, float &Err2Y, float &Err2Z ) const
693d2443 900{
901 //
902 // Use calibrated cluster error from OCDB
903 //
904
63d8b79d 905 fParam.GetClusterErrors2( iRow, z, sinPhi, cosPhi, DzDs, Err2Y, Err2Z );
f0fb467d 906 Err2Y*=fParam.ClusterError2CorrectionY();
907 Err2Z*=fParam.ClusterError2CorrectionZ();
693d2443 908}
909
fbb9b71b 910GPUd() void AliHLTTPCCATracker::GetErrors2( int iRow, const AliHLTTPCCATrackParam &t, float &Err2Y, float &Err2Z ) const
00d07bcd 911{
912 //
913 // Use calibrated cluster error from OCDB
914 //
915
15d2e9cf 916 fParam.GetClusterErrors2( iRow, t.GetZ(), t.SinPhi(), t.GetCosPhi(), t.DzDs(), Err2Y, Err2Z );
00d07bcd 917}
918
4687b8fc 919
fbb9b71b 920#if !defined(HLTCA_GPUCODE)
4687b8fc 921
fbb9b71b 922GPUh() void AliHLTTPCCATracker::WriteEvent( std::ostream &out )
00d07bcd 923{
4687b8fc 924 // write event to the file
fbb9b71b 925 for ( int iRow = 0; iRow < fParam.NRows(); iRow++ ) {
4acc2401 926 out << fData.Row( iRow ).HitNumberOffset() << " " << fData.Row( iRow ).NHits() << std::endl;
fbb9b71b 927 }
4acc2401 928 out << NHitsTotal() << std::endl;
fbb9b71b 929
4acc2401 930 AliHLTResizableArray<float> y( NHitsTotal() ), z( NHitsTotal() );
fbb9b71b 931
932 for ( int iRow = 0; iRow < fParam.NRows(); iRow++ ) {
4acc2401 933 const AliHLTTPCCARow &row = Row( iRow );
fbb9b71b 934 float y0 = row.Grid().YMin();
935 float z0 = row.Grid().ZMin();
936 float stepY = row.HstepY();
937 float stepZ = row.HstepZ();
4acc2401 938 for ( int ih = 0; ih < fData.Row( iRow ).NHits(); ih++ ) {
939 int id = HitInputID( row, ih );
940 y[id] = y0 + HitDataY( row, ih ) * stepY;
941 z[id] = z0 + HitDataZ( row, ih ) * stepZ;
4687b8fc 942 }
943 }
4acc2401 944 for ( int ih = 0; ih < NHitsTotal(); ih++ ) {
fbb9b71b 945 out << y[ih] << " " << z[ih] << std::endl;
4687b8fc 946 }
fbb9b71b 947}
4687b8fc 948
fbb9b71b 949GPUh() void AliHLTTPCCATracker::WriteTracks( std::ostream &out )
4687b8fc 950{
fbb9b71b 951 //* Write tracks to file
98512261 952 AliHLTTPCCASliceOutput* useOutput = *fOutput;
fbb9b71b 953
954 out << fTimers[0] << std::endl;
98512261 955 out << useOutput->NOutTrackHits() << std::endl;
956 for ( int ih = 0; ih < useOutput->NOutTrackHits(); ih++ ) {
957 out << useOutput->OutTrackHit(ih) << " ";
4687b8fc 958 }
fbb9b71b 959 out << std::endl;
960
98512261 961 out << useOutput->NOutTracks() << std::endl;
fbb9b71b 962
98512261 963 for ( int itr = 0; itr < useOutput->NOutTracks(); itr++ ) {
964 const AliHLTTPCCAOutTrack &t = useOutput->OutTrack(itr);
fbb9b71b 965 AliHLTTPCCATrackParam p1 = t.StartPoint();
966 AliHLTTPCCATrackParam p2 = t.EndPoint();
967 out << t.NHits() << " ";
968 out << t.FirstHitRef() << " ";
969 out << t.OrigTrackID() << " ";
970 out << std::endl;
971 out << p1.X() << " ";
972 out << p1.SignCosPhi() << " ";
973 out << p1.Chi2() << " ";
974 out << p1.NDF() << std::endl;
975 for ( int i = 0; i < 5; i++ ) out << p1.Par()[i] << " ";
976 out << std::endl;
977 for ( int i = 0; i < 15; i++ ) out << p1.Cov()[i] << " ";
978 out << std::endl;
979 out << p2.X() << " ";
980 out << p2.SignCosPhi() << " ";
981 out << p2.Chi2() << " ";
982 out << p2.NDF() << std::endl;
983 for ( int i = 0; i < 5; i++ ) out << p2.Par()[i] << " ";
984 out << std::endl;
985 for ( int i = 0; i < 15; i++ ) out << p2.Cov()[i] << " ";
986 out << std::endl;
4687b8fc 987 }
988}
989
990GPUh() void AliHLTTPCCATracker::ReadTracks( std::istream &in )
991{
fbb9b71b 992 //* Read tracks from file
d4594e7d 993 AliHLTTPCCASliceOutput::Allocate(*fOutput, 4096, 16384, fOutputControl);//Just some max values
98512261 994 AliHLTTPCCASliceOutput* useOutput = *fOutput;
995
996 int tmpval;
fbb9b71b 997 in >> fTimers[0];
b22af1bf 998 in >> tmpval;
98512261 999 useOutput->SetNOutTrackHits(tmpval);
4687b8fc 1000
98512261 1001 for ( int ih = 0; ih < useOutput->NOutTrackHits(); ih++ ) {
b22af1bf 1002 in >> tmpval;
98512261 1003 useOutput->SetOutTrackHit(ih, tmpval);
4687b8fc 1004 }
b22af1bf 1005 in >> tmpval;
98512261 1006 useOutput->SetNOutTracks(tmpval);
4687b8fc 1007
98512261 1008 for ( int itr = 0; itr < useOutput->NOutTracks(); itr++ ) {
1009 AliHLTTPCCAOutTrack &t = useOutput->OutTracks()[itr];
693d2443 1010 AliHLTTPCCATrackParam p1, p2;
fbb9b71b 1011 int i;
1012 float f;
1013 in >> i; t.SetNHits( i );
1014 in >> i; t.SetFirstHitRef( i );
1015 in >> i; t.SetOrigTrackID( i );
1016 in >> f; p1.SetX( f );
1017 in >> f; p1.SetSignCosPhi( f );
1018 in >> f; p1.SetChi2( f );
1019 in >> i; p1.SetNDF( i );
1020 for ( int j = 0; j < 5; j++ ) { in >> f; p1.SetPar( j, f ); }
1021 for ( int j = 0; j < 15; j++ ) { in >> f; p1.SetCov( j, f ); }
1022 in >> f; p2.SetX( f );
1023 in >> f; p2.SetSignCosPhi( f );
1024 in >> f; p2.SetChi2( f );
1025 in >> i; p2.SetNDF( i );
1026 for ( int j = 0; j < 5; j++ ) { in >> f; p2.SetPar( j, f ); }
1027 for ( int j = 0; j < 15; j++ ) { in >> f; p2.SetCov( j, f ); }
693d2443 1028 t.SetStartPoint( p1 );
1029 t.SetEndPoint( p2 );
4687b8fc 1030 }
326c2d4b 1031}
4687b8fc 1032#endif