]>
Commit | Line | Data |
---|---|---|
3e87ef69 | 1 | // @(#) $Id$ |
b1886074 | 2 | |
3 | // Author: Anders Vestbo <mailto:vestbo@fi.uib.no> | |
3e87ef69 | 4 | //*-- Copyright © ALICE HLT Group |
b1886074 | 5 | |
e06900d5 | 6 | #include "AliL3StandardIncludes.h" |
0309a5ee | 7 | #include <sys/time.h> |
f000f8a5 | 8 | |
e06900d5 | 9 | #include "AliL3Logging.h" |
b1886074 | 10 | #include "AliL3HoughMerger.h" |
11 | #include "AliL3HoughIntMerger.h" | |
12 | #include "AliL3HoughGlobalMerger.h" | |
f80b98cb | 13 | #include "AliL3Histogram.h" |
f000f8a5 | 14 | #include "AliL3Hough.h" |
15 | #include "AliL3HoughTransformer.h" | |
6c97129d | 16 | #include "AliL3HoughClusterTransformer.h" |
636080ea | 17 | #include "AliL3HoughTransformerLUT.h" |
b46b53c1 | 18 | #include "AliL3HoughTransformerVhdl.h" |
f000f8a5 | 19 | #include "AliL3HoughMaxFinder.h" |
3e87ef69 | 20 | #include "AliL3Benchmark.h" |
95a00d93 | 21 | #ifdef use_aliroot |
f80b98cb | 22 | #include "AliL3FileHandler.h" |
95a00d93 | 23 | #else |
24 | #include "AliL3MemHandler.h" | |
25 | #endif | |
d96f6a4a | 26 | #include "AliL3DataHandler.h" |
f80b98cb | 27 | #include "AliL3DigitData.h" |
28 | #include "AliL3HoughEval.h" | |
29 | #include "AliL3Transform.h" | |
f80b98cb | 30 | #include "AliL3TrackArray.h" |
31 | #include "AliL3HoughTrack.h" | |
b2a02bce | 32 | #include "AliL3DDLDataFileHandler.h" |
95a00d93 | 33 | |
e06900d5 | 34 | #if GCCVERSION == 3 |
35 | using namespace std; | |
36 | #endif | |
b1886074 | 37 | |
aa641eb8 | 38 | /** /class AliL3Hough |
39 | //<pre> | |
b1886074 | 40 | //_____________________________________________________________ |
41 | // AliL3Hough | |
42 | // | |
237d3f5c | 43 | // Interface class for the Hough transform |
b1886074 | 44 | // |
237d3f5c | 45 | // Example how to use: |
46 | // | |
47 | // AliL3Hough *hough = new AliL3Hough(path,kTRUE,NumberOfEtaSegments); | |
48 | // hough->ReadData(slice); | |
49 | // hough->Transform(); | |
50 | // hough->FindTrackCandidates(); | |
51 | // | |
52 | // AliL3TrackArray *tracks = hough->GetTracks(patch); | |
aa641eb8 | 53 | //</pre> |
54 | */ | |
f000f8a5 | 55 | |
56 | ClassImp(AliL3Hough) | |
57 | ||
58 | AliL3Hough::AliL3Hough() | |
59 | { | |
b1886074 | 60 | //Constructor |
61 | ||
6dbc57b4 | 62 | fBinary = kFALSE; |
a6008206 | 63 | fAddHistograms = kFALSE; |
6dbc57b4 | 64 | fDoIterative = kFALSE; |
65 | fWriteDigits = kFALSE; | |
66 | fUse8bits = kFALSE; | |
67 | ||
68 | fMemHandler = 0; | |
237d3f5c | 69 | fHoughTransformer = 0; |
6dbc57b4 | 70 | fEval = 0; |
71 | fPeakFinder = 0; | |
72 | fTracks = 0; | |
b2a02bce | 73 | fGlobalTracks = 0; |
6dbc57b4 | 74 | fMerger = 0; |
75 | fInterMerger = 0; | |
76 | fGlobalMerger = 0; | |
3e87ef69 | 77 | fBenchmark = 0; |
78 | ||
6dbc57b4 | 79 | fNEtaSegments = 0; |
80 | fNPatches = 0; | |
81 | fVersion = 0; | |
82 | fCurrentSlice = 0; | |
b2a02bce | 83 | fEvent = 0; |
84 | ||
6dbc57b4 | 85 | SetTransformerParams(); |
86 | SetThreshold(); | |
636080ea | 87 | SetNSaveIterations(); |
3e87ef69 | 88 | SetPeakThreshold(); |
f000f8a5 | 89 | } |
90 | ||
b2a02bce | 91 | AliL3Hough::AliL3Hough(Char_t *path,Bool_t binary,Int_t n_eta_segments,Bool_t bit8,Int_t tv,Char_t *infile) |
b46b53c1 | 92 | { |
93 | //Default ctor. | |
94 | ||
95 | fBinary = binary; | |
96 | strcpy(fPath,path); | |
6dbc57b4 | 97 | fNEtaSegments = n_eta_segments; |
b46b53c1 | 98 | fAddHistograms = kFALSE; |
6dbc57b4 | 99 | fDoIterative = kFALSE; |
100 | fWriteDigits = kFALSE; | |
101 | fUse8bits = bit8; | |
102 | fVersion = tv; | |
b2a02bce | 103 | if(!fBinary) |
104 | fInputFile = infile; | |
105 | else | |
106 | fInputFile = 0; | |
b46b53c1 | 107 | } |
f000f8a5 | 108 | |
f000f8a5 | 109 | AliL3Hough::~AliL3Hough() |
110 | { | |
237d3f5c | 111 | //dtor |
112 | ||
b1886074 | 113 | CleanUp(); |
114 | if(fMerger) | |
115 | delete fMerger; | |
116 | if(fInterMerger) | |
117 | delete fInterMerger; | |
a6008206 | 118 | if(fPeakFinder) |
119 | delete fPeakFinder; | |
1c404dd5 | 120 | if(fGlobalMerger) |
121 | delete fGlobalMerger; | |
3e87ef69 | 122 | if(fBenchmark) |
123 | delete fBenchmark; | |
b2a02bce | 124 | if(fGlobalTracks) |
125 | delete fGlobalTracks; | |
f000f8a5 | 126 | } |
127 | ||
b1886074 | 128 | void AliL3Hough::CleanUp() |
f000f8a5 | 129 | { |
b1886074 | 130 | //Cleanup memory |
131 | ||
1c404dd5 | 132 | for(Int_t i=0; i<fNPatches; i++) |
4fc9a6a4 | 133 | { |
b1886074 | 134 | if(fTracks[i]) delete fTracks[i]; |
135 | if(fEval[i]) delete fEval[i]; | |
136 | if(fHoughTransformer[i]) delete fHoughTransformer[i]; | |
137 | if(fMemHandler[i]) delete fMemHandler[i]; | |
4fc9a6a4 | 138 | } |
b1886074 | 139 | |
3e87ef69 | 140 | if(fTracks) delete [] fTracks; |
141 | if(fEval) delete [] fEval; | |
142 | if(fHoughTransformer) delete [] fHoughTransformer; | |
143 | if(fMemHandler) delete [] fMemHandler; | |
144 | ||
f000f8a5 | 145 | } |
146 | ||
b2a02bce | 147 | void AliL3Hough::Init(Char_t *path,Bool_t binary,Int_t n_eta_segments,Bool_t bit8,Int_t tv,Char_t *infile) |
f000f8a5 | 148 | { |
d96f6a4a | 149 | fBinary = binary; |
150 | strcpy(fPath,path); | |
151 | fNEtaSegments = n_eta_segments; | |
6dbc57b4 | 152 | fWriteDigits = kFALSE; |
153 | fUse8bits = bit8; | |
154 | fVersion = tv; | |
b2a02bce | 155 | if(!fBinary) |
156 | fInputFile = infile; | |
157 | else | |
158 | fInputFile = 0; | |
6dbc57b4 | 159 | |
160 | Init(); //do the rest | |
161 | } | |
162 | ||
e06900d5 | 163 | void AliL3Hough::Init(Bool_t doit, Bool_t addhists) |
a4639de2 | 164 | { |
6dbc57b4 | 165 | fDoIterative = doit; |
166 | fAddHistograms = addhists; | |
b46b53c1 | 167 | |
26abc209 | 168 | fNPatches = AliL3Transform::GetNPatches(); |
3e87ef69 | 169 | |
237d3f5c | 170 | fHoughTransformer = new AliL3HoughBaseTransformer*[fNPatches]; |
95a00d93 | 171 | fMemHandler = new AliL3MemHandler*[fNPatches]; |
3e87ef69 | 172 | |
1c404dd5 | 173 | fTracks = new AliL3TrackArray*[fNPatches]; |
174 | fEval = new AliL3HoughEval*[fNPatches]; | |
b2a02bce | 175 | |
176 | fGlobalTracks = new AliL3TrackArray("AliL3HoughTrack"); | |
177 | ||
1c404dd5 | 178 | for(Int_t i=0; i<fNPatches; i++) |
f80b98cb | 179 | { |
6dbc57b4 | 180 | switch (fVersion){ //choose Transformer |
b46b53c1 | 181 | case 1: |
636080ea | 182 | fHoughTransformer[i] = new AliL3HoughTransformerLUT(0,i,fNEtaSegments); |
b46b53c1 | 183 | break; |
6c97129d | 184 | case 2: |
185 | fHoughTransformer[i] = new AliL3HoughClusterTransformer(0,i,fNEtaSegments); | |
186 | break; | |
636080ea | 187 | case 3: |
188 | fHoughTransformer[i] = new AliL3HoughTransformerVhdl(0,i,fNEtaSegments,fNSaveIterations); | |
189 | break; | |
b46b53c1 | 190 | default: |
3e87ef69 | 191 | fHoughTransformer[i] = new AliL3HoughTransformer(0,i,fNEtaSegments,kFALSE,kFALSE); |
b46b53c1 | 192 | } |
aa641eb8 | 193 | |
b2a02bce | 194 | fHoughTransformer[i]->CreateHistograms(fNBinX[i],fLowPt[i],fNBinY[i],-fPhi[i],fPhi[i]); |
195 | //fHoughTransformer[i]->CreateHistograms(fLowPt[i],fUpperPt[i],fPtRes[i],fNBinY[i],fPhi[i]); | |
196 | fHoughTransformer[i]->SetLowerThreshold(fThreshold[i]); | |
197 | fHoughTransformer[i]->SetUpperThreshold(100); | |
198 | ||
0309a5ee | 199 | LOG(AliL3Log::kInformational,"AliL3Hough::Init","Version") |
6dbc57b4 | 200 | <<"Initializing Hough transformer version "<<fVersion<<ENDLOG; |
a4639de2 | 201 | |
b1886074 | 202 | fEval[i] = new AliL3HoughEval(); |
203 | fTracks[i] = new AliL3TrackArray("AliL3HoughTrack"); | |
d96f6a4a | 204 | if(fUse8bits) |
205 | fMemHandler[i] = new AliL3DataHandler(); | |
206 | else | |
95a00d93 | 207 | #ifdef use_aliroot |
d96f6a4a | 208 | { |
b2a02bce | 209 | if(!fInputFile) { |
210 | /* In case of reading digits file */ | |
211 | fMemHandler[i] = new AliL3FileHandler(); | |
212 | if(!fBinary) { | |
44c7f8de | 213 | Char_t filename[1024]; |
b490510d | 214 | sprintf(filename,"%s/digitfile.root",fPath); |
b2a02bce | 215 | fMemHandler[i]->SetAliInput(filename); |
3bb06991 | 216 | } |
b2a02bce | 217 | } |
218 | else { | |
219 | /* In case of reading rawdata from ROOT file */ | |
220 | fMemHandler[i] = new AliL3DDLDataFileHandler(); | |
221 | fMemHandler[i]->SetReaderInput(fInputFile); | |
222 | } | |
d96f6a4a | 223 | } |
95a00d93 | 224 | #else |
225 | fMemHandler[i] = new AliL3MemHandler(); | |
226 | #endif | |
a6008206 | 227 | } |
6dbc57b4 | 228 | |
a4639de2 | 229 | fPeakFinder = new AliL3HoughMaxFinder("KappaPhi",1000); |
1c404dd5 | 230 | fMerger = new AliL3HoughMerger(fNPatches); |
b1886074 | 231 | fInterMerger = new AliL3HoughIntMerger(); |
237d3f5c | 232 | fGlobalMerger = 0; |
3e87ef69 | 233 | fBenchmark = new AliL3Benchmark(); |
b2a02bce | 234 | } |
235 | ||
236 | void AliL3Hough::SetTransformerParams(Float_t ptres,Float_t ptmin,Float_t ptmax,Int_t ny,Int_t patch) | |
237 | { | |
238 | ||
239 | Int_t mrow; | |
240 | Float_t psi=0; | |
241 | if(patch==-1) | |
242 | mrow = 80; | |
243 | else | |
244 | mrow = AliL3Transform::GetLastRow(patch); | |
245 | if(ptmin) | |
246 | { | |
247 | Double_t lineradius = sqrt(pow(AliL3Transform::Row2X(mrow),2) + pow(AliL3Transform::GetMaxY(mrow),2)); | |
248 | Double_t kappa = -1*AliL3Transform::GetBField()*AliL3Transform::GetBFact()/ptmin; | |
249 | psi = AliL3Transform::Deg2Rad(10) - asin(lineradius*kappa/2); | |
250 | cout<<"Calculated psi range "<<psi<<" in patch "<<patch<<endl; | |
251 | } | |
252 | ||
253 | if(patch==-1) | |
254 | { | |
255 | Int_t i=0; | |
256 | while(i < 6) | |
257 | { | |
258 | fPtRes[i] = ptres; | |
259 | fLowPt[i] = ptmin; | |
260 | fUpperPt[i] = ptmax; | |
261 | fNBinY[i] = ny; | |
262 | fPhi[i] = psi; | |
263 | fNBinX[i]=0; | |
264 | i++; | |
265 | } | |
266 | return; | |
267 | } | |
268 | ||
269 | fPtRes[patch] = ptres; | |
270 | fLowPt[patch] = ptmin; | |
271 | fUpperPt[patch] = ptmax; | |
272 | fNBinY[patch] = ny; | |
273 | fPhi[patch] = psi; | |
274 | } | |
275 | ||
276 | void AliL3Hough::SetTransformerParams(Int_t nx,Int_t ny,Float_t ptmin,Int_t patch) | |
277 | { | |
278 | ||
279 | Int_t mrow=80; | |
280 | Double_t lineradius = sqrt(pow(AliL3Transform::Row2X(mrow),2) + pow(AliL3Transform::GetMaxY(mrow),2)); | |
281 | Double_t kappa = -1*AliL3Transform::GetBField()*AliL3Transform::GetBFact()/ptmin; | |
282 | Double_t psi = AliL3Transform::Deg2Rad(10) - asin(lineradius*kappa/2); | |
283 | cout<<"Calculated psi range "<<psi<<" in patch "<<patch<<endl; | |
284 | ||
285 | Int_t i=0; | |
286 | while(i < 6) | |
287 | { | |
288 | fLowPt[i] = ptmin; | |
289 | fNBinY[i] = ny; | |
290 | fNBinX[i] = nx; | |
291 | fPhi[i] = psi; | |
292 | i++; | |
293 | } | |
294 | } | |
295 | ||
296 | void AliL3Hough::SetTransformerParams(Int_t nx,Int_t ny,Float_t lpt,Float_t phi) | |
297 | { | |
298 | Int_t i=0; | |
299 | while(i < 6) | |
300 | { | |
301 | fLowPt[i] = lpt; | |
302 | fNBinY[i] = ny; | |
303 | fNBinX[i] = nx; | |
304 | fPhi[i] = phi; | |
305 | i++; | |
306 | } | |
307 | } | |
308 | ||
309 | void AliL3Hough::SetThreshold(Int_t t3,Int_t patch) | |
310 | { | |
311 | if(patch==-1) | |
312 | { | |
313 | Int_t i=0; | |
314 | while(i < 6) | |
315 | fThreshold[i++]=t3; | |
316 | return; | |
317 | } | |
318 | fThreshold[patch]=t3; | |
319 | } | |
3e87ef69 | 320 | |
b2a02bce | 321 | void AliL3Hough::SetPeakThreshold(Int_t threshold,Int_t patch) |
322 | { | |
323 | if(patch==-1) | |
324 | { | |
325 | Int_t i=0; | |
326 | while(i < 6) | |
327 | fPeakThreshold[i++]=threshold; | |
328 | return; | |
329 | } | |
330 | fPeakThreshold[patch]=threshold; | |
3e87ef69 | 331 | } |
332 | ||
333 | void AliL3Hough::DoBench(Char_t *name) | |
334 | { | |
335 | fBenchmark->Analyze(name); | |
a6008206 | 336 | } |
337 | ||
338 | void AliL3Hough::Process(Int_t minslice,Int_t maxslice) | |
339 | { | |
340 | //Process all slices [minslice,maxslice]. | |
1c404dd5 | 341 | fGlobalMerger = new AliL3HoughGlobalMerger(minslice,maxslice); |
b1886074 | 342 | |
a6008206 | 343 | for(Int_t i=minslice; i<=maxslice; i++) |
344 | { | |
b1886074 | 345 | ReadData(i); |
346 | Transform(); | |
a6008206 | 347 | if(fAddHistograms) |
348 | AddAllHistograms(); | |
349 | FindTrackCandidates(); | |
3e87ef69 | 350 | //Evaluate(); |
351 | //fGlobalMerger->FillTracks(fTracks[0],i); | |
f80b98cb | 352 | } |
4fc9a6a4 | 353 | } |
f80b98cb | 354 | |
e06900d5 | 355 | void AliL3Hough::ReadData(Int_t slice,Int_t eventnr) |
4fc9a6a4 | 356 | { |
b1886074 | 357 | //Read data from files, binary or root. |
3bb06991 | 358 | |
b2a02bce | 359 | fEvent=eventnr; |
3bb06991 | 360 | fCurrentSlice = slice; |
1c404dd5 | 361 | for(Int_t i=0; i<fNPatches; i++) |
f80b98cb | 362 | { |
4fc9a6a4 | 363 | fMemHandler[i]->Free(); |
364 | UInt_t ndigits=0; | |
365 | AliL3DigitRowData *digits =0; | |
366 | Char_t name[256]; | |
3fe49b5b | 367 | fMemHandler[i]->Init(slice,i); |
a6008206 | 368 | if(fBinary)//take input data from binary files |
4fc9a6a4 | 369 | { |
d96f6a4a | 370 | if(fUse8bits) |
b2a02bce | 371 | sprintf(name,"%s/binaries/digits_c8_%d_%d_%d.raw",fPath,eventnr,slice,i); |
d96f6a4a | 372 | else |
b2a02bce | 373 | sprintf(name,"%s/binaries/digits_%d_%d_%d.raw",fPath,eventnr,slice,i); |
636080ea | 374 | |
4fc9a6a4 | 375 | fMemHandler[i]->SetBinaryInput(name); |
376 | digits = (AliL3DigitRowData *)fMemHandler[i]->CompBinary2Memory(ndigits); | |
377 | fMemHandler[i]->CloseBinaryInput(); | |
378 | } | |
379 | else //read data from root file | |
380 | { | |
95a00d93 | 381 | #ifdef use_aliroot |
3e87ef69 | 382 | digits=(AliL3DigitRowData *)fMemHandler[i]->AliAltroDigits2Memory(ndigits,eventnr); |
95a00d93 | 383 | #else |
384 | cerr<<"You cannot read from rootfile now"<<endl; | |
385 | #endif | |
4fc9a6a4 | 386 | } |
aa641eb8 | 387 | |
636080ea | 388 | //set input data and init transformer |
389 | fHoughTransformer[i]->SetInputData(ndigits,digits); | |
390 | fHoughTransformer[i]->Init(slice,i,fNEtaSegments); | |
b1886074 | 391 | } |
392 | } | |
393 | ||
3e87ef69 | 394 | void AliL3Hough::Transform(Int_t *row_range) |
b1886074 | 395 | { |
396 | //Transform all data given to the transformer within the given slice | |
397 | //(after ReadData(slice)) | |
0309a5ee | 398 | |
399 | Double_t initTime,cpuTime; | |
400 | initTime = GetCpuTime(); | |
1c404dd5 | 401 | for(Int_t i=0; i<fNPatches; i++) |
b1886074 | 402 | { |
403 | fHoughTransformer[i]->Reset();//Reset the histograms | |
3e87ef69 | 404 | fBenchmark->Start("Hough Transform"); |
405 | if(!row_range) | |
237d3f5c | 406 | fHoughTransformer[i]->TransformCircle(); |
407 | else | |
3e87ef69 | 408 | fHoughTransformer[i]->TransformCircleC(row_range,1); |
409 | fBenchmark->Stop("Hough Transform"); | |
b1886074 | 410 | } |
0309a5ee | 411 | cpuTime = GetCpuTime() - initTime; |
412 | LOG(AliL3Log::kInformational,"AliL3Hough::Transform()","Timing") | |
413 | <<"Transform done in average per patch of "<<cpuTime*1000/fNPatches<<" ms"<<ENDLOG; | |
b1886074 | 414 | } |
415 | ||
416 | void AliL3Hough::MergePatches() | |
417 | { | |
418 | if(fAddHistograms) //Nothing to merge here | |
419 | return; | |
b1886074 | 420 | fMerger->MergePatches(kTRUE); |
b1886074 | 421 | } |
422 | ||
423 | void AliL3Hough::MergeInternally() | |
424 | { | |
425 | if(fAddHistograms) | |
426 | fInterMerger->FillTracks(fTracks[0]); | |
427 | else | |
428 | fInterMerger->FillTracks(fMerger->GetOutTracks()); | |
429 | ||
430 | fInterMerger->MMerge(); | |
431 | } | |
432 | ||
433 | void AliL3Hough::ProcessSliceIter() | |
434 | { | |
435 | //Process current slice (after ReadData(slice)) iteratively. | |
436 | ||
6c97129d | 437 | if(!fAddHistograms) |
b1886074 | 438 | { |
6c97129d | 439 | for(Int_t i=0; i<fNPatches; i++) |
440 | { | |
441 | ProcessPatchIter(i); | |
442 | fMerger->FillTracks(fTracks[i],i); //Copy tracks to merger | |
443 | } | |
444 | } | |
445 | else | |
446 | { | |
447 | for(Int_t i=0; i<10; i++) | |
448 | { | |
449 | Transform(); | |
450 | AddAllHistograms(); | |
451 | InitEvaluate(); | |
452 | AliL3HoughBaseTransformer *tr = fHoughTransformer[0]; | |
453 | for(Int_t j=0; j<fNEtaSegments; j++) | |
454 | { | |
455 | AliL3Histogram *hist = tr->GetHistogram(j); | |
456 | if(hist->GetNEntries()==0) continue; | |
457 | fPeakFinder->Reset(); | |
458 | fPeakFinder->SetHistogram(hist); | |
459 | fPeakFinder->FindAbsMaxima(); | |
460 | AliL3HoughTrack *track = (AliL3HoughTrack*)fTracks[0]->NextTrack(); | |
461 | track->SetTrackParameters(fPeakFinder->GetXPeak(0),fPeakFinder->GetYPeak(0),fPeakFinder->GetWeight(0)); | |
462 | track->SetEtaIndex(j); | |
463 | track->SetEta(tr->GetEta(j,fCurrentSlice)); | |
464 | for(Int_t k=0; k<fNPatches; k++) | |
465 | { | |
466 | fEval[i]->SetNumOfPadsToLook(2); | |
467 | fEval[i]->SetNumOfRowsToMiss(2); | |
468 | fEval[i]->RemoveFoundTracks(); | |
3e87ef69 | 469 | /* |
6c97129d | 470 | Int_t nrows=0; |
471 | if(!fEval[i]->LookInsideRoad(track,nrows)) | |
472 | { | |
473 | fTracks[0]->Remove(fTracks[0]->GetNTracks()-1); | |
474 | fTracks[0]->Compress(); | |
475 | } | |
3e87ef69 | 476 | */ |
6c97129d | 477 | } |
478 | } | |
479 | ||
480 | } | |
481 | ||
f80b98cb | 482 | } |
4fc9a6a4 | 483 | } |
484 | ||
b1886074 | 485 | void AliL3Hough::ProcessPatchIter(Int_t patch) |
486 | { | |
487 | //Process patch in a iterative way. | |
488 | //transform + peakfinding + evaluation + transform +... | |
489 | ||
6c97129d | 490 | Int_t num_of_tries = 5; |
237d3f5c | 491 | AliL3HoughBaseTransformer *tr = fHoughTransformer[patch]; |
b1886074 | 492 | AliL3TrackArray *tracks = fTracks[patch]; |
493 | tracks->Reset(); | |
494 | AliL3HoughEval *ev = fEval[patch]; | |
495 | ev->InitTransformer(tr); | |
6c97129d | 496 | //ev->RemoveFoundTracks(); |
497 | ev->SetNumOfRowsToMiss(3); | |
b5a207b4 | 498 | ev->SetNumOfPadsToLook(2); |
b1886074 | 499 | AliL3Histogram *hist; |
500 | for(Int_t t=0; t<num_of_tries; t++) | |
501 | { | |
502 | tr->Reset(); | |
503 | tr->TransformCircle(); | |
504 | for(Int_t i=0; i<fNEtaSegments; i++) | |
505 | { | |
506 | hist = tr->GetHistogram(i); | |
507 | if(hist->GetNEntries()==0) continue; | |
6c97129d | 508 | fPeakFinder->Reset(); |
b1886074 | 509 | fPeakFinder->SetHistogram(hist); |
6c97129d | 510 | fPeakFinder->FindAbsMaxima(); |
511 | //fPeakFinder->FindPeak1(); | |
b1886074 | 512 | AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->NextTrack(); |
6c97129d | 513 | track->SetTrackParameters(fPeakFinder->GetXPeak(0),fPeakFinder->GetYPeak(0),fPeakFinder->GetWeight(0)); |
514 | track->SetEtaIndex(i); | |
515 | track->SetEta(tr->GetEta(i,fCurrentSlice)); | |
3e87ef69 | 516 | /* |
6c97129d | 517 | Int_t nrows=0; |
518 | if(!ev->LookInsideRoad(track,nrows)) | |
b1886074 | 519 | { |
520 | tracks->Remove(tracks->GetNTracks()-1); | |
521 | tracks->Compress(); | |
522 | } | |
3e87ef69 | 523 | */ |
b1886074 | 524 | } |
525 | } | |
6c97129d | 526 | fTracks[0]->QSort(); |
b1886074 | 527 | LOG(AliL3Log::kInformational,"AliL3Hough::ProcessPatch","NTracks") |
528 | <<AliL3Log::kDec<<"Found "<<tracks->GetNTracks()<<" tracks in patch "<<patch<<ENDLOG; | |
529 | } | |
530 | ||
a6008206 | 531 | void AliL3Hough::AddAllHistograms() |
4fc9a6a4 | 532 | { |
a6008206 | 533 | //Add the histograms within one etaslice. |
534 | //Resulting histogram are in patch=0. | |
b1886074 | 535 | |
0309a5ee | 536 | Double_t initTime,cpuTime; |
537 | initTime = GetCpuTime(); | |
3e87ef69 | 538 | fBenchmark->Start("Add Histograms"); |
a6008206 | 539 | for(Int_t i=0; i<fNEtaSegments; i++) |
540 | { | |
541 | AliL3Histogram *hist0 = fHoughTransformer[0]->GetHistogram(i); | |
1c404dd5 | 542 | for(Int_t j=1; j<fNPatches; j++) |
a6008206 | 543 | { |
544 | AliL3Histogram *hist = fHoughTransformer[j]->GetHistogram(i); | |
545 | hist0->Add(hist); | |
546 | } | |
547 | } | |
3e87ef69 | 548 | fBenchmark->Stop("Add Histograms"); |
b1886074 | 549 | fAddHistograms = kTRUE; |
0309a5ee | 550 | cpuTime = GetCpuTime() - initTime; |
551 | LOG(AliL3Log::kInformational,"AliL3Hough::AddAllHistograms()","Timing") | |
552 | <<"Adding histograms in "<<cpuTime*1000<<" ms"<<ENDLOG; | |
a6008206 | 553 | } |
554 | ||
b2a02bce | 555 | void AliL3Hough::AddTracks() |
556 | { | |
557 | if(!fTracks[0]) | |
558 | { | |
559 | cerr<<"AliL3Hough::AddTracks : No tracks"<<endl; | |
560 | return; | |
561 | } | |
562 | AliL3TrackArray *tracks = fTracks[0]; | |
563 | for(Int_t i=0; i<tracks->GetNTracks(); i++) | |
564 | { | |
565 | AliL3Track *track = tracks->GetCheckedTrack(i); | |
566 | if(!track) continue; | |
567 | if(track->GetNHits()!=1) cerr<<"NHITS "<<track->GetNHits()<<endl; | |
568 | UInt_t *ids = track->GetHitNumbers(); | |
569 | ids[0] = (fCurrentSlice&0x7f)<<25; | |
570 | } | |
571 | ||
572 | fGlobalTracks->AddTracks(fTracks[0],0,fCurrentSlice); | |
573 | } | |
574 | ||
a6008206 | 575 | void AliL3Hough::FindTrackCandidates() |
576 | { | |
577 | //Look for peaks in histograms, and find the track candidates | |
578 | ||
a6008206 | 579 | Int_t n_patches; |
580 | if(fAddHistograms) | |
b46b53c1 | 581 | n_patches = 1; //Histograms have been added. |
a6008206 | 582 | else |
1c404dd5 | 583 | n_patches = fNPatches; |
b1886074 | 584 | |
0309a5ee | 585 | Double_t initTime,cpuTime; |
586 | initTime = GetCpuTime(); | |
3e87ef69 | 587 | fBenchmark->Start("Find Maxima"); |
a6008206 | 588 | for(Int_t i=0; i<n_patches; i++) |
589 | { | |
237d3f5c | 590 | AliL3HoughBaseTransformer *tr = fHoughTransformer[i]; |
b1886074 | 591 | fTracks[i]->Reset(); |
6c97129d | 592 | |
a6008206 | 593 | for(Int_t j=0; j<fNEtaSegments; j++) |
594 | { | |
595 | AliL3Histogram *hist = tr->GetHistogram(j); | |
b1886074 | 596 | if(hist->GetNEntries()==0) continue; |
3fe49b5b | 597 | fPeakFinder->Reset(); |
a6008206 | 598 | fPeakFinder->SetHistogram(hist); |
b2a02bce | 599 | |
3bb06991 | 600 | //fPeakFinder->FindAbsMaxima(); |
b2a02bce | 601 | fPeakFinder->SetThreshold(fPeakThreshold[i]); |
602 | fPeakFinder->FindAdaptedPeaks(6); | |
603 | //fPeakFinder->FindMaxima(fPeakThreshold[i]); //Simple maxima finder | |
604 | ||
3fe49b5b | 605 | for(Int_t k=0; k<fPeakFinder->GetEntries(); k++) |
a6008206 | 606 | { |
b1886074 | 607 | AliL3HoughTrack *track = (AliL3HoughTrack*)fTracks[i]->NextTrack(); |
3fe49b5b | 608 | track->SetTrackParameters(fPeakFinder->GetXPeak(k),fPeakFinder->GetYPeak(k),fPeakFinder->GetWeight(k)); |
a6008206 | 609 | track->SetEtaIndex(j); |
afd8fed4 | 610 | track->SetEta(tr->GetEta(j,fCurrentSlice)); |
26abc209 | 611 | track->SetRowRange(AliL3Transform::GetFirstRow(0),AliL3Transform::GetLastRow(5)); |
a6008206 | 612 | } |
613 | } | |
b2a02bce | 614 | cout<<"Found "<<fTracks[i]->GetNTracks()<<" tracks in patch "<<i<<endl; |
b1886074 | 615 | fTracks[i]->QSort(); |
a6008206 | 616 | } |
3e87ef69 | 617 | fBenchmark->Stop("Find Maxima"); |
0309a5ee | 618 | cpuTime = GetCpuTime() - initTime; |
619 | LOG(AliL3Log::kInformational,"AliL3Hough::FindTrackCandidates()","Timing") | |
620 | <<"Maxima finding done in "<<cpuTime*1000<<" ms"<<ENDLOG; | |
a6008206 | 621 | } |
622 | ||
3fe49b5b | 623 | void AliL3Hough::InitEvaluate() |
624 | { | |
625 | //Pass the transformer objects to the AliL3HoughEval objects: | |
626 | //This will provide the evaluation objects with all the necessary | |
208b54c5 | 627 | //data and parameters it needs. |
3fe49b5b | 628 | |
629 | for(Int_t i=0; i<fNPatches; i++) | |
630 | fEval[i]->InitTransformer(fHoughTransformer[i]); | |
631 | } | |
632 | ||
0309a5ee | 633 | Int_t AliL3Hough::Evaluate(Int_t road_width,Int_t nrowstomiss) |
a6008206 | 634 | { |
635 | //Evaluate the tracks, by looking along the road in the raw data. | |
3fe49b5b | 636 | //If track does not cross all padrows - rows2miss, it is removed from the arrray. |
0309a5ee | 637 | //If histograms were not added, the check is done locally in patch, |
638 | //meaning that nrowstomiss is the number of padrows the road can miss with respect | |
639 | //to the number of rows in the patch. | |
640 | //If the histograms were added, the comparison is done globally in the _slice_, | |
641 | //meaing that nrowstomiss is the number of padrows the road can miss with | |
642 | //respect to the total number of padrows in the slice. | |
643 | // | |
644 | //Return value = number of tracks which were removed (only in case of fAddHistograms) | |
a6008206 | 645 | |
b1886074 | 646 | if(!fTracks[0]) |
a6008206 | 647 | { |
b1886074 | 648 | LOG(AliL3Log::kError,"AliL3Hough::Evaluate","Track Array") |
649 | <<"No tracks to work with..."<<ENDLOG; | |
0309a5ee | 650 | return 0; |
a6008206 | 651 | } |
652 | ||
0309a5ee | 653 | Int_t removed_tracks=0; |
654 | AliL3TrackArray *tracks=0; | |
a4639de2 | 655 | |
0309a5ee | 656 | if(fAddHistograms) |
a4639de2 | 657 | { |
0309a5ee | 658 | tracks = fTracks[0]; |
0309a5ee | 659 | for(Int_t i=0; i<tracks->GetNTracks(); i++) |
a6008206 | 660 | { |
a4639de2 | 661 | AliL3Track *track = tracks->GetCheckedTrack(i); |
662 | if(!track) continue; | |
663 | track->SetNHits(0); | |
0309a5ee | 664 | } |
f80b98cb | 665 | } |
f000f8a5 | 666 | |
a4639de2 | 667 | for(Int_t i=0; i<fNPatches; i++) |
668 | EvaluatePatch(i,road_width,nrowstomiss); | |
669 | ||
aa641eb8 | 670 | //Here we check the tracks globally; |
671 | //how many good rows (padrows with signal) | |
672 | //did it cross in the slice | |
673 | if(fAddHistograms) | |
0309a5ee | 674 | { |
675 | for(Int_t j=0; j<tracks->GetNTracks(); j++) | |
676 | { | |
a4639de2 | 677 | AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(j); |
678 | ||
679 | if(track->GetNHits() < AliL3Transform::GetNRows() - nrowstomiss) | |
0309a5ee | 680 | { |
681 | tracks->Remove(j); | |
682 | removed_tracks++; | |
683 | } | |
684 | } | |
685 | tracks->Compress(); | |
686 | tracks->QSort(); | |
687 | } | |
a4639de2 | 688 | |
689 | return removed_tracks; | |
690 | } | |
691 | ||
692 | void AliL3Hough::EvaluatePatch(Int_t i,Int_t road_width,Int_t nrowstomiss) | |
693 | { | |
694 | //Evaluate patch i. | |
0309a5ee | 695 | |
a4639de2 | 696 | fEval[i]->InitTransformer(fHoughTransformer[i]); |
697 | fEval[i]->SetNumOfPadsToLook(road_width); | |
698 | fEval[i]->SetNumOfRowsToMiss(nrowstomiss); | |
699 | //fEval[i]->RemoveFoundTracks(); | |
0309a5ee | 700 | |
a4639de2 | 701 | AliL3TrackArray *tracks=0; |
702 | ||
703 | if(!fAddHistograms) | |
704 | tracks = fTracks[i]; | |
705 | else | |
706 | tracks = fTracks[0]; | |
707 | ||
708 | Int_t nrows=0; | |
709 | for(Int_t j=0; j<tracks->GetNTracks(); j++) | |
710 | { | |
711 | AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(j); | |
712 | if(!track) | |
713 | { | |
714 | LOG(AliL3Log::kWarning,"AliL3Hough::EvaluatePatch","Track array") | |
715 | <<"Track object missing!"<<ENDLOG; | |
716 | continue; | |
717 | } | |
718 | nrows=0; | |
3e87ef69 | 719 | Int_t rowrange[2] = {AliL3Transform::GetFirstRow(i),AliL3Transform::GetLastRow(i)}; |
720 | Bool_t result = fEval[i]->LookInsideRoad(track,nrows,rowrange); | |
a4639de2 | 721 | if(fAddHistograms) |
722 | { | |
723 | Int_t pre=track->GetNHits(); | |
724 | track->SetNHits(pre+nrows); | |
725 | } | |
3e87ef69 | 726 | else//the track crossed too few good padrows (padrows with signal) in the patch, so remove it |
727 | { | |
728 | if(result == kFALSE) | |
729 | tracks->Remove(j); | |
730 | } | |
a4639de2 | 731 | } |
732 | ||
733 | tracks->Compress(); | |
a4639de2 | 734 | |
a6008206 | 735 | } |
f80b98cb | 736 | |
44c7f8de | 737 | void AliL3Hough::MergeEtaSlices() |
b1886074 | 738 | { |
44c7f8de | 739 | //Merge tracks found in neighbouring eta slices. |
740 | //Removes the track with the lower weight. | |
741 | ||
3e87ef69 | 742 | fBenchmark->Start("Merge Eta-slices"); |
44c7f8de | 743 | AliL3TrackArray *tracks = fTracks[0]; |
744 | if(!tracks) | |
b1886074 | 745 | { |
44c7f8de | 746 | cerr<<"AliL3Hough::MergeEtaSlices : No tracks "<<endl; |
b1886074 | 747 | return; |
748 | } | |
44c7f8de | 749 | for(Int_t j=0; j<tracks->GetNTracks(); j++) |
b1886074 | 750 | { |
44c7f8de | 751 | AliL3HoughTrack *track1 = (AliL3HoughTrack*)tracks->GetCheckedTrack(j); |
752 | if(!track1) continue; | |
753 | for(Int_t k=j+1; k<tracks->GetNTracks(); k++) | |
754 | { | |
755 | AliL3HoughTrack *track2 = (AliL3HoughTrack*)tracks->GetCheckedTrack(k); | |
756 | if(!track2) continue; | |
757 | if(abs(track1->GetEtaIndex() - track2->GetEtaIndex()) != 1) continue; | |
3e87ef69 | 758 | if(fabs(track1->GetKappa()-track2->GetKappa()) < 0.006 && |
759 | fabs(track1->GetPsi()- track2->GetPsi()) < 0.1) | |
44c7f8de | 760 | { |
3e87ef69 | 761 | //cout<<"Merging track in slices "<<track1->GetEtaIndex()<<" "<<track2->GetEtaIndex()<<endl; |
762 | if(track1->GetWeight() > track2->GetWeight()) | |
763 | tracks->Remove(k); | |
764 | else | |
765 | tracks->Remove(j); | |
44c7f8de | 766 | } |
767 | } | |
b1886074 | 768 | } |
3e87ef69 | 769 | fBenchmark->Stop("Merge Eta-slices"); |
44c7f8de | 770 | tracks->Compress(); |
b1886074 | 771 | } |
772 | ||
b2a02bce | 773 | void AliL3Hough::WriteTracks(Char_t *path) |
774 | { | |
775 | //cout<<"AliL3Hough::WriteTracks : Sorting the tracsk"<<endl; | |
776 | //fGlobalTracks->QSort(); | |
777 | ||
778 | Char_t filename[1024]; | |
779 | sprintf(filename,"%s/tracks_%d.raw",path,fEvent); | |
780 | AliL3MemHandler mem; | |
781 | mem.SetBinaryOutput(filename); | |
782 | mem.TrackArray2Binary(fGlobalTracks); | |
783 | mem.CloseBinaryOutput(); | |
784 | fGlobalTracks->Reset(); | |
785 | } | |
786 | ||
3fe49b5b | 787 | void AliL3Hough::WriteTracks(Int_t slice,Char_t *path) |
1c404dd5 | 788 | { |
c2f25cd2 | 789 | |
3e87ef69 | 790 | AliL3MemHandler mem; |
95a00d93 | 791 | Char_t fname[100]; |
b5a207b4 | 792 | if(fAddHistograms) |
793 | { | |
b2a02bce | 794 | sprintf(fname,"%s/tracks_ho_%d_%d.raw",path,fEvent,slice); |
3e87ef69 | 795 | mem.SetBinaryOutput(fname); |
796 | mem.TrackArray2Binary(fTracks[0]); | |
797 | mem.CloseBinaryOutput(); | |
b5a207b4 | 798 | } |
799 | else | |
800 | { | |
801 | for(Int_t i=0; i<fNPatches; i++) | |
802 | { | |
b2a02bce | 803 | sprintf(fname,"%s/tracks_ho_%d_%d_%d.raw",path,fEvent,slice,i); |
3e87ef69 | 804 | mem.SetBinaryOutput(fname); |
805 | mem.TrackArray2Binary(fTracks[i]); | |
806 | mem.CloseBinaryOutput(); | |
b5a207b4 | 807 | } |
808 | } | |
1c404dd5 | 809 | } |
208b54c5 | 810 | |
a6008206 | 811 | void AliL3Hough::WriteDigits(Char_t *outfile) |
812 | { | |
208b54c5 | 813 | #ifdef use_aliroot |
a6008206 | 814 | //Write the current data to a new rootfile. |
815 | ||
1c404dd5 | 816 | for(Int_t i=0; i<fNPatches; i++) |
a6008206 | 817 | { |
818 | AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer[i]->GetDataPointer(); | |
819 | fMemHandler[i]->AliDigits2RootFile(tempPt,outfile); | |
820 | } | |
208b54c5 | 821 | #else |
822 | cerr<<"AliL3Hough::WriteDigits : You need to compile with AliROOT!"<<endl; | |
823 | return; | |
824 | #endif | |
4fc9a6a4 | 825 | } |
208b54c5 | 826 | |
0309a5ee | 827 | Double_t AliL3Hough::GetCpuTime() |
828 | { | |
829 | //Return the Cputime in seconds. | |
830 | struct timeval tv; | |
831 | gettimeofday( &tv, NULL ); | |
832 | return tv.tv_sec+(((Double_t)tv.tv_usec)/1000000.); | |
0309a5ee | 833 | } |
60a3d829 | 834 |