]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliL3TrackArray.cxx
Introduction of the online monitoring code into the alimdc package. Fixed some memory...
[u/mrichter/AliRoot.git] / HLT / src / AliL3TrackArray.cxx
CommitLineData
3e87ef69 1// @(#) $Id$
95a00d93 2
71df269a 3// Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
3e87ef69 4//*-- Copyright &copy ALICE HLT Group
108615fc 5
118c26c3 6#include "AliL3StandardIncludes.h"
7
108615fc 8#include "AliL3Logging.h"
9#include "AliL3TrackArray.h"
10#include "AliL3HoughTrack.h"
95a00d93 11#include "AliL3ModelTrack.h"
108615fc 12#include "AliL3ConfMapTrack.h"
13#include "AliL3TrackSegmentData.h"
14#include "AliL3Transform.h"
15#include "AliL3ConfMapPoint.h"
71df269a 16
3e87ef69 17/** \class AliL3TrackArray
18<pre>
108615fc 19//_____________________________________________________________
71df269a 20// AliL3TrackArray
108615fc 21//
71df269a 22// Track array class
108615fc 23//
3e87ef69 24</pre>
25*/
108615fc 26
27ClassImp(AliL3TrackArray)
28
b1ed0288 29AliL3TrackArray::AliL3TrackArray()
30{
108615fc 31 //Default constructor
32 fSize = 0;
33 fNTracks=0;
34 fNAbsent=0;
35 fTrackType='t';
36 SetSize();
37}
38
39
b1ed0288 40AliL3TrackArray::AliL3TrackArray(Int_t ntrack)
41{
108615fc 42 //Constructor.
43 fSize = 0;
44 fNTracks=0;
45 fNAbsent=0;
46 fTrackType='t';
47 SetSize(ntrack);
48}
49
b1ed0288 50AliL3TrackArray::AliL3TrackArray(char* tracktype,Int_t ntrack)
51{
108615fc 52 //Constructor.
53 fSize = 0;
54 fNTracks=0;
55 fNAbsent=0;
56 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
57 if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
58 if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
95a00d93 59 if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
108615fc 60 SetSize(ntrack);
61}
62
b1ed0288 63AliL3TrackArray::AliL3TrackArray(char* tracktype)
64{
108615fc 65 //Constructor.
66 fSize = 0;
67 fNTracks=0;
68 fNAbsent=0;
69 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
70 if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
71 if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
95a00d93 72 if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
108615fc 73 SetSize();
74}
75
b1ed0288 76AliL3TrackArray::~AliL3TrackArray()
77{
108615fc 78 //Destructor
79 DeleteArray();
80}
81
82
b1ed0288 83AliL3Track *AliL3TrackArray::NextTrack()
84{
85 //next track in array
108615fc 86 if(fNTracks<fSize) return fTrack[fNTracks++];
87 SetSize(fSize+100);
88 return fTrack[fNTracks++];
89}
90
b1ed0288 91void AliL3TrackArray::DeleteArray()
92{
93 //delete array
108615fc 94 for(Int_t i=0; i<fSize;i++)
95 delete fTrack[i];
96 delete[] fIsPresent;
97 delete[] fTrack;
98}
99
b1ed0288 100Bool_t AliL3TrackArray::SetSize(Int_t newsize)
101{
102 //set size
108615fc 103 if(newsize<=fSize) return kFALSE; //shrink comes later!!
104 if(!fSize){
105 fSize = newsize;
106 fTrack = new AliL3Track*[fSize];
107 fIsPresent = new Bool_t[fSize];
108 switch(fTrackType){
109 case 't':
110 for(Int_t i=0;i<fSize;i++){
111 fTrack[i] = new AliL3Track();
112 fIsPresent[i] = kTRUE;
113 }
114 break;
115 case 'c':
116 for(Int_t i=0;i<fSize;i++){
117 fTrack[i] = new AliL3ConfMapTrack();
118 fIsPresent[i] = kTRUE;
119 }
120 break;
121 case 'h':
122 for(Int_t i=0;i<fSize;i++){
123 fTrack[i] = new AliL3HoughTrack();
124 fIsPresent[i] = kTRUE;
125 }
126 break;
95a00d93 127 case 'm':
128 for(Int_t i=0;i<fSize;i++){
129 fTrack[i] = new AliL3ModelTrack();
130 fIsPresent[i] = kTRUE;
131 }
132 break;
108615fc 133 default:
134 return kFALSE;
135 }
136 return kTRUE;
137 }
138 AliL3Track **tmp = new AliL3Track*[fSize];
139 Bool_t *pre = new Bool_t[fSize];
140 for(Int_t i=0; i<fSize;i++){
141 tmp[i] = fTrack[i];
142 pre[i] = fIsPresent[i];
143 }
144 delete[] fTrack;
145 delete[] fIsPresent;
12d59a2a 146 fTrack = new AliL3Track*[newsize];
108615fc 147 fIsPresent = new Bool_t[newsize];
148 for(Int_t i=0; i<fSize;i++){
149 fTrack[i] = tmp[i];
150 fIsPresent[i] = pre[i];
151 }
152 delete[] tmp;
153 delete[] pre;
154 switch(fTrackType){
155 case 't':
156 for(Int_t i=fSize;i<newsize;i++){
157 fTrack[i] = new AliL3Track();
158 fIsPresent[i] = kTRUE;
159 }
160 break;
161 case 'c':
162 for(Int_t i=fSize;i<newsize;i++){
163 fTrack[i] = new AliL3ConfMapTrack();
164 fIsPresent[i] = kTRUE;
165 }
166 break;
167 case 'h':
168 for(Int_t i=fSize;i<newsize;i++){
169 fTrack[i] = new AliL3HoughTrack();
170 fIsPresent[i] = kTRUE;
171 }
172 break;
95a00d93 173 case 'm':
174 for(Int_t i=fSize;i<newsize;i++){
175 fTrack[i] = new AliL3ModelTrack();
176 fIsPresent[i] = kTRUE;
177 }
178 break;
108615fc 179 default:
180 return kFALSE;
181 }
182 fSize = newsize;
183 return kTRUE;
184}
185
b1ed0288 186void AliL3TrackArray::Reset()
187{
188 //reset
108615fc 189 fNTracks=0;
190 fNAbsent=0;
191 for(Int_t i=0; i<fSize;i++)
192 fIsPresent[i] = kTRUE;
193}
194
b1ed0288 195void AliL3TrackArray::Remove(Int_t track)
196{
197 //remove track
108615fc 198 if(fIsPresent[track]){
199 fIsPresent[track]=kFALSE;
200 fNAbsent++;
201 }
202}
203
204void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr){
205 //Read tracks from shared memory (or memory)
206 AliL3TrackSegmentData *trs = tr;
95a00d93 207 for(Int_t i=0; i<ntracks; i++){
108615fc 208 AliL3Track *track = NextTrack();
209 track->SetPt(trs->fPt);
210 track->SetPsi(trs->fPsi);
211 track->SetTgl(trs->fTgl);
212 track->SetNHits(trs->fNPoints);
213 track->SetCharge(trs->fCharge);
214 track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
215 track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
216 track->SetHits( trs->fNPoints, trs->fPointIDs );
de3c3890 217#ifdef ROWHOUGHPARAMS
0bd0c1ef 218 if(GetTrackType()=='h') {
219 ((AliL3HoughTrack *)track)->SetWeight(trs->fWeight);
de3c3890 220 ((AliL3HoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
0bd0c1ef 221 }
de3c3890 222 track->SetMCid(trs->fTrackID);
223 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
224 track->SetSector(trs->fSector);
225 track->SetPID(trs->fPID);
0bd0c1ef 226#endif
108615fc 227 UChar_t *tmpP = (UChar_t*)trs;
228 tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
229 trs = (AliL3TrackSegmentData*)tmpP;
230 }
231}
232
b1ed0288 233void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr,Int_t slice)
234{
108615fc 235 //Read tracks from shared memory (or memory)
236 AliL3TrackSegmentData *trs = tr;
237 for(Int_t i=0; i<ntracks; i++){
238 AliL3Track *track = NextTrack();
239 track->SetPt(trs->fPt);
240 Float_t psi[1];
241 psi[0]=trs->fPsi;
494fad94 242 AliL3Transform::Local2GlobalAngle(psi,slice);
108615fc 243 track->SetPsi(psi[0]);
244 track->SetTgl(trs->fTgl);
245 track->SetNHits(trs->fNPoints);
246 track->SetCharge(trs->fCharge);
247 Float_t first[3];
248 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
494fad94 249 AliL3Transform::Local2Global(first,slice);
108615fc 250 track->SetFirstPoint(first[0],first[1],first[2]);
251 Float_t last[3];
252 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
494fad94 253 AliL3Transform::Local2Global(last,slice);
108615fc 254 track->SetLastPoint(last[0],last[1],last[2]);
255 track->SetHits( trs->fNPoints, trs->fPointIDs );
de3c3890 256#ifdef ROWHOUGHPARAMS
0bd0c1ef 257 if(GetTrackType()=='h') {
258 ((AliL3HoughTrack *)track)->SetWeight(trs->fWeight);
de3c3890 259 ((AliL3HoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
0bd0c1ef 260 }
de3c3890 261 track->SetMCid(trs->fTrackID);
262 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
263 track->SetSector(slice);
264 track->SetPID(trs->fPID);
0bd0c1ef 265#endif
1242f919 266 UChar_t *tmpP = (UChar_t*)trs;
267 tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
268 trs = (AliL3TrackSegmentData*)tmpP;
108615fc 269 }
270}
271
b1ed0288 272UInt_t AliL3TrackArray::GetOutSize()
273{
274 //get size for IO
108615fc 275 UInt_t count = GetOutCount(); //use only present tracks
276 UInt_t tHits = 0;
277 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
278 AliL3Track *track = GetCheckedTrack(i); //use only present tracks
279 if(track) //use only present tracks
280 tHits += track->GetNHits();
281 }
282
283 //calculate size of track
284 return count*sizeof(AliL3TrackSegmentData)+sizeof(UInt_t)*tHits;
285}
286
b1ed0288 287UInt_t AliL3TrackArray::WriteTracks(UInt_t & ntracks,AliL3TrackSegmentData* tr)
288{
289 //write tracks
108615fc 290 ntracks = GetOutCount();
291 return WriteTracks(tr);
292}
293
b1ed0288 294UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr)
295{
1f1942b8 296 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
108615fc 297 AliL3TrackSegmentData *tP = tr;
298 UInt_t *pP;
299 UInt_t size = 0;
300 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
301 AliL3Track *track = GetCheckedTrack(i); //use only present tracks
302 if(!track) continue; //use only present tracks
303 tP->fX = track->GetFirstPointX();
304 tP->fY = track->GetFirstPointY();
305 tP->fZ = track->GetFirstPointZ();
306 tP->fPt = track->GetPt();
307 tP->fLastX = track->GetLastPointX();
308 tP->fLastY = track->GetLastPointY();
309 tP->fLastZ = track->GetLastPointZ();
310 tP->fPsi = track->GetPsi();
311 tP->fTgl = track->GetTgl();
312 tP->fCharge = track->GetCharge();
313 tP->fNPoints = track->GetNHits();
de3c3890 314#ifdef ROWHOUGHPARAMS
0bd0c1ef 315 if(GetTrackType()=='h') {
316 tP->fWeight = ((AliL3HoughTrack *)track)->GetWeight();
de3c3890 317 tP->fBinX = ((AliL3HoughTrack *)track)->GetBinX();
318 tP->fBinY = ((AliL3HoughTrack *)track)->GetBinY();
319 tP->fBinXSize = ((AliL3HoughTrack *)track)->GetSizeX();
320 tP->fBinYSize = ((AliL3HoughTrack *)track)->GetSizeY();
0bd0c1ef 321 }
de3c3890 322 tP->fTrackID = track->GetMCid();
323 tP->fRowRange1 = track->GetFirstRow();
324 tP->fRowRange2 = track->GetLastRow();
325 tP->fSector = track->GetSector();
326 tP->fPID = track->GetPID();
0bd0c1ef 327#endif
108615fc 328 pP = (UInt_t*)track->GetHitNumbers();
329 for (UInt_t j=0;j<tP->fNPoints;j++){
330 tP->fPointIDs[j] = pP[j];
331 }
332 Byte_t *tmpP = (Byte_t *)tP;
333 tmpP += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
334 size += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
335 tP = (AliL3TrackSegmentData*)tmpP;
336 }
337 return size;
338}
339
b1ed0288 340UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr)
341{
108615fc 342 // use first and last point objects
343 AliL3TrackSegmentData *tP = tr;
344 UInt_t *pP;
345 UInt_t size = 0;
346 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
347 AliL3ConfMapTrack *track =(AliL3ConfMapTrack *) GetCheckedTrack(i); //use only present tracks
348 if(!track) continue; //use only present tracks
b1ed0288 349 AliL3ConfMapPoint *hit = (AliL3ConfMapPoint*)track->GetLastHit();
350 AliL3ConfMapPoint *lastHit = (AliL3ConfMapPoint*)track->GetFirstHit();
108615fc 351 tP->fX = hit->GetX();
352 tP->fY = hit->GetY();
353 tP->fZ = hit->GetZ();
354 tP->fLastX = lastHit->GetX();
355 tP->fLastY = lastHit->GetY();
356 tP->fLastZ = lastHit->GetZ();
357
358// tP->fX = track->GetFirstPointX();
359// tP->fY = track->GetFirstPointY();
360// tP->fZ = track->GetFirstPointZ();
361 tP->fPt = track->GetPt();
362// tP->fLastX = track->GetLastPointX();
363// tP->fLastY = track->GetLastPointY();
364// tP->fLastZ = track->GetLastPointZ();
365 tP->fPsi = track->GetPsi();
366 tP->fTgl = track->GetTgl();
367 tP->fCharge = track->GetCharge();
de3c3890 368#ifdef ROWHOUGHPARAMS
369 tP->fTrackID = track->GetMCid();
370 tP->fRowRange1 = track->GetFirstRow();
371 tP->fRowRange2 = track->GetLastRow();
372 tP->fSector = track->GetSector();
373 tP->fPID = track->GetPID();
374#endif
108615fc 375 tP->fNPoints = track->GetNHits();
376 pP = (UInt_t*)track->GetHitNumbers();
377 for (UInt_t j=0;j<tP->fNPoints;j++){
378 tP->fPointIDs[j] = pP[j];
379 }
380 Byte_t *tmpP = (Byte_t *)tP;
381 tmpP += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
382 size +=sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
383 tP = (AliL3TrackSegmentData*)tmpP;
384 }
385 return size;
386}
387
2e843b99 388void AliL3TrackArray::AddLast(AliL3Track *track)
389{
b1ed0288 390 //add track to last position
2e843b99 391 AliL3Track *tpt = NextTrack();
392 tpt->Set(track);
44fd1eb4 393
2e843b99 394}
395
71df269a 396void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old,Int_t slice)
397{
b1ed0288 398 //add tracks
d5fe1d26 399 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
400 {
401 LOG(AliL3Log::kError,"AliL3TrackArray::AddTracks","Track types")
402 <<"Bad idea to add tracks of different types"<<ENDLOG;
403 return;
404 }
108615fc 405 if(fSize < fNTracks+newtrack->GetNPresent())
406 SetSize(fSize+newtrack->GetSize());
407 for(Int_t i =0;i<newtrack->GetNTracks();i++){
408 AliL3Track *tpt = newtrack->GetCheckedTrack(i);
409 if(!tpt) continue;
15846008 410 if(remove_old)
411 newtrack->Remove(i);
108615fc 412 AliL3Track *track = NextTrack();
ce54fcc8 413 track->Set(tpt);
71df269a 414 if(slice>=0)
415 track->Rotate(slice); //Rotate track to global coordinates
203925a9 416 /*
417 AliL3Track *track;
418 if(GetTrackType()=='h')
419 track = (AliL3HoughTrack*)NextTrack();
420 else
421 track = NextTrack();
422 track->Set(tpt);
423 */
108615fc 424 }
425}
426
b1ed0288 427void AliL3TrackArray::Compress()
428{
429 //compress array
108615fc 430 if(GetNPresent()==GetNTracks()) return;
431 AliL3Track **tmp = new AliL3Track *[fNTracks];
432 Int_t present=0;
433 Int_t absent=GetNPresent();
434 for(Int_t i=0;i<GetNTracks();i++){
435 if(fIsPresent[i]) tmp[present++] = fTrack[i];
436 else tmp[absent++] = fTrack[i];
437 }
438 for(Int_t i=0;i<GetNTracks();i++)
439 fIsPresent[i]=kTRUE;
440
441 //Copy pointers back
442 for(Int_t i=0; i<GetNTracks();i++){
443 fTrack[i]=tmp[i];
444 }
445
446 delete[] tmp;
447
448 fNTracks = GetNPresent();
449 fNAbsent = 0;
450}
451
b1ed0288 452void AliL3TrackArray::QSort()
453{
454 // compress and sort
108615fc 455 Compress();
456 QSort(fTrack,0,fNTracks);
457}
458
b1ed0288 459void AliL3TrackArray::QSort( AliL3Track **a, Int_t first, Int_t last)
460{
108615fc 461 // Sort array of AliL3Track pointers using a quicksort algorithm.
462 // Uses TrackCompare() to compare objects.
463 // Thanks to Root!
464
465 static AliL3Track *tmp;
466 static int i; // "static" to save stack space
467 int j;
468
469 while (last - first > 1) {
470 i = first;
471 j = last;
472 for (;;) {
203925a9 473 while (++i < last && TrackCompare(a[i], a[first]) < 0)
474 ;
475 while (--j > first && TrackCompare(a[j], a[first]) > 0)
476 ;
108615fc 477 if (i >= j)
478 break;
479
480 tmp = a[i];
481 a[i] = a[j];
482 a[j] = tmp;
483 }
484 if (j == first) {
485 ++first;
486 continue;
487 }
488 tmp = a[first];
489 a[first] = a[j];
490 a[j] = tmp;
491 if (j - first < last - (j + 1)) {
492 QSort(a, first, j);
493 first = j + 1; // QSort(j + 1, last);
494 } else {
495 QSort(a, j + 1, last);
496 last = j; // QSort(first, j);
497 }
498 }
499}
500
b1ed0288 501Int_t AliL3TrackArray::TrackCompare(AliL3Track *a, AliL3Track *b) const
502{
108615fc 503 // Compare the two tracks.
203925a9 504
505 return b->Compare(a);
506
507 /*
508 if(fTrackType=='h')
509 {
510 AliL3HoughTrack *tra = (AliL3HoughTrack*)a;
511 AliL3HoughTrack *trb = (AliL3HoughTrack*)b;
512 if(tra->GetWeight() < trb->GetWeight()) return 1;
513 if(tra->GetWeight() > trb->GetWeight()) return -1;
514 }
515 else
516 {
517 if(a->GetNHits() < b->GetNHits()) return 1;
518 if(a->GetNHits() > b->GetNHits()) return -1;
519 }
520
521 return 0;
522 */
108615fc 523}
524
525