Example how to run script
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughEval.cxx
CommitLineData
b1886074 1// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
2//*-- Copyright &copy ASV
f80b98cb 3
162e2e5a 4#include <math.h>
b46b21a5 5#include <TH1.h>
162e2e5a 6#include <TFile.h>
7
b46b21a5 8#include "AliL3MemHandler.h"
162e2e5a 9#include "GetGoodParticles.h"
10#include "AliL3TrackArray.h"
11#include "AliL3Logging.h"
99e7186b 12#include "AliL3HoughEval.h"
4de874d1 13#include "AliL3HoughTransformer.h"
99e7186b 14#include "AliL3DigitData.h"
4de874d1 15#include "AliL3HoughTrack.h"
99e7186b 16#include "AliL3Transform.h"
17#include "AliL3Histogram.h"
b46b21a5 18#include "AliL3Histogram1D.h"
99e7186b 19#include "AliL3Defs.h"
4de874d1 20
b1886074 21//_____________________________________________________________
22// AliL3HoughEval
23//
24// Evaluation class for tracklets produced by the Hough transform.
25
4de874d1 26ClassImp(AliL3HoughEval)
27
4de874d1 28AliL3HoughEval::AliL3HoughEval()
4de874d1 29{
4fc9a6a4 30
4de874d1 31 fTransform = new AliL3Transform();
99e7186b 32 fRemoveFoundTracks = kFALSE;
f80b98cb 33 fNumOfPadsToLook = 1;
99e7186b 34 fNumOfRowsToMiss = 1;
b46b21a5 35 fEtaHistos=0;
b1886074 36 fRowPointers = 0;
4de874d1 37}
38
b46b21a5 39
4de874d1 40AliL3HoughEval::~AliL3HoughEval()
41{
b46b21a5 42 fHoughTransformer = 0;
4de874d1 43 if(fTransform)
44 delete fTransform;
99e7186b 45 if(fRowPointers)
b1886074 46 {
47 for(Int_t i=0; i<fNrows; i++)
48 fRowPointers[i] = 0;
49 delete [] fRowPointers;
50 }
4de874d1 51}
52
b46b21a5 53void AliL3HoughEval::InitTransformer(AliL3HoughTransformer *transformer)
54{
55 fHoughTransformer = transformer;
56 fSlice = fHoughTransformer->GetSlice();
57 fPatch = fHoughTransformer->GetPatch();
58 fNrows = NRows[fPatch][1] - NRows[fPatch][0] + 1;
59 fNEtaSegments = fHoughTransformer->GetNEtaSegments();
60 fEtaMin = fHoughTransformer->GetEtaMin();
61 fEtaMax = fHoughTransformer->GetEtaMax();
62 GenerateLUT();
63}
64
99e7186b 65void AliL3HoughEval::GenerateLUT()
4de874d1 66{
b46b21a5 67 //Generate a Look-up table, to limit the access to raw data
99e7186b 68
b1886074 69 if(!fRowPointers)
70 fRowPointers = new AliL3DigitRowData*[fNrows];
99e7186b 71
72 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer->GetDataPointer();
73 if(!tempPt)
b46b21a5 74 printf("\nAliL3HoughEval::GenerateLUT : Zero data pointer\n");
f80b98cb 75
99e7186b 76 for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++)
f80b98cb 77 {
99e7186b 78 Int_t prow = i - NRows[fPatch][0];
79 fRowPointers[prow] = tempPt;
b46b21a5 80 AliL3MemHandler::UpdateRowPointer(tempPt);
f80b98cb 81 }
82
99e7186b 83}
f80b98cb 84
99e7186b 85Bool_t AliL3HoughEval::LookInsideRoad(AliL3HoughTrack *track,Int_t eta_index,Bool_t remove)
86{
87 //Look at rawdata along the road specified by the track candidates.
88 //If track is good, return true, if not return false.
162e2e5a 89
f80b98cb 90 Int_t sector,row;
99e7186b 91
5de3a7f2 92 Int_t nrow=0,npixs=0,rows_crossed=0;
f80b98cb 93 Float_t xyz[3];
99e7186b 94
b46b21a5 95 Int_t total_charge=0;//total charge along the road
99e7186b 96 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
5de3a7f2 97
98 Float_t maxrow=300;
99 Double_t angle=Pi/18;
100 track->CalculateEdgePoint(angle);
101 if(!track->IsPoint())
102 {
103 track->CalculateEdgePoint(-1.*angle);
104 if(track->IsPoint())
105 maxrow = track->GetPointX();
106 }
107 else
108 maxrow = track->GetPointX();
109
99e7186b 110 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
f80b98cb 111 {
5de3a7f2 112 if(fTransform->Row2X(padrow) > maxrow) break;//The track has left this slice
113 rows_crossed++;
99e7186b 114 Int_t prow = padrow - NRows[fPatch][0];
f80b98cb 115 if(!track->GetCrossingPoint(padrow,xyz))
116 {
5de3a7f2 117 //printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!; pt %f phi0 %f\n",track->GetPt(),track->GetPhi0());
f80b98cb 118 continue;
119 }
120
99e7186b 121 fTransform->Slice2Sector(fSlice,padrow,sector,row);
f80b98cb 122 fTransform->Local2Raw(xyz,sector,row);
123 npixs=0;
99e7186b 124
125 //Get the timebins for this pad
126 AliL3DigitRowData *tempPt = fRowPointers[prow];
127 if(!tempPt)
f80b98cb 128 {
99e7186b 129 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
130 continue;
f80b98cb 131 }
132
99e7186b 133 //Look at both sides of the pad:
162e2e5a 134 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
99e7186b 135 {
136 AliL3DigitData *digPt = tempPt->fDigitData;
137 for(UInt_t j=0; j<tempPt->fNDigit; j++)
138 {
b1886074 139 //if(digPt->fCharge <= fHoughTransformer->GetThreshold()) continue;
99e7186b 140 UChar_t pad = digPt[j].fPad;
141 if(pad < p) continue;
142 if(pad > p) break;
143 UShort_t time = digPt[j].fTime;
162e2e5a 144 Double_t eta = fTransform->GetEta(padrow,pad,time);
99e7186b 145 Int_t pixel_index = (Int_t)(eta/etaslice);
146 if(pixel_index > eta_index) continue;
147 if(pixel_index != eta_index) break;
b46b21a5 148 total_charge += digPt[j].fCharge;
99e7186b 149 if(remove)
b46b21a5 150 digPt[j].fCharge = 0; //Erease the track from image
99e7186b 151 npixs++;
152 }
153 }
154
162e2e5a 155 if(npixs > 1)//At least 2 digits on this padrow
f80b98cb 156 {
157 nrow++;
158 }
159 }
99e7186b 160 if(remove)
161 return kTRUE;
162
5de3a7f2 163 if(nrow >= rows_crossed - fNumOfRowsToMiss)//this was a good track
f80b98cb 164 {
b46b21a5 165 Double_t eta_track = (Double_t)eta_index*etaslice;
f80b98cb 166 track->SetEtaIndex(eta_index);
b46b21a5 167 track->SetWeight(total_charge,kTRUE);
168 track->SetEta(eta_track);
b1886074 169 track->SetRowRange(NRows[fPatch][0],NRows[fPatch][1]);
170 track->SetSlice(fSlice);
99e7186b 171 if(fRemoveFoundTracks)
172 LookInsideRoad(track,eta_index,kTRUE);
f80b98cb 173 return kTRUE;
174 }
175 else
176 return kFALSE;
177}
178
b46b21a5 179void AliL3HoughEval::FindEta(AliL3TrackArray *tracks)
180{
181
182 Int_t sector,row;
183 Float_t xyz[3];
184
185 Int_t ntracks = tracks->GetNTracks();
186 fEtaHistos = new AliL3Histogram1D*[ntracks];
187
188 Char_t hname[100];
189 for(Int_t i=0; i<ntracks; i++)
190 {
191 sprintf(hname,"etahist_%d",i);
192 fEtaHistos[i] = new AliL3Histogram1D(hname,hname,100,0,1);
193 }
194 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
195
196 for(Int_t ntr=0; ntr<ntracks; ntr++)
197 {
198 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(ntr);
199 if(!track) continue;
200 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
201 {
202 Int_t prow = padrow - NRows[fPatch][0];
203
204 if(!track->GetCrossingPoint(padrow,xyz))
205 {
206 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
207 continue;
208 }
209
210 fTransform->Slice2Sector(fSlice,padrow,sector,row);
211 fTransform->Local2Raw(xyz,sector,row);
212
213 //Get the timebins for this pad
214 AliL3DigitRowData *tempPt = fRowPointers[prow];
215 if(!tempPt)
216 {
217 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
218 continue;
219 }
220
221 //Look at both sides of the pad:
222 for(Int_t p=(Int_t)rint(xyz[1])-fNumOfPadsToLook; p<=(Int_t)rint(xyz[1])+fNumOfPadsToLook; p++)
223 {
224 AliL3DigitData *digPt = tempPt->fDigitData;
225 for(UInt_t j=0; j<tempPt->fNDigit; j++)
226 {
227 UChar_t pad = digPt[j].fPad;
228
229 if(pad < p) continue;
230 if(pad > p) break;
231 UShort_t time = digPt[j].fTime;
232 Double_t eta = fTransform->GetEta(padrow,pad,time);
233 Int_t pixel_index = (Int_t)(eta/etaslice);
234 if(pixel_index > track->GetEtaIndex()+1) continue;
235 if(pixel_index < track->GetEtaIndex()-1) break;
236 fEtaHistos[ntr]->Fill(eta,digPt[j].fCharge);
237 }
238 }
239 }
240 }
241
242 for(Int_t i=0; i<ntracks; i++)
243 {
244 AliL3Histogram1D *hist = fEtaHistos[i];
245 Int_t max_bin = hist->GetMaximumBin();
246 Double_t max_value = hist->GetBinContent(max_bin);
247 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
248 if(!track) continue;
249 if(hist->GetBinContent(max_bin-1)<max_value && hist->GetBinContent(max_bin+1)<max_value)
250 {
251 track->SetWeight((Int_t)max_value,kTRUE);
252 track->SetEta(hist->GetBinCenter(max_bin));
253 track->SetNHits(track->GetWeight());
254 }
255 else
256 {
257 track->SetWeight(0);
258 tracks->Remove(i); //remove this track, because it was not a peak
259 }
260 }
261 tracks->Compress();
262
263 //for(Int_t i=0; i<ntracks; i++)
264 //delete fEtaHistos[i];
265