]>
Commit | Line | Data |
---|---|---|
f80b98cb | 1 | //Author: Anders Strand Vestbo |
2 | //Last Modified: 28.6.01 | |
3 | ||
f000f8a5 | 4 | #include <string.h> |
f80b98cb | 5 | #include <TCanvas.h> |
6 | #include <TFile.h> | |
f000f8a5 | 7 | |
a6008206 | 8 | #include "AliL3Logging.h" |
f80b98cb | 9 | #include "AliL3Histogram.h" |
f000f8a5 | 10 | #include "AliL3Hough.h" |
11 | #include "AliL3HoughTransformer.h" | |
12 | #include "AliL3HoughMaxFinder.h" | |
f80b98cb | 13 | #include "AliL3FileHandler.h" |
14 | #include "AliL3DigitData.h" | |
15 | #include "AliL3HoughEval.h" | |
16 | #include "AliL3Transform.h" | |
17 | #include "AliL3Defs.h" | |
18 | #include "AliL3TrackArray.h" | |
19 | #include "AliL3HoughTrack.h" | |
f000f8a5 | 20 | |
21 | ClassImp(AliL3Hough) | |
22 | ||
23 | AliL3Hough::AliL3Hough() | |
24 | { | |
a6008206 | 25 | fBinary = kFALSE; |
26 | fNEtaSegments = 0; | |
27 | fAddHistograms = kFALSE; | |
28 | fRemoveFoundTracks = kFALSE; | |
29 | fWriteDigits=kFALSE; | |
f000f8a5 | 30 | } |
31 | ||
32 | ||
4fc9a6a4 | 33 | AliL3Hough::AliL3Hough(Char_t *path,Bool_t binary,Int_t n_eta_segments) |
f000f8a5 | 34 | { |
4fc9a6a4 | 35 | fBinary = binary; |
36 | strcpy(fPath,path); | |
f80b98cb | 37 | fNEtaSegments = n_eta_segments; |
a6008206 | 38 | fAddHistograms = kFALSE; |
39 | fRemoveFoundTracks = kFALSE; | |
40 | fWriteDigits = kFALSE; | |
4fc9a6a4 | 41 | Init(); |
f000f8a5 | 42 | } |
43 | ||
44 | ||
45 | AliL3Hough::~AliL3Hough() | |
46 | { | |
f80b98cb | 47 | if(fMemHandler) |
4fc9a6a4 | 48 | DeleteMemory(); |
49 | if(fHoughTransformer) | |
50 | DeleteTransformers(); | |
a6008206 | 51 | if(fEval) |
52 | DeleteEval(); | |
53 | if(fPeakFinder) | |
54 | delete fPeakFinder; | |
55 | if(fTracks) | |
56 | delete fTracks; | |
4fc9a6a4 | 57 | if(fRootFile) |
58 | { | |
59 | fRootFile->Close(); | |
60 | delete fRootFile; | |
61 | } | |
f000f8a5 | 62 | } |
63 | ||
a6008206 | 64 | void AliL3Hough::DeleteEval() |
65 | { | |
66 | for(Int_t i=0; i<NPatches; i++) | |
67 | { | |
68 | if(!fEval[i]) continue; | |
69 | delete fEval[i]; | |
70 | } | |
71 | delete [] fEval; | |
72 | } | |
73 | ||
4fc9a6a4 | 74 | void AliL3Hough::DeleteTransformers() |
f000f8a5 | 75 | { |
4fc9a6a4 | 76 | for(Int_t i=0; i<NPatches; i++) |
f80b98cb | 77 | { |
4fc9a6a4 | 78 | if(!fHoughTransformer[i]) continue; |
a6008206 | 79 | delete fHoughTransformer[i]; |
f80b98cb | 80 | } |
4fc9a6a4 | 81 | delete [] fHoughTransformer; |
f000f8a5 | 82 | } |
83 | ||
4fc9a6a4 | 84 | void AliL3Hough::DeleteMemory() |
f000f8a5 | 85 | { |
4fc9a6a4 | 86 | for(Int_t i=0; i<NPatches; i++) |
87 | { | |
88 | if(!fMemHandler[i]) continue; | |
89 | delete fMemHandler[i]; | |
90 | } | |
91 | delete [] fMemHandler; | |
f000f8a5 | 92 | } |
93 | ||
4fc9a6a4 | 94 | void AliL3Hough::Init() |
f000f8a5 | 95 | { |
4fc9a6a4 | 96 | fHoughTransformer = new AliL3HoughTransformer*[NPatches]; |
97 | fMemHandler = new AliL3FileHandler*[NPatches]; | |
98 | for(Int_t i=0; i<NPatches; i++) | |
f80b98cb | 99 | { |
4fc9a6a4 | 100 | fHoughTransformer[i] = new AliL3HoughTransformer(1,i,fNEtaSegments); |
a6008206 | 101 | fHoughTransformer[i]->CreateHistograms(64,-0.003,0.003,64,-0.26,0.26); |
102 | fHoughTransformer[i]->SetThreshold(3); | |
4fc9a6a4 | 103 | fMemHandler[i] = new AliL3FileHandler(); |
a6008206 | 104 | if(!fBinary) |
105 | fMemHandler[i]->SetAliInput(fPath); | |
106 | } | |
107 | fPeakFinder = new AliL3HoughMaxFinder("KappaPhi"); | |
108 | } | |
109 | ||
110 | void AliL3Hough::Process(Int_t minslice,Int_t maxslice) | |
111 | { | |
112 | //Process all slices [minslice,maxslice]. | |
113 | ||
114 | for(Int_t i=minslice; i<=maxslice; i++) | |
115 | { | |
116 | TransformSlice(i); | |
117 | if(fAddHistograms) | |
118 | AddAllHistograms(); | |
119 | FindTrackCandidates(); | |
120 | Evaluate(fRemoveFoundTracks); | |
121 | if(fWriteDigits) | |
122 | WriteDigits(); | |
f80b98cb | 123 | } |
4fc9a6a4 | 124 | } |
f80b98cb | 125 | |
4fc9a6a4 | 126 | void AliL3Hough::TransformSlice(Int_t slice) |
127 | { | |
f80b98cb | 128 | |
4fc9a6a4 | 129 | for(Int_t i=0; i<NPatches; i++) |
f80b98cb | 130 | { |
a6008206 | 131 | //Reset memories |
132 | fHoughTransformer[i]->Reset(); | |
4fc9a6a4 | 133 | fMemHandler[i]->Free(); |
134 | UInt_t ndigits=0; | |
135 | AliL3DigitRowData *digits =0; | |
136 | Char_t name[256]; | |
a6008206 | 137 | if(fBinary)//take input data from binary files |
4fc9a6a4 | 138 | { |
139 | sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,i); | |
140 | fMemHandler[i]->SetBinaryInput(name); | |
141 | digits = (AliL3DigitRowData *)fMemHandler[i]->CompBinary2Memory(ndigits); | |
142 | fMemHandler[i]->CloseBinaryInput(); | |
143 | } | |
144 | else //read data from root file | |
145 | { | |
4fc9a6a4 | 146 | fMemHandler[i]->Init(slice,i,NRows[i]); |
147 | digits=(AliL3DigitRowData *)fMemHandler[i]->AliDigits2Memory(ndigits); | |
148 | } | |
149 | fHoughTransformer[i]->SetInputData(ndigits,digits); | |
150 | fHoughTransformer[i]->TransformCircle(); | |
f80b98cb | 151 | } |
4fc9a6a4 | 152 | |
153 | } | |
154 | ||
a6008206 | 155 | AliL3Histogram *AliL3Hough::AddHistograms(Int_t eta_index) |
4fc9a6a4 | 156 | { |
a6008206 | 157 | |
158 | AliL3Histogram *hist0 = fHoughTransformer[0]->GetHistogram(eta_index); | |
4fc9a6a4 | 159 | for(Int_t i=1; i<NPatches; i++) |
f80b98cb | 160 | { |
a6008206 | 161 | AliL3Histogram *hist = fHoughTransformer[i]->GetHistogram(eta_index); |
4fc9a6a4 | 162 | hist0->Add(hist); |
f80b98cb | 163 | } |
f80b98cb | 164 | |
4fc9a6a4 | 165 | return hist0; |
166 | } | |
167 | ||
a6008206 | 168 | void AliL3Hough::AddAllHistograms() |
4fc9a6a4 | 169 | { |
a6008206 | 170 | //Add the histograms within one etaslice. |
171 | //Resulting histogram are in patch=0. | |
172 | ||
173 | LOG(AliL3Log::kDebug,"AliL3Hough::AddAllHistograms","Progress") | |
174 | <<"Adding all histograms"<<ENDLOG; | |
175 | for(Int_t i=0; i<fNEtaSegments; i++) | |
176 | { | |
177 | AliL3Histogram *hist0 = fHoughTransformer[0]->GetHistogram(i); | |
178 | for(Int_t j=1; j<NPatches; j++) | |
179 | { | |
180 | AliL3Histogram *hist = fHoughTransformer[j]->GetHistogram(i); | |
181 | hist0->Add(hist); | |
182 | } | |
183 | } | |
184 | } | |
185 | ||
186 | void AliL3Hough::FindTrackCandidates() | |
187 | { | |
188 | //Look for peaks in histograms, and find the track candidates | |
189 | ||
190 | if(fTracks) | |
191 | { | |
192 | LOG(AliL3Log::kDebug,"AliL3Hough::FindTrackCandidates","Track array") | |
193 | <<"Deleting old track array"<<ENDLOG; | |
194 | delete fTracks; | |
195 | } | |
196 | fTracks = new AliL3TrackArray("AliL3HoughTrack"); | |
4fc9a6a4 | 197 | |
a6008206 | 198 | Int_t n_patches; |
199 | if(fAddHistograms) | |
200 | n_patches = 1; //Histograms has been added. | |
201 | else | |
202 | n_patches = NPatches; | |
203 | ||
204 | for(Int_t i=0; i<n_patches; i++) | |
205 | { | |
206 | AliL3HoughTransformer *tr = fHoughTransformer[i]; | |
207 | for(Int_t j=0; j<fNEtaSegments; j++) | |
208 | { | |
209 | AliL3Histogram *hist = tr->GetHistogram(j); | |
210 | fPeakFinder->SetHistogram(hist); | |
211 | Int_t n=10; | |
212 | Float_t x[10]; | |
213 | Float_t y[10]; | |
214 | fPeakFinder->FindPeak1(x,y,n); | |
215 | for(Int_t k=0; k<n; k++) | |
216 | { | |
217 | AliL3HoughTrack *track = (AliL3HoughTrack*)fTracks->NextTrack(); | |
218 | track->SetTrackParameters(x[k],y[k],1); | |
219 | track->SetEtaIndex(j); | |
220 | } | |
221 | } | |
222 | } | |
223 | ||
224 | } | |
225 | ||
226 | void AliL3Hough::Evaluate(Bool_t remove) | |
227 | { | |
228 | //Evaluate the tracks, by looking along the road in the raw data. | |
229 | //You may choose to remove the found tracks from the image. | |
230 | ||
231 | if(!fTracks) | |
232 | { | |
233 | LOG(AliL3Log::kError,"AliL3Hough::Evaluate","Track array") | |
234 | <<AliL3Log::kHex<<"No tracks to work on "<<(Int_t)fTracks<<ENDLOG; | |
235 | return; | |
236 | } | |
237 | ||
238 | if(fEval) | |
239 | { | |
240 | LOG(AliL3Log::kDebug,"AliL3Hough::Evaluate","Evaluate object") | |
241 | <<"Deleting old AliL3HoughEval objects"<<ENDLOG; | |
242 | DeleteEval(); | |
243 | } | |
244 | ||
245 | fEval = new AliL3HoughEval*[NPatches]; | |
4fc9a6a4 | 246 | for(Int_t i=0; i<NPatches; i++) |
f80b98cb | 247 | { |
a6008206 | 248 | fEval[i] = new AliL3HoughEval(fHoughTransformer[i]); |
249 | if(remove) | |
250 | fEval[i]->RemoveFoundTracks(); | |
251 | for(Int_t j=0; j<fTracks->GetNTracks(); j++) | |
252 | { | |
253 | AliL3HoughTrack *track = (AliL3HoughTrack*)fTracks->GetCheckedTrack(j); | |
254 | if(!track) | |
255 | { | |
256 | printf("AliL3Hough::Evaluate : Missing track object...\n"); | |
257 | continue; | |
258 | } | |
259 | //fEval[i]->LookInsideRoad(track,track->GetEtaIndex()); | |
260 | if(!fEval[i]->LookInsideRoad(track,track->GetEtaIndex())) | |
261 | fTracks->Remove(j); | |
262 | } | |
263 | fTracks->Compress(); | |
f80b98cb | 264 | } |
f000f8a5 | 265 | |
a6008206 | 266 | } |
f80b98cb | 267 | |
a6008206 | 268 | void AliL3Hough::WriteDigits(Char_t *outfile) |
269 | { | |
270 | //Write the current data to a new rootfile. | |
271 | ||
272 | for(Int_t i=0; i<NPatches; i++) | |
273 | { | |
274 | AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer[i]->GetDataPointer(); | |
275 | fMemHandler[i]->AliDigits2RootFile(tempPt,outfile); | |
276 | } | |
277 | ||
4fc9a6a4 | 278 | } |