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