2 // Original: AliLevel3.cxx,v 1.42 2004/06/11 16:06:33 loizides
4 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
5 //*-- Copyright © ALICE HLT Group
9 #include <TDirectory.h>
10 #include <TClonesArray.h>
11 #include <TStopwatch.h>
14 #include <AliRunLoader.h>
16 #include "AliHLTTPCLogging.h"
17 #include "AliHLTTPC.h"
18 #include "AliHLTTPCConfMapper.h"
19 #include "AliHLTTPCVertex.h"
20 #include "AliHLTTPCVertexFinder.h"
21 #include "AliHLTTPCTrackMerger.h"
22 #include "AliHLTTPCGlobalMerger.h"
23 #include "AliHLTTPCInterMerger.h"
24 #include "AliHLTTPCConfMapPoint.h"
25 #include "AliHLTTPCConfMapTrack.h"
26 #include "AliHLTTPCTransform.h"
27 #include "AliHLTTPCClusterFinder.h"
28 #include "AliHLTTPCDigitReaderUnpacked.h"
29 #include "AliHLTTPCDigitData.h"
30 #include "AliHLTTPCTrackArray.h"
31 #include "AliHLTTPCMemHandler.h"
32 #include "AliHLTTPCFitter.h"
34 #include "AliHLTTPCFileHandler.h"
36 #include "AliHLTTPCBenchmark.h"
37 #include "AliHLTTPCDigitData.h"
38 #include "AliHLTTPCTrackSegmentData.h"
39 #include "AliHLTTPCSpacePointData.h"
40 #include "AliHLTTPCVertexData.h"
41 #include "AliHLTTPCDDLDataFileHandler.h"
45 //_____________________________________________________________
49 // Interface class for HLTTPC tracker.
50 // For example how to use, see exa/runtracker.C (root)
51 // or programs/runtracker.cxx (standalone program).
53 //<img src="tpcsectorsnb.gif">
60 AliHLTTPC::AliHLTTPC()
62 //Default constructor. Should also be used when input is from binary files.
63 //In that case the path to where the binary files are located has to be
64 //passed to the AliLevel::Init function.
77 AliHLTTPC::AliHLTTPC(Char_t *infile)
79 //Constructor to use for when input is anything else but binary files,
80 //meaning rootfiles or raw files.
93 AliHLTTPC::AliHLTTPC(AliRunLoader *rl)
95 //Constructor to use when input is aliroot runloader
107 Bool_t AliHLTTPC::fgDoVertexFit = kTRUE;//Include the vertex in the final track fit
109 void AliHLTTPC::Init(Char_t *path,EFileType filetype,Int_t npatches)
111 //Init the whole standard tracker chain
113 if((filetype!=kBinary) && (filetype!=kDate)
114 && (filetype!=kRunLoader)&& !fInputFile)
116 LOG(AliHLTTPCLog::kError,"AliHLTTPC::Init","Files")
117 <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
120 if((filetype==kRunLoader) && !fRunLoader)
122 LOG(AliHLTTPCLog::kError,"AliHLTTPC::Init","Files")
123 <<"You have not supplied the input runloader; use the appropriate ctor!"<<ENDLOG;
130 fUseBinary = (filetype==kBinary);
134 fDoNonVertex = kFALSE;
135 fFindVertex = kFALSE;
136 SetClusterFinderParam();
142 #ifdef use_aliroot /*just to be sure*/
143 AliHLTTPCFileHandler::CleanStaticIndex();
149 fRow[0][0] = AliHLTTPCTransform::GetFirstRow(3);
150 fRow[0][1] = AliHLTTPCTransform::GetLastRow(5);
153 fNPatch = 1; //number of patches change row in process
155 fRow[0][1] = AliHLTTPCTransform::GetLastRow(-1);
158 fNPatch = 2; //number of patches change row in process
159 fRow[0][0] = 0; // first row
160 fRow[0][1] = AliHLTTPCTransform::GetLastRow(1);
161 fRow[1][0] = AliHLTTPCTransform::GetFirstRow(2);
162 fRow[1][1] = AliHLTTPCTransform::GetLastRow(5);
166 fRow[0][0] = AliHLTTPCTransform::GetFirstRow(0);
167 fRow[0][1] = AliHLTTPCTransform::GetLastRow(0);
168 fRow[1][0] = AliHLTTPCTransform::GetFirstRow(1);
169 fRow[1][1] = AliHLTTPCTransform::GetLastRow(1);
170 fRow[2][0] = AliHLTTPCTransform::GetFirstRow(2);
171 fRow[2][1] = AliHLTTPCTransform::GetLastRow(2);
172 fRow[3][0] = AliHLTTPCTransform::GetFirstRow(3);
173 fRow[3][1] = AliHLTTPCTransform::GetLastRow(3);
174 fRow[4][0] = AliHLTTPCTransform::GetFirstRow(4);
175 fRow[4][1] = AliHLTTPCTransform::GetLastRow(4);
176 fRow[5][0] = AliHLTTPCTransform::GetFirstRow(5);
177 fRow[5][1] = AliHLTTPCTransform::GetLastRow(5);
180 fVertexFinder = new AliHLTTPCVertexFinder();
181 fVertex = new AliHLTTPCVertex();
182 fTracker = new AliHLTTPCConfMapper();
183 fTrackMerger = new AliHLTTPCTrackMerger(fNPatch);
184 fInterMerger = new AliHLTTPCInterMerger();
185 fGlobalMerger = new AliHLTTPCGlobalMerger();
186 SetMergerParameters();//Set default merger parameters
189 fFileHandler = new AliHLTTPCFileHandler(kTRUE); //static version
190 fFileHandler->SetAliInput(fInputFile);
191 }else if(filetype==kRaw){
192 fFileHandler = new AliHLTTPCDDLDataFileHandler();
193 fFileHandler->SetReaderInput(fInputFile);
194 }else if(filetype==kDate){
195 fFileHandler = new AliHLTTPCDDLDataFileHandler();
196 fFileHandler->SetReaderInput(fInputFile,-1);
198 else if(filetype==kRunLoader){
199 fFileHandler = new AliHLTTPCFileHandler(kTRUE); //static version
200 fFileHandler->SetAliInput(fRunLoader);
203 fFileHandler = new AliHLTTPCMemHandler();
207 fFileHandler = new AliHLTTPCDDLDataFileHandler();
208 fFileHandler->SetReaderInput(fInputFile);
210 fFileHandler = new AliHLTTPCMemHandler();
213 fBenchmark = new AliHLTTPCBenchmark();
216 void AliHLTTPC::DoBench(char* name)
219 fBenchmark->Analyze(name);
221 fBenchmark = new AliHLTTPCBenchmark();
224 void AliHLTTPC::DoMc(char* file)
228 if(!fFileHandler->IsDigit(fEvent))
229 fFileHandler->SetMCOutput(file);
233 AliHLTTPC::~AliHLTTPC()
236 if(fVertexFinder) delete fVertexFinder;
237 if(fVertex) delete fVertex;
238 if(fTracker) delete fTracker;
239 if(fTrackMerger) delete fTrackMerger;
240 if(fInterMerger) delete fInterMerger;
241 if(fFileHandler) delete fFileHandler;
242 if(fGlobalMerger) delete fGlobalMerger;
245 void AliHLTTPC::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
247 //set cluster finder parameter
248 fXYClusterError=fXYError;
249 fZClusterError=fZError;
250 fClusterDeconv=deconv;
253 void AliHLTTPC::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
254 Int_t trackletlength, Int_t tracklength,
255 Int_t rowscopetracklet, Int_t rowscopetrack,
256 Double_t min_pt_fit, Double_t maxangle,
257 Double_t goodDist, Double_t hitChi2Cut,
258 Double_t goodHitChi2, Double_t trackChi2Cut,
259 Int_t maxdist,Double_t maxphi,Double_t maxeta,
260 Bool_t vertexconstraint)
262 //Set parameters input to the tracker
263 //If no arguments are given, default parameters will be used
265 fTracker->SetNSegments(phi_segments,eta_segments);
266 fTracker->SetMaxDca(min_pt_fit);
267 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
268 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
270 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
272 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
273 fTracker->InitVolumes();
276 void AliHLTTPC::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
278 //set global merger parameter
279 fGlobalMerger->SetParameter(maxy,maxz,maxkappa,maxpsi,maxtgl);
282 void AliHLTTPC::ProcessEvent(Int_t first,Int_t last,Int_t event)
284 //Do tracking on all slices in region [first,last]
285 //Slices numbering in TPC goes from 0-35, which means that one slice
286 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
287 //inner=2 + outer=38.
289 fGlobalMerger->Setup(first,last);
291 if(fEvent!=event) AliHLTTPCFileHandler::CleanStaticIndex();
294 for(Int_t i=first; i<=last; i++){
296 fGlobalMerger->SetVertex(fVertex);
297 fGlobalMerger->InitSlice(i);
298 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
299 fFileHandler->Free(); //free the memory
303 fBenchmark->Start("Global track merger");
304 //fGlobalMerger->AddAllTracks();
305 fGlobalMerger->Merge();
306 //fGlobalMerger->SlowMerge(fWriteOutPath);
307 fBenchmark->Stop("Global track merger");
311 if(fWriteOut) WriteResults();
312 fFileHandler->FreeDigitsTree();
315 void AliHLTTPC::ProcessSlice(Int_t slice)
319 Bool_t UseCF = kFALSE;
321 UseCF = fFileHandler->IsDigit(fEvent);
324 UseCF = kTRUE; //In case you are not using aliroot
325 if(fNoCF == kTRUE) //In case you don't want to run with cluster finder
328 const Int_t kmaxpoints=120000;
329 const Int_t kpointsize = kmaxpoints * sizeof(AliHLTTPCSpacePointData);
330 AliHLTTPCMemHandler *memory = new AliHLTTPCMemHandler();
332 fTrackMerger->Reset();
333 fTrackMerger->SetRows(fRow[0]);
335 for(Int_t patch=fNPatch-1;patch>=0;patch--){
336 fFileHandler->Init(slice,patch,&fRow[patch][0]);
338 AliHLTTPCSpacePointData *points =0;
340 AliHLTTPCDigitRowData *digits =0;
341 UInt_t digitSize = 0;
345 if(1){ //Binary to Memory
346 fFileHandler->Free();
348 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
350 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
351 if(!fFileHandler->SetBinaryInput(name)) return;
353 { //Read binary files which are not RLE
354 digits = (AliHLTTPCDigitRowData*)fFileHandler->Allocate();
355 fFileHandler->Binary2Memory(ndigits,digits, digitSize );
356 digitSize = fFileHandler->GetFileSize();
358 else //Read RLE binary files
360 digits= (AliHLTTPCDigitRowData *)fFileHandler->CompBinary2Memory(ndigits, digitSize);
363 fFileHandler->CloseBinaryInput();
366 if(0){ //Binary to Memory with Benchmark
367 fFileHandler->Free();
369 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
371 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
372 if(!memory->SetBinaryInput(name)) return;
373 UInt_t compsize=memory->GetFileSize();
374 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
375 memory->CompBinary2CompMemory(ndigits,comp);
376 memory->CloseBinaryInput();
377 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
378 digits=(AliHLTTPCDigitRowData *)fFileHandler->Allocate(datasize);
379 fBenchmark->Start("Unpacker");
380 fFileHandler->CompMemory2Memory(ndigits,digits,comp,digitSize);
381 fBenchmark->Stop("Unpacker");
385 if(0){ //Binary to Memory with Random
386 fFileHandler->Free();
387 fFileHandler->ResetRandom();
388 fFileHandler->SetRandomCluster(100);
389 fFileHandler->SetNGenerate(100);
391 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
393 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
394 if(!memory->SetBinaryInput(name)) return;
395 UInt_t compsize=memory->GetFileSize();
396 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
397 memory->CompBinary2CompMemory(ndigits,comp);
398 memory->CloseBinaryInput();
399 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
400 UInt_t rsize=fFileHandler->GetRandomSize();
401 digits=(AliHLTTPCDigitRowData*)fFileHandler->Allocate(dsize+rsize);
402 fBenchmark->Start("Unpacker");
403 fFileHandler->CompMemory2Memory(ndigits,digits,comp,digitSize);
404 fBenchmark->Stop("Unpacker");
409 else{ //Binary to Memory with Roi
410 fFileHandler->Free();
412 fFileHandler->SetROI(fEta,sli);
414 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
416 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
417 if(!memory->SetBinaryInput(name)) return;
418 UInt_t compsize=memory->GetFileSize();
419 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
420 memory->CompBinary2CompMemory(ndigits,comp);
421 memory->CloseBinaryInput();
422 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
423 digits=(AliHLTTPCDigitRowData *)fFileHandler->Allocate(datasize);
424 fBenchmark->Start("Unpacker");
425 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp,digitSize);
426 fBenchmark->Stop("Unpacker");
432 fBenchmark->Start("Dummy Unpacker");
434 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,-1);
436 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,patch);
437 fBenchmark->Stop("Dummy Unpacker");
439 if(0){ //Ali to Binary
440 fFileHandler->SetBinaryOutput(name);
441 fFileHandler->AliDigits2CompBinary();
442 fFileHandler->CloseBinaryOutput();
445 if(1){ //Ali to Memory
446 digits=(AliHLTTPCDigitRowData *)fFileHandler->AliAltroDigits2Memory(ndigits,fEvent);
447 if(0){ //Memory to Binary
448 fFileHandler->SetBinaryOutput(name);
449 fFileHandler->Memory2CompBinary(ndigits,digits);
450 fFileHandler->CloseBinaryOutput();
454 }//end else UseBinary
456 points = (AliHLTTPCSpacePointData *) memory->Allocate(kpointsize);
457 fClusterFinder = new AliHLTTPCClusterFinder();
458 fDigitReader = new AliHLTTPCDigitReaderUnpacked();
459 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],kmaxpoints);
460 fClusterFinder->SetDeconv(fClusterDeconv);
461 fClusterFinder->SetXYError(fXYClusterError);
462 fClusterFinder->SetZError(fZClusterError);
463 if((fXYClusterError>0)&&(fZClusterError>0))
464 fClusterFinder->SetCalcErr(kFALSE);
465 fClusterFinder->SetOutputArray(points);
466 fClusterFinder->SetReader( fDigitReader );
467 fBenchmark->Start("Cluster finder");
468 //fClusterFinder->Read(ndigits,digits);
469 fClusterFinder->Read( (void*)digits, (unsigned long) digitSize );
470 fClusterFinder->ProcessDigits();
471 fBenchmark->Stop("Cluster finder");
472 npoints = fClusterFinder->GetNumberOfClusters();
473 delete fClusterFinder;
475 fFileHandler->Free();
476 LOG(AliHLTTPCLog::kInformational,"AliHLTTPC::ProcessSlice","Cluster Finder")
477 <<AliHLTTPCLog::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
479 else{// if not use Clusterfinder
480 if(fUseBinary){//Binary to Memory
483 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,-1);
485 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,patch);
486 if(!memory->SetBinaryInput(name)) return;
487 points = (AliHLTTPCSpacePointData *) memory->Allocate();
488 memory->Binary2Memory(npoints,points);
489 memory->CloseBinaryInput();
490 LOG(AliHLTTPCLog::kInformational,"AliHLTTPC::ProcessSlice","Read Cluster")
491 <<AliHLTTPCLog::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
495 points = fFileHandler->AliPoints2Memory(npoints);
498 fBenchmark->Start("Dummy Unpacker");
499 fBenchmark->Stop("Dummy Unpacker");
500 fBenchmark->Start("Dummy CF");
501 fBenchmark->Stop("Dummy CF");
504 if(patch == fNPatch-1){
509 fBenchmark->Start("Vertex Finder Read");
510 fVertexFinder->Reset();
511 fVertexFinder->Read(npoints,points);
512 fBenchmark->Stop("Vertex Finder Read");
513 fBenchmark->Start("Vertex Finder");
514 fVertexFinder->Analyze();
515 AliHLTTPCVertexData vertex[1];
516 fVertexFinder->Write(vertex);
517 fVertex->Read(vertex);
518 fBenchmark->Stop("Vertex Finder");
521 //use 0,0,0 for vertex
524 fTrackMerger->SetVertex(fVertex);
527 fTracker->InitSector(slice,fRow[patch],fEta);
528 fTracker->SetVertex(fVertex);
529 fBenchmark->Start("Tracker setup");
530 fTracker->ReadHits(npoints,points);
531 fTracker->MainVertexTracking_a();
532 fBenchmark->Stop("Tracker setup");
533 fBenchmark->Start("Track follower");
534 fTracker->MainVertexTracking_b();
535 fBenchmark->Stop("Track follower");
537 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
538 fBenchmark->Start("Sector track fitting");
539 fTracker->FillTracks();
540 fBenchmark->Stop("Sector track fitting");
543 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
549 fFileHandler->Free();
552 AliHLTTPCTrackSegmentData *trackdata0 =
553 (AliHLTTPCTrackSegmentData *) memory->Allocate(fTracker->GetTracks());
554 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
559 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
561 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
562 memory->SetBinaryOutput(name);
563 memory->Memory2Binary(ntracks0,trackdata0);
564 memory->CloseBinaryOutput();
567 fInterMerger->Reset();
568 fInterMerger->Init(fRow[patch],patch);
570 fInterMerger->FillTracks(ntracks0,trackdata0);
572 //fBenchmark->Start("Inter Merger");
573 // fInterMerger->Merge();
574 // fInterMerger->SlowMerge();
576 //fBenchmark->Stop("Inter Merger");
578 //write inter merged tracks
580 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
581 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
587 AliHLTTPCTrackSegmentData *trackdata1 =
588 (AliHLTTPCTrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
589 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
591 fTrackMerger->InitSector(slice,patch);
592 fTrackMerger->FillTracks(ntracks1,trackdata1);
596 //fBenchmark->Start("Patch Merger");
597 //fTrackMerger->SlowMerge();
598 fTrackMerger->AddAllTracks();
599 //fTrackMerger->Merge();
600 //fBenchmark->Stop("Patch Merger");
602 //write merged tracks
604 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
605 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
608 fTrackData = (AliHLTTPCTrackSegmentData *)
609 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
611 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
612 fTrackMerger->GetOutTracks());
617 void AliHLTTPC::FitGlobalTracks()
620 AliHLTTPCFitter *fitter = new AliHLTTPCFitter(fVertex,AliHLTTPC::DoVertexFit());
622 fitter->LoadClusters(fWriteOutPath,fEvent,kTRUE);
624 fitter->LoadClusters(fWriteOutPath,fEvent,kFALSE);
626 fBenchmark->Start("Global track fitter");
627 AliHLTTPCTrackArray *tracks = fGlobalMerger->GetOutTracks();
628 for(Int_t i=0; i<tracks->GetNTracks(); i++)
630 AliHLTTPCTrack *tr = tracks->GetCheckedTrack(i);
632 fitter->FitHelix(tr);
633 tr->UpdateToFirstPoint();
635 fBenchmark->Stop("Global track fitter");
639 void AliHLTTPC::WriteSpacePoints(UInt_t npoints,AliHLTTPCSpacePointData *points,
640 Int_t slice,Int_t patch) const
645 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
647 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
648 AliHLTTPCMemHandler * memory = new AliHLTTPCMemHandler();
649 memory->SetBinaryOutput(name);
650 memory->Transform(npoints,points,slice);
651 memory->Memory2Binary(npoints,points);
652 memory->CloseBinaryOutput();
656 Int_t AliHLTTPC::WriteTracks(char *filename,AliHLTTPCMerger *merger,char opt) const
659 AliHLTTPCMemHandler *memory = new AliHLTTPCMemHandler();
660 memory->SetBinaryOutput(filename);
661 if(opt=='a'||opt=='i'){ //add intracks
662 for(Int_t i=0;i<merger->GetNIn();i++){
663 AliHLTTPCTrackArray *tr=merger->GetInTracks(i);
664 memory->TrackArray2Binary(tr);
668 if(opt=='o'||opt=='a'){
669 AliHLTTPCTrackArray *tr=merger->GetOutTracks();
670 memory->TrackArray2Binary(tr);
673 memory->CloseBinaryOutput();
678 void AliHLTTPC::WriteResults()
680 //Write the resulting tracks to outputfile
682 sprintf(fname,"%s/tracks_%d.raw",fWriteOutPath,fEvent);
683 WriteTracks(fname,fGlobalMerger,'a');
684 //WriteTracks("tracks.raw",fGlobalMerger,'a');
685 sprintf(fname,"%s/tracks_gl_%d.raw",fWriteOutPath,fEvent);
686 WriteTracks(fname,fGlobalMerger,'o');
687 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');