]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliLevel3.cxx
This commit was generated by cvs2svn to compensate for changes in r3176,
[u/mrichter/AliRoot.git] / HLT / src / AliLevel3.cxx
CommitLineData
108615fc 1//Author: Uli Frankenfeld
2//Author: Anders Strand Vestbo
3//Last Modified: 13.12.2000
4
5#include "AliL3Logging.h"
6
7#include <TFile.h>
8#include <TDirectory.h>
9#include <TClonesArray.h>
10#include <TStopwatch.h>
11#include <iostream.h>
12
13//#include <AliTPCcluster.h>
14//#include "AliTPCParam.h"
15#include "AliLevel3.h"
16#include "AliL3ConfMapper.h"
17#include "AliL3Vertex.h"
18#include "AliL3VertexFinder.h"
19#include "AliL3TrackMerger.h"
20#include "AliL3GlobalMerger.h"
21#include "AliL3InterMerger.h"
22#include "AliL3ConfMapPoint.h"
23#include "AliL3ConfMapTrack.h"
24#include "AliL3Transform.h"
25#include "AliL3ClustFinder.h"
26#include "AliL3DigitData.h"
27#include "AliL3TrackArray.h"
28#include "AliL3MemHandler.h"
29#include "AliL3FileHandler.h"
30#include "AliL3Benchmark.h"
31
32#include "AliL3DigitData.h"
33#include "AliL3TrackSegmentData.h"
34#include "AliL3SpacePointData.h"
35#include "AliL3VertexData.h"
36
37//_______________________________________
38//
39// AliLevel3
40//
41// Interface class for Level3 tracker.
42// Tracking is done by calling constructor with input,output
43// given as argument.
44// You must always remember to set the tracking parameters. E.g.:
45//
46// AliLevel3 *level3 = new AliLevel3(inputfile,outputfile);
47// level3->SetTrackerParam(); //Sets default tracking parameters
48// level3->ProcessSector(2,2); //Does tracking on sector 2 (actually 2+38)
49
50ClassImp(AliLevel3)
51
52AliLevel3::AliLevel3(){
53 fInputFile=0;
54 fOutputFile=0;
55 Init();
56}
57
58AliLevel3::AliLevel3(Char_t *infile,Char_t *outfile){
59 //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
60
61 fOutputFile = new TFile(outfile,"NEW");
62
63 if(!fOutputFile->IsOpen())
64 {
65 LOG(AliL3Log::kWarning, "AliLevel3::AliLevel3","File Open")
66 <<"Delete your old "<<outfile<<" file!"<<ENDLOG;
67 }
68 fInputFile = new TFile(infile,"READ");
69
70 if(!fInputFile->IsOpen())
71 {
72 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
73 <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
74 return;
75 }
76
77 Init();
78}
79
80AliLevel3::AliLevel3(TFile *in, TFile *out){
81 fOutputFile = out;
82 fInputFile = in;
83 if(!in){
84 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
85 <<"Pointer to InFile 0x0!"<<ENDLOG;
86 return;
87 }
88 if(!out){
89 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
90 <<"Pointer to OutFile 0x0!"<<ENDLOG;
91 return;
92 }
93
94 if(!fOutputFile->IsOpen())
95 {
96 LOG(AliL3Log::kWarning,"AliLevel3::AliLevel3","File Open")
97 <<"no output file!"<<ENDLOG;
98 return;
99 }
100 if(!fInputFile->IsOpen())
101 {
102 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
103 <<"Inputfile does not exist"<<ENDLOG;
104 return;
105 }
106 Init();
107}
108
109void AliLevel3::Init(){
110 fWriteOut = kFALSE;
111 fGlobalMerger=0;
112 fTransformer = new AliL3Transform();
113 fDoRoi = kFALSE;
114 fUseBinary =kFALSE;
115 SetPath("");
116 fFindVertex =kTRUE;
117 fNPatch = 5; //number of patches change row in process
118 fVertexFinder = new AliL3VertexFinder();
119 fVertex = new AliL3Vertex();
120 fTracker = new AliL3ConfMapper();
121 fTrackMerger = new AliL3TrackMerger(fNPatch);
122 fInterMerger = new AliL3InterMerger();
123 fFileHandler = new AliL3FileHandler();
124 fFileHandler->SetAliInput(fInputFile);
125 fBenchmark = new AliL3Benchmark();
126}
127
128void AliLevel3::DoBench(char* name){
129 fBenchmark->Analyze(name);
130}
131
132void AliLevel3::DoMc(char* file){
133 if(!fFileHandler->IsDigit())
134 fFileHandler->SetMCOutput(file);
135}
136
137AliLevel3::~AliLevel3(){
138 //Destructor
139 if(fVertexFinder) delete fVertexFinder;
140 if(fVertex) delete fVertex;
141 if(fTracker) delete fTracker;
142 if(fTransformer) delete fTransformer;
143 if(fTrackMerger) delete fTrackMerger;
144 if(fInterMerger) delete fInterMerger;
145 if(fFileHandler) delete fFileHandler;
146}
147
148void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
149 Int_t trackletlength, Int_t tracklength,
150 Int_t rowscopetracklet, Int_t rowscopetrack,
151 Double_t min_pt_fit, Double_t maxangle,
152 Double_t goodDist, Double_t hitChi2Cut,
153 Double_t goodHitChi2, Double_t trackChi2Cut,
154 Int_t maxdist)
155{
156 //Set parameters input to the tracker
157 //If no arguments are given, default parameters will be used
158
159 fTracker->SetNSegments(phi_segments,eta_segments);
160 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
161 fTracker->SetMaxDca(min_pt_fit);
162 fTracker->SetTrackletCuts(maxangle,goodDist,true);
163 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist);
164
165 fTracker->SetParamDone(true);
166}
167
168void AliLevel3::ProcessEvent(Int_t first,Int_t last){
169 //Do tracking on all slices in region [first,last]
170 //Slices numbering in TPC goes from 0-35, which means that 1 slice
171 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
172 //inner=2 + outer=38.
173 fGlobalMerger= new AliL3GlobalMerger(first,last);
174 for(Int_t i=first; i<=last; i++){
175 ProcessSlice(i);
176 fGlobalMerger->SetVertex(fVertex);
177 fGlobalMerger->SetTransformer(fTransformer);
178 fGlobalMerger->InitSlice(i);
179 fBenchmark->Start("Fill Global Merger");
180 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
181 fBenchmark->Stop("Fill Global Merger");
182 fFileHandler->Free(); //free the memory
183 fNTrackData=0;
184 fTrackData=0;
185 }
186 fBenchmark->Start("Global Merger");
187 fGlobalMerger->Merge();
188// fGlobalMerger->SlowMerge();
189 fBenchmark->Stop("Global Merger");
190
191 if(fWriteOut) WriteResults();
192 delete fGlobalMerger; fGlobalMerger = 0;
193}
194
195void AliLevel3::ProcessSlice(Int_t slice){
196 char name[256];
197 Bool_t isdigit = fFileHandler->IsDigit();
198// Int_t row[5][2] = {{ 0,173}};
199 Int_t row[5][2] = {{ 0, 45},{46,77},{78,109},{110,141},{142,173}};
200 const Int_t maxpoints=100000;
201 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
202 AliL3MemHandler *memory = new AliL3MemHandler();
203
204 fTrackMerger->Reset();
205 fTrackMerger->SetTransformer(fTransformer);
206 fTrackMerger->SetRows(row[0]);
207 for(Int_t patch=fNPatch-1;patch>=0;patch--){
208 fFileHandler->Init(slice,patch,row[patch]);
209 fFileHandler->Init(fTransformer);
210 UInt_t npoints=0;
211 AliL3SpacePointData *points =0;
212 UInt_t ndigits=0;
213 AliL3DigitRowData *digits =0;
214 if(fUseBinary){
215
216 if(!fDoRoi){
217 if(0){ //Binary to Memory
218 fFileHandler->Free();
219 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
220 fFileHandler->SetBinaryInput(name);
221 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
222 fFileHandler->CloseBinaryInput();
223 }
224
225 if(1){ //Binary to Memory with Benchmark
226 fFileHandler->Free();
227 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
228 memory->SetBinaryInput(name);
229 UInt_t compsize=memory->GetFileSize();
230 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
231 memory->CompBinary2CompMemory(ndigits,comp);
232 memory->CloseBinaryInput();
233 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
234 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
235 fBenchmark->Start("Unpacker");
236 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
237 fBenchmark->Stop("Unpacker");
238 memory->Free();
239 }
240
241 if(0){ //Binary to Memory with Random
242 fFileHandler->Free();
243 fFileHandler->ResetRandom();
244 fFileHandler->SetRandomCluster(100);
245 fFileHandler->SetNGenerate(100);
246 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
247 memory->SetBinaryInput(name);
248 UInt_t compsize=memory->GetFileSize();
249 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
250 memory->CompBinary2CompMemory(ndigits,comp);
251 memory->CloseBinaryInput();
252 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
253 UInt_t rsize=fFileHandler->GetRandomSize();
254 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
255 fBenchmark->Start("Unpacker");
256 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
257 fBenchmark->Stop("Unpacker");
258 memory->Free();
259 if(1)
260 cerr<<endl<<dsize/1024<<" "<<rsize/1024<<" "
261 <<100.*rsize/dsize<<"%"<<endl;
262 }
263 }
264
265 else{ //Binary to Memory with Roi
266 fFileHandler->Free();
267 Int_t sli[2]={0,0};
268 fFileHandler->SetROI(fEta,sli);
269 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
270 memory->SetBinaryInput(name);
271 UInt_t compsize=memory->GetFileSize();
272 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
273 memory->CompBinary2CompMemory(ndigits,comp);
274 memory->CloseBinaryInput();
275 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
276 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
277 fBenchmark->Start("Unpacker");
278 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
279 fBenchmark->Stop("Unpacker");
280 memory->Free();
281 if(1)
282 cerr<<endl<<datasize/1024<<" "<<endl;
283 }
284
285
286 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
287
288 fClusterFinder = new AliL3ClustFinder(fTransformer);
289 fClusterFinder->InitSlice(slice,patch,row[patch][0],row[patch][1]
290 ,maxpoints);
291 fClusterFinder->SetXYError(0.1);
292 fClusterFinder->SetZError(0.2);
293 fClusterFinder->SetOutputArray(points);
294 fBenchmark->Start("Read Cluster Finder");
295 fClusterFinder->Read(ndigits,digits);
296 fBenchmark->Stop("Read Cluster Finder");
297 fBenchmark->Start("Cluster Finder");
298 fClusterFinder->ProcessDigits();
299 fBenchmark->Stop("Cluster Finder");
300 npoints = fClusterFinder->GetNumberOfClusters();
301 delete fClusterFinder;
302 fClusterFinder =0;
303 fFileHandler->Free();
304
305 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
306 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
307 }
308
309 else{
310 if(isdigit){
311 sprintf(name,"digits_%d_%d.raw",slice,patch);
312
313 if(0){ //Ali to Binary
314 fFileHandler->SetBinaryOutput(name);
315 fFileHandler->AliDigits2CompBinary();
316 fFileHandler->CloseBinaryOutput();
317 }
318
319 if(1){ //Ali to Memory
320 digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits);
321 if(fWriteOut){ //Memory to Binary
322 fFileHandler->SetBinaryOutput(name);
323 fFileHandler->Memory2CompBinary(ndigits,digits);
324 fFileHandler->CloseBinaryOutput();
325 }
326 }
327 }
328 else points = fFileHandler->AliPoints2Memory(npoints);
329 }
330
331 if(patch == fNPatch-1){
332 // Vertex
333 if(fFindVertex){
334 // Vertex Finder
335
336 fBenchmark->Start("Vertex Finder Read");
337 fVertexFinder->Reset();
338 fVertexFinder->Read(npoints,points);
339 fBenchmark->Stop("Vertex Finder Read");
340 fBenchmark->Start("Vertex Finder");
341 fVertexFinder->Analyze();
342 AliL3VertexData vertex[1];
343 fVertexFinder->Write(vertex);
344 fVertex->Read(vertex);
345 fBenchmark->Stop("Vertex Finder");
346 }
347 else{
348 //use 0,0,0 for vertex
349 fVertex->SetZero();
350 }
351 fTrackMerger->SetVertex(fVertex);
352 }
353 fTracker->InitSector(slice,row[patch]);
354 fTracker->SetVertex(fVertex);
355 fBenchmark->Start("Tracker Read Hits");
356 fTracker->ReadHits(npoints,points);
357 fBenchmark->Stop("Tracker Read Hits");
358 fBenchmark->Start("MainVertexTracking A");
359 fTracker->MainVertexTracking_a();
360 fBenchmark->Stop("MainVertexTracking A");
361 fBenchmark->Start("MainVertexTracking B");
362 fTracker->MainVertexTracking_b();
363 fBenchmark->Stop("MainVertexTracking B");
364 fBenchmark->Start("Tracking fit");
365 fTracker->FillTracks();
366 fBenchmark->Stop("Tracking fit");
367
368 if(fWriteOut)
369 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
370 fFileHandler->Free();
371
372 UInt_t ntracks0 =0;
373 AliL3TrackSegmentData *trackdata0 =
374 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
375 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
376
377 //write tracks
378 if(fWriteOut){
379 sprintf(name,"tracks_tr_%d_%d.raw",slice,patch);
380 memory->SetBinaryOutput(name);
381 memory->Memory2Binary(ntracks0,trackdata0);
382 memory->CloseBinaryOutput();
383 }
384
385 fInterMerger->Reset();
386 fInterMerger->SetTransformer(fTransformer);
387 fInterMerger->Init(row[patch],patch);
388
389 fBenchmark->Start("Fill Inter Merger");
390 fInterMerger->FillTracks(ntracks0,trackdata0);
391 fBenchmark->Stop("Fill Inter Merger");
392 fBenchmark->Start("Inter Merger");
393 fInterMerger->Merge();
394// fInterMerger->SlowMerge();
395
396 fBenchmark->Stop("Inter Merger");
397
398 //write inter merged tracks
399 if(fWriteOut){
400 sprintf(name,"tracks_im_%d_%d.raw",slice,patch);
401 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
402 }
403 memory->Free();
404
405 UInt_t ntracks1 =0;
406 AliL3TrackSegmentData *trackdata1 =
407 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
408 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
409
410 fTrackMerger->InitSector(slice,patch);
411 fBenchmark->Start("Fill Patch Merger");
412 fTrackMerger->FillTracks(ntracks1,trackdata1);
413 fBenchmark->Stop("Fill Patch Merger");
414
415 memory->Free();
416 }
417 fBenchmark->Start("Patch Merger");
418// fTrackMerger->SlowMerge();
419 fTrackMerger->Merge();
420 fBenchmark->Stop("Patch Merger");
421 //write merged tracks
422 if(fWriteOut){
423 sprintf(name,"tracks_tm_%d.raw",slice);
424 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
425 }
426
427 fTrackData = (AliL3TrackSegmentData *)
428 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
429
430 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
431 fTrackMerger->GetOutTracks());
432
433 delete memory;
434}
435
436void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
437 Int_t slice,Int_t patch){
438 char name[256];
439 sprintf(name,"points_%d_%d.raw",slice,patch);
440 AliL3MemHandler * memory = new AliL3MemHandler();
441 memory->SetBinaryOutput(name);
442 memory->Transform(npoints,points,slice,fTransformer);
443 memory->Memory2Binary(npoints,points);
444 memory->CloseBinaryOutput();
445 delete memory;
446}
447
448
449Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
450 AliL3FileHandler *memory = new AliL3FileHandler();
451 memory->SetBinaryOutput(filename);
452 if(opt=='a'||opt=='i'){ //add intracks
453 for(Int_t i=0;i<merger->GetNIn();i++){
454 AliL3TrackArray *tr=merger->GetInTracks(i);
455 memory->TrackArray2Binary(tr);
456 }
457 }
458
459 if(opt=='o'||opt=='a'){
460 AliL3TrackArray *tr=merger->GetOutTracks();
461 memory->TrackArray2Binary(tr);
462 }
463
464 memory->CloseBinaryOutput();
465
466 return 1;
467}
468
469void AliLevel3::WriteResults()
470{
471 //Write the resulting tracks to outputfile
472 WriteTracks("tracks.raw",fGlobalMerger,'a');
473}