3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ASV
10 #include "AliL3HoughMerger.h"
11 #include "AliL3HoughIntMerger.h"
12 #include "AliL3HoughGlobalMerger.h"
13 #include "AliL3Logging.h"
14 #include "AliL3Histogram.h"
15 #include "AliL3Hough.h"
16 #include "AliL3HoughTransformer.h"
17 #include "AliL3HoughTransformerVhdl.h"
18 #include "AliL3HoughMaxFinder.h"
20 #include "AliL3FileHandler.h"
22 #include "AliL3MemHandler.h"
24 #include "AliL3DataHandler.h"
25 #include "AliL3DigitData.h"
26 #include "AliL3HoughEval.h"
27 #include "AliL3Transform.h"
28 #include "AliL3TrackArray.h"
29 #include "AliL3HoughTrack.h"
34 //_____________________________________________________________
37 // Interface class for the Hough transform
39 // Example how to use:
41 // AliL3Hough *hough = new AliL3Hough(path,kTRUE,NumberOfEtaSegments);
42 // hough->ReadData(slice);
43 // hough->Transform();
44 // hough->FindTrackCandidates();
46 // AliL3TrackArray *tracks = hough->GetTracks(patch);
52 AliL3Hough::AliL3Hough()
57 fAddHistograms = kFALSE;
58 fDoIterative = kFALSE;
59 fWriteDigits = kFALSE;
63 fHoughTransformer = 0;
76 SetTransformerParams();
80 AliL3Hough::AliL3Hough(Char_t *path,Bool_t binary,Int_t n_eta_segments=100,Bool_t bit8=kFALSE,Int_t tv=0)
86 fNEtaSegments = n_eta_segments;
87 fAddHistograms = kFALSE;
88 fDoIterative = kFALSE;
89 fWriteDigits = kFALSE;
94 AliL3Hough::~AliL3Hough()
106 delete fGlobalMerger;
109 void AliL3Hough::CleanUp()
113 for(Int_t i=0; i<fNPatches; i++)
115 if(fTracks[i]) delete fTracks[i];
116 if(fEval[i]) delete fEval[i];
117 if(fHoughTransformer[i]) delete fHoughTransformer[i];
118 if(fMemHandler[i]) delete fMemHandler[i];
122 if(fTracks) delete [] fTracks;
123 if(fEval) delete [] fEval;
124 if(fHoughTransformer) delete [] fHoughTransformer;
125 if(fMemHandler) delete [] fMemHandler;
129 void AliL3Hough::Init(Char_t *path,Bool_t binary,Int_t n_eta_segments=100,Bool_t bit8=kFALSE,Int_t tv=0)
133 fNEtaSegments = n_eta_segments;
134 fWriteDigits = kFALSE;
138 Init(); //do the rest
141 void AliL3Hough::Init(Bool_t doit=kFALSE, Bool_t addhists=kFALSE)
144 fAddHistograms = addhists;
146 AliL3Transform::Init(fPath);
147 fNPatches = AliL3Transform::GetNPatches();
149 fHoughTransformer = new AliL3HoughBaseTransformer*[fNPatches];
150 fMemHandler = new AliL3MemHandler*[fNPatches];
151 fTracks = new AliL3TrackArray*[fNPatches];
152 fEval = new AliL3HoughEval*[fNPatches];
154 for(Int_t i=0; i<fNPatches; i++)
156 //VESTBO: Changes here, slice information is in principle not needed
157 //by the HoughTransformers. You always gave here a one, I changed
158 //it to zero and have Init function with is called in ReadData (see
159 //a few lines below.). I did not have time to think about it longer
160 //as there was that strange bug, but we should either consider not
161 //to give slice at all or to give it correcty (thats what I am doing
164 switch (fVersion){ //choose Transformer
166 fHoughTransformer[i] = new AliL3HoughTransformerVhdl(0,i,fNEtaSegments);
169 fHoughTransformer[i] = new AliL3HoughTransformer(0,i,fNEtaSegments);
172 fHoughTransformer[i]->CreateHistograms(fNBinX,fLowPt,fNBinY,-fPhi,fPhi);
173 fHoughTransformer[i]->SetLowerThreshold(fThreshold);
175 LOG(AliL3Log::kInformational,"AliL3Hough::Init","Version")
176 <<"Initializing Hough transformer version "<<fVersion<<ENDLOG;
178 fEval[i] = new AliL3HoughEval();
179 fTracks[i] = new AliL3TrackArray("AliL3HoughTrack");
181 fMemHandler[i] = new AliL3DataHandler();
185 fMemHandler[i] = new AliL3FileHandler();
188 Char_t filename[100];
189 sprintf(filename,"%s/digitfile",fPath);
190 fMemHandler[i]->SetAliInput(filename);
194 fMemHandler[i] = new AliL3MemHandler();
198 fPeakFinder = new AliL3HoughMaxFinder("KappaPhi",1000);
199 fMerger = new AliL3HoughMerger(fNPatches);
200 fInterMerger = new AliL3HoughIntMerger();
204 void AliL3Hough::Process(Int_t minslice,Int_t maxslice)
206 //Process all slices [minslice,maxslice].
207 fGlobalMerger = new AliL3HoughGlobalMerger(minslice,maxslice);
209 for(Int_t i=minslice; i<=maxslice; i++)
215 FindTrackCandidates();
217 fGlobalMerger->FillTracks(fTracks[0],i);
221 void AliL3Hough::ReadData(Int_t slice,Int_t eventnr=0)
223 //Read data from files, binary or root.
225 fCurrentSlice = slice;
226 for(Int_t i=0; i<fNPatches; i++)
228 fMemHandler[i]->Free();
230 AliL3DigitRowData *digits =0;
232 fMemHandler[i]->Init(slice,i);
233 if(fBinary)//take input data from binary files
236 sprintf(name,"%sdigits_c8_%d_%d.raw",fPath,slice,i);
238 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,i);
239 fMemHandler[i]->SetBinaryInput(name);
240 digits = (AliL3DigitRowData *)fMemHandler[i]->CompBinary2Memory(ndigits);
241 fMemHandler[i]->CloseBinaryInput();
243 else //read data from root file
246 digits=(AliL3DigitRowData *)fMemHandler[i]->AliDigits2Memory(ndigits,eventnr);
247 fMemHandler[i]->FreeDigitsTree();
249 cerr<<"You cannot read from rootfile now"<<endl;
252 fHoughTransformer[i]->SetInputData(ndigits,digits);
254 //VESTBO: due to bug commented out!!!
255 //fHoughTransformer[i]->Init(slice,i,fNEtaSegments);
256 //fHoughTransformer[i]->Print();
260 void AliL3Hough::Transform(Int_t row_range=-1)
262 //Transform all data given to the transformer within the given slice
263 //(after ReadData(slice))
265 Double_t initTime,cpuTime;
266 initTime = GetCpuTime();
267 for(Int_t i=0; i<fNPatches; i++)
269 fHoughTransformer[i]->Reset();//Reset the histograms
271 fHoughTransformer[i]->TransformCircle();
273 fHoughTransformer[i]->TransformCircleC(row_range);
275 cpuTime = GetCpuTime() - initTime;
276 LOG(AliL3Log::kInformational,"AliL3Hough::Transform()","Timing")
277 <<"Transform done in average per patch of "<<cpuTime*1000/fNPatches<<" ms"<<ENDLOG;
280 void AliL3Hough::MergePatches()
282 if(fAddHistograms) //Nothing to merge here
284 fMerger->MergePatches(kTRUE);
287 void AliL3Hough::MergeInternally()
290 fInterMerger->FillTracks(fTracks[0]);
292 fInterMerger->FillTracks(fMerger->GetOutTracks());
294 fInterMerger->MMerge();
297 void AliL3Hough::ProcessSliceIter()
299 //Process current slice (after ReadData(slice)) iteratively.
301 for(Int_t i=0; i<fNPatches; i++)
304 fMerger->FillTracks(fTracks[i],i); //Copy tracks to merger
308 void AliL3Hough::ProcessPatchIter(Int_t patch)
310 //Process patch in a iterative way.
311 //transform + peakfinding + evaluation + transform +...
313 Int_t num_of_tries = 10;
314 AliL3HoughBaseTransformer *tr = fHoughTransformer[patch];
315 AliL3TrackArray *tracks = fTracks[patch];
317 AliL3HoughEval *ev = fEval[patch];
318 ev->InitTransformer(tr);
319 ev->RemoveFoundTracks();
320 ev->SetNumOfRowsToMiss(2);
321 ev->SetNumOfPadsToLook(2);
322 AliL3Histogram *hist;
323 for(Int_t t=0; t<num_of_tries; t++)
326 tr->TransformCircle();
327 for(Int_t i=0; i<fNEtaSegments; i++)
329 hist = tr->GetHistogram(i);
330 if(hist->GetNEntries()==0) continue;
331 fPeakFinder->SetHistogram(hist);
334 //fPeakFinder->FindAbsMaxima(*x,*y);
335 fPeakFinder->FindPeak(3,0.95,5,x,y);
336 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->NextTrack();
337 track->SetTrackParameters(x,y,1);
338 if(!ev->LookInsideRoad(track,i))
340 tracks->Remove(tracks->GetNTracks()-1);
345 LOG(AliL3Log::kInformational,"AliL3Hough::ProcessPatch","NTracks")
346 <<AliL3Log::kDec<<"Found "<<tracks->GetNTracks()<<" tracks in patch "<<patch<<ENDLOG;
349 void AliL3Hough::AddAllHistograms()
351 //Add the histograms within one etaslice.
352 //Resulting histogram are in patch=0.
354 Double_t initTime,cpuTime;
355 initTime = GetCpuTime();
356 for(Int_t i=0; i<fNEtaSegments; i++)
358 AliL3Histogram *hist0 = fHoughTransformer[0]->GetHistogram(i);
359 for(Int_t j=1; j<fNPatches; j++)
361 AliL3Histogram *hist = fHoughTransformer[j]->GetHistogram(i);
365 fAddHistograms = kTRUE;
366 cpuTime = GetCpuTime() - initTime;
367 LOG(AliL3Log::kInformational,"AliL3Hough::AddAllHistograms()","Timing")
368 <<"Adding histograms in "<<cpuTime*1000<<" ms"<<ENDLOG;
371 void AliL3Hough::FindTrackCandidates()
373 //Look for peaks in histograms, and find the track candidates
377 n_patches = 1; //Histograms have been added.
379 n_patches = fNPatches;
381 Double_t initTime,cpuTime;
382 initTime = GetCpuTime();
384 for(Int_t i=0; i<n_patches; i++)
386 AliL3HoughBaseTransformer *tr = fHoughTransformer[i];
389 for(Int_t j=0; j<fNEtaSegments; j++)
391 AliL3Histogram *hist = tr->GetHistogram(j);
392 if(hist->GetNEntries()==0) continue;
393 fPeakFinder->Reset();
394 fPeakFinder->SetHistogram(hist);
395 //fPeakFinder->FindPeak1(3,1);
396 fPeakFinder->FindMaxima(0,0); //Simple maxima finder
397 //fPeakFinder->FindAbsMaxima();
399 for(Int_t k=0; k<fPeakFinder->GetEntries(); k++)
401 if(fPeakFinder->GetWeight(k) == 0) continue;
402 AliL3HoughTrack *track = (AliL3HoughTrack*)fTracks[i]->NextTrack();
403 track->SetTrackParameters(fPeakFinder->GetXPeak(k),fPeakFinder->GetYPeak(k),fPeakFinder->GetWeight(k));
404 track->SetEtaIndex(j);
405 track->SetEta(tr->GetEta(j,fCurrentSlice));
406 track->SetRowRange(AliL3Transform::GetFirstRow(0),AliL3Transform::GetLastRow(5));
411 cpuTime = GetCpuTime() - initTime;
412 LOG(AliL3Log::kInformational,"AliL3Hough::FindTrackCandidates()","Timing")
413 <<"Maxima finding done in "<<cpuTime*1000<<" ms"<<ENDLOG;
416 void AliL3Hough::InitEvaluate()
418 //Pass the transformer objects to the AliL3HoughEval objects:
419 //This will provide the evaluation objects with all the necessary
420 //data and parameters it needs.
422 for(Int_t i=0; i<fNPatches; i++)
423 fEval[i]->InitTransformer(fHoughTransformer[i]);
426 Int_t AliL3Hough::Evaluate(Int_t road_width,Int_t nrowstomiss)
428 //Evaluate the tracks, by looking along the road in the raw data.
429 //If track does not cross all padrows - rows2miss, it is removed from the arrray.
430 //If histograms were not added, the check is done locally in patch,
431 //meaning that nrowstomiss is the number of padrows the road can miss with respect
432 //to the number of rows in the patch.
433 //If the histograms were added, the comparison is done globally in the _slice_,
434 //meaing that nrowstomiss is the number of padrows the road can miss with
435 //respect to the total number of padrows in the slice.
437 //Return value = number of tracks which were removed (only in case of fAddHistograms)
441 LOG(AliL3Log::kError,"AliL3Hough::Evaluate","Track Array")
442 <<"No tracks to work with..."<<ENDLOG;
446 Int_t removed_tracks=0;
447 AliL3TrackArray *tracks=0;
452 for(Int_t i=0; i<tracks->GetNTracks(); i++)
454 AliL3Track *track = tracks->GetCheckedTrack(i);
460 for(Int_t i=0; i<fNPatches; i++)
461 EvaluatePatch(i,road_width,nrowstomiss);
463 //Here we check the tracks globally;
464 //how many good rows (padrows with signal)
465 //did it cross in the slice
469 for(Int_t j=0; j<tracks->GetNTracks(); j++)
471 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(j);
473 if(track->GetNHits() < AliL3Transform::GetNRows() - nrowstomiss)
483 return removed_tracks;
486 void AliL3Hough::EvaluatePatch(Int_t i,Int_t road_width,Int_t nrowstomiss)
490 fEval[i]->InitTransformer(fHoughTransformer[i]);
491 fEval[i]->SetNumOfPadsToLook(road_width);
492 fEval[i]->SetNumOfRowsToMiss(nrowstomiss);
493 //fEval[i]->RemoveFoundTracks();
495 AliL3TrackArray *tracks=0;
503 for(Int_t j=0; j<tracks->GetNTracks(); j++)
505 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(j);
508 LOG(AliL3Log::kWarning,"AliL3Hough::EvaluatePatch","Track array")
509 <<"Track object missing!"<<ENDLOG;
513 Bool_t result = fEval[i]->LookInsideRoad(track,nrows);
516 Int_t pre=track->GetNHits();
517 track->SetNHits(pre+nrows);
519 //else//the track crossed too few good padrows (padrows with signal) in the patch, so remove it
532 fMerger->FillTracks(tracks,i); //Copy tracks to the track merger
538 void AliL3Hough::EvaluateWithEta()
542 printf("AliL3Hough::EvaluateWithEta: NO TRACKS\n");
545 printf("Number of tracks before evaluation %d\n",fTracks[0]->GetNTracks());
547 for(Int_t i=0; i<fNPatches; i++)
549 fEval[i]->InitTransformer(fHoughTransformer[i]);
550 fEval[i]->FindEta(fTracks[0]);
552 fMerger->FillTracks(fTracks[0],0);
555 void AliL3Hough::WriteTracks(Int_t slice,Char_t *path)
557 //Write the tracks in slice
559 AliL3MemHandler *mem = new AliL3MemHandler();
563 sprintf(fname,"%s/tracks_ho_%d.raw",path,slice);
564 mem->SetBinaryOutput(fname);
565 mem->TrackArray2Binary(fTracks[0]);
566 mem->CloseBinaryOutput();
570 for(Int_t i=0; i<fNPatches; i++)
572 sprintf(fname,"%s/tracks_ho_%d_%d.raw",path,slice,i);
573 mem->SetBinaryOutput(fname);
574 mem->TrackArray2Binary(fTracks[i]);
575 mem->CloseBinaryOutput();
582 void AliL3Hough::WriteDigits(Char_t *outfile)
585 //Write the current data to a new rootfile.
587 for(Int_t i=0; i<fNPatches; i++)
589 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer[i]->GetDataPointer();
590 fMemHandler[i]->AliDigits2RootFile(tempPt,outfile);
593 cerr<<"AliL3Hough::WriteDigits : You need to compile with AliROOT!"<<endl;
598 Double_t AliL3Hough::GetCpuTime()
600 //Return the Cputime in seconds.
602 gettimeofday( &tv, NULL );
603 return tv.tv_sec+(((Double_t)tv.tv_usec)/1000000.);
604 //return (Double_t)(clock()) / CLOCKS_PER_SEC;