3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3Logging.h"
9 #include "AliL3TrackArray.h"
10 #include "AliL3HoughTrack.h"
11 #include "AliL3ModelTrack.h"
12 #include "AliL3ConfMapTrack.h"
13 #include "AliL3TrackSegmentData.h"
14 #include "AliL3Transform.h"
15 #include "AliL3ConfMapPoint.h"
17 /** \class AliL3TrackArray
19 //_____________________________________________________________
27 ClassImp(AliL3TrackArray)
29 AliL3TrackArray::AliL3TrackArray(){
39 AliL3TrackArray::AliL3TrackArray(Int_t ntrack){
48 AliL3TrackArray::AliL3TrackArray(char* tracktype,Int_t ntrack){
53 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
54 if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
55 if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
56 if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
60 AliL3TrackArray::AliL3TrackArray(char* tracktype){
65 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
66 if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
67 if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
68 if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
72 AliL3TrackArray::~AliL3TrackArray(){
78 AliL3Track *AliL3TrackArray::NextTrack(){
79 if(fNTracks<fSize) return fTrack[fNTracks++];
81 return fTrack[fNTracks++];
84 void AliL3TrackArray::DeleteArray(){
85 for(Int_t i=0; i<fSize;i++)
91 Bool_t AliL3TrackArray::SetSize(Int_t newsize){
92 if(newsize<=fSize) return kFALSE; //shrink comes later!!
95 fTrack = new AliL3Track*[fSize];
96 fIsPresent = new Bool_t[fSize];
99 for(Int_t i=0;i<fSize;i++){
100 fTrack[i] = new AliL3Track();
101 fIsPresent[i] = kTRUE;
105 for(Int_t i=0;i<fSize;i++){
106 fTrack[i] = new AliL3ConfMapTrack();
107 fIsPresent[i] = kTRUE;
111 for(Int_t i=0;i<fSize;i++){
112 fTrack[i] = new AliL3HoughTrack();
113 fIsPresent[i] = kTRUE;
117 for(Int_t i=0;i<fSize;i++){
118 fTrack[i] = new AliL3ModelTrack();
119 fIsPresent[i] = kTRUE;
127 AliL3Track **tmp = new AliL3Track*[fSize];
128 Bool_t *pre = new Bool_t[fSize];
129 for(Int_t i=0; i<fSize;i++){
131 pre[i] = fIsPresent[i];
135 fTrack = new AliL3Track*[newsize];
136 fIsPresent = new Bool_t[newsize];
137 for(Int_t i=0; i<fSize;i++){
139 fIsPresent[i] = pre[i];
145 for(Int_t i=fSize;i<newsize;i++){
146 fTrack[i] = new AliL3Track();
147 fIsPresent[i] = kTRUE;
151 for(Int_t i=fSize;i<newsize;i++){
152 fTrack[i] = new AliL3ConfMapTrack();
153 fIsPresent[i] = kTRUE;
157 for(Int_t i=fSize;i<newsize;i++){
158 fTrack[i] = new AliL3HoughTrack();
159 fIsPresent[i] = kTRUE;
163 for(Int_t i=fSize;i<newsize;i++){
164 fTrack[i] = new AliL3ModelTrack();
165 fIsPresent[i] = kTRUE;
175 void AliL3TrackArray::Reset(){
178 for(Int_t i=0; i<fSize;i++)
179 fIsPresent[i] = kTRUE;
182 void AliL3TrackArray::Remove(Int_t track){
183 if(fIsPresent[track]){
184 fIsPresent[track]=kFALSE;
189 void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr){
190 //Read tracks from shared memory (or memory)
191 AliL3TrackSegmentData *trs = tr;
192 for(Int_t i=0; i<ntracks; i++){
193 AliL3Track *track = NextTrack();
194 track->SetPt(trs->fPt);
195 track->SetPsi(trs->fPsi);
196 track->SetTgl(trs->fTgl);
197 track->SetNHits(trs->fNPoints);
198 track->SetCharge(trs->fCharge);
199 track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
200 track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
201 track->SetHits( trs->fNPoints, trs->fPointIDs );
203 if(GetTrackType()=='h') {
204 ((AliL3HoughTrack *)track)->SetWeight(trs->fWeight);
205 track->SetMCid(trs->fTrackID);
208 UChar_t *tmpP = (UChar_t*)trs;
209 tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
210 trs = (AliL3TrackSegmentData*)tmpP;
214 void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr,Int_t slice){
215 //Read tracks from shared memory (or memory)
216 AliL3TrackSegmentData *trs = tr;
217 for(Int_t i=0; i<ntracks; i++){
218 AliL3Track *track = NextTrack();
219 track->SetPt(trs->fPt);
222 AliL3Transform::Local2GlobalAngle(psi,slice);
223 track->SetPsi(psi[0]);
224 track->SetTgl(trs->fTgl);
225 track->SetNHits(trs->fNPoints);
226 track->SetCharge(trs->fCharge);
228 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
229 AliL3Transform::Local2Global(first,slice);
230 track->SetFirstPoint(first[0],first[1],first[2]);
232 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
233 AliL3Transform::Local2Global(last,slice);
234 track->SetLastPoint(last[0],last[1],last[2]);
235 track->SetHits( trs->fNPoints, trs->fPointIDs );
236 UChar_t *tmpP = (UChar_t*)trs;
237 tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
238 trs = (AliL3TrackSegmentData*)tmpP;
240 if(GetTrackType()=='h') {
241 ((AliL3HoughTrack *)track)->SetWeight(trs->fWeight);
242 track->SetMCid(trs->fTrackID);
248 UInt_t AliL3TrackArray::GetOutSize(){
249 UInt_t count = GetOutCount(); //use only present tracks
251 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
252 AliL3Track *track = GetCheckedTrack(i); //use only present tracks
253 if(track) //use only present tracks
254 tHits += track->GetNHits();
257 //calculate size of track
258 return count*sizeof(AliL3TrackSegmentData)+sizeof(UInt_t)*tHits;
261 UInt_t AliL3TrackArray::WriteTracks(UInt_t & ntracks,AliL3TrackSegmentData* tr){
262 ntracks = GetOutCount();
263 return WriteTracks(tr);
266 UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr){
267 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
268 AliL3TrackSegmentData *tP = tr;
271 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
272 AliL3Track *track = GetCheckedTrack(i); //use only present tracks
273 if(!track) continue; //use only present tracks
274 tP->fX = track->GetFirstPointX();
275 tP->fY = track->GetFirstPointY();
276 tP->fZ = track->GetFirstPointZ();
277 tP->fPt = track->GetPt();
278 tP->fLastX = track->GetLastPointX();
279 tP->fLastY = track->GetLastPointY();
280 tP->fLastZ = track->GetLastPointZ();
281 tP->fPsi = track->GetPsi();
282 tP->fTgl = track->GetTgl();
283 tP->fCharge = track->GetCharge();
284 tP->fNPoints = track->GetNHits();
286 if(GetTrackType()=='h') {
287 tP->fWeight = ((AliL3HoughTrack *)track)->GetWeight();
288 tP->fTrackID = track->GetMCid();
291 pP = (UInt_t*)track->GetHitNumbers();
292 for (UInt_t j=0;j<tP->fNPoints;j++){
293 tP->fPointIDs[j] = pP[j];
295 Byte_t *tmpP = (Byte_t *)tP;
296 tmpP += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
297 size += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
298 tP = (AliL3TrackSegmentData*)tmpP;
303 UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr){
304 // use first and last point objects
305 AliL3TrackSegmentData *tP = tr;
308 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
309 AliL3ConfMapTrack *track =(AliL3ConfMapTrack *) GetCheckedTrack(i); //use only present tracks
310 if(!track) continue; //use only present tracks
311 AliL3ConfMapPoint *hit = (AliL3ConfMapPoint*)track->lastHit;
312 AliL3ConfMapPoint *lastHit = (AliL3ConfMapPoint*)track->firstHit;
313 tP->fX = hit->GetX();
314 tP->fY = hit->GetY();
315 tP->fZ = hit->GetZ();
316 tP->fLastX = lastHit->GetX();
317 tP->fLastY = lastHit->GetY();
318 tP->fLastZ = lastHit->GetZ();
320 // tP->fX = track->GetFirstPointX();
321 // tP->fY = track->GetFirstPointY();
322 // tP->fZ = track->GetFirstPointZ();
323 tP->fPt = track->GetPt();
324 // tP->fLastX = track->GetLastPointX();
325 // tP->fLastY = track->GetLastPointY();
326 // tP->fLastZ = track->GetLastPointZ();
327 tP->fPsi = track->GetPsi();
328 tP->fTgl = track->GetTgl();
329 tP->fCharge = track->GetCharge();
330 tP->fNPoints = track->GetNHits();
331 pP = (UInt_t*)track->GetHitNumbers();
332 for (UInt_t j=0;j<tP->fNPoints;j++){
333 tP->fPointIDs[j] = pP[j];
335 Byte_t *tmpP = (Byte_t *)tP;
336 tmpP += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
337 size +=sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
338 tP = (AliL3TrackSegmentData*)tmpP;
343 void AliL3TrackArray::AddLast(AliL3Track *track)
345 AliL3Track *tpt = NextTrack();
350 void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old,Int_t slice)
352 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
354 LOG(AliL3Log::kError,"AliL3TrackArray::AddTracks","Track types")
355 <<"Bad idea to add tracks of different types"<<ENDLOG;
358 if(fSize < fNTracks+newtrack->GetNPresent())
359 SetSize(fSize+newtrack->GetSize());
360 for(Int_t i =0;i<newtrack->GetNTracks();i++){
361 AliL3Track *tpt = newtrack->GetCheckedTrack(i);
365 AliL3Track *track = NextTrack();
368 track->Rotate(slice); //Rotate track to global coordinates
371 if(GetTrackType()=='h')
372 track = (AliL3HoughTrack*)NextTrack();
381 void AliL3TrackArray::Compress(){
382 if(GetNPresent()==GetNTracks()) return;
383 AliL3Track **tmp = new AliL3Track *[fNTracks];
385 Int_t absent=GetNPresent();
386 for(Int_t i=0;i<GetNTracks();i++){
387 if(fIsPresent[i]) tmp[present++] = fTrack[i];
388 else tmp[absent++] = fTrack[i];
390 for(Int_t i=0;i<GetNTracks();i++)
394 for(Int_t i=0; i<GetNTracks();i++){
400 fNTracks = GetNPresent();
404 void AliL3TrackArray::QSort(){
407 QSort(fTrack,0,fNTracks);
410 void AliL3TrackArray::QSort( AliL3Track **a, Int_t first, Int_t last){
412 // Sort array of AliL3Track pointers using a quicksort algorithm.
413 // Uses TrackCompare() to compare objects.
416 static AliL3Track *tmp;
417 static int i; // "static" to save stack space
420 while (last - first > 1) {
424 while (++i < last && TrackCompare(a[i], a[first]) < 0)
426 while (--j > first && TrackCompare(a[j], a[first]) > 0)
442 if (j - first < last - (j + 1)) {
444 first = j + 1; // QSort(j + 1, last);
446 QSort(a, j + 1, last);
447 last = j; // QSort(first, j);
452 Int_t AliL3TrackArray::TrackCompare(AliL3Track *a, AliL3Track *b){
453 // Compare the two tracks.
455 return b->Compare(a);
460 AliL3HoughTrack *tra = (AliL3HoughTrack*)a;
461 AliL3HoughTrack *trb = (AliL3HoughTrack*)b;
462 if(tra->GetWeight() < trb->GetWeight()) return 1;
463 if(tra->GetWeight() > trb->GetWeight()) return -1;
467 if(a->GetNHits() < b->GetNHits()) return 1;
468 if(a->GetNHits() > b->GetNHits()) return -1;