]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliLevel3.cxx
Minor changes
[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
108615fc 5#include <TFile.h>
6#include <TDirectory.h>
7#include <TClonesArray.h>
8#include <TStopwatch.h>
9#include <iostream.h>
10
2e1fe9ef 11#include "AliL3Logging.h"
108615fc 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"
2e1fe9ef 26#ifdef use_aliroot
108615fc 27#include "AliL3FileHandler.h"
2e1fe9ef 28#endif
108615fc 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
49ClassImp(AliLevel3)
50
51AliLevel3::AliLevel3(){
52 fInputFile=0;
53 fOutputFile=0;
54 Init();
55}
56
57AliLevel3::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
79AliLevel3::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
108void AliLevel3::Init(){
109 fWriteOut = kFALSE;
110 fGlobalMerger=0;
111 fTransformer = new AliL3Transform();
112 fDoRoi = kFALSE;
113 fUseBinary =kFALSE;
114 SetPath("");
115 fFindVertex =kTRUE;
21896bc6 116 if(0){
117 fNPatch = 1; //number of patches change row in process
118 fRow[0][0] = 0; // first row
119 fRow[0][1] = 173; // last row
120 }
121 if(0){
122 fNPatch = 2; //number of patches change row in process
123 fRow[0][0] = 0; // first row
124 fRow[0][1] = 54;
125 fRow[1][0] = 55;
126 fRow[1][1] = 173; // last row
127 }
128 if(1){
129 fNPatch = 5; //number of patches change row in process
130 fRow[0][0] = 0; // first row
131 fRow[0][1] = 45;
132 fRow[1][0] = 46;
133 fRow[1][1] = 77;
134 fRow[2][0] = 78;
135 fRow[2][1] = 109;
136 fRow[3][0] = 110;
137 fRow[3][1] = 141;
138 fRow[4][0] = 142;
139 fRow[4][1] = 173; // last row
140 }
108615fc 141 fVertexFinder = new AliL3VertexFinder();
142 fVertex = new AliL3Vertex();
143 fTracker = new AliL3ConfMapper();
144 fTrackMerger = new AliL3TrackMerger(fNPatch);
145 fInterMerger = new AliL3InterMerger();
2e1fe9ef 146 #ifdef use_aliroot
108615fc 147 fFileHandler = new AliL3FileHandler();
148 fFileHandler->SetAliInput(fInputFile);
2e1fe9ef 149 #else
150 fFileHandler = new AliL3MemHandler();
151 #endif
108615fc 152 fBenchmark = new AliL3Benchmark();
153}
154
155void AliLevel3::DoBench(char* name){
156 fBenchmark->Analyze(name);
157}
158
159void AliLevel3::DoMc(char* file){
2e1fe9ef 160 #ifdef use_aliroot
108615fc 161 if(!fFileHandler->IsDigit())
162 fFileHandler->SetMCOutput(file);
2e1fe9ef 163 #endif
108615fc 164}
165
166AliLevel3::~AliLevel3(){
167 //Destructor
168 if(fVertexFinder) delete fVertexFinder;
169 if(fVertex) delete fVertex;
170 if(fTracker) delete fTracker;
171 if(fTransformer) delete fTransformer;
172 if(fTrackMerger) delete fTrackMerger;
173 if(fInterMerger) delete fInterMerger;
174 if(fFileHandler) delete fFileHandler;
175}
176
177void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
178 Int_t trackletlength, Int_t tracklength,
179 Int_t rowscopetracklet, Int_t rowscopetrack,
180 Double_t min_pt_fit, Double_t maxangle,
181 Double_t goodDist, Double_t hitChi2Cut,
182 Double_t goodHitChi2, Double_t trackChi2Cut,
183 Int_t maxdist)
184{
185 //Set parameters input to the tracker
186 //If no arguments are given, default parameters will be used
187
188 fTracker->SetNSegments(phi_segments,eta_segments);
189 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
190 fTracker->SetMaxDca(min_pt_fit);
191 fTracker->SetTrackletCuts(maxangle,goodDist,true);
192 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist);
193
194 fTracker->SetParamDone(true);
195}
196
197void AliLevel3::ProcessEvent(Int_t first,Int_t last){
198 //Do tracking on all slices in region [first,last]
199 //Slices numbering in TPC goes from 0-35, which means that 1 slice
200 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
201 //inner=2 + outer=38.
202 fGlobalMerger= new AliL3GlobalMerger(first,last);
203 for(Int_t i=first; i<=last; i++){
204 ProcessSlice(i);
205 fGlobalMerger->SetVertex(fVertex);
206 fGlobalMerger->SetTransformer(fTransformer);
207 fGlobalMerger->InitSlice(i);
108615fc 208 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
108615fc 209 fFileHandler->Free(); //free the memory
210 fNTrackData=0;
211 fTrackData=0;
212 }
213 fBenchmark->Start("Global Merger");
214 fGlobalMerger->Merge();
215// fGlobalMerger->SlowMerge();
216 fBenchmark->Stop("Global Merger");
217
218 if(fWriteOut) WriteResults();
219 delete fGlobalMerger; fGlobalMerger = 0;
220}
221
222void AliLevel3::ProcessSlice(Int_t slice){
223 char name[256];
e0ea9951 224 Bool_t UseCF = kTRUE;
225#ifdef use_aliroot
226 UseCF = fFileHandler->IsDigit();
227#endif
108615fc 228 const Int_t maxpoints=100000;
229 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
230 AliL3MemHandler *memory = new AliL3MemHandler();
231
232 fTrackMerger->Reset();
233 fTrackMerger->SetTransformer(fTransformer);
e0ea9951 234 fTrackMerger->SetRows(fRow[0]);
108615fc 235 for(Int_t patch=fNPatch-1;patch>=0;patch--){
e0ea9951 236 fFileHandler->Init(slice,patch,fRow[patch]);
108615fc 237 fFileHandler->Init(fTransformer);
238 UInt_t npoints=0;
239 AliL3SpacePointData *points =0;
240 UInt_t ndigits=0;
241 AliL3DigitRowData *digits =0;
242 if(fUseBinary){
108615fc 243 if(!fDoRoi){
244 if(0){ //Binary to Memory
245 fFileHandler->Free();
246 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
247 fFileHandler->SetBinaryInput(name);
248 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
249 fFileHandler->CloseBinaryInput();
250 }
251
252 if(1){ //Binary to Memory with Benchmark
253 fFileHandler->Free();
254 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
255 memory->SetBinaryInput(name);
256 UInt_t compsize=memory->GetFileSize();
257 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
258 memory->CompBinary2CompMemory(ndigits,comp);
259 memory->CloseBinaryInput();
260 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
261 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
262 fBenchmark->Start("Unpacker");
263 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
264 fBenchmark->Stop("Unpacker");
265 memory->Free();
266 }
267
268 if(0){ //Binary to Memory with Random
269 fFileHandler->Free();
270 fFileHandler->ResetRandom();
271 fFileHandler->SetRandomCluster(100);
272 fFileHandler->SetNGenerate(100);
273 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
274 memory->SetBinaryInput(name);
275 UInt_t compsize=memory->GetFileSize();
276 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
277 memory->CompBinary2CompMemory(ndigits,comp);
278 memory->CloseBinaryInput();
279 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
280 UInt_t rsize=fFileHandler->GetRandomSize();
281 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
282 fBenchmark->Start("Unpacker");
283 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
284 fBenchmark->Stop("Unpacker");
285 memory->Free();
108615fc 286 }
287 }
288
289 else{ //Binary to Memory with Roi
290 fFileHandler->Free();
291 Int_t sli[2]={0,0};
292 fFileHandler->SetROI(fEta,sli);
293 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
294 memory->SetBinaryInput(name);
295 UInt_t compsize=memory->GetFileSize();
296 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
297 memory->CompBinary2CompMemory(ndigits,comp);
298 memory->CloseBinaryInput();
299 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
300 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
301 fBenchmark->Start("Unpacker");
302 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
303 fBenchmark->Stop("Unpacker");
304 memory->Free();
108615fc 305 }
21896bc6 306 }//end UseBinary
108615fc 307 else{
2e1fe9ef 308#ifdef use_aliroot
e0ea9951 309 if(UseCF){
21896bc6 310 fBenchmark->Start("Dummy Unpacker");
108615fc 311 sprintf(name,"digits_%d_%d.raw",slice,patch);
21896bc6 312 fBenchmark->Stop("Dummy Unpacker");
2e1fe9ef 313
108615fc 314 if(0){ //Ali to Binary
315 fFileHandler->SetBinaryOutput(name);
316 fFileHandler->AliDigits2CompBinary();
317 fFileHandler->CloseBinaryOutput();
318 }
319
320 if(1){ //Ali to Memory
321 digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits);
322 if(fWriteOut){ //Memory to Binary
323 fFileHandler->SetBinaryOutput(name);
324 fFileHandler->Memory2CompBinary(ndigits,digits);
325 fFileHandler->CloseBinaryOutput();
326 }
327 }
328 }
2e1fe9ef 329#endif
108615fc 330 }
331
e0ea9951 332 if(UseCF){
333 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
334
335 fClusterFinder = new AliL3ClustFinder(fTransformer);
336 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1]
337 ,maxpoints);
338 fClusterFinder->SetXYError(0.1);
339 fClusterFinder->SetZError(0.2);
340 fClusterFinder->SetOutputArray(points);
341 fClusterFinder->Read(ndigits,digits);
342 fBenchmark->Start("Cluster Finder");
343 fClusterFinder->ProcessDigits();
344 fBenchmark->Stop("Cluster Finder");
345 npoints = fClusterFinder->GetNumberOfClusters();
346 delete fClusterFinder;
347 fClusterFinder =0;
348 fFileHandler->Free();
349 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
350 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
351 }
352
353#ifdef use_aliroot
354 // if not use Clusterfinder
21896bc6 355 if(!UseCF){
356 points = fFileHandler->AliPoints2Memory(npoints);
357 fBenchmark->Start("Dummy Unpacker");
358 fBenchmark->Stop("Dummy Unpacker");
359 fBenchmark->Start("Dummy CF");
360 fBenchmark->Stop("Dummy CF");
361 }
e0ea9951 362#endif
363
108615fc 364 if(patch == fNPatch-1){
365 // Vertex
366 if(fFindVertex){
367 // Vertex Finder
368
369 fBenchmark->Start("Vertex Finder Read");
370 fVertexFinder->Reset();
371 fVertexFinder->Read(npoints,points);
372 fBenchmark->Stop("Vertex Finder Read");
373 fBenchmark->Start("Vertex Finder");
374 fVertexFinder->Analyze();
375 AliL3VertexData vertex[1];
376 fVertexFinder->Write(vertex);
377 fVertex->Read(vertex);
378 fBenchmark->Stop("Vertex Finder");
379 }
380 else{
381 //use 0,0,0 for vertex
382 fVertex->SetZero();
383 }
384 fTrackMerger->SetVertex(fVertex);
385 }
e0ea9951 386 fTracker->InitSector(slice,fRow[patch]);
108615fc 387 fTracker->SetVertex(fVertex);
388 fBenchmark->Start("Tracker Read Hits");
389 fTracker->ReadHits(npoints,points);
390 fBenchmark->Stop("Tracker Read Hits");
391 fBenchmark->Start("MainVertexTracking A");
392 fTracker->MainVertexTracking_a();
393 fBenchmark->Stop("MainVertexTracking A");
394 fBenchmark->Start("MainVertexTracking B");
395 fTracker->MainVertexTracking_b();
396 fBenchmark->Stop("MainVertexTracking B");
397 fBenchmark->Start("Tracking fit");
398 fTracker->FillTracks();
399 fBenchmark->Stop("Tracking fit");
400
401 if(fWriteOut)
402 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
e0ea9951 403
404 //free memory
405 if(UseCF)
406 memory->Free();
407 else
408 fFileHandler->Free();
108615fc 409
410 UInt_t ntracks0 =0;
411 AliL3TrackSegmentData *trackdata0 =
412 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
413 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
414
415 //write tracks
416 if(fWriteOut){
417 sprintf(name,"tracks_tr_%d_%d.raw",slice,patch);
418 memory->SetBinaryOutput(name);
419 memory->Memory2Binary(ntracks0,trackdata0);
420 memory->CloseBinaryOutput();
421 }
422
423 fInterMerger->Reset();
424 fInterMerger->SetTransformer(fTransformer);
e0ea9951 425 fInterMerger->Init(fRow[patch],patch);
108615fc 426
108615fc 427 fInterMerger->FillTracks(ntracks0,trackdata0);
108615fc 428 fBenchmark->Start("Inter Merger");
429 fInterMerger->Merge();
430// fInterMerger->SlowMerge();
431
432 fBenchmark->Stop("Inter Merger");
433
434 //write inter merged tracks
435 if(fWriteOut){
436 sprintf(name,"tracks_im_%d_%d.raw",slice,patch);
437 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
438 }
439 memory->Free();
440
441 UInt_t ntracks1 =0;
442 AliL3TrackSegmentData *trackdata1 =
443 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
444 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
445
446 fTrackMerger->InitSector(slice,patch);
108615fc 447 fTrackMerger->FillTracks(ntracks1,trackdata1);
108615fc 448
449 memory->Free();
450 }
451 fBenchmark->Start("Patch Merger");
452// fTrackMerger->SlowMerge();
453 fTrackMerger->Merge();
454 fBenchmark->Stop("Patch Merger");
455 //write merged tracks
456 if(fWriteOut){
457 sprintf(name,"tracks_tm_%d.raw",slice);
458 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
459 }
460
461 fTrackData = (AliL3TrackSegmentData *)
462 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
463
464 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
465 fTrackMerger->GetOutTracks());
466
467 delete memory;
468}
469
470void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
471 Int_t slice,Int_t patch){
472 char name[256];
473 sprintf(name,"points_%d_%d.raw",slice,patch);
474 AliL3MemHandler * memory = new AliL3MemHandler();
475 memory->SetBinaryOutput(name);
476 memory->Transform(npoints,points,slice,fTransformer);
477 memory->Memory2Binary(npoints,points);
478 memory->CloseBinaryOutput();
479 delete memory;
480}
481
482
483Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
2e1fe9ef 484 AliL3MemHandler *memory = new AliL3MemHandler();
108615fc 485 memory->SetBinaryOutput(filename);
486 if(opt=='a'||opt=='i'){ //add intracks
487 for(Int_t i=0;i<merger->GetNIn();i++){
488 AliL3TrackArray *tr=merger->GetInTracks(i);
489 memory->TrackArray2Binary(tr);
490 }
491 }
492
493 if(opt=='o'||opt=='a'){
494 AliL3TrackArray *tr=merger->GetOutTracks();
495 memory->TrackArray2Binary(tr);
496 }
497
498 memory->CloseBinaryOutput();
499
500 return 1;
501}
502
503void AliLevel3::WriteResults()
504{
505 //Write the resulting tracks to outputfile
506 WriteTracks("tracks.raw",fGlobalMerger,'a');
507}