2 // origin: hough/AliL3HoughEval.cxx,v 1.28 Thu Jun 17 10:36:14 2004 UTC by cvetan
4 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
5 //*-- Copyright © ALICE HLT Group
7 #include "AliHLTStdIncludes.h"
12 #include "AliHLTTPCLogging.h"
13 #include "AliHLTTPCHoughEval.h"
14 #include "AliHLTTPCMemHandler.h"
15 #include "AliHLTTPCTrackArray.h"
16 #include "AliHLTTPCHoughTransformer.h"
17 #include "AliHLTTPCDigitData.h"
18 #include "AliHLTTPCHoughTrack.h"
19 #include "AliHLTTPCTransform.h"
20 #include "AliHLTTPCHistogram.h"
21 #include "AliHLTTPCHistogram1D.h"
27 /** /class AliHLTTPCHoughEval
29 //_____________________________________________________________
32 // Evaluation class for tracklets produced by the Hough transform.
37 ClassImp(AliHLTTPCHoughEval)
39 AliHLTTPCHoughEval::AliHLTTPCHoughEval()
42 fRemoveFoundTracks = kFALSE;
50 AliHLTTPCHoughEval::~AliHLTTPCHoughEval()
53 fHoughTransformer = 0;
56 for(Int_t i=0; i<fNrows; i++)
58 delete [] fRowPointers;
62 void AliHLTTPCHoughEval::InitTransformer(AliHLTTPCHoughTransformer *transformer)
64 //Init hough transformer
65 fHoughTransformer = transformer;
66 fSlice = fHoughTransformer->GetSlice();
67 fPatch = fHoughTransformer->GetPatch();
68 fNrows = AliHLTTPCTransform::GetLastRow(fPatch) - AliHLTTPCTransform::GetFirstRow(fPatch) + 1;
69 fNEtaSegments = fHoughTransformer->GetNEtaSegments();
70 fEtaMin = fHoughTransformer->GetEtaMin();
71 fEtaMax = fHoughTransformer->GetEtaMax();
72 fZVertex = fHoughTransformer->GetZVertex();
76 void AliHLTTPCHoughEval::GenerateLUT()
78 //Generate a Look-up table, to limit the access to raw data
81 fRowPointers = new AliHLTTPCDigitRowData*[fNrows];
83 AliHLTTPCDigitRowData *tempPt = (AliHLTTPCDigitRowData*)fHoughTransformer->GetDataPointer();
85 printf("\nAliHLTTPCHoughEval::GenerateLUT : Zero data pointer\n");
87 for(Int_t i=AliHLTTPCTransform::GetFirstRow(fPatch); i<=AliHLTTPCTransform::GetLastRow(fPatch); i++)
89 Int_t prow = i - AliHLTTPCTransform::GetFirstRow(fPatch);
90 fRowPointers[prow] = tempPt;
91 AliHLTTPCMemHandler::UpdateRowPointer(tempPt);
96 Bool_t AliHLTTPCHoughEval::LookInsideRoad(AliHLTTPCHoughTrack *track,Int_t &nrowscrossed,Int_t *rowrange,Bool_t remove)
98 //Look at rawdata along the road specified by the track candidates.
99 //If track is good, return true, if not return false.
103 Int_t nrow=0,npixs=0;//,rows_crossed=0;
106 Int_t totalcharge=0;//total charge along the road
108 //for(Int_t padrow = AliHLTTPCTransform::GetFirstRow(fPatch); padrow <= AliHLTTPCTransform::GetLastRow(fPatch); padrow++)
109 for(Int_t padrow = rowrange[0]; padrow<=rowrange[1]; padrow++)
111 Int_t prow = padrow - AliHLTTPCTransform::GetFirstRow(fPatch);
114 if(!track->GetCrossingPoint(padrow,xyz))
121 track->GetLineCrossingPoint(padrow,xyz);
122 xyz[0] += AliHLTTPCTransform::Row2X(track->GetFirstRow());
123 Float_t r = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]);
124 xyz[2] = r*track->GetTgl();
127 AliHLTTPCTransform::Slice2Sector(fSlice,padrow,sector,row);
128 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
132 //Get the timebins for this pad
133 AliHLTTPCDigitRowData *tempPt = fRowPointers[prow];
136 printf("AliHLTTPCHoughEval::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 AliHLTTPCDigitData *digPt = tempPt->fDigitData;
144 for(UInt_t j=0; j<tempPt->fNDigit; j++)
146 Int_t pad = digPt[j].fPad;
147 Int_t charge = digPt[j].fCharge;
148 if(charge <= fHoughTransformer->GetLowerThreshold()) continue;
149 if(pad < p) continue;
151 UShort_t time = digPt[j].fTime;
152 Double_t eta = AliHLTTPCTransform::GetEta(fSlice,padrow,pad,time);
153 Int_t pixelindex = fHoughTransformer->GetEtaIndex(eta);
154 if(pixelindex != track->GetEtaIndex()) continue;
155 totalcharge += 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 nrowscrossed += nrow; //Update the number of rows crossed.
172 if(nrow >= rowrange[1]-rowrange[0]+1 - fNumOfRowsToMiss)//this was a good track
174 if(fRemoveFoundTracks)
177 LookInsideRoad(track,dummy,rowrange,kTRUE);
185 void AliHLTTPCHoughEval::FindEta(AliHLTTPCTrackArray *tracks)
187 //Find the corresponding eta slice hough space
191 Int_t ntracks = tracks->GetNTracks();
192 fEtaHistos = new AliHLTTPCHistogram1D*[ntracks];
195 for(Int_t i=0; i<ntracks; i++)
197 sprintf(hname,"etahist_%d",i);
198 fEtaHistos[i] = new AliHLTTPCHistogram1D(hname,hname,100,0,1);
200 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
202 for(Int_t ntr=0; ntr<ntracks; ntr++)
204 AliHLTTPCHoughTrack *track = (AliHLTTPCHoughTrack*)tracks->GetCheckedTrack(ntr);
206 for(Int_t padrow = AliHLTTPCTransform::GetFirstRow(fPatch); padrow <= AliHLTTPCTransform::GetLastRow(fPatch); padrow++)
208 Int_t prow = padrow - AliHLTTPCTransform::GetFirstRow(fPatch);
210 if(!track->GetCrossingPoint(padrow,xyz))
212 printf("AliHLTTPCHoughEval::LookInsideRoad : Track does not cross line!!\n");
216 AliHLTTPCTransform::Slice2Sector(fSlice,padrow,sector,row);
217 AliHLTTPCTransform::Local2Raw(xyz,sector,row);
219 //Get the timebins for this pad
220 AliHLTTPCDigitRowData *tempPt = fRowPointers[prow];
223 printf("AliHLTTPCHoughEval::LookInsideRoad : Zero data pointer\n");
227 //Look at both sides of the pad:
228 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
230 AliHLTTPCDigitData *digPt = tempPt->fDigitData;
231 for(UInt_t j=0; j<tempPt->fNDigit; j++)
233 UChar_t pad = digPt[j].fPad;
234 Int_t charge = digPt[j].fCharge;
235 if(charge <= fHoughTransformer->GetLowerThreshold()) continue;
236 if(pad < p) continue;
238 UShort_t time = digPt[j].fTime;
239 Double_t eta = AliHLTTPCTransform::GetEta(fSlice,padrow,pad,time);
240 Int_t pixelindex = (Int_t)(eta/etaslice);
241 if(pixelindex > track->GetEtaIndex()+1) continue;
242 if(pixelindex < track->GetEtaIndex()-1) break;
243 fEtaHistos[ntr]->Fill(eta,digPt[j].fCharge);
249 for(Int_t i=0; i<ntracks; i++)
251 AliHLTTPCHistogram1D *hist = fEtaHistos[i];
252 Int_t maxbin = hist->GetMaximumBin();
253 Double_t maxvalue = hist->GetBinContent(maxbin);
254 AliHLTTPCHoughTrack *track = (AliHLTTPCHoughTrack*)tracks->GetCheckedTrack(i);
256 if(hist->GetBinContent(maxbin-1)<maxvalue && hist->GetBinContent(maxbin+1)<maxvalue)
258 track->SetWeight((Int_t)maxvalue,kTRUE);
259 track->SetEta(hist->GetBinCenter(maxbin));
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 AliHLTTPCHoughEval::DisplayEtaSlice(Int_t etaindex,AliHLTTPCHistogram *hist)
277 //Display the current raw data inside the (slice,patch)
281 printf("AliHLTTPCHoughEval::DisplayEtaSlice : No input histogram!\n");
285 for(Int_t padrow = AliHLTTPCTransform::GetFirstRow(fPatch); padrow <= AliHLTTPCTransform::GetLastRow(fPatch); padrow++)
287 Int_t prow = padrow - AliHLTTPCTransform::GetFirstRow(fPatch);
289 AliHLTTPCDigitRowData *tempPt = fRowPointers[prow];
292 printf("AliHLTTPCHoughEval::DisplayEtaSlice : Zero data pointer\n");
296 AliHLTTPCDigitData *digPt = tempPt->fDigitData;
297 if((Int_t)tempPt->fRow != padrow)
299 printf("\nAliHLTTPCHoughEval::DisplayEtaSlice : Mismatching padrows!!!\n");
302 for(UInt_t j=0; j<tempPt->fNDigit; j++)
304 UChar_t pad = digPt[j].fPad;
305 UChar_t charge = digPt[j].fCharge;
306 UShort_t time = digPt[j].fTime;
307 if((Int_t)charge <= fHoughTransformer->GetLowerThreshold() || (Int_t)charge >= fHoughTransformer->GetUpperThreshold()) continue;
310 AliHLTTPCTransform::Slice2Sector(fSlice,padrow,sector,row);
311 AliHLTTPCTransform::Raw2Local(xyz,sector,row,pad,time);
313 Double_t eta = AliHLTTPCTransform::GetEta(xyz);
314 Int_t pixelindex = fHoughTransformer->GetEtaIndex(eta);//(Int_t)(eta/etaslice);
315 if(pixelindex != etaindex) continue;
316 hist->Fill(xyz[0],xyz[1],charge);
322 void AliHLTTPCHoughEval::CompareMC(AliHLTTPCTrackArray */*tracks*/,Char_t */*trackfile*/,Int_t /*threshold*/)
325 struct GoodTrack goodtracks[15000];
327 ifstream in(trackfile);
330 printf("Reading good tracks from file %s\n",trackfile);
331 while (in>>goodtracks[nt].label>>goodtracks[nt].code>>
332 goodtracks[nt].px>>goodtracks[nt].py>>goodtracks[nt].pz>>
333 goodtracks[nt].pt>>goodtracks[nt].eta>>goodtracks[nt].nhits)
338 cerr<<"Too many good tracks"<<endl;
344 LOG(AliHLTTPCLog::kError,"AliHLTTPCHoughEval::CompareMC","Input file")
345 <<"Error in file reading"<<ENDLOG;
351 LOG(AliHLTTPCLog::kError,"AliHLTTPCHoughEval::CompareMC","Input")
352 <<"No input trackfile "<<trackfile<<ENDLOG;
355 Int_t *particles = new Int_t[fNEtaSegments];
356 Int_t *ftracks = new Int_t[fNEtaSegments];
357 for(Int_t i=0; i<fNEtaSegments; i++)
363 TH1F *ptgood = new TH1F("ptgood","ptgood",5,0,2);
364 TH1F *ptfound = new TH1F("ptfound","ptgood",5,0,2);
365 TH1F *pteff = new TH1F("pteff","pteff",5,0,2);
366 TH1F *etafound = new TH1F("etafound","etafound",5,0,1);
367 TH1F *etagood = new TH1F("etagood","etagood",5,0,1);
368 TH1F *etaeff = new TH1F("etaeff","etaeff",5,0,1);
370 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
371 for(Int_t i=0; i<tracks->GetNTracks(); i++)
373 AliHLTTPCHoughTrack *tr = (AliHLTTPCHoughTrack*)tracks->GetCheckedTrack(i);
375 if(tr->GetWeight()<threshold) continue;
376 Int_t trackindex = tr->GetEtaIndex();
377 if(trackindex <0 || trackindex >= fNEtaSegments) continue;
378 ftracks[trackindex]++;
379 ptfound->Fill(tr->GetPt());
380 etafound->Fill(tr->GetEta());
382 for(Int_t i=0; i<nt; i++)
384 if(goodtracks[i].nhits < 174) continue;
385 if(goodtracks[i].pt < 0.2) continue;
386 Int_t particleindex = (Int_t)(goodtracks[i].eta/etaslice);
387 if(particleindex < 0 || particleindex >= fNEtaSegments) continue;
388 particles[particleindex]++;
389 ptgood->Fill(goodtracks[i].pt);
390 etagood->Fill(goodtracks[i].eta);
395 for(Int_t i=0; i<fNEtaSegments; i++)
397 //printf("Slice %d : Found tracks %d, good tracks %d\n",i,ftracks[i],particles[i]);
399 good += particles[i];
401 printf("And the total efficiency was: %f\n",found/good);
403 ptgood->Sumw2(); ptfound->Sumw2();
404 etagood->Sumw2(); etafound->Sumw2();
405 pteff->Divide(ptfound,ptgood,1,1,"b");
406 etaeff->Divide(etafound,etagood,1,1,"b");
407 TFile *file = TFile::Open("eff.root","RECREATE");