3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ULI
9 #include "AliL3Logging.h"
10 #include "AliL3TrackArray.h"
11 #include "AliL3HoughTrack.h"
12 #include "AliL3ModelTrack.h"
13 #include "AliL3ConfMapTrack.h"
14 #include "AliL3TrackSegmentData.h"
15 #include "AliL3Transform.h"
16 #include "AliL3ConfMapPoint.h"
18 //_____________________________________________________________
24 ClassImp(AliL3TrackArray)
26 AliL3TrackArray::AliL3TrackArray(){
36 AliL3TrackArray::AliL3TrackArray(Int_t ntrack){
45 AliL3TrackArray::AliL3TrackArray(char* tracktype,Int_t ntrack){
50 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
51 if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
52 if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
53 if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
57 AliL3TrackArray::AliL3TrackArray(char* tracktype){
62 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
63 if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
64 if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
65 if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
69 AliL3TrackArray::~AliL3TrackArray(){
75 AliL3Track *AliL3TrackArray::NextTrack(){
76 if(fNTracks<fSize) return fTrack[fNTracks++];
78 return fTrack[fNTracks++];
81 void AliL3TrackArray::DeleteArray(){
82 for(Int_t i=0; i<fSize;i++)
88 Bool_t AliL3TrackArray::SetSize(Int_t newsize){
89 if(newsize<=fSize) return kFALSE; //shrink comes later!!
92 fTrack = new AliL3Track*[fSize];
93 fIsPresent = new Bool_t[fSize];
96 for(Int_t i=0;i<fSize;i++){
97 fTrack[i] = new AliL3Track();
98 fIsPresent[i] = kTRUE;
102 for(Int_t i=0;i<fSize;i++){
103 fTrack[i] = new AliL3ConfMapTrack();
104 fIsPresent[i] = kTRUE;
108 for(Int_t i=0;i<fSize;i++){
109 fTrack[i] = new AliL3HoughTrack();
110 fIsPresent[i] = kTRUE;
114 for(Int_t i=0;i<fSize;i++){
115 fTrack[i] = new AliL3ModelTrack();
116 fIsPresent[i] = kTRUE;
124 AliL3Track **tmp = new AliL3Track*[fSize];
125 Bool_t *pre = new Bool_t[fSize];
126 for(Int_t i=0; i<fSize;i++){
128 pre[i] = fIsPresent[i];
132 fTrack = new AliL3Track*[newsize];
133 fIsPresent = new Bool_t[newsize];
134 for(Int_t i=0; i<fSize;i++){
136 fIsPresent[i] = pre[i];
142 for(Int_t i=fSize;i<newsize;i++){
143 fTrack[i] = new AliL3Track();
144 fIsPresent[i] = kTRUE;
148 for(Int_t i=fSize;i<newsize;i++){
149 fTrack[i] = new AliL3ConfMapTrack();
150 fIsPresent[i] = kTRUE;
154 for(Int_t i=fSize;i<newsize;i++){
155 fTrack[i] = new AliL3HoughTrack();
156 fIsPresent[i] = kTRUE;
160 for(Int_t i=fSize;i<newsize;i++){
161 fTrack[i] = new AliL3ModelTrack();
162 fIsPresent[i] = kTRUE;
172 void AliL3TrackArray::Reset(){
175 for(Int_t i=0; i<fSize;i++)
176 fIsPresent[i] = kTRUE;
179 void AliL3TrackArray::Remove(Int_t track){
180 if(fIsPresent[track]){
181 fIsPresent[track]=kFALSE;
186 void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr){
187 //Read tracks from shared memory (or memory)
188 AliL3TrackSegmentData *trs = tr;
189 for(Int_t i=0; i<ntracks; i++){
190 AliL3Track *track = NextTrack();
191 track->SetPt(trs->fPt);
192 track->SetPsi(trs->fPsi);
193 track->SetTgl(trs->fTgl);
194 track->SetNHits(trs->fNPoints);
195 track->SetCharge(trs->fCharge);
196 track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
197 track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
198 track->SetHits( trs->fNPoints, trs->fPointIDs );
199 UChar_t *tmpP = (UChar_t*)trs;
200 tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
201 trs = (AliL3TrackSegmentData*)tmpP;
205 void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr,Int_t slice){
206 //Read tracks from shared memory (or memory)
207 AliL3TrackSegmentData *trs = tr;
208 for(Int_t i=0; i<ntracks; i++){
209 AliL3Track *track = NextTrack();
210 track->SetPt(trs->fPt);
213 AliL3Transform::Local2GlobalAngle(psi,slice);
214 track->SetPsi(psi[0]);
215 track->SetTgl(trs->fTgl);
216 track->SetNHits(trs->fNPoints);
217 track->SetCharge(trs->fCharge);
219 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
220 AliL3Transform::Local2Global(first,slice);
221 track->SetFirstPoint(first[0],first[1],first[2]);
223 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
224 AliL3Transform::Local2Global(last,slice);
225 track->SetLastPoint(last[0],last[1],last[2]);
226 track->SetHits( trs->fNPoints, trs->fPointIDs );
227 UChar_t *tmpP = (UChar_t*)trs;
228 tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
229 trs = (AliL3TrackSegmentData*)tmpP;
233 UInt_t AliL3TrackArray::GetOutSize(){
234 UInt_t count = GetOutCount(); //use only present tracks
236 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
237 AliL3Track *track = GetCheckedTrack(i); //use only present tracks
238 if(track) //use only present tracks
239 tHits += track->GetNHits();
242 //calculate size of track
243 return count*sizeof(AliL3TrackSegmentData)+sizeof(UInt_t)*tHits;
246 UInt_t AliL3TrackArray::WriteTracks(UInt_t & ntracks,AliL3TrackSegmentData* tr){
247 ntracks = GetOutCount();
248 return WriteTracks(tr);
251 UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr){
252 if(GetTrackType()=='c') return WriteConfMapTracks(tr);
253 AliL3TrackSegmentData *tP = tr;
256 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
257 AliL3Track *track = GetCheckedTrack(i); //use only present tracks
258 if(!track) continue; //use only present tracks
259 tP->fX = track->GetFirstPointX();
260 tP->fY = track->GetFirstPointY();
261 tP->fZ = track->GetFirstPointZ();
262 tP->fPt = track->GetPt();
263 tP->fLastX = track->GetLastPointX();
264 tP->fLastY = track->GetLastPointY();
265 tP->fLastZ = track->GetLastPointZ();
266 tP->fPsi = track->GetPsi();
267 tP->fTgl = track->GetTgl();
268 tP->fCharge = track->GetCharge();
269 tP->fNPoints = track->GetNHits();
271 pP = (UInt_t*)track->GetHitNumbers();
272 for (UInt_t j=0;j<tP->fNPoints;j++){
273 tP->fPointIDs[j] = pP[j];
275 Byte_t *tmpP = (Byte_t *)tP;
276 tmpP += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
277 size += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
278 tP = (AliL3TrackSegmentData*)tmpP;
283 UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr){
284 // use first and last point objects
285 AliL3TrackSegmentData *tP = tr;
288 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
289 AliL3ConfMapTrack *track =(AliL3ConfMapTrack *) GetCheckedTrack(i); //use only present tracks
290 if(!track) continue; //use only present tracks
291 AliL3ConfMapPoint *hit = (AliL3ConfMapPoint*)track->lastHit;
292 AliL3ConfMapPoint *lastHit = (AliL3ConfMapPoint*)track->firstHit;
293 tP->fX = hit->GetX();
294 tP->fY = hit->GetY();
295 tP->fZ = hit->GetZ();
296 tP->fLastX = lastHit->GetX();
297 tP->fLastY = lastHit->GetY();
298 tP->fLastZ = lastHit->GetZ();
300 // tP->fX = track->GetFirstPointX();
301 // tP->fY = track->GetFirstPointY();
302 // tP->fZ = track->GetFirstPointZ();
303 tP->fPt = track->GetPt();
304 // tP->fLastX = track->GetLastPointX();
305 // tP->fLastY = track->GetLastPointY();
306 // tP->fLastZ = track->GetLastPointZ();
307 tP->fPsi = track->GetPsi();
308 tP->fTgl = track->GetTgl();
309 tP->fCharge = track->GetCharge();
310 tP->fNPoints = track->GetNHits();
311 pP = (UInt_t*)track->GetHitNumbers();
312 for (UInt_t j=0;j<tP->fNPoints;j++){
313 tP->fPointIDs[j] = pP[j];
315 Byte_t *tmpP = (Byte_t *)tP;
316 tmpP += sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
317 size +=sizeof(AliL3TrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
318 tP = (AliL3TrackSegmentData*)tmpP;
323 void AliL3TrackArray::AddLast(AliL3Track *track)
325 AliL3Track *tpt = NextTrack();
330 void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old,Int_t slice)
332 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
334 LOG(AliL3Log::kError,"AliL3TrackArray::AddTracks","Track types")
335 <<"Bad idea to add tracks of different types"<<ENDLOG;
338 if(fSize < fNTracks+newtrack->GetNPresent())
339 SetSize(fSize+newtrack->GetSize());
340 for(Int_t i =0;i<newtrack->GetNTracks();i++){
341 AliL3Track *tpt = newtrack->GetCheckedTrack(i);
345 AliL3Track *track = NextTrack();
348 track->Rotate(slice); //Rotate track to global coordinates
351 if(GetTrackType()=='h')
352 track = (AliL3HoughTrack*)NextTrack();
361 void AliL3TrackArray::Compress(){
362 if(GetNPresent()==GetNTracks()) return;
363 AliL3Track **tmp = new AliL3Track *[fNTracks];
365 Int_t absent=GetNPresent();
366 for(Int_t i=0;i<GetNTracks();i++){
367 if(fIsPresent[i]) tmp[present++] = fTrack[i];
368 else tmp[absent++] = fTrack[i];
370 for(Int_t i=0;i<GetNTracks();i++)
374 for(Int_t i=0; i<GetNTracks();i++){
380 fNTracks = GetNPresent();
384 void AliL3TrackArray::QSort(){
387 QSort(fTrack,0,fNTracks);
390 void AliL3TrackArray::QSort( AliL3Track **a, Int_t first, Int_t last){
392 // Sort array of AliL3Track pointers using a quicksort algorithm.
393 // Uses TrackCompare() to compare objects.
396 static AliL3Track *tmp;
397 static int i; // "static" to save stack space
400 while (last - first > 1) {
404 while (++i < last && TrackCompare(a[i], a[first]) < 0)
406 while (--j > first && TrackCompare(a[j], a[first]) > 0)
422 if (j - first < last - (j + 1)) {
424 first = j + 1; // QSort(j + 1, last);
426 QSort(a, j + 1, last);
427 last = j; // QSort(first, j);
432 Int_t AliL3TrackArray::TrackCompare(AliL3Track *a, AliL3Track *b){
433 // Compare the two tracks.
435 return b->Compare(a);
440 AliL3HoughTrack *tra = (AliL3HoughTrack*)a;
441 AliL3HoughTrack *trb = (AliL3HoughTrack*)b;
442 if(tra->GetWeight() < trb->GetWeight()) return 1;
443 if(tra->GetWeight() > trb->GetWeight()) return -1;
447 if(a->GetNHits() < b->GetNHits()) return 1;
448 if(a->GetNHits() > b->GetNHits()) return -1;