3 // Author: Anders Vestbo <mailto:vestbo$fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ASV
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"
31 #include "AliL3FileHandler.h"
33 #include "AliL3Benchmark.h"
34 #include "AliL3DigitData.h"
35 #include "AliL3TrackSegmentData.h"
36 #include "AliL3SpacePointData.h"
37 #include "AliL3VertexData.h"
39 //_____________________________________________________________
43 // Interface class for Level3 tracker.
44 // Tracking is done by calling constructor with input,output
46 // You must always remember to set the tracking parameters. E.g.:
48 // AliLevel3 *level3 = new AliLevel3(inputfile,outputfile);
49 // level3->SetTrackerParam(); //Sets default tracking parameters
50 // level3->ProcessSector(2,2); //Does tracking on sector 2 (actually 2+38)
53 <img src="tpcsectorsnb.gif">
59 AliLevel3::AliLevel3()
65 AliLevel3::AliLevel3(Char_t *infile)
67 //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
69 fInputFile = fopen(infile,"r");
73 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
74 <<"Inputfile "<<infile<<" does not exist!"<<ENDLOG;
79 AliLevel3::AliLevel3(Char_t *infile)
81 //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
83 fInputFile = new TFile(infile,"READ");
85 if(!fInputFile->IsOpen())
87 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
88 <<"Inputfile "<<infile<<" does not exist!"<<ENDLOG;
95 AliLevel3::AliLevel3(TFile *in)
99 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
100 <<"Pointer to InFile 0x0!"<<ENDLOG;
104 if(!fInputFile->IsOpen())
106 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
107 <<"Inputfile does not exist"<<ENDLOG;
113 void AliLevel3::Init(Char_t *path,Bool_t binary,Int_t npatches)
116 if(npatches != 1 && binary == kFALSE)
118 LOG(AliL3Log::kWarning,"AliLevel3::Init","NPatches")
119 <<"You can only read data slice by slice (1 patch) when reading from a rootfile and using the patched (ASV) AliTPC version."<<ENDLOG;
124 if(!binary && !fInputFile)
126 LOG(AliL3Log::kError,"AliLevel3::Init","Files")
127 <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
131 AliL3Transform::Init(path,!binary);//Initialize the detector parameters.
138 fDoNonVertex = kFALSE;
139 fFindVertex = kFALSE;
140 SetClusterFinderParam();
149 fNPatch = 1; //number of patches change row in process
151 fRow[0][1] = AliL3Transform::GetNRows();
154 fNPatch = 2; //number of patches change row in process
155 fRow[0][0] = 0; // first row
156 fRow[0][1] = AliL3Transform::GetLastRow(1);
157 fRow[1][0] = AliL3Transform::GetFirstRow(2);
158 fRow[1][1] = AliL3Transform::GetLastRow(5);
162 fRow[0][0] = AliL3Transform::GetFirstRow(0);
163 fRow[0][1] = AliL3Transform::GetLastRow(0);
164 fRow[1][0] = AliL3Transform::GetFirstRow(1);
165 fRow[1][1] = AliL3Transform::GetLastRow(1);
166 fRow[2][0] = AliL3Transform::GetFirstRow(2);
167 fRow[2][1] = AliL3Transform::GetLastRow(2);
168 fRow[3][0] = AliL3Transform::GetFirstRow(3);
169 fRow[3][1] = AliL3Transform::GetLastRow(3);
170 fRow[4][0] = AliL3Transform::GetFirstRow(4);
171 fRow[4][1] = AliL3Transform::GetLastRow(4);
172 fRow[5][0] = AliL3Transform::GetFirstRow(5);
173 fRow[5][1] = AliL3Transform::GetLastRow(5);
176 fVertexFinder = new AliL3VertexFinder();
177 fVertex = new AliL3Vertex();
178 fTracker = new AliL3ConfMapper();
179 fTrackMerger = new AliL3TrackMerger(fNPatch);
180 fInterMerger = new AliL3InterMerger();
182 fFileHandler = new AliL3FileHandler();
183 fFileHandler->SetAliInput(fInputFile);
185 fFileHandler = new AliL3MemHandler();
187 fBenchmark = new AliL3Benchmark();
190 void AliLevel3::DoBench(char* name){
191 fBenchmark->Analyze(name);
194 void AliLevel3::DoMc(char* file){
196 if(!fFileHandler->IsDigit(fEvent))
197 fFileHandler->SetMCOutput(file);
201 AliLevel3::~AliLevel3(){
203 if(fVertexFinder) delete fVertexFinder;
204 if(fVertex) delete fVertex;
205 if(fTracker) delete fTracker;
206 if(fTrackMerger) delete fTrackMerger;
207 if(fInterMerger) delete fInterMerger;
208 if(fFileHandler) delete fFileHandler;
211 void AliLevel3::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
213 fXYClusterError=fXYError;
214 fZClusterError=fZError;
215 fClusterDeconv=deconv;
218 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
219 Int_t trackletlength, Int_t tracklength,
220 Int_t rowscopetracklet, Int_t rowscopetrack,
221 Double_t min_pt_fit, Double_t maxangle,
222 Double_t goodDist, Double_t hitChi2Cut,
223 Double_t goodHitChi2, Double_t trackChi2Cut,
224 Int_t maxdist,Double_t maxphi,Double_t maxeta,Bool_t vertexconstraint)
226 //Set parameters input to the tracker
227 //If no arguments are given, default parameters will be used
229 fTracker->SetNSegments(phi_segments,eta_segments);
230 fTracker->SetMaxDca(min_pt_fit);
231 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
232 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
234 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
236 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
238 fTracker->SetParamDone(true);
239 fTracker->InitVolumes();
242 void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event){
243 //Do tracking on all slices in region [first,last]
244 //Slices numbering in TPC goes from 0-35, which means that one slice
245 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
246 //inner=2 + outer=38.
247 fGlobalMerger= new AliL3GlobalMerger(first,last);
249 for(Int_t i=first; i<=last; i++){
251 fGlobalMerger->SetVertex(fVertex);
252 fGlobalMerger->InitSlice(i);
253 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
254 fFileHandler->Free(); //free the memory
258 fBenchmark->Start("Global Merger");
259 //fGlobalMerger->AddAllTracks();
260 //fGlobalMerger->Merge();
261 fGlobalMerger->SlowMerge();
262 fBenchmark->Stop("Global Merger");
264 if(fWriteOut) WriteResults();
265 delete fGlobalMerger; fGlobalMerger = 0;
268 void AliLevel3::ProcessSlice(Int_t slice){
270 Bool_t UseCF = kFALSE;
272 UseCF = fFileHandler->IsDigit(fEvent);
275 UseCF = kTRUE; //In case you are not using aliroot
277 const Int_t maxpoints=100000;
278 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
279 AliL3MemHandler *memory = new AliL3MemHandler();
281 fTrackMerger->Reset();
282 fTrackMerger->SetRows(fRow[0]);
283 for(Int_t patch=fNPatch-1;patch>=0;patch--){
284 fFileHandler->Init(slice,patch,&fRow[patch][0]);
286 AliL3SpacePointData *points =0;
288 AliL3DigitRowData *digits =0;
292 if(1){ //Binary to Memory
293 fFileHandler->Free();
294 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
295 if(!fFileHandler->SetBinaryInput(name)) return;
296 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
297 fFileHandler->CloseBinaryInput();
300 if(0){ //Binary to Memory with Benchmark
301 fFileHandler->Free();
302 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
303 if(!memory->SetBinaryInput(name)) return;
304 UInt_t compsize=memory->GetFileSize();
305 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
306 memory->CompBinary2CompMemory(ndigits,comp);
307 memory->CloseBinaryInput();
308 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
309 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
310 fBenchmark->Start("Unpacker");
311 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
312 fBenchmark->Stop("Unpacker");
316 if(0){ //Binary to Memory with Random
317 fFileHandler->Free();
318 fFileHandler->ResetRandom();
319 fFileHandler->SetRandomCluster(100);
320 fFileHandler->SetNGenerate(100);
321 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
322 if(!memory->SetBinaryInput(name)) return;
323 UInt_t compsize=memory->GetFileSize();
324 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
325 memory->CompBinary2CompMemory(ndigits,comp);
326 memory->CloseBinaryInput();
327 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
328 UInt_t rsize=fFileHandler->GetRandomSize();
329 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
330 fBenchmark->Start("Unpacker");
331 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
332 fBenchmark->Stop("Unpacker");
337 else{ //Binary to Memory with Roi
338 fFileHandler->Free();
340 fFileHandler->SetROI(fEta,sli);
341 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
342 if(!memory->SetBinaryInput(name)) return;
343 UInt_t compsize=memory->GetFileSize();
344 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
345 memory->CompBinary2CompMemory(ndigits,comp);
346 memory->CloseBinaryInput();
347 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
348 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
349 fBenchmark->Start("Unpacker");
350 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
351 fBenchmark->Stop("Unpacker");
357 fBenchmark->Start("Dummy Unpacker");
358 sprintf(name,"digits_%d_%d.raw",slice,patch);
359 fBenchmark->Stop("Dummy Unpacker");
361 if(0){ //Ali to Binary
362 fFileHandler->SetBinaryOutput(name);
363 fFileHandler->AliDigits2CompBinary();
364 fFileHandler->CloseBinaryOutput();
367 if(1){ //Ali to Memory
368 digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits,fEvent);
369 if(0){ //Memory to Binary
370 fFileHandler->SetBinaryOutput(name);
371 fFileHandler->Memory2CompBinary(ndigits,digits);
372 fFileHandler->CloseBinaryOutput();
376 }//end else UseBinary
378 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
380 fClusterFinder = new AliL3ClustFinderNew();
381 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],maxpoints);
382 fClusterFinder->SetDeconv(fClusterDeconv);
383 fClusterFinder->SetXYError(fXYClusterError);
384 fClusterFinder->SetZError(fZClusterError);
385 if((fXYClusterError>0)&&(fZClusterError>0))
386 fClusterFinder->SetCalcErr(kFALSE);
387 fClusterFinder->SetOutputArray(points);
388 fClusterFinder->Read(ndigits,digits);
389 fBenchmark->Start("Cluster Finder");
390 fClusterFinder->ProcessDigits();
391 fBenchmark->Stop("Cluster Finder");
392 npoints = fClusterFinder->GetNumberOfClusters();
393 delete fClusterFinder;
395 fFileHandler->Free();
396 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
397 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
399 else{// if not use Clusterfinder
400 if(fUseBinary){//Binary to Memory
402 sprintf(name,"/%spoints_%d_%d.raw",fPath,slice,patch);
403 if(!memory->SetBinaryInput(name)) return;
404 points = (AliL3SpacePointData *) memory->Allocate();
405 memory->Binary2Memory(npoints,points);
406 memory->CloseBinaryInput();
407 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Read Cluster")
408 <<AliL3Log::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
412 points = fFileHandler->AliPoints2Memory(npoints);
415 fBenchmark->Start("Dummy Unpacker");
416 fBenchmark->Stop("Dummy Unpacker");
417 fBenchmark->Start("Dummy CF");
418 fBenchmark->Stop("Dummy CF");
421 if(patch == fNPatch-1){
426 fBenchmark->Start("Vertex Finder Read");
427 fVertexFinder->Reset();
428 fVertexFinder->Read(npoints,points);
429 fBenchmark->Stop("Vertex Finder Read");
430 fBenchmark->Start("Vertex Finder");
431 fVertexFinder->Analyze();
432 AliL3VertexData vertex[1];
433 fVertexFinder->Write(vertex);
434 fVertex->Read(vertex);
435 fBenchmark->Stop("Vertex Finder");
438 //use 0,0,0 for vertex
441 fTrackMerger->SetVertex(fVertex);
443 fTracker->InitSector(slice,fRow[patch]);//,fEta);
444 fTracker->SetVertex(fVertex);
445 fBenchmark->Start("Tracker Read Hits");
446 fTracker->ReadHits(npoints,points);
447 fBenchmark->Stop("Tracker Read Hits");
448 fBenchmark->Start("MainVertexTracking A");
449 fTracker->MainVertexTracking();
450 //fTracker->MainVertexTracking_a();
451 fBenchmark->Stop("MainVertexTracking A");
452 //fBenchmark->Start("MainVertexTracking B");
453 //fTracker->MainVertexTracking_b();
454 //fBenchmark->Stop("MainVertexTracking B");
455 fBenchmark->Start("Tracking fit");
457 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
458 fTracker->FillTracks();
459 fBenchmark->Stop("Tracking fit");
462 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
468 fFileHandler->Free();
471 AliL3TrackSegmentData *trackdata0 =
472 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
473 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
477 sprintf(name,"%stracks_tr_%d_%d.raw",fWriteOutPath,slice,patch);
478 memory->SetBinaryOutput(name);
479 memory->Memory2Binary(ntracks0,trackdata0);
480 memory->CloseBinaryOutput();
483 fInterMerger->Reset();
484 fInterMerger->Init(fRow[patch],patch);
486 fInterMerger->FillTracks(ntracks0,trackdata0);
488 //fBenchmark->Start("Inter Merger");
489 // fInterMerger->Merge();
490 // fInterMerger->SlowMerge();
492 //fBenchmark->Stop("Inter Merger");
494 //write inter merged tracks
496 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
497 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
503 AliL3TrackSegmentData *trackdata1 =
504 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
505 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
507 fTrackMerger->InitSector(slice,patch);
508 fTrackMerger->FillTracks(ntracks1,trackdata1);
512 fBenchmark->Start("Patch Merger");
513 //fTrackMerger->SlowMerge();
514 //fTrackMerger->AddAllTracks();
515 fTrackMerger->Merge();
516 fBenchmark->Stop("Patch Merger");
518 //write merged tracks
520 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
521 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
524 fTrackData = (AliL3TrackSegmentData *)
525 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
527 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
528 fTrackMerger->GetOutTracks());
533 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
534 Int_t slice,Int_t patch){
536 sprintf(name,"%spoints_%d_%d.raw",fWriteOutPath,slice,patch);
537 AliL3MemHandler * memory = new AliL3MemHandler();
538 memory->SetBinaryOutput(name);
539 memory->Transform(npoints,points,slice);
540 memory->Memory2Binary(npoints,points);
541 memory->CloseBinaryOutput();
545 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
546 AliL3MemHandler *memory = new AliL3MemHandler();
547 memory->SetBinaryOutput(filename);
548 if(opt=='a'||opt=='i'){ //add intracks
549 for(Int_t i=0;i<merger->GetNIn();i++){
550 AliL3TrackArray *tr=merger->GetInTracks(i);
551 memory->TrackArray2Binary(tr);
555 if(opt=='o'||opt=='a'){
556 AliL3TrackArray *tr=merger->GetOutTracks();
557 memory->TrackArray2Binary(tr);
560 memory->CloseBinaryOutput();
565 void AliLevel3::WriteResults()
567 //Write the resulting tracks to outputfile
569 sprintf(fname,"%stracks.raw",fWriteOutPath);
570 WriteTracks(fname,fGlobalMerger,'a');
571 //WriteTracks("tracks.raw",fGlobalMerger,'a');
572 sprintf(fname,"%stracks_gl.raw",fWriteOutPath);
573 WriteTracks(fname,fGlobalMerger,'o');
574 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');