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 "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 |
28 | ClassImp(AliL3HoughEval) |
29 | |
4de874d1 |
30 | AliL3HoughEval::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 |
41 | AliL3HoughEval::~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 |
52 | void 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 |
64 | void 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 |
84 | Bool_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 |
171 | void 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 |