]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/AliHLTTPCTrackArray.cxx
added Celular Automaton tracker
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCTrackArray.cxx
CommitLineData
a6c02c85 1// @(#) $Id$
4aa41877 2// Original: AliHLTTrackArray.cxx,v 1.21 2005/06/14 10:55:21 cvetan
a6c02c85 3
4fdaad1e 4/**************************************************************************
5 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 * *
7 * Authors: Uli Frankenfeld *
8 * Matthias Richter <Matthias.Richter@ift.uib.no> *
9 * for The ALICE Off-line Project. *
10 * *
11 * Permission to use, copy, modify and distribute this software and its *
12 * documentation strictly for non-commercial purposes is hereby granted *
13 * without fee, provided that the above copyright notice appears in all *
14 * copies and that both the copyright notice and this permission notice *
15 * appear in the supporting documentation. The authors make no claims *
16 * about the suitability of this software for any purpose. It is *
17 * provided "as is" without express or implied warranty. *
18 **************************************************************************/
19
20/** @file AliHLTTPCTrackArray.cxx
21 @author Uli Frankenfeld, maintained by Matthias Richter
22 @date
23 @brief Array of AliHLTTPCTracks */
a6c02c85 24
a6c02c85 25#include "AliHLTTPCLogging.h"
26#include "AliHLTTPCTrackArray.h"
27#ifdef INCLUDE_TPC_HOUGH
28#include "AliHLTTPCHoughTrack.h"
29#endif
30#include "AliHLTTPCModelTrack.h"
31#include "AliHLTTPCConfMapTrack.h"
32#include "AliHLTTPCTrackSegmentData.h"
33#include "AliHLTTPCTransform.h"
34#include "AliHLTTPCConfMapPoint.h"
35
a6c02c85 36#if __GNUC__ >= 3
37using namespace std;
38#endif
39
40ClassImp(AliHLTTPCTrackArray)
41
42AliHLTTPCTrackArray::AliHLTTPCTrackArray()
4fdaad1e 43 :
44 fSize(0),
45 fNTracks(0),
46 fNAbsent(0),
47 fTrackType('t')
a6c02c85 48{
49 //Default constructor
4fdaad1e 50 SetSize();
51}
52
53
54AliHLTTPCTrackArray::AliHLTTPCTrackArray(const AliHLTTPCTrackArray&)
55 :
56 fSize(0),
57 fNTracks(0),
58 fNAbsent(0),
59 fTrackType('t')
60{
61 //constructor
62 SetSize();
63}
64
65AliHLTTPCTrackArray& AliHLTTPCTrackArray::operator=(const AliHLTTPCTrackArray&)
66{
67 //assignment
68 fSize=0;
a6c02c85 69 fNTracks=0;
70 fNAbsent=0;
71 fTrackType='t';
72 SetSize();
4fdaad1e 73 return *this;
a6c02c85 74}
75
a6c02c85 76AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
4fdaad1e 77 :
78 fSize(0),
79 fNTracks(0),
80 fNAbsent(0),
81 fTrackType('t')
a6c02c85 82{
83 //Constructor.
a6c02c85 84 SetSize(ntrack);
85}
86
87AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
4fdaad1e 88 :
89 fSize(0),
90 fNTracks(0),
91 fNAbsent(0)
a6c02c85 92{
93 //Constructor.
a6c02c85 94 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
95 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
96#ifdef INCLUDE_TPC_HOUGH
97 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
98#endif
99 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
100 SetSize(ntrack);
101}
102
103AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
4fdaad1e 104 :
105 fSize(0),
106 fNTracks(0),
107 fNAbsent(0)
a6c02c85 108{
109 //Constructor.
a6c02c85 110 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
111 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
112#ifdef INCLUDE_TPC_HOUGH
113 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
114#endif
115 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
116 SetSize();
117}
118
119AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
120{
121 //Destructor
122 DeleteArray();
123}
124
125
126AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
127{
128 //next track in array
129 if(fNTracks<fSize) return fTrack[fNTracks++];
130 SetSize(fSize+100);
131 return fTrack[fNTracks++];
132}
133
134void AliHLTTPCTrackArray::DeleteArray()
135{
136 //delete array
137 for(Int_t i=0; i<fSize;i++)
138 delete fTrack[i];
139 delete[] fIsPresent;
140 delete[] fTrack;
141}
142
143Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
144{
145 //set size
146 if(newsize<=fSize) return kFALSE; //shrink comes later!!
147 if(!fSize){
148 fSize = newsize;
149 fTrack = new AliHLTTPCTrack*[fSize];
150 fIsPresent = new Bool_t[fSize];
151 switch(fTrackType){
152 case 't':
153 for(Int_t i=0;i<fSize;i++){
154 fTrack[i] = new AliHLTTPCTrack();
155 fIsPresent[i] = kTRUE;
156 }
157 break;
158 case 'c':
159 for(Int_t i=0;i<fSize;i++){
160 fTrack[i] = new AliHLTTPCConfMapTrack();
161 fIsPresent[i] = kTRUE;
162 }
163 break;
164#ifdef INCLUDE_TPC_HOUGH
165 case 'h':
166 for(Int_t i=0;i<fSize;i++){
167 fTrack[i] = new AliHLTTPCHoughTrack();
168 fIsPresent[i] = kTRUE;
169 }
170 break;
171#endif
172 case 'm':
173 for(Int_t i=0;i<fSize;i++){
174 fTrack[i] = new AliHLTTPCModelTrack();
175 fIsPresent[i] = kTRUE;
176 }
177 break;
178 default:
179 return kFALSE;
180 }
181 return kTRUE;
182 }
183 AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
184 Bool_t *pre = new Bool_t[fSize];
185 for(Int_t i=0; i<fSize;i++){
186 tmp[i] = fTrack[i];
187 pre[i] = fIsPresent[i];
188 }
189 delete[] fTrack;
190 delete[] fIsPresent;
191 fTrack = new AliHLTTPCTrack*[newsize];
192 fIsPresent = new Bool_t[newsize];
193 for(Int_t i=0; i<fSize;i++){
194 fTrack[i] = tmp[i];
195 fIsPresent[i] = pre[i];
196 }
197 delete[] tmp;
198 delete[] pre;
199 switch(fTrackType){
200 case 't':
201 for(Int_t i=fSize;i<newsize;i++){
202 fTrack[i] = new AliHLTTPCTrack();
203 fIsPresent[i] = kTRUE;
204 }
205 break;
206 case 'c':
207 for(Int_t i=fSize;i<newsize;i++){
208 fTrack[i] = new AliHLTTPCConfMapTrack();
209 fIsPresent[i] = kTRUE;
210 }
211 break;
212#ifdef INCLUDE_TPC_HOUGH
213 case 'h':
214 for(Int_t i=fSize;i<newsize;i++){
215 fTrack[i] = new AliHLTTPCHoughTrack();
216 fIsPresent[i] = kTRUE;
217 }
218 break;
219#endif
220 case 'm':
221 for(Int_t i=fSize;i<newsize;i++){
222 fTrack[i] = new AliHLTTPCModelTrack();
223 fIsPresent[i] = kTRUE;
224 }
225 break;
226 default:
227 return kFALSE;
228 }
229 fSize = newsize;
230 return kTRUE;
231}
232
233void AliHLTTPCTrackArray::Reset()
234{
235 //reset
236 fNTracks=0;
237 fNAbsent=0;
238 for(Int_t i=0; i<fSize;i++)
239 fIsPresent[i] = kTRUE;
240}
241
242void AliHLTTPCTrackArray::Remove(Int_t track)
243{
244 //remove track
245 if(fIsPresent[track]){
246 fIsPresent[track]=kFALSE;
247 fNAbsent++;
248 }
249}
250
4fdaad1e 251void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice, Int_t bTransform)
a6c02c85 252{
253 //Read tracks from shared memory (or memory)
254 AliHLTTPCTrackSegmentData *trs = tr;
255 for(Int_t i=0; i<ntracks; i++){
256 AliHLTTPCTrack *track = NextTrack();
257 track->SetPt(trs->fPt);
258 track->SetPterr(trs->fPterr);
259 Float_t psi[1];
260 psi[0]=trs->fPsi;
4fdaad1e 261 if (slice>=0 && bTransform!=0) {
262 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
263 }
264 //cout << "psi " << psi[0] << endl;
a6c02c85 265 track->SetPsi(psi[0]);
266 track->SetTgl(trs->fTgl);
267 track->SetPsierr(trs->fPsierr);
268 track->SetTglerr(trs->fTglerr);
269 track->SetNHits(trs->fNPoints);
270 track->SetCharge(trs->fCharge);
271 Float_t first[3];
272 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
4fdaad1e 273 if (slice>=0 && bTransform!=0) {
274 AliHLTTPCTransform::Local2Global(first,slice);
275 }
276 //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
a6c02c85 277 track->SetFirstPoint(first[0],first[1],first[2]);
278 Float_t last[3];
279 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
4fdaad1e 280 if (slice>=0 && bTransform!=0) {
281 AliHLTTPCTransform::Local2Global(last,slice);
282 }
283 //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
a6c02c85 284 track->SetLastPoint(last[0],last[1],last[2]);
285 track->SetHits( trs->fNPoints, trs->fPointIDs );
4fdaad1e 286
287 if (slice>=0 && bTransform!=0) {
288 // as everything is now in global coordinates we set the sector to 0
289 track->SetSector(0);
290 } else {
291 // the parameters are in local coordinates, set the sector no
292#ifndef INCLUDE_TPC_HOUGH
293 if (slice<0) track->SetSector(0);
294 else track->SetSector(slice);
295#else
296 // Matthias Feb 2007: this is some kind of legacy ...
297 // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
298 // and this line was below in the corresponding block. As the slice
299 // parameter is very useful but not available if the define is off
300 // we distinguish the two cases here. Should be cleaned up.
301 track->SetSector(trs->fSector);
302#endif // INCLUDE_TPC_HOUGH
303 }
21b6a334 304
305 // this is currently a quick hack for straight lines of the first version
306 // of the CA tracker.
307 // we have to think about a more general way of treating straight and curved
308 // tracks
309 if ( trs->fPt == -9876.0 || trs->fPt == -1.0) {
310 track->SetPhi0(atan2(first[1],first[0]));
311 track->SetKappa(1.0);
312 track->SetRadius(999999.0);
313 } else {
314 // this we have to check
315 //track->CalculateHelix();
316 }
317
a6c02c85 318#ifdef INCLUDE_TPC_HOUGH
319#ifdef ROWHOUGHPARAMS
320 if(GetTrackType()=='h') {
321 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
322 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
323 }
324 track->SetMCid(trs->fTrackID);
325 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
a6c02c85 326 track->SetPID(trs->fPID);
327#endif
328#endif // INCLUDE_TPC_HOUGH
329 UChar_t *tmpP = (UChar_t*)trs;
330 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
331 trs = (AliHLTTPCTrackSegmentData*)tmpP;
332 }
333}
334
335UInt_t AliHLTTPCTrackArray::GetOutSize()
336{
337 //get size for IO
338 UInt_t count = GetOutCount(); //use only present tracks
339 UInt_t tHits = 0;
340 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
341 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
342 if(track) //use only present tracks
343 tHits += track->GetNHits();
344 }
345
346 //calculate size of track
347 return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
348}
349
350UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
351{
352 //write tracks
353 ntracks = GetOutCount();
354 return WriteTracks(tr);
355}
356
357UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
358{
359 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
360 AliHLTTPCTrackSegmentData *tP = tr;
361 UInt_t *pP;
362 UInt_t size = 0;
363 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
364 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
365 if(!track) continue; //use only present tracks
366 tP->fX = track->GetFirstPointX();
367 tP->fY = track->GetFirstPointY();
368 tP->fZ = track->GetFirstPointZ();
369 tP->fPt = track->GetPt();
370 tP->fPterr = track->GetPterr();
371 tP->fLastX = track->GetLastPointX();
372 tP->fLastY = track->GetLastPointY();
373 tP->fLastZ = track->GetLastPointZ();
374 tP->fPsi = track->GetPsi();
375 tP->fTgl = track->GetTgl();
376 tP->fPsierr = track->GetPsierr();
377 tP->fTglerr = track->GetTglerr();
378 tP->fCharge = track->GetCharge();
379 tP->fNPoints = track->GetNHits();
380#ifdef INCLUDE_TPC_HOUGH
381#ifdef ROWHOUGHPARAMS
382 if(GetTrackType()=='h') {
383 tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
384 tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
385 tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
386 tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
387 tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
388 }
389 tP->fTrackID = track->GetMCid();
390 tP->fRowRange1 = track->GetFirstRow();
391 tP->fRowRange2 = track->GetLastRow();
392 tP->fSector = track->GetSector();
393 tP->fPID = track->GetPID();
394#endif
395#endif // INCLUDE_TPC_HOUGH
396 pP = (UInt_t*)track->GetHitNumbers();
397 for (UInt_t j=0;j<tP->fNPoints;j++){
398 tP->fPointIDs[j] = pP[j];
399 }
400 Byte_t *tmpP = (Byte_t *)tP;
401 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
402 size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
403 tP = (AliHLTTPCTrackSegmentData*)tmpP;
738c049f 404
405// BEGINN ############################################## MODIFIY JMT
db16520a 406// LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
407// track->Rotate(0,kFALSE);
408// track->Print();
738c049f 409// END ################################################# MODIFIY JMT
410
a6c02c85 411 }
412 return size;
413}
414
415UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
416{
417 // use first and last point objects
418 AliHLTTPCTrackSegmentData *tP = tr;
419 UInt_t *pP;
420 UInt_t size = 0;
421 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
422 AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
423 if(!track) continue; //use only present tracks
424 AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
425 AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
426 tP->fX = hit->GetX();
427 tP->fY = hit->GetY();
428 tP->fZ = hit->GetZ();
429 tP->fLastX = lastHit->GetX();
430 tP->fLastY = lastHit->GetY();
431 tP->fLastZ = lastHit->GetZ();
432
433// tP->fX = track->GetFirstPointX();
434// tP->fY = track->GetFirstPointY();
435// tP->fZ = track->GetFirstPointZ();
436 tP->fPt = track->GetPt();
437 tP->fPterr = track->GetPterr();
438// tP->fLastX = track->GetLastPointX();
439// tP->fLastY = track->GetLastPointY();
440// tP->fLastZ = track->GetLastPointZ();
441 tP->fPsi = track->GetPsi();
442 tP->fTgl = track->GetTgl();
443 tP->fPsierr = track->GetPsierr();
444 tP->fTglerr = track->GetTglerr();
445 tP->fCharge = track->GetCharge();
446#ifdef INCLUDE_TPC_HOUGH
447#ifdef ROWHOUGHPARAMS
448 tP->fTrackID = track->GetMCid();
449 tP->fRowRange1 = track->GetFirstRow();
450 tP->fRowRange2 = track->GetLastRow();
451 tP->fSector = track->GetSector();
452 tP->fPID = track->GetPID();
453#endif
454#endif // INCLUDE_TPC_HOUGH
455 tP->fNPoints = track->GetNHits();
456 pP = (UInt_t*)track->GetHitNumbers();
457 for (UInt_t j=0;j<tP->fNPoints;j++){
458 tP->fPointIDs[j] = pP[j];
459 }
460 Byte_t *tmpP = (Byte_t *)tP;
461 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
462 size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
463 tP = (AliHLTTPCTrackSegmentData*)tmpP;
464 }
465 return size;
466}
467
468void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
469{
470 //add track to last position
471 AliHLTTPCTrack *tpt = NextTrack();
3cde846d 472 tpt->Copy(track);
a6c02c85 473
474}
475
476void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
477{
478 //add tracks
479 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
480 {
481 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
482 <<"Bad idea to add tracks of different types"<<ENDLOG;
483 return;
484 }
485 if(fSize < fNTracks+newtrack->GetNPresent())
486 SetSize(fSize+newtrack->GetSize());
487 for(Int_t i =0;i<newtrack->GetNTracks();i++){
488 AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
489 if(!tpt) continue;
490 if(remove_old)
491 newtrack->Remove(i);
492 AliHLTTPCTrack *track = NextTrack();
3cde846d 493 track->Copy(tpt);
a6c02c85 494 if(slice>=0)
495 track->Rotate(slice); //Rotate track to global coordinates
496 /*
497 AliHLTTPCTrack *track;
498#ifdef INCLUDE_TPC_HOUGH
499 if(GetTrackType()=='h')
500 track = (AliHLTTPCHoughTrack*)NextTrack();
501 else
502#endif
503 track = NextTrack();
3cde846d 504 track->Copy(tpt);
a6c02c85 505 */
506 }
507}
508
509void AliHLTTPCTrackArray::Compress()
510{
511 //compress array
512 if(GetNPresent()==GetNTracks()) return;
513 AliHLTTPCTrack **tmp = new AliHLTTPCTrack *[fNTracks];
514 Int_t present=0;
515 Int_t absent=GetNPresent();
516 for(Int_t i=0;i<GetNTracks();i++){
517 if(fIsPresent[i]) tmp[present++] = fTrack[i];
518 else tmp[absent++] = fTrack[i];
519 }
520 for(Int_t i=0;i<GetNTracks();i++)
521 fIsPresent[i]=kTRUE;
522
523 //Copy pointers back
524 for(Int_t i=0; i<GetNTracks();i++){
525 fTrack[i]=tmp[i];
526 }
527
528 delete[] tmp;
529
530 fNTracks = GetNPresent();
531 fNAbsent = 0;
532}
533
534void AliHLTTPCTrackArray::QSort()
535{
536 // compress and sort
537 Compress();
538 QSort(fTrack,0,fNTracks);
539}
540
541void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
542{
543 // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
544 // Uses TrackCompare() to compare objects.
545 // Thanks to Root!
546
547 static AliHLTTPCTrack *tmp;
548 static int i; // "static" to save stack space
549 int j;
550
551 while (last - first > 1) {
552 i = first;
553 j = last;
554 for (;;) {
555 while (++i < last && TrackCompare(a[i], a[first]) < 0)
556 ;
557 while (--j > first && TrackCompare(a[j], a[first]) > 0)
558 ;
559 if (i >= j)
560 break;
561
562 tmp = a[i];
563 a[i] = a[j];
564 a[j] = tmp;
565 }
566 if (j == first) {
567 ++first;
568 continue;
569 }
570 tmp = a[first];
571 a[first] = a[j];
572 a[j] = tmp;
573 if (j - first < last - (j + 1)) {
574 QSort(a, first, j);
575 first = j + 1; // QSort(j + 1, last);
576 } else {
577 QSort(a, j + 1, last);
578 last = j; // QSort(first, j);
579 }
580 }
581}
582
583Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
584{
585 // Compare the two tracks.
586
587 return b->Compare(a);
588
589 /*
590#ifdef INCLUDE_TPC_HOUGH
591 if(fTrackType=='h')
592 {
593 AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
594 AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
595 if(tra->GetWeight() < trb->GetWeight()) return 1;
596 if(tra->GetWeight() > trb->GetWeight()) return -1;
597 }
598 else
599#endif
600 {
601 if(a->GetNHits() < b->GetNHits()) return 1;
602 if(a->GetNHits() > b->GetNHits()) return -1;
603 }
604
605 return 0;
606 */
607}
608
3cde846d 609AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
610{
4fdaad1e 611 // access operator
3cde846d 612 if (index<fNTracks) return fTrack[index];
613 return NULL;
614}