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