3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTTPCStandardIncludes.h"
10 #include <TDirectory.h>
11 #include <TClonesArray.h>
12 #include <TStopwatch.h>
15 #include "AliHLTTPCLogging.h"
16 #include "AliHLTTPC.h"
17 #include "AliHLTTPCConfMapper.h"
18 #include "AliHLTTPCVertex.h"
19 #include "AliHLTTPCVertexFinder.h"
20 #include "AliHLTTPCTrackMerger.h"
21 #include "AliHLTTPCGlobalMerger.h"
22 #include "AliHLTTPCInterMerger.h"
23 #include "AliHLTTPCConfMapPoint.h"
24 #include "AliHLTTPCConfMapTrack.h"
25 #include "AliHLTTPCTransform.h"
26 #include "AliHLTTPCClustFinderNew.h"
27 #include "AliHLTTPCDigitData.h"
28 #include "AliHLTTPCTrackArray.h"
29 #include "AliHLTTPCMemHandler.h"
30 #include "AliHLTTPCFitter.h"
32 #include "AliHLTTPCFileHandler.h"
34 #include "AliHLTTPCBenchmark.h"
35 #include "AliHLTTPCDigitData.h"
36 #include "AliHLTTPCTrackSegmentData.h"
37 #include "AliHLTTPCSpacePointData.h"
38 #include "AliHLTTPCVertexData.h"
39 #include "AliHLTTPCDDLDataFileHandler.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 Bool_t AliHLTTPC::fSetTracks2FirstPoint = kTRUE;//Define track parameters at first point
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.
69 AliHLTTPC::AliHLTTPC(Char_t *infile)
71 //Constructor to use for when input is anything else but binary files,
72 //meaning rootfiles or raw files.
78 void AliHLTTPC::Init(Char_t *path,EFileType filetype,Int_t npatches)
80 if((filetype!=kBinary) && (filetype!=kDate) && !fInputFile)
82 LOG(AliHLTTPCLog::kError,"AliHLTTPC::Init","Files")
83 <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
90 fUseBinary = (filetype==kBinary);
94 fDoNonVertex = kFALSE;
96 SetClusterFinderParam();
106 fRow[0][0] = AliHLTTPCTransform::GetFirstRow(3);
107 fRow[0][1] = AliHLTTPCTransform::GetLastRow(5);
110 fNPatch = 1; //number of patches change row in process
112 fRow[0][1] = AliHLTTPCTransform::GetLastRow(-1);
115 fNPatch = 2; //number of patches change row in process
116 fRow[0][0] = 0; // first row
117 fRow[0][1] = AliHLTTPCTransform::GetLastRow(1);
118 fRow[1][0] = AliHLTTPCTransform::GetFirstRow(2);
119 fRow[1][1] = AliHLTTPCTransform::GetLastRow(5);
123 fRow[0][0] = AliHLTTPCTransform::GetFirstRow(0);
124 fRow[0][1] = AliHLTTPCTransform::GetLastRow(0);
125 fRow[1][0] = AliHLTTPCTransform::GetFirstRow(1);
126 fRow[1][1] = AliHLTTPCTransform::GetLastRow(1);
127 fRow[2][0] = AliHLTTPCTransform::GetFirstRow(2);
128 fRow[2][1] = AliHLTTPCTransform::GetLastRow(2);
129 fRow[3][0] = AliHLTTPCTransform::GetFirstRow(3);
130 fRow[3][1] = AliHLTTPCTransform::GetLastRow(3);
131 fRow[4][0] = AliHLTTPCTransform::GetFirstRow(4);
132 fRow[4][1] = AliHLTTPCTransform::GetLastRow(4);
133 fRow[5][0] = AliHLTTPCTransform::GetFirstRow(5);
134 fRow[5][1] = AliHLTTPCTransform::GetLastRow(5);
137 fVertexFinder = new AliHLTTPCVertexFinder();
138 fVertex = new AliHLTTPCVertex();
139 fTracker = new AliHLTTPCConfMapper();
140 fTrackMerger = new AliHLTTPCTrackMerger(fNPatch);
141 fInterMerger = new AliHLTTPCInterMerger();
142 fGlobalMerger = new AliHLTTPCGlobalMerger();
143 SetMergerParameters();//Set default merger parameters
146 fFileHandler = new AliHLTTPCFileHandler();
147 fFileHandler->SetAliInput(fInputFile);
148 }else if(filetype==kRaw){
149 fFileHandler = new AliHLTTPCDDLDataFileHandler();
150 fFileHandler->SetReaderInput(fInputFile);
151 }else if(filetype==kDate){
152 fFileHandler = new AliHLTTPCDDLDataFileHandler();
153 fFileHandler->SetReaderInput(fInputFile,-1);
155 fFileHandler = new AliHLTTPCMemHandler();
159 fFileHandler = new AliHLTTPCDDLDataFileHandler();
160 fFileHandler->SetReaderInput(fInputFile);
162 fFileHandler = new AliHLTTPCMemHandler();
165 fBenchmark = new AliHLTTPCBenchmark();
168 void AliHLTTPC::DoBench(char* name){
169 fBenchmark->Analyze(name);
171 fBenchmark = new AliHLTTPCBenchmark();
174 void AliHLTTPC::DoMc(char* file){
176 if(!fFileHandler->IsDigit(fEvent))
177 fFileHandler->SetMCOutput(file);
181 AliHLTTPC::~AliHLTTPC(){
183 if(fVertexFinder) delete fVertexFinder;
184 if(fVertex) delete fVertex;
185 if(fTracker) delete fTracker;
186 if(fTrackMerger) delete fTrackMerger;
187 if(fInterMerger) delete fInterMerger;
188 if(fFileHandler) delete fFileHandler;
189 if(fGlobalMerger) delete fGlobalMerger;
192 void AliHLTTPC::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
194 fXYClusterError=fXYError;
195 fZClusterError=fZError;
196 fClusterDeconv=deconv;
199 void AliHLTTPC::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
200 Int_t trackletlength, Int_t tracklength,
201 Int_t rowscopetracklet, Int_t rowscopetrack,
202 Double_t min_pt_fit, Double_t maxangle,
203 Double_t goodDist, Double_t hitChi2Cut,
204 Double_t goodHitChi2, Double_t trackChi2Cut,
205 Int_t maxdist,Double_t maxphi,Double_t maxeta,Bool_t vertexconstraint)
207 //Set parameters input to the tracker
208 //If no arguments are given, default parameters will be used
210 fTracker->SetNSegments(phi_segments,eta_segments);
211 fTracker->SetMaxDca(min_pt_fit);
212 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
213 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
215 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
217 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
218 fTracker->InitVolumes();
221 void AliHLTTPC::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
223 fGlobalMerger->SetParameter(maxy,maxz,maxkappa,maxpsi,maxtgl);
226 void AliHLTTPC::ProcessEvent(Int_t first,Int_t last,Int_t event){
227 //Do tracking on all slices in region [first,last]
228 //Slices numbering in TPC goes from 0-35, which means that one slice
229 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
230 //inner=2 + outer=38.
232 fGlobalMerger->Setup(first,last);
234 for(Int_t i=first; i<=last; i++){
236 fGlobalMerger->SetVertex(fVertex);
237 fGlobalMerger->InitSlice(i);
238 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
239 fFileHandler->Free(); //free the memory
243 fBenchmark->Start("Global track merger");
244 //fGlobalMerger->AddAllTracks();
245 fGlobalMerger->Merge();
246 //fGlobalMerger->SlowMerge(fWriteOutPath);
247 fBenchmark->Stop("Global track merger");
251 if(fWriteOut) WriteResults();
252 fFileHandler->FreeDigitsTree();
255 void AliHLTTPC::ProcessSlice(Int_t slice){
257 Bool_t UseCF = kFALSE;
259 UseCF = fFileHandler->IsDigit(fEvent);
262 UseCF = kTRUE; //In case you are not using aliroot
263 if(fNoCF == kTRUE) //In case you don't want to run with cluster finder
266 const Int_t maxpoints=120000;
267 const Int_t pointsize = maxpoints * sizeof(AliHLTTPCSpacePointData);
268 AliHLTTPCMemHandler *memory = new AliHLTTPCMemHandler();
270 fTrackMerger->Reset();
271 fTrackMerger->SetRows(fRow[0]);
273 for(Int_t patch=fNPatch-1;patch>=0;patch--){
274 fFileHandler->Init(slice,patch,&fRow[patch][0]);
276 AliHLTTPCSpacePointData *points =0;
278 AliHLTTPCDigitRowData *digits =0;
282 if(1){ //Binary to Memory
283 fFileHandler->Free();
285 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
287 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
288 if(!fFileHandler->SetBinaryInput(name)) return;
290 { //Read binary files which are not RLE
291 digits = (AliHLTTPCDigitRowData*)fFileHandler->Allocate();
292 fFileHandler->Binary2Memory(ndigits,digits);
294 else //Read RLE binary files
295 digits= (AliHLTTPCDigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
297 fFileHandler->CloseBinaryInput();
300 if(0){ //Binary to Memory with Benchmark
301 fFileHandler->Free();
303 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
305 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
306 if(!memory->SetBinaryInput(name)) return;
307 UInt_t compsize=memory->GetFileSize();
308 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
309 memory->CompBinary2CompMemory(ndigits,comp);
310 memory->CloseBinaryInput();
311 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
312 digits=(AliHLTTPCDigitRowData *)fFileHandler->Allocate(datasize);
313 fBenchmark->Start("Unpacker");
314 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
315 fBenchmark->Stop("Unpacker");
319 if(0){ //Binary to Memory with Random
320 fFileHandler->Free();
321 fFileHandler->ResetRandom();
322 fFileHandler->SetRandomCluster(100);
323 fFileHandler->SetNGenerate(100);
325 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
327 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
328 if(!memory->SetBinaryInput(name)) return;
329 UInt_t compsize=memory->GetFileSize();
330 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
331 memory->CompBinary2CompMemory(ndigits,comp);
332 memory->CloseBinaryInput();
333 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
334 UInt_t rsize=fFileHandler->GetRandomSize();
335 digits=(AliHLTTPCDigitRowData*)fFileHandler->Allocate(dsize+rsize);
336 fBenchmark->Start("Unpacker");
337 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
338 fBenchmark->Stop("Unpacker");
343 else{ //Binary to Memory with Roi
344 fFileHandler->Free();
346 fFileHandler->SetROI(fEta,sli);
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(!memory->SetBinaryInput(name)) return;
352 UInt_t compsize=memory->GetFileSize();
353 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
354 memory->CompBinary2CompMemory(ndigits,comp);
355 memory->CloseBinaryInput();
356 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
357 digits=(AliHLTTPCDigitRowData *)fFileHandler->Allocate(datasize);
358 fBenchmark->Start("Unpacker");
359 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
360 fBenchmark->Stop("Unpacker");
366 fBenchmark->Start("Dummy Unpacker");
368 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,-1);
370 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,patch);
371 fBenchmark->Stop("Dummy Unpacker");
373 if(0){ //Ali to Binary
374 fFileHandler->SetBinaryOutput(name);
375 fFileHandler->AliDigits2CompBinary();
376 fFileHandler->CloseBinaryOutput();
379 if(1){ //Ali to Memory
380 digits=(AliHLTTPCDigitRowData *)fFileHandler->AliAltroDigits2Memory(ndigits,fEvent);
381 if(0){ //Memory to Binary
382 fFileHandler->SetBinaryOutput(name);
383 fFileHandler->Memory2CompBinary(ndigits,digits);
384 fFileHandler->CloseBinaryOutput();
388 }//end else UseBinary
390 points = (AliHLTTPCSpacePointData *) memory->Allocate(pointsize);
391 fClusterFinder = new AliHLTTPCClustFinderNew();
392 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],maxpoints);
393 fClusterFinder->SetDeconv(fClusterDeconv);
394 fClusterFinder->SetXYError(fXYClusterError);
395 fClusterFinder->SetZError(fZClusterError);
396 if((fXYClusterError>0)&&(fZClusterError>0))
397 fClusterFinder->SetCalcErr(kFALSE);
398 fClusterFinder->SetOutputArray(points);
399 fBenchmark->Start("Cluster finder");
400 fClusterFinder->Read(ndigits,digits);
401 fClusterFinder->ProcessDigits();
402 fBenchmark->Stop("Cluster finder");
403 npoints = fClusterFinder->GetNumberOfClusters();
404 delete fClusterFinder;
406 fFileHandler->Free();
407 LOG(AliHLTTPCLog::kInformational,"AliHLTTPC::ProcessSlice","Cluster Finder")
408 <<AliHLTTPCLog::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
410 else{// if not use Clusterfinder
411 if(fUseBinary){//Binary to Memory
414 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,-1);
416 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,patch);
417 if(!memory->SetBinaryInput(name)) return;
418 points = (AliHLTTPCSpacePointData *) memory->Allocate();
419 memory->Binary2Memory(npoints,points);
420 memory->CloseBinaryInput();
421 LOG(AliHLTTPCLog::kInformational,"AliHLTTPC::ProcessSlice","Read Cluster")
422 <<AliHLTTPCLog::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
426 points = fFileHandler->AliPoints2Memory(npoints);
429 fBenchmark->Start("Dummy Unpacker");
430 fBenchmark->Stop("Dummy Unpacker");
431 fBenchmark->Start("Dummy CF");
432 fBenchmark->Stop("Dummy CF");
435 if(patch == fNPatch-1){
440 fBenchmark->Start("Vertex Finder Read");
441 fVertexFinder->Reset();
442 fVertexFinder->Read(npoints,points);
443 fBenchmark->Stop("Vertex Finder Read");
444 fBenchmark->Start("Vertex Finder");
445 fVertexFinder->Analyze();
446 AliHLTTPCVertexData vertex[1];
447 fVertexFinder->Write(vertex);
448 fVertex->Read(vertex);
449 fBenchmark->Stop("Vertex Finder");
452 //use 0,0,0 for vertex
455 fTrackMerger->SetVertex(fVertex);
458 fTracker->InitSector(slice,fRow[patch],fEta);
459 fTracker->SetVertex(fVertex);
460 fBenchmark->Start("Tracker setup");
461 fTracker->ReadHits(npoints,points);
462 fTracker->MainVertexTracking_a();
463 fBenchmark->Stop("Tracker setup");
464 fBenchmark->Start("Track follower");
465 fTracker->MainVertexTracking_b();
466 fBenchmark->Stop("Track follower");
468 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
469 fBenchmark->Start("Sector track fitting");
470 fTracker->FillTracks();
471 fBenchmark->Stop("Sector track fitting");
474 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
480 fFileHandler->Free();
483 AliHLTTPCTrackSegmentData *trackdata0 =
484 (AliHLTTPCTrackSegmentData *) memory->Allocate(fTracker->GetTracks());
485 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
490 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
492 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
493 memory->SetBinaryOutput(name);
494 memory->Memory2Binary(ntracks0,trackdata0);
495 memory->CloseBinaryOutput();
498 fInterMerger->Reset();
499 fInterMerger->Init(fRow[patch],patch);
501 fInterMerger->FillTracks(ntracks0,trackdata0);
503 //fBenchmark->Start("Inter Merger");
504 // fInterMerger->Merge();
505 // fInterMerger->SlowMerge();
507 //fBenchmark->Stop("Inter Merger");
509 //write inter merged tracks
511 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
512 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
518 AliHLTTPCTrackSegmentData *trackdata1 =
519 (AliHLTTPCTrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
520 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
522 fTrackMerger->InitSector(slice,patch);
523 fTrackMerger->FillTracks(ntracks1,trackdata1);
527 //fBenchmark->Start("Patch Merger");
528 //fTrackMerger->SlowMerge();
529 fTrackMerger->AddAllTracks();
530 //fTrackMerger->Merge();
531 //fBenchmark->Stop("Patch Merger");
533 //write merged tracks
535 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
536 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
539 fTrackData = (AliHLTTPCTrackSegmentData *)
540 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
542 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
543 fTrackMerger->GetOutTracks());
548 void AliHLTTPC::FitGlobalTracks()
550 AliHLTTPCFitter *fitter = new AliHLTTPCFitter(fVertex);
552 fitter->LoadClusters(fWriteOutPath,fEvent,kTRUE);
554 fitter->LoadClusters(fWriteOutPath,fEvent,kFALSE);
556 fBenchmark->Start("Global track fitter");
557 AliHLTTPCTrackArray *tracks = fGlobalMerger->GetOutTracks();
558 for(Int_t i=0; i<tracks->GetNTracks(); i++)
560 AliHLTTPCTrack *tr = tracks->GetCheckedTrack(i);
562 fitter->FitHelix(tr);
563 fitter->UpdateTrack(tr);
565 fBenchmark->Stop("Global track fitter");
569 void AliHLTTPC::WriteSpacePoints(UInt_t npoints,AliHLTTPCSpacePointData *points,
570 Int_t slice,Int_t patch)
574 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
576 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
577 AliHLTTPCMemHandler * memory = new AliHLTTPCMemHandler();
578 memory->SetBinaryOutput(name);
579 memory->Transform(npoints,points,slice);
580 memory->Memory2Binary(npoints,points);
581 memory->CloseBinaryOutput();
585 Int_t AliHLTTPC::WriteTracks(char *filename,AliHLTTPCMerger *merger,char opt)
587 AliHLTTPCMemHandler *memory = new AliHLTTPCMemHandler();
588 memory->SetBinaryOutput(filename);
589 if(opt=='a'||opt=='i'){ //add intracks
590 for(Int_t i=0;i<merger->GetNIn();i++){
591 AliHLTTPCTrackArray *tr=merger->GetInTracks(i);
592 memory->TrackArray2Binary(tr);
596 if(opt=='o'||opt=='a'){
597 AliHLTTPCTrackArray *tr=merger->GetOutTracks();
598 memory->TrackArray2Binary(tr);
601 memory->CloseBinaryOutput();
606 void AliHLTTPC::WriteResults()
608 //Write the resulting tracks to outputfile
610 sprintf(fname,"%s/tracks_%d.raw",fWriteOutPath,fEvent);
611 WriteTracks(fname,fGlobalMerger,'a');
612 //WriteTracks("tracks.raw",fGlobalMerger,'a');
613 sprintf(fname,"%s/tracks_gl_%d.raw",fWriteOutPath,fEvent);
614 WriteTracks(fname,fGlobalMerger,'o');
615 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');