b1886074 |
1 | // Author: Anders Vestbo <mailto:vestbo@fi.uib.no> |
2 | //*-- Copyright © 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 |
26 | ClassImp(AliL3HoughEval) |
27 | |
4de874d1 |
28 | AliL3HoughEval::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 |
40 | AliL3HoughEval::~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 |
53 | void 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 |
65 | void 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 |
85 | Bool_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 |
179 | void 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 |