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