3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
10 #include <TDirectory.h>
11 #include <TClonesArray.h>
12 #include <TStopwatch.h>
15 #include "AliL3Logging.h"
16 #include "AliLevel3.h"
17 #include "AliL3ConfMapper.h"
18 #include "AliL3Vertex.h"
19 #include "AliL3VertexFinder.h"
20 #include "AliL3TrackMerger.h"
21 #include "AliL3GlobalMerger.h"
22 #include "AliL3InterMerger.h"
23 #include "AliL3ConfMapPoint.h"
24 #include "AliL3ConfMapTrack.h"
25 #include "AliL3Transform.h"
26 #include "AliL3ClustFinderNew.h"
27 #include "AliL3DigitData.h"
28 #include "AliL3TrackArray.h"
29 #include "AliL3MemHandler.h"
30 #include "AliL3Fitter.h"
32 #include "AliL3FileHandler.h"
34 #include "AliL3Benchmark.h"
35 #include "AliL3DigitData.h"
36 #include "AliL3TrackSegmentData.h"
37 #include "AliL3SpacePointData.h"
38 #include "AliL3VertexData.h"
39 #include "AliL3DDLDataFileHandler.h"
43 //_____________________________________________________________
47 // Interface class for Level3 tracker.
48 // For example how to use, see exa/runtracker.C (root)
49 // or programs/runtracker.cxx (standalone program).
51 //<img src="tpcsectorsnb.gif">
58 AliLevel3::AliLevel3()
60 //Default constructor. Should also be used when input is from binary files.
61 //In that case the path to where the binary files are located has to be
62 //passed to the AliLevel::Init function.
67 AliLevel3::AliLevel3(Char_t *infile)
69 //Constructor to use for when input is anything else but binary files,
70 //meaning rootfiles or raw files.
76 void AliLevel3::Init(Char_t *path,EFileType filetype,Int_t npatches)
78 if((filetype!=kBinary) && (filetype!=kDate) && !fInputFile)
80 LOG(AliL3Log::kError,"AliLevel3::Init","Files")
81 <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
88 fUseBinary = (filetype==kBinary);
92 fDoNonVertex = kFALSE;
94 SetClusterFinderParam();
104 fRow[0][0] = AliL3Transform::GetFirstRow(3);
105 fRow[0][1] = AliL3Transform::GetLastRow(5);
108 fNPatch = 1; //number of patches change row in process
110 fRow[0][1] = AliL3Transform::GetLastRow(-1);
113 fNPatch = 2; //number of patches change row in process
114 fRow[0][0] = 0; // first row
115 fRow[0][1] = AliL3Transform::GetLastRow(1);
116 fRow[1][0] = AliL3Transform::GetFirstRow(2);
117 fRow[1][1] = AliL3Transform::GetLastRow(5);
121 fRow[0][0] = AliL3Transform::GetFirstRow(0);
122 fRow[0][1] = AliL3Transform::GetLastRow(0);
123 fRow[1][0] = AliL3Transform::GetFirstRow(1);
124 fRow[1][1] = AliL3Transform::GetLastRow(1);
125 fRow[2][0] = AliL3Transform::GetFirstRow(2);
126 fRow[2][1] = AliL3Transform::GetLastRow(2);
127 fRow[3][0] = AliL3Transform::GetFirstRow(3);
128 fRow[3][1] = AliL3Transform::GetLastRow(3);
129 fRow[4][0] = AliL3Transform::GetFirstRow(4);
130 fRow[4][1] = AliL3Transform::GetLastRow(4);
131 fRow[5][0] = AliL3Transform::GetFirstRow(5);
132 fRow[5][1] = AliL3Transform::GetLastRow(5);
135 fVertexFinder = new AliL3VertexFinder();
136 fVertex = new AliL3Vertex();
137 fTracker = new AliL3ConfMapper();
138 fTrackMerger = new AliL3TrackMerger(fNPatch);
139 fInterMerger = new AliL3InterMerger();
140 fGlobalMerger = new AliL3GlobalMerger();
141 SetMergerParameters();//Set default merger parameters
144 fFileHandler = new AliL3FileHandler();
145 fFileHandler->SetAliInput(fInputFile);
146 }else if(filetype==kRaw){
147 fFileHandler = new AliL3DDLDataFileHandler();
148 fFileHandler->SetReaderInput(fInputFile);
149 }else if(filetype==kDate){
150 fFileHandler = new AliL3DDLDataFileHandler();
151 fFileHandler->SetReaderInput(fInputFile,-1);
153 fFileHandler = new AliL3MemHandler();
157 fFileHandler = new AliL3DDLDataFileHandler();
158 fFileHandler->SetReaderInput(fInputFile);
160 fFileHandler = new AliL3MemHandler();
163 fBenchmark = new AliL3Benchmark();
166 void AliLevel3::DoBench(char* name){
167 fBenchmark->Analyze(name);
169 fBenchmark = new AliL3Benchmark();
172 void AliLevel3::DoMc(char* file){
174 if(!fFileHandler->IsDigit(fEvent))
175 fFileHandler->SetMCOutput(file);
179 AliLevel3::~AliLevel3(){
181 if(fVertexFinder) delete fVertexFinder;
182 if(fVertex) delete fVertex;
183 if(fTracker) delete fTracker;
184 if(fTrackMerger) delete fTrackMerger;
185 if(fInterMerger) delete fInterMerger;
186 if(fFileHandler) delete fFileHandler;
187 if(fGlobalMerger) delete fGlobalMerger;
190 void AliLevel3::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
192 fXYClusterError=fXYError;
193 fZClusterError=fZError;
194 fClusterDeconv=deconv;
197 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
198 Int_t trackletlength, Int_t tracklength,
199 Int_t rowscopetracklet, Int_t rowscopetrack,
200 Double_t min_pt_fit, Double_t maxangle,
201 Double_t goodDist, Double_t hitChi2Cut,
202 Double_t goodHitChi2, Double_t trackChi2Cut,
203 Int_t maxdist,Double_t maxphi,Double_t maxeta,Bool_t vertexconstraint)
205 //Set parameters input to the tracker
206 //If no arguments are given, default parameters will be used
208 fTracker->SetNSegments(phi_segments,eta_segments);
209 fTracker->SetMaxDca(min_pt_fit);
210 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
211 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
213 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
215 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
216 fTracker->InitVolumes();
219 void AliLevel3::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
221 fGlobalMerger->SetParameter(maxy,maxz,maxkappa,maxpsi,maxtgl);
224 void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event){
225 //Do tracking on all slices in region [first,last]
226 //Slices numbering in TPC goes from 0-35, which means that one slice
227 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
228 //inner=2 + outer=38.
230 fGlobalMerger->Setup(first,last);
232 for(Int_t i=first; i<=last; i++){
234 fGlobalMerger->SetVertex(fVertex);
235 fGlobalMerger->InitSlice(i);
236 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
237 fFileHandler->Free(); //free the memory
241 fBenchmark->Start("Global track merger");
242 //fGlobalMerger->AddAllTracks();
243 fGlobalMerger->Merge();
244 //fGlobalMerger->SlowMerge(fWriteOutPath);
245 fBenchmark->Stop("Global track merger");
249 if(fWriteOut) WriteResults();
250 fFileHandler->FreeDigitsTree();
253 void AliLevel3::ProcessSlice(Int_t slice){
255 Bool_t UseCF = kFALSE;
257 UseCF = fFileHandler->IsDigit(fEvent);
260 UseCF = kTRUE; //In case you are not using aliroot
261 if(fNoCF == kTRUE) //In case you don't want to run with cluster finder
264 const Int_t maxpoints=120000;
265 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
266 AliL3MemHandler *memory = new AliL3MemHandler();
268 fTrackMerger->Reset();
269 fTrackMerger->SetRows(fRow[0]);
271 for(Int_t patch=fNPatch-1;patch>=0;patch--){
272 fFileHandler->Init(slice,patch,&fRow[patch][0]);
274 AliL3SpacePointData *points =0;
276 AliL3DigitRowData *digits =0;
280 if(1){ //Binary to Memory
281 fFileHandler->Free();
283 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
285 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
286 if(!fFileHandler->SetBinaryInput(name)) return;
288 { //Read binary files which are not RLE
289 digits = (AliL3DigitRowData*)fFileHandler->Allocate();
290 fFileHandler->Binary2Memory(ndigits,digits);
292 else //Read RLE binary files
293 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
295 fFileHandler->CloseBinaryInput();
298 if(0){ //Binary to Memory with Benchmark
299 fFileHandler->Free();
301 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
303 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
304 if(!memory->SetBinaryInput(name)) return;
305 UInt_t compsize=memory->GetFileSize();
306 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
307 memory->CompBinary2CompMemory(ndigits,comp);
308 memory->CloseBinaryInput();
309 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
310 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
311 fBenchmark->Start("Unpacker");
312 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
313 fBenchmark->Stop("Unpacker");
317 if(0){ //Binary to Memory with Random
318 fFileHandler->Free();
319 fFileHandler->ResetRandom();
320 fFileHandler->SetRandomCluster(100);
321 fFileHandler->SetNGenerate(100);
323 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
325 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
326 if(!memory->SetBinaryInput(name)) return;
327 UInt_t compsize=memory->GetFileSize();
328 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
329 memory->CompBinary2CompMemory(ndigits,comp);
330 memory->CloseBinaryInput();
331 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
332 UInt_t rsize=fFileHandler->GetRandomSize();
333 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
334 fBenchmark->Start("Unpacker");
335 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
336 fBenchmark->Stop("Unpacker");
341 else{ //Binary to Memory with Roi
342 fFileHandler->Free();
344 fFileHandler->SetROI(fEta,sli);
346 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
348 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
349 if(!memory->SetBinaryInput(name)) return;
350 UInt_t compsize=memory->GetFileSize();
351 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
352 memory->CompBinary2CompMemory(ndigits,comp);
353 memory->CloseBinaryInput();
354 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
355 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
356 fBenchmark->Start("Unpacker");
357 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
358 fBenchmark->Stop("Unpacker");
364 fBenchmark->Start("Dummy Unpacker");
366 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,-1);
368 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,patch);
369 fBenchmark->Stop("Dummy Unpacker");
371 if(0){ //Ali to Binary
372 fFileHandler->SetBinaryOutput(name);
373 fFileHandler->AliDigits2CompBinary();
374 fFileHandler->CloseBinaryOutput();
377 if(1){ //Ali to Memory
378 digits=(AliL3DigitRowData *)fFileHandler->AliAltroDigits2Memory(ndigits,fEvent);
379 if(0){ //Memory to Binary
380 fFileHandler->SetBinaryOutput(name);
381 fFileHandler->Memory2CompBinary(ndigits,digits);
382 fFileHandler->CloseBinaryOutput();
386 }//end else UseBinary
388 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
389 fClusterFinder = new AliL3ClustFinderNew();
390 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],maxpoints);
391 fClusterFinder->SetDeconv(fClusterDeconv);
392 fClusterFinder->SetXYError(fXYClusterError);
393 fClusterFinder->SetZError(fZClusterError);
394 if((fXYClusterError>0)&&(fZClusterError>0))
395 fClusterFinder->SetCalcErr(kFALSE);
396 fClusterFinder->SetOutputArray(points);
397 fBenchmark->Start("Cluster finder");
398 fClusterFinder->Read(ndigits,digits);
399 fClusterFinder->ProcessDigits();
400 fBenchmark->Stop("Cluster finder");
401 npoints = fClusterFinder->GetNumberOfClusters();
402 delete fClusterFinder;
404 fFileHandler->Free();
405 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
406 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
408 else{// if not use Clusterfinder
409 if(fUseBinary){//Binary to Memory
412 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,-1);
414 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,patch);
415 if(!memory->SetBinaryInput(name)) return;
416 points = (AliL3SpacePointData *) memory->Allocate();
417 memory->Binary2Memory(npoints,points);
418 memory->CloseBinaryInput();
419 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Read Cluster")
420 <<AliL3Log::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
424 points = fFileHandler->AliPoints2Memory(npoints);
427 fBenchmark->Start("Dummy Unpacker");
428 fBenchmark->Stop("Dummy Unpacker");
429 fBenchmark->Start("Dummy CF");
430 fBenchmark->Stop("Dummy CF");
433 if(patch == fNPatch-1){
438 fBenchmark->Start("Vertex Finder Read");
439 fVertexFinder->Reset();
440 fVertexFinder->Read(npoints,points);
441 fBenchmark->Stop("Vertex Finder Read");
442 fBenchmark->Start("Vertex Finder");
443 fVertexFinder->Analyze();
444 AliL3VertexData vertex[1];
445 fVertexFinder->Write(vertex);
446 fVertex->Read(vertex);
447 fBenchmark->Stop("Vertex Finder");
450 //use 0,0,0 for vertex
453 fTrackMerger->SetVertex(fVertex);
456 fTracker->InitSector(slice,fRow[patch],fEta);
457 fTracker->SetVertex(fVertex);
458 fBenchmark->Start("Tracker setup");
459 fTracker->ReadHits(npoints,points);
460 fTracker->MainVertexTracking_a();
461 fBenchmark->Stop("Tracker setup");
462 fBenchmark->Start("Track follower");
463 fTracker->MainVertexTracking_b();
464 fBenchmark->Stop("Track follower");
466 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
467 fBenchmark->Start("Sector track fitting");
468 fTracker->FillTracks();
469 fBenchmark->Stop("Sector track fitting");
472 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
478 fFileHandler->Free();
481 AliL3TrackSegmentData *trackdata0 =
482 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
483 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
488 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
490 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
491 memory->SetBinaryOutput(name);
492 memory->Memory2Binary(ntracks0,trackdata0);
493 memory->CloseBinaryOutput();
496 fInterMerger->Reset();
497 fInterMerger->Init(fRow[patch],patch);
499 fInterMerger->FillTracks(ntracks0,trackdata0);
501 //fBenchmark->Start("Inter Merger");
502 // fInterMerger->Merge();
503 // fInterMerger->SlowMerge();
505 //fBenchmark->Stop("Inter Merger");
507 //write inter merged tracks
509 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
510 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
516 AliL3TrackSegmentData *trackdata1 =
517 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
518 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
520 fTrackMerger->InitSector(slice,patch);
521 fTrackMerger->FillTracks(ntracks1,trackdata1);
525 //fBenchmark->Start("Patch Merger");
526 //fTrackMerger->SlowMerge();
527 fTrackMerger->AddAllTracks();
528 //fTrackMerger->Merge();
529 //fBenchmark->Stop("Patch Merger");
531 //write merged tracks
533 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
534 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
537 fTrackData = (AliL3TrackSegmentData *)
538 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
540 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
541 fTrackMerger->GetOutTracks());
546 void AliLevel3::FitGlobalTracks()
548 AliL3Fitter *fitter = new AliL3Fitter(fVertex);
550 fitter->LoadClusters(fWriteOutPath,fEvent,kTRUE);
552 fitter->LoadClusters(fWriteOutPath,fEvent,kFALSE);
554 fBenchmark->Start("Global track fitter");
555 AliL3TrackArray *tracks = fGlobalMerger->GetOutTracks();
556 for(Int_t i=0; i<tracks->GetNTracks(); i++)
558 AliL3Track *tr = tracks->GetCheckedTrack(i);
560 fitter->FitHelix(tr);
561 fitter->UpdateTrack(tr);
563 fBenchmark->Stop("Global track fitter");
567 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
568 Int_t slice,Int_t patch)
572 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
574 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
575 AliL3MemHandler * memory = new AliL3MemHandler();
576 memory->SetBinaryOutput(name);
577 memory->Transform(npoints,points,slice);
578 memory->Memory2Binary(npoints,points);
579 memory->CloseBinaryOutput();
583 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt)
585 AliL3MemHandler *memory = new AliL3MemHandler();
586 memory->SetBinaryOutput(filename);
587 if(opt=='a'||opt=='i'){ //add intracks
588 for(Int_t i=0;i<merger->GetNIn();i++){
589 AliL3TrackArray *tr=merger->GetInTracks(i);
590 memory->TrackArray2Binary(tr);
594 if(opt=='o'||opt=='a'){
595 AliL3TrackArray *tr=merger->GetOutTracks();
596 memory->TrackArray2Binary(tr);
599 memory->CloseBinaryOutput();
604 void AliLevel3::WriteResults()
606 //Write the resulting tracks to outputfile
608 sprintf(fname,"%s/tracks_%d.raw",fWriteOutPath,fEvent);
609 WriteTracks(fname,fGlobalMerger,'a');
610 //WriteTracks("tracks.raw",fGlobalMerger,'a');
611 sprintf(fname,"%s/tracks_gl_%d.raw",fWriteOutPath,fEvent);
612 WriteTracks(fname,fGlobalMerger,'o');
613 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');