3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ASV
12 #include "AliL3MemHandler.h"
13 #include "GetGoodParticles.h"
14 #include "AliL3TrackArray.h"
15 #include "AliL3Logging.h"
16 #include "AliL3HoughEval.h"
17 #include "AliL3HoughTransformer.h"
18 #include "AliL3DigitData.h"
19 #include "AliL3HoughTrack.h"
20 #include "AliL3Transform.h"
21 #include "AliL3Histogram.h"
22 #include "AliL3Histogram1D.h"
23 #include "AliL3Defs.h"
25 //_____________________________________________________________
28 // Evaluation class for tracklets produced by the Hough transform.
30 ClassImp(AliL3HoughEval)
32 AliL3HoughEval::AliL3HoughEval()
35 fTransform = new AliL3Transform();
36 fRemoveFoundTracks = kFALSE;
44 AliL3HoughEval::~AliL3HoughEval()
46 fHoughTransformer = 0;
51 for(Int_t i=0; i<fNrows; i++)
53 delete [] fRowPointers;
57 void AliL3HoughEval::InitTransformer(AliL3HoughTransformer *transformer)
59 fHoughTransformer = transformer;
60 fSlice = fHoughTransformer->GetSlice();
61 fPatch = fHoughTransformer->GetPatch();
62 fNrows = NRows[fPatch][1] - NRows[fPatch][0] + 1;
63 fNEtaSegments = fHoughTransformer->GetNEtaSegments();
64 fEtaMin = fHoughTransformer->GetEtaMin();
65 fEtaMax = fHoughTransformer->GetEtaMax();
69 void AliL3HoughEval::GenerateLUT()
71 //Generate a Look-up table, to limit the access to raw data
74 fRowPointers = new AliL3DigitRowData*[fNrows];
76 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer->GetDataPointer();
78 printf("\nAliL3HoughEval::GenerateLUT : Zero data pointer\n");
80 for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++)
82 Int_t prow = i - NRows[fPatch][0];
83 fRowPointers[prow] = tempPt;
84 AliL3MemHandler::UpdateRowPointer(tempPt);
89 Bool_t AliL3HoughEval::LookInsideRoad(AliL3HoughTrack *track,Int_t eta_index,Bool_t remove)
91 //Look at rawdata along the road specified by the track candidates.
92 //If track is good, return true, if not return false.
96 Int_t nrow=0,npixs=0,rows_crossed=0;
99 Int_t total_charge=0;//total charge along the road
100 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
103 //Check if the track is leaving the sector at some point
105 Double_t angle=Pi/18;
106 track->CalculateEdgePoint(angle);
107 if(!track->IsPoint())
109 track->CalculateEdgePoint(-1.*angle);
111 maxrow = track->GetPointX();
114 maxrow = track->GetPointX();
116 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
118 if(fTransform->Row2X(padrow) > maxrow) break;//The track has left this slice
120 Int_t prow = padrow - NRows[fPatch][0];
121 if(!track->GetCrossingPoint(padrow,xyz))
123 //printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!; pt %f phi0 %f\n",track->GetPt(),track->GetPhi0());
127 fTransform->Slice2Sector(fSlice,padrow,sector,row);
128 fTransform->Local2Raw(xyz,sector,row);
132 //Get the timebins for this pad
133 AliL3DigitRowData *tempPt = fRowPointers[prow];
136 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
140 //Look at both sides of the pad:
141 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
143 AliL3DigitData *digPt = tempPt->fDigitData;
144 for(UInt_t j=0; j<tempPt->fNDigit; j++)
146 //if(digPt->fCharge <= fHoughTransformer->GetThreshold()) continue;
147 UChar_t pad = digPt[j].fPad;
148 if(pad < p) continue;
150 UShort_t time = digPt[j].fTime;
151 Double_t eta = fTransform->GetEta(padrow,pad,time);
152 Int_t pixel_index = (Int_t)(eta/etaslice);
153 if(pixel_index > eta_index) continue;
154 if(pixel_index != eta_index) break;
155 total_charge += digPt[j].fCharge;
157 digPt[j].fCharge = 0; //Erease the track from image
162 if(npixs > 1)//At least 2 digits on this padrow
170 if(nrow >= rows_crossed - fNumOfRowsToMiss)//this was a good track
172 Double_t eta_track = (Double_t)eta_index*etaslice;
173 track->SetEtaIndex(eta_index);
174 track->SetWeight(total_charge,kTRUE);
175 track->SetEta(eta_track);
176 track->SetRowRange(NRows[fPatch][0],NRows[fPatch][1]);
177 track->SetSlice(fSlice);
178 if(fRemoveFoundTracks)
179 LookInsideRoad(track,eta_index,kTRUE);
186 void AliL3HoughEval::FindEta(AliL3TrackArray *tracks)
192 Int_t ntracks = tracks->GetNTracks();
193 fEtaHistos = new AliL3Histogram1D*[ntracks];
196 for(Int_t i=0; i<ntracks; i++)
198 sprintf(hname,"etahist_%d",i);
199 fEtaHistos[i] = new AliL3Histogram1D(hname,hname,100,0,1);
201 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
203 for(Int_t ntr=0; ntr<ntracks; ntr++)
205 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(ntr);
207 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
209 Int_t prow = padrow - NRows[fPatch][0];
211 if(!track->GetCrossingPoint(padrow,xyz))
213 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
217 fTransform->Slice2Sector(fSlice,padrow,sector,row);
218 fTransform->Local2Raw(xyz,sector,row);
220 //Get the timebins for this pad
221 AliL3DigitRowData *tempPt = fRowPointers[prow];
224 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
228 //Look at both sides of the pad:
229 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
231 AliL3DigitData *digPt = tempPt->fDigitData;
232 for(UInt_t j=0; j<tempPt->fNDigit; j++)
234 UChar_t pad = digPt[j].fPad;
236 if(pad < p) continue;
238 UShort_t time = digPt[j].fTime;
239 Double_t eta = fTransform->GetEta(padrow,pad,time);
240 Int_t pixel_index = (Int_t)(eta/etaslice);
241 if(pixel_index > track->GetEtaIndex()+1) continue;
242 if(pixel_index < track->GetEtaIndex()-1) break;
243 fEtaHistos[ntr]->Fill(eta,digPt[j].fCharge);
249 for(Int_t i=0; i<ntracks; i++)
251 AliL3Histogram1D *hist = fEtaHistos[i];
252 Int_t max_bin = hist->GetMaximumBin();
253 Double_t max_value = hist->GetBinContent(max_bin);
254 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
256 if(hist->GetBinContent(max_bin-1)<max_value && hist->GetBinContent(max_bin+1)<max_value)
258 track->SetWeight((Int_t)max_value,kTRUE);
259 track->SetEta(hist->GetBinCenter(max_bin));
260 track->SetNHits(track->GetWeight());
265 tracks->Remove(i); //remove this track, because it was not a peak
270 //for(Int_t i=0; i<ntracks; i++)
271 //delete fEtaHistos[i];
272 //delete [] fEtaHistos;
275 void AliL3HoughEval::DisplayEtaSlice(Int_t eta_index,AliL3Histogram *hist)
277 //Display the current raw data inside the (slice,patch)
281 printf("AliL3HoughEval::DisplayEtaSlice : No input histogram!\n");
285 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
286 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
288 Int_t prow = padrow - NRows[fPatch][0];
290 AliL3DigitRowData *tempPt = fRowPointers[prow];
293 printf("AliL3HoughEval::DisplayEtaSlice : Zero data pointer\n");
297 AliL3DigitData *digPt = tempPt->fDigitData;
298 if((Int_t)tempPt->fRow != padrow)
300 printf("\nAliL3HoughEval::DisplayEtaSlice : Mismatching padrows!!!\n");
303 for(UInt_t j=0; j<tempPt->fNDigit; j++)
305 UChar_t pad = digPt[j].fPad;
306 UChar_t charge = digPt[j].fCharge;
307 UShort_t time = digPt[j].fTime;
308 if(charge < fHoughTransformer->GetThreshold()) continue;
311 fTransform->Slice2Sector(fSlice,padrow,sector,row);
312 fTransform->Raw2Local(xyz,sector,row,pad,time);
313 Double_t eta = fTransform->GetEta(xyz);
314 Int_t pixel_index = (Int_t)(eta/etaslice);
315 if(pixel_index != eta_index) continue;
316 hist->Fill(xyz[0],xyz[1],charge);
323 void AliL3HoughEval::CompareMC(AliL3TrackArray *tracks,Char_t *trackfile,Int_t threshold)
326 struct GoodTrack goodtracks[15000];
328 ifstream in(trackfile);
331 printf("Reading good tracks from file %s\n",trackfile);
332 while (in>>goodtracks[nt].label>>goodtracks[nt].code>>
333 goodtracks[nt].px>>goodtracks[nt].py>>goodtracks[nt].pz>>
334 goodtracks[nt].pt>>goodtracks[nt].eta>>goodtracks[nt].nhits)
339 cerr<<"Too many good tracks"<<endl;
345 LOG(AliL3Log::kError,"AliL3HoughEval::CompareMC","Input file")
346 <<"Error in file reading"<<ENDLOG;
352 LOG(AliL3Log::kError,"AliL3HoughEval::CompareMC","Input")
353 <<"No input trackfile "<<trackfile<<ENDLOG;
356 Int_t *particles = new Int_t[fNEtaSegments];
357 Int_t *ftracks = new Int_t[fNEtaSegments];
358 for(Int_t i=0; i<fNEtaSegments; i++)
364 TH1F *ptgood = new TH1F("ptgood","ptgood",5,0,2);
365 TH1F *ptfound = new TH1F("ptfound","ptgood",5,0,2);
366 TH1F *pteff = new TH1F("pteff","pteff",5,0,2);
367 TH1F *etafound = new TH1F("etafound","etafound",5,0,1);
368 TH1F *etagood = new TH1F("etagood","etagood",5,0,1);
369 TH1F *etaeff = new TH1F("etaeff","etaeff",5,0,1);
371 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
372 for(Int_t i=0; i<tracks->GetNTracks(); i++)
374 AliL3HoughTrack *tr = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
376 if(tr->GetWeight()<threshold) continue;
377 Int_t trackindex = tr->GetEtaIndex();
378 if(trackindex <0 || trackindex >= fNEtaSegments) continue;
379 ftracks[trackindex]++;
380 ptfound->Fill(tr->GetPt());
381 etafound->Fill(tr->GetEta());
383 for(Int_t i=0; i<nt; i++)
385 if(goodtracks[i].nhits < 174) continue;
386 if(goodtracks[i].pt < 0.2) continue;
387 Int_t particleindex = (Int_t)(goodtracks[i].eta/etaslice);
388 if(particleindex < 0 || particleindex >= fNEtaSegments) continue;
389 particles[particleindex]++;
390 ptgood->Fill(goodtracks[i].pt);
391 etagood->Fill(goodtracks[i].eta);
396 for(Int_t i=0; i<fNEtaSegments; i++)
398 //printf("Slice %d : Found tracks %d, good tracks %d\n",i,ftracks[i],particles[i]);
400 good += particles[i];
402 printf("And the total efficiency was: %f\n",found/good);
404 ptgood->Sumw2(); ptfound->Sumw2();
405 etagood->Sumw2(); etafound->Sumw2();
406 pteff->Divide(ptfound,ptgood,1,1,"b");
407 etaeff->Divide(etafound,etagood,1,1,"b");
408 TFile *file = TFile::Open("eff.root","RECREATE");