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>
16 #include <AliRunLoader.h>
19 #include "AliL3Logging.h"
20 #include "AliLevel3.h"
21 #include "AliL3ConfMapper.h"
22 #include "AliL3Vertex.h"
23 #include "AliL3VertexFinder.h"
24 #include "AliL3TrackMerger.h"
25 #include "AliL3GlobalMerger.h"
26 #include "AliL3InterMerger.h"
27 #include "AliL3ConfMapPoint.h"
28 #include "AliL3ConfMapTrack.h"
29 #include "AliL3Transform.h"
30 #include "AliL3ClustFinderNew.h"
31 #include "AliL3DigitData.h"
32 #include "AliL3TrackArray.h"
33 #include "AliL3MemHandler.h"
34 #include "AliL3Fitter.h"
36 #include "AliL3FileHandler.h"
38 #include "AliL3Benchmark.h"
39 #include "AliL3DigitData.h"
40 #include "AliL3TrackSegmentData.h"
41 #include "AliL3SpacePointData.h"
42 #include "AliL3VertexData.h"
43 #include "AliL3DDLDataFileHandler.h"
47 //_____________________________________________________________
51 // Interface class for Level3 tracker.
52 // For example how to use, see exa/runtracker.C (root)
53 // or programs/runtracker.cxx (standalone program).
55 //<img src="tpcsectorsnb.gif">
62 Bool_t AliLevel3::fgDoVertexFit = kTRUE;//Include the vertex in the final track fit
64 AliLevel3::AliLevel3()
66 //Default constructor. Should also be used when input is from binary files.
67 //In that case the path to where the binary files are located has to be
68 //passed to the AliLevel::Init function.
83 AliLevel3::AliLevel3(Char_t *infile)
85 //Constructor to use for when input is anything else but binary files,
86 //meaning rootfiles or raw files.
102 AliLevel3::AliLevel3(AliRunLoader *rl)
104 //Constructor to use when input is aliroot runloader
117 void AliLevel3::Init(Char_t *path,EFileType filetype,Int_t npatches)
119 //Init the whole standard tracker chain
121 if (filetype==kRunLoader){
122 LOG(AliL3Log::kError,"AliLevel3::Init","Files")
123 <<"You have not supplied the input rootfile; if you want "
124 <<"to run with RunLoader use -Duse_newio for compiling!"<<ENDLOG;
128 if((filetype!=kBinary) && (filetype!=kDate)
129 && (filetype!=kRunLoader)&& !fInputFile)
131 LOG(AliL3Log::kError,"AliLevel3::Init","Files")
132 <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
136 if((filetype==kRunLoader) && !fRunLoader)
138 LOG(AliL3Log::kError,"AliLevel3::Init","Files")
139 <<"You have not supplied the input runloader; use the appropriate ctor!"<<ENDLOG;
147 fUseBinary = (filetype==kBinary);
151 fDoNonVertex = kFALSE;
152 fFindVertex = kFALSE;
153 SetClusterFinderParam();
159 #ifdef use_aliroot /*just to be sure*/
160 AliL3FileHandler::CleanStaticIndex();
166 fRow[0][0] = AliL3Transform::GetFirstRow(3);
167 fRow[0][1] = AliL3Transform::GetLastRow(5);
170 fNPatch = 1; //number of patches change row in process
172 fRow[0][1] = AliL3Transform::GetLastRow(-1);
175 fNPatch = 2; //number of patches change row in process
176 fRow[0][0] = 0; // first row
177 fRow[0][1] = AliL3Transform::GetLastRow(1);
178 fRow[1][0] = AliL3Transform::GetFirstRow(2);
179 fRow[1][1] = AliL3Transform::GetLastRow(5);
183 fRow[0][0] = AliL3Transform::GetFirstRow(0);
184 fRow[0][1] = AliL3Transform::GetLastRow(0);
185 fRow[1][0] = AliL3Transform::GetFirstRow(1);
186 fRow[1][1] = AliL3Transform::GetLastRow(1);
187 fRow[2][0] = AliL3Transform::GetFirstRow(2);
188 fRow[2][1] = AliL3Transform::GetLastRow(2);
189 fRow[3][0] = AliL3Transform::GetFirstRow(3);
190 fRow[3][1] = AliL3Transform::GetLastRow(3);
191 fRow[4][0] = AliL3Transform::GetFirstRow(4);
192 fRow[4][1] = AliL3Transform::GetLastRow(4);
193 fRow[5][0] = AliL3Transform::GetFirstRow(5);
194 fRow[5][1] = AliL3Transform::GetLastRow(5);
197 fVertexFinder = new AliL3VertexFinder();
198 fVertex = new AliL3Vertex();
199 fTracker = new AliL3ConfMapper();
200 fTrackMerger = new AliL3TrackMerger(fNPatch);
201 fInterMerger = new AliL3InterMerger();
202 fGlobalMerger = new AliL3GlobalMerger();
203 SetMergerParameters();//Set default merger parameters
206 fFileHandler = new AliL3FileHandler(kTRUE); //static version
207 fFileHandler->SetAliInput(fInputFile);
208 }else if(filetype==kRaw){
209 fFileHandler = new AliL3DDLDataFileHandler();
210 fFileHandler->SetReaderInput(fInputFile);
211 }else if(filetype==kDate){
212 fFileHandler = new AliL3DDLDataFileHandler();
213 fFileHandler->SetReaderInput(fInputFile,-1);
216 else if(filetype==kRunLoader){
217 fFileHandler = new AliL3FileHandler(kTRUE); //static version
218 fFileHandler->SetAliInput(fRunLoader);
222 fFileHandler = new AliL3MemHandler();
226 fFileHandler = new AliL3DDLDataFileHandler();
227 fFileHandler->SetReaderInput(fInputFile);
229 fFileHandler = new AliL3MemHandler();
232 fBenchmark = new AliL3Benchmark();
235 void AliLevel3::DoBench(char* name)
238 fBenchmark->Analyze(name);
240 fBenchmark = new AliL3Benchmark();
243 void AliLevel3::DoMc(char* file)
247 if(!fFileHandler->IsDigit(fEvent))
248 fFileHandler->SetMCOutput(file);
252 AliLevel3::~AliLevel3()
255 if(fVertexFinder) delete fVertexFinder;
256 if(fVertex) delete fVertex;
257 if(fTracker) delete fTracker;
258 if(fTrackMerger) delete fTrackMerger;
259 if(fInterMerger) delete fInterMerger;
260 if(fFileHandler) delete fFileHandler;
261 if(fGlobalMerger) delete fGlobalMerger;
264 void AliLevel3::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
266 //set cluster finder parameter
267 fXYClusterError=fXYError;
268 fZClusterError=fZError;
269 fClusterDeconv=deconv;
272 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
273 Int_t trackletlength, Int_t tracklength,
274 Int_t rowscopetracklet, Int_t rowscopetrack,
275 Double_t min_pt_fit, Double_t maxangle,
276 Double_t goodDist, Double_t hitChi2Cut,
277 Double_t goodHitChi2, Double_t trackChi2Cut,
278 Int_t maxdist,Double_t maxphi,Double_t maxeta,
279 Bool_t vertexconstraint)
281 //Set parameters input to the tracker
282 //If no arguments are given, default parameters will be used
284 fTracker->SetNSegments(phi_segments,eta_segments);
285 fTracker->SetMaxDca(min_pt_fit);
286 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
287 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
289 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
291 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
292 fTracker->InitVolumes();
295 void AliLevel3::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
297 //set global merger parameter
298 fGlobalMerger->SetParameter(maxy,maxz,maxkappa,maxpsi,maxtgl);
301 void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event)
303 //Do tracking on all slices in region [first,last]
304 //Slices numbering in TPC goes from 0-35, which means that one slice
305 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
306 //inner=2 + outer=38.
308 fGlobalMerger->Setup(first,last);
310 if(fEvent!=event) AliL3FileHandler::CleanStaticIndex();
313 for(Int_t i=first; i<=last; i++){
315 fGlobalMerger->SetVertex(fVertex);
316 fGlobalMerger->InitSlice(i);
317 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
318 fFileHandler->Free(); //free the memory
322 fBenchmark->Start("Global track merger");
323 //fGlobalMerger->AddAllTracks();
324 fGlobalMerger->Merge();
325 //fGlobalMerger->SlowMerge(fWriteOutPath);
326 fBenchmark->Stop("Global track merger");
330 if(fWriteOut) WriteResults();
331 fFileHandler->FreeDigitsTree();
334 void AliLevel3::ProcessSlice(Int_t slice)
338 Bool_t UseCF = kFALSE;
340 UseCF = fFileHandler->IsDigit(fEvent);
343 UseCF = kTRUE; //In case you are not using aliroot
344 if(fNoCF == kTRUE) //In case you don't want to run with cluster finder
347 const Int_t kmaxpoints=120000;
348 const Int_t kpointsize = kmaxpoints * sizeof(AliL3SpacePointData);
349 AliL3MemHandler *memory = new AliL3MemHandler();
351 fTrackMerger->Reset();
352 fTrackMerger->SetRows(fRow[0]);
354 for(Int_t patch=fNPatch-1;patch>=0;patch--){
355 fFileHandler->Init(slice,patch,&fRow[patch][0]);
357 AliL3SpacePointData *points =0;
359 AliL3DigitRowData *digits =0;
363 if(1){ //Binary to Memory
364 fFileHandler->Free();
366 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
368 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
369 if(!fFileHandler->SetBinaryInput(name)) return;
371 { //Read binary files which are not RLE
372 digits = (AliL3DigitRowData*)fFileHandler->Allocate();
373 fFileHandler->Binary2Memory(ndigits,digits);
375 else //Read RLE binary files
376 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
378 fFileHandler->CloseBinaryInput();
381 if(0){ //Binary to Memory with Benchmark
382 fFileHandler->Free();
384 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
386 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
387 if(!memory->SetBinaryInput(name)) return;
388 UInt_t compsize=memory->GetFileSize();
389 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
390 memory->CompBinary2CompMemory(ndigits,comp);
391 memory->CloseBinaryInput();
392 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
393 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
394 fBenchmark->Start("Unpacker");
395 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
396 fBenchmark->Stop("Unpacker");
400 if(0){ //Binary to Memory with Random
401 fFileHandler->Free();
402 fFileHandler->ResetRandom();
403 fFileHandler->SetRandomCluster(100);
404 fFileHandler->SetNGenerate(100);
406 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
408 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
409 if(!memory->SetBinaryInput(name)) return;
410 UInt_t compsize=memory->GetFileSize();
411 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
412 memory->CompBinary2CompMemory(ndigits,comp);
413 memory->CloseBinaryInput();
414 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
415 UInt_t rsize=fFileHandler->GetRandomSize();
416 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
417 fBenchmark->Start("Unpacker");
418 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
419 fBenchmark->Stop("Unpacker");
424 else{ //Binary to Memory with Roi
425 fFileHandler->Free();
427 fFileHandler->SetROI(fEta,sli);
429 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
431 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
432 if(!memory->SetBinaryInput(name)) return;
433 UInt_t compsize=memory->GetFileSize();
434 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
435 memory->CompBinary2CompMemory(ndigits,comp);
436 memory->CloseBinaryInput();
437 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
438 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
439 fBenchmark->Start("Unpacker");
440 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
441 fBenchmark->Stop("Unpacker");
447 fBenchmark->Start("Dummy Unpacker");
449 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,-1);
451 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,patch);
452 fBenchmark->Stop("Dummy Unpacker");
454 if(0){ //Ali to Binary
455 fFileHandler->SetBinaryOutput(name);
456 fFileHandler->AliDigits2CompBinary();
457 fFileHandler->CloseBinaryOutput();
460 if(1){ //Ali to Memory
461 digits=(AliL3DigitRowData *)fFileHandler->AliAltroDigits2Memory(ndigits,fEvent);
462 if(0){ //Memory to Binary
463 fFileHandler->SetBinaryOutput(name);
464 fFileHandler->Memory2CompBinary(ndigits,digits);
465 fFileHandler->CloseBinaryOutput();
469 }//end else UseBinary
471 points = (AliL3SpacePointData *) memory->Allocate(kpointsize);
472 fClusterFinder = new AliL3ClustFinderNew();
473 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],kmaxpoints);
474 fClusterFinder->SetDeconv(fClusterDeconv);
475 fClusterFinder->SetXYError(fXYClusterError);
476 fClusterFinder->SetZError(fZClusterError);
477 if((fXYClusterError>0)&&(fZClusterError>0))
478 fClusterFinder->SetCalcErr(kFALSE);
479 fClusterFinder->SetOutputArray(points);
480 fBenchmark->Start("Cluster finder");
481 fClusterFinder->Read(ndigits,digits);
482 fClusterFinder->ProcessDigits();
483 fBenchmark->Stop("Cluster finder");
484 npoints = fClusterFinder->GetNumberOfClusters();
485 delete fClusterFinder;
487 fFileHandler->Free();
488 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
489 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
491 else{// if not use Clusterfinder
492 if(fUseBinary){//Binary to Memory
495 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,-1);
497 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,patch);
498 if(!memory->SetBinaryInput(name)) return;
499 points = (AliL3SpacePointData *) memory->Allocate();
500 memory->Binary2Memory(npoints,points);
501 memory->CloseBinaryInput();
502 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Read Cluster")
503 <<AliL3Log::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
507 points = fFileHandler->AliPoints2Memory(npoints);
510 fBenchmark->Start("Dummy Unpacker");
511 fBenchmark->Stop("Dummy Unpacker");
512 fBenchmark->Start("Dummy CF");
513 fBenchmark->Stop("Dummy CF");
516 if(patch == fNPatch-1){
521 fBenchmark->Start("Vertex Finder Read");
522 fVertexFinder->Reset();
523 fVertexFinder->Read(npoints,points);
524 fBenchmark->Stop("Vertex Finder Read");
525 fBenchmark->Start("Vertex Finder");
526 fVertexFinder->Analyze();
527 AliL3VertexData vertex[1];
528 fVertexFinder->Write(vertex);
529 fVertex->Read(vertex);
530 fBenchmark->Stop("Vertex Finder");
533 //use 0,0,0 for vertex
536 fTrackMerger->SetVertex(fVertex);
539 fTracker->InitSector(slice,fRow[patch],fEta);
540 fTracker->SetVertex(fVertex);
541 fBenchmark->Start("Tracker setup");
542 fTracker->ReadHits(npoints,points);
543 fTracker->MainVertexTracking_a();
544 fBenchmark->Stop("Tracker setup");
545 fBenchmark->Start("Track follower");
546 fTracker->MainVertexTracking_b();
547 fBenchmark->Stop("Track follower");
549 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
550 fBenchmark->Start("Sector track fitting");
551 fTracker->FillTracks();
552 fBenchmark->Stop("Sector track fitting");
555 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
561 fFileHandler->Free();
564 AliL3TrackSegmentData *trackdata0 =
565 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
566 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
571 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
573 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
574 memory->SetBinaryOutput(name);
575 memory->Memory2Binary(ntracks0,trackdata0);
576 memory->CloseBinaryOutput();
579 fInterMerger->Reset();
580 fInterMerger->Init(fRow[patch],patch);
582 fInterMerger->FillTracks(ntracks0,trackdata0);
584 //fBenchmark->Start("Inter Merger");
585 // fInterMerger->Merge();
586 // fInterMerger->SlowMerge();
588 //fBenchmark->Stop("Inter Merger");
590 //write inter merged tracks
592 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
593 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
599 AliL3TrackSegmentData *trackdata1 =
600 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
601 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
603 fTrackMerger->InitSector(slice,patch);
604 fTrackMerger->FillTracks(ntracks1,trackdata1);
608 //fBenchmark->Start("Patch Merger");
609 //fTrackMerger->SlowMerge();
610 fTrackMerger->AddAllTracks();
611 //fTrackMerger->Merge();
612 //fBenchmark->Stop("Patch Merger");
614 //write merged tracks
616 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
617 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
620 fTrackData = (AliL3TrackSegmentData *)
621 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
623 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
624 fTrackMerger->GetOutTracks());
629 void AliLevel3::FitGlobalTracks()
632 AliL3Fitter *fitter = new AliL3Fitter(fVertex,AliLevel3::DoVertexFit());
634 fitter->LoadClusters(fWriteOutPath,fEvent,kTRUE);
636 fitter->LoadClusters(fWriteOutPath,fEvent,kFALSE);
638 fBenchmark->Start("Global track fitter");
639 AliL3TrackArray *tracks = fGlobalMerger->GetOutTracks();
640 for(Int_t i=0; i<tracks->GetNTracks(); i++)
642 AliL3Track *tr = tracks->GetCheckedTrack(i);
644 fitter->FitHelix(tr);
645 tr->UpdateToFirstPoint();
647 fBenchmark->Stop("Global track fitter");
651 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
652 Int_t slice,Int_t patch) const
657 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
659 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
660 AliL3MemHandler * memory = new AliL3MemHandler();
661 memory->SetBinaryOutput(name);
662 memory->Transform(npoints,points,slice);
663 memory->Memory2Binary(npoints,points);
664 memory->CloseBinaryOutput();
668 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt) const
671 AliL3MemHandler *memory = new AliL3MemHandler();
672 memory->SetBinaryOutput(filename);
673 if(opt=='a'||opt=='i'){ //add intracks
674 for(Int_t i=0;i<merger->GetNIn();i++){
675 AliL3TrackArray *tr=merger->GetInTracks(i);
676 memory->TrackArray2Binary(tr);
680 if(opt=='o'||opt=='a'){
681 AliL3TrackArray *tr=merger->GetOutTracks();
682 memory->TrackArray2Binary(tr);
685 memory->CloseBinaryOutput();
690 void AliLevel3::WriteResults()
692 //Write the resulting tracks to outputfile
694 sprintf(fname,"%s/tracks_%d.raw",fWriteOutPath,fEvent);
695 WriteTracks(fname,fGlobalMerger,'a');
696 //WriteTracks("tracks.raw",fGlobalMerger,'a');
697 sprintf(fname,"%s/tracks_gl_%d.raw",fWriteOutPath,fEvent);
698 WriteTracks(fname,fGlobalMerger,'o');
699 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');