3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ASV
12 #include "AliL3MemHandler.h"
13 #include "AliL3TrackArray.h"
14 #include "AliL3Logging.h"
15 #include "AliL3HoughEval.h"
16 #include "AliL3HoughBaseTransformer.h"
17 #include "AliL3DigitData.h"
18 #include "AliL3HoughTrack.h"
19 #include "AliL3Transform.h"
20 #include "AliL3Histogram.h"
21 #include "AliL3Histogram1D.h"
23 //_____________________________________________________________
26 // Evaluation class for tracklets produced by the Hough transform.
28 ClassImp(AliL3HoughEval)
30 AliL3HoughEval::AliL3HoughEval()
33 fRemoveFoundTracks = kFALSE;
41 AliL3HoughEval::~AliL3HoughEval()
43 fHoughTransformer = 0;
46 for(Int_t i=0; i<fNrows; i++)
48 delete [] fRowPointers;
52 void AliL3HoughEval::InitTransformer(AliL3HoughBaseTransformer *transformer)
54 fHoughTransformer = transformer;
55 fSlice = fHoughTransformer->GetSlice();
56 fPatch = fHoughTransformer->GetPatch();
57 fNrows = AliL3Transform::GetLastRow(fPatch) - AliL3Transform::GetFirstRow(fPatch) + 1;
58 fNEtaSegments = fHoughTransformer->GetNEtaSegments();
59 fEtaMin = fHoughTransformer->GetEtaMin();
60 fEtaMax = fHoughTransformer->GetEtaMax();
64 void AliL3HoughEval::GenerateLUT()
66 //Generate a Look-up table, to limit the access to raw data
69 fRowPointers = new AliL3DigitRowData*[fNrows];
71 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer->GetDataPointer();
73 printf("\nAliL3HoughEval::GenerateLUT : Zero data pointer\n");
75 for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++)
77 Int_t prow = i - AliL3Transform::GetFirstRow(fPatch);
78 fRowPointers[prow] = tempPt;
79 AliL3MemHandler::UpdateRowPointer(tempPt);
84 Bool_t AliL3HoughEval::LookInsideRoad(AliL3HoughTrack *track,Int_t &nrows_crossed,Bool_t remove)
86 //Look at rawdata along the road specified by the track candidates.
87 //If track is good, return true, if not return false.
91 Int_t nrow=0,npixs=0;//,rows_crossed=0;
94 Int_t total_charge=0;//total charge along the road
96 for(Int_t padrow = AliL3Transform::GetFirstRow(fPatch); padrow <= AliL3Transform::GetLastRow(fPatch); padrow++)
98 //if(AliL3Transform::Row2X(padrow) > maxrow) break;//The track has left this slice
101 Int_t prow = padrow - AliL3Transform::GetFirstRow(fPatch);
102 if(!track->GetCrossingPoint(padrow,xyz))
107 AliL3Transform::Slice2Sector(fSlice,padrow,sector,row);
108 AliL3Transform::Local2Raw(xyz,sector,row);
111 //Get the timebins for this pad
112 AliL3DigitRowData *tempPt = fRowPointers[prow];
115 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
119 //Look at both sides of the pad:
120 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
122 AliL3DigitData *digPt = tempPt->fDigitData;
123 for(UInt_t j=0; j<tempPt->fNDigit; j++)
125 UChar_t pad = digPt[j].fPad;
126 Int_t charge = digPt[j].fCharge;
127 if(charge <= fHoughTransformer->GetLowerThreshold()) continue;
128 if(pad < p) continue;
130 UShort_t time = digPt[j].fTime;
131 Double_t eta = AliL3Transform::GetEta(padrow,pad,time);
132 Int_t pixel_index = fHoughTransformer->GetEtaIndex(eta);
133 if(pixel_index > track->GetEtaIndex()) continue;
134 if(pixel_index != track->GetEtaIndex()) continue;
135 total_charge += digPt[j].fCharge;
137 digPt[j].fCharge = 0; //Erase the track from image
142 if(npixs > 1)//At least 2 digits on this padrow
150 nrows_crossed += nrow; //Update the number of rows crossed.
152 if(nrow >= AliL3Transform::GetNRows(fPatch) - fNumOfRowsToMiss)//this was a good track
154 if(fRemoveFoundTracks)
157 LookInsideRoad(track,dummy,kTRUE);
165 void AliL3HoughEval::FindEta(AliL3TrackArray *tracks)
171 Int_t ntracks = tracks->GetNTracks();
172 fEtaHistos = new AliL3Histogram1D*[ntracks];
175 for(Int_t i=0; i<ntracks; i++)
177 sprintf(hname,"etahist_%d",i);
178 fEtaHistos[i] = new AliL3Histogram1D(hname,hname,100,0,1);
180 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
182 for(Int_t ntr=0; ntr<ntracks; ntr++)
184 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(ntr);
186 for(Int_t padrow = AliL3Transform::GetFirstRow(fPatch); padrow <= AliL3Transform::GetLastRow(fPatch); padrow++)
188 Int_t prow = padrow - AliL3Transform::GetFirstRow(fPatch);
190 if(!track->GetCrossingPoint(padrow,xyz))
192 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
196 AliL3Transform::Slice2Sector(fSlice,padrow,sector,row);
197 AliL3Transform::Local2Raw(xyz,sector,row);
199 //Get the timebins for this pad
200 AliL3DigitRowData *tempPt = fRowPointers[prow];
203 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
207 //Look at both sides of the pad:
208 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
210 AliL3DigitData *digPt = tempPt->fDigitData;
211 for(UInt_t j=0; j<tempPt->fNDigit; j++)
213 UChar_t pad = digPt[j].fPad;
214 Int_t charge = digPt[j].fCharge;
215 if(charge <= fHoughTransformer->GetLowerThreshold()) continue;
216 if(pad < p) continue;
218 UShort_t time = digPt[j].fTime;
219 Double_t eta = AliL3Transform::GetEta(padrow,pad,time);
220 Int_t pixel_index = (Int_t)(eta/etaslice);
221 if(pixel_index > track->GetEtaIndex()+1) continue;
222 if(pixel_index < track->GetEtaIndex()-1) break;
223 fEtaHistos[ntr]->Fill(eta,digPt[j].fCharge);
229 for(Int_t i=0; i<ntracks; i++)
231 AliL3Histogram1D *hist = fEtaHistos[i];
232 Int_t max_bin = hist->GetMaximumBin();
233 Double_t max_value = hist->GetBinContent(max_bin);
234 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
236 if(hist->GetBinContent(max_bin-1)<max_value && hist->GetBinContent(max_bin+1)<max_value)
238 track->SetWeight((Int_t)max_value,kTRUE);
239 track->SetEta(hist->GetBinCenter(max_bin));
240 track->SetNHits(track->GetWeight());
245 tracks->Remove(i); //remove this track, because it was not a peak
250 //for(Int_t i=0; i<ntracks; i++)
251 //delete fEtaHistos[i];
252 //delete [] fEtaHistos;
255 void AliL3HoughEval::DisplayEtaSlice(Int_t eta_index,AliL3Histogram *hist)
257 //Display the current raw data inside the (slice,patch)
261 printf("AliL3HoughEval::DisplayEtaSlice : No input histogram!\n");
265 for(Int_t padrow = AliL3Transform::GetFirstRow(fPatch); padrow <= AliL3Transform::GetLastRow(fPatch); padrow++)
267 Int_t prow = padrow - AliL3Transform::GetFirstRow(fPatch);
269 AliL3DigitRowData *tempPt = fRowPointers[prow];
272 printf("AliL3HoughEval::DisplayEtaSlice : Zero data pointer\n");
276 AliL3DigitData *digPt = tempPt->fDigitData;
277 if((Int_t)tempPt->fRow != padrow)
279 printf("\nAliL3HoughEval::DisplayEtaSlice : Mismatching padrows!!!\n");
282 for(UInt_t j=0; j<tempPt->fNDigit; j++)
284 UChar_t pad = digPt[j].fPad;
285 UChar_t charge = digPt[j].fCharge;
286 UShort_t time = digPt[j].fTime;
287 if((Int_t)charge <= fHoughTransformer->GetLowerThreshold() || (Int_t)charge >= fHoughTransformer->GetUpperThreshold()) continue;
290 AliL3Transform::Slice2Sector(fSlice,padrow,sector,row);
291 AliL3Transform::Raw2Local(xyz,sector,row,pad,time);
292 Double_t eta = AliL3Transform::GetEta(xyz);
293 Int_t pixel_index = fHoughTransformer->GetEtaIndex(eta);//(Int_t)(eta/etaslice);
294 if(pixel_index != eta_index) continue;
295 hist->Fill(xyz[0],xyz[1],charge);
302 void AliL3HoughEval::CompareMC(AliL3TrackArray *tracks,Char_t *trackfile,Int_t threshold)
305 struct GoodTrack goodtracks[15000];
307 ifstream in(trackfile);
310 printf("Reading good tracks from file %s\n",trackfile);
311 while (in>>goodtracks[nt].label>>goodtracks[nt].code>>
312 goodtracks[nt].px>>goodtracks[nt].py>>goodtracks[nt].pz>>
313 goodtracks[nt].pt>>goodtracks[nt].eta>>goodtracks[nt].nhits)
318 cerr<<"Too many good tracks"<<endl;
324 LOG(AliL3Log::kError,"AliL3HoughEval::CompareMC","Input file")
325 <<"Error in file reading"<<ENDLOG;
331 LOG(AliL3Log::kError,"AliL3HoughEval::CompareMC","Input")
332 <<"No input trackfile "<<trackfile<<ENDLOG;
335 Int_t *particles = new Int_t[fNEtaSegments];
336 Int_t *ftracks = new Int_t[fNEtaSegments];
337 for(Int_t i=0; i<fNEtaSegments; i++)
343 TH1F *ptgood = new TH1F("ptgood","ptgood",5,0,2);
344 TH1F *ptfound = new TH1F("ptfound","ptgood",5,0,2);
345 TH1F *pteff = new TH1F("pteff","pteff",5,0,2);
346 TH1F *etafound = new TH1F("etafound","etafound",5,0,1);
347 TH1F *etagood = new TH1F("etagood","etagood",5,0,1);
348 TH1F *etaeff = new TH1F("etaeff","etaeff",5,0,1);
350 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
351 for(Int_t i=0; i<tracks->GetNTracks(); i++)
353 AliL3HoughTrack *tr = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
355 if(tr->GetWeight()<threshold) continue;
356 Int_t trackindex = tr->GetEtaIndex();
357 if(trackindex <0 || trackindex >= fNEtaSegments) continue;
358 ftracks[trackindex]++;
359 ptfound->Fill(tr->GetPt());
360 etafound->Fill(tr->GetEta());
362 for(Int_t i=0; i<nt; i++)
364 if(goodtracks[i].nhits < 174) continue;
365 if(goodtracks[i].pt < 0.2) continue;
366 Int_t particleindex = (Int_t)(goodtracks[i].eta/etaslice);
367 if(particleindex < 0 || particleindex >= fNEtaSegments) continue;
368 particles[particleindex]++;
369 ptgood->Fill(goodtracks[i].pt);
370 etagood->Fill(goodtracks[i].eta);
375 for(Int_t i=0; i<fNEtaSegments; i++)
377 //printf("Slice %d : Found tracks %d, good tracks %d\n",i,ftracks[i],particles[i]);
379 good += particles[i];
381 printf("And the total efficiency was: %f\n",found/good);
383 ptgood->Sumw2(); ptfound->Sumw2();
384 etagood->Sumw2(); etafound->Sumw2();
385 pteff->Divide(ptfound,ptgood,1,1,"b");
386 etaeff->Divide(etafound,etagood,1,1,"b");
387 TFile *file = TFile::Open("eff.root","RECREATE");