3 // Author: Anders Vestbo <mailto:vestbo$fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ASV
7 #include <TDirectory.h>
8 #include <TClonesArray.h>
9 #include <TStopwatch.h>
12 #include "AliL3Logging.h"
13 #include "AliLevel3.h"
14 #include "AliL3ConfMapper.h"
15 #include "AliL3Vertex.h"
16 #include "AliL3VertexFinder.h"
17 #include "AliL3TrackMerger.h"
18 #include "AliL3GlobalMerger.h"
19 #include "AliL3InterMerger.h"
20 #include "AliL3ConfMapPoint.h"
21 #include "AliL3ConfMapTrack.h"
22 #include "AliL3Transform.h"
23 #include "AliL3ClustFinderNew.h"
24 #include "AliL3DigitData.h"
25 #include "AliL3TrackArray.h"
26 #include "AliL3MemHandler.h"
28 #include "AliL3FileHandler.h"
30 #include "AliL3Benchmark.h"
32 #include "AliL3DigitData.h"
33 #include "AliL3TrackSegmentData.h"
34 #include "AliL3SpacePointData.h"
35 #include "AliL3VertexData.h"
37 //_____________________________________________________________
41 // Interface class for Level3 tracker.
42 // Tracking is done by calling constructor with input,output
44 // You must always remember to set the tracking parameters. E.g.:
46 // AliLevel3 *level3 = new AliLevel3(inputfile,outputfile);
47 // level3->SetTrackerParam(); //Sets default tracking parameters
48 // level3->ProcessSector(2,2); //Does tracking on sector 2 (actually 2+38)
51 <img src="tpcsectorsnb.gif">
57 AliLevel3::AliLevel3(){
63 AliLevel3::AliLevel3(Char_t *infile,Char_t *outfile){
64 //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
66 fOutputFile = new TFile(outfile,"NEW");
68 if(!fOutputFile->IsOpen())
70 LOG(AliL3Log::kWarning, "AliLevel3::AliLevel3","File Open")
71 <<"Delete your old "<<outfile<<" file!"<<ENDLOG;
73 fInputFile = new TFile(infile,"READ");
75 if(!fInputFile->IsOpen())
77 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
78 <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
85 AliLevel3::AliLevel3(TFile *in, TFile *out){
89 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
90 <<"Pointer to InFile 0x0!"<<ENDLOG;
94 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
95 <<"Pointer to OutFile 0x0!"<<ENDLOG;
99 if(!fOutputFile->IsOpen())
101 LOG(AliL3Log::kWarning,"AliLevel3::AliLevel3","File Open")
102 <<"no output file!"<<ENDLOG;
105 if(!fInputFile->IsOpen())
107 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
108 <<"Inputfile does not exist"<<ENDLOG;
114 void AliLevel3::Init(Int_t npatches=6){
117 fTransformer = new AliL3Transform();
119 fDoNonVertex = kFALSE;
120 fClusterDeconv = kTRUE;
130 fNPatch = 1; //number of patches change row in process
131 fRow[0][0] = 0; // first row
132 fRow[0][1] = 175; // last row
135 fNPatch = 2; //number of patches change row in process
136 fRow[0][0] = 0; // first row
139 fRow[1][1] = 175; // last row
142 fNPatch = 5; //number of patches change row in process
143 fRow[0][0] = 0; // first row
152 fRow[4][1] = 175; // last row
155 fNPatch = 6; //number of patches change row in process
156 fRow[0][0] = 0; // first row
167 fRow[5][1] = 175; // last row
170 fVertexFinder = new AliL3VertexFinder();
171 fVertex = new AliL3Vertex();
172 fTracker = new AliL3ConfMapper();
173 fTrackMerger = new AliL3TrackMerger(fNPatch);
174 fInterMerger = new AliL3InterMerger();
176 fFileHandler = new AliL3FileHandler();
177 fFileHandler->SetAliInput(fInputFile);
179 fFileHandler = new AliL3MemHandler();
181 fBenchmark = new AliL3Benchmark();
184 void AliLevel3::DoBench(char* name){
185 fBenchmark->Analyze(name);
188 void AliLevel3::DoMc(char* file){
190 if(!fFileHandler->IsDigit())
191 fFileHandler->SetMCOutput(file);
195 AliLevel3::~AliLevel3(){
197 if(fVertexFinder) delete fVertexFinder;
198 if(fVertex) delete fVertex;
199 if(fTracker) delete fTracker;
200 if(fTransformer) delete fTransformer;
201 if(fTrackMerger) delete fTrackMerger;
202 if(fInterMerger) delete fInterMerger;
203 if(fFileHandler) delete fFileHandler;
206 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
207 Int_t trackletlength, Int_t tracklength,
208 Int_t rowscopetracklet, Int_t rowscopetrack,
209 Double_t min_pt_fit, Double_t maxangle,
210 Double_t goodDist, Double_t hitChi2Cut,
211 Double_t goodHitChi2, Double_t trackChi2Cut,
212 Int_t maxdist,Double_t maxphi,Double_t maxeta,Bool_t vertexconstraint)
214 //Set parameters input to the tracker
215 //If no arguments are given, default parameters will be used
217 fTracker->SetNSegments(phi_segments,eta_segments);
218 fTracker->SetMaxDca(min_pt_fit);
219 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
220 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
222 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
224 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
226 fTracker->SetParamDone(true);
227 fTracker->InitVolumes();
230 void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event){
231 //Do tracking on all slices in region [first,last]
232 //Slices numbering in TPC goes from 0-35, which means that 1 slice
233 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
234 //inner=2 + outer=38.
235 fGlobalMerger= new AliL3GlobalMerger(first,last);
237 for(Int_t i=first; i<=last; i++){
239 fGlobalMerger->SetVertex(fVertex);
240 fGlobalMerger->SetTransformer(fTransformer);
241 fGlobalMerger->InitSlice(i);
242 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
243 fFileHandler->Free(); //free the memory
247 fBenchmark->Start("Global Merger");
248 //fGlobalMerger->AddAllTracks();
249 //fGlobalMerger->Merge();
250 fGlobalMerger->SlowMerge();
251 fBenchmark->Stop("Global Merger");
253 if(fWriteOut) WriteResults();
254 delete fGlobalMerger; fGlobalMerger = 0;
257 void AliLevel3::ProcessSlice(Int_t slice){
259 Bool_t UseCF = kFALSE;
261 UseCF = fFileHandler->IsDigit();
264 UseCF = kTRUE; //In case you are not using aliroot
266 const Int_t maxpoints=100000;
267 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
268 AliL3MemHandler *memory = new AliL3MemHandler();
270 fTrackMerger->Reset();
271 fTrackMerger->SetTransformer(fTransformer);
272 fTrackMerger->SetRows(fRow[0]);
273 for(Int_t patch=fNPatch-1;patch>=0;patch--){
274 fFileHandler->Init(slice,patch,fRow[patch]);
275 fFileHandler->Init(fTransformer);
277 AliL3SpacePointData *points =0;
279 AliL3DigitRowData *digits =0;
283 if(1){ //Binary to Memory
284 fFileHandler->Free();
285 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
286 if(!fFileHandler->SetBinaryInput(name)) return;
287 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
288 fFileHandler->CloseBinaryInput();
291 if(0){ //Binary to Memory with Benchmark
292 fFileHandler->Free();
293 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
294 if(!memory->SetBinaryInput(name)) return;
295 UInt_t compsize=memory->GetFileSize();
296 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
297 memory->CompBinary2CompMemory(ndigits,comp);
298 memory->CloseBinaryInput();
299 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
300 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
301 fBenchmark->Start("Unpacker");
302 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
303 fBenchmark->Stop("Unpacker");
307 if(0){ //Binary to Memory with Random
308 fFileHandler->Free();
309 fFileHandler->ResetRandom();
310 fFileHandler->SetRandomCluster(100);
311 fFileHandler->SetNGenerate(100);
312 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
313 if(!memory->SetBinaryInput(name)) return;
314 UInt_t compsize=memory->GetFileSize();
315 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
316 memory->CompBinary2CompMemory(ndigits,comp);
317 memory->CloseBinaryInput();
318 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
319 UInt_t rsize=fFileHandler->GetRandomSize();
320 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
321 fBenchmark->Start("Unpacker");
322 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
323 fBenchmark->Stop("Unpacker");
328 else{ //Binary to Memory with Roi
329 fFileHandler->Free();
331 fFileHandler->SetROI(fEta,sli);
332 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
333 if(!memory->SetBinaryInput(name)) return;
334 UInt_t compsize=memory->GetFileSize();
335 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
336 memory->CompBinary2CompMemory(ndigits,comp);
337 memory->CloseBinaryInput();
338 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
339 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
340 fBenchmark->Start("Unpacker");
341 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
342 fBenchmark->Stop("Unpacker");
348 fBenchmark->Start("Dummy Unpacker");
349 sprintf(name,"digits_%d_%d.raw",slice,patch);
350 fBenchmark->Stop("Dummy Unpacker");
352 if(0){ //Ali to Binary
353 fFileHandler->SetBinaryOutput(name);
354 fFileHandler->AliDigits2CompBinary();
355 fFileHandler->CloseBinaryOutput();
358 if(1){ //Ali to Memory
359 digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits,fEvent);
360 if(fWriteOut){ //Memory to Binary
361 fFileHandler->SetBinaryOutput(name);
362 fFileHandler->Memory2CompBinary(ndigits,digits);
363 fFileHandler->CloseBinaryOutput();
367 }//end else UseBinary
369 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
371 fClusterFinder = new AliL3ClustFinderNew(fTransformer);
372 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1]
374 fClusterFinder->SetDeconv(fClusterDeconv);
375 fClusterFinder->SetXYError(0.2);
376 fClusterFinder->SetZError(0.3);
377 fClusterFinder->SetOutputArray(points);
378 fClusterFinder->Read(ndigits,digits);
379 fBenchmark->Start("Cluster Finder");
380 fClusterFinder->ProcessDigits();
381 fBenchmark->Stop("Cluster Finder");
382 npoints = fClusterFinder->GetNumberOfClusters();
383 delete fClusterFinder;
385 fFileHandler->Free();
386 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
387 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
391 else{// if not use Clusterfinder
392 if(fUseBinary){//Binary to Memory
394 sprintf(name,"/%spoints_%d_%d.raw",fPath,slice,patch);
395 if(!memory->SetBinaryInput(name)) return;
396 points = (AliL3SpacePointData *) memory->Allocate();
397 memory->Binary2Memory(npoints,points);
398 memory->CloseBinaryInput();
399 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Read Cluster")
400 <<AliL3Log::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
404 points = fFileHandler->AliPoints2Memory(npoints);
407 fBenchmark->Start("Dummy Unpacker");
408 fBenchmark->Stop("Dummy Unpacker");
409 fBenchmark->Start("Dummy CF");
410 fBenchmark->Stop("Dummy CF");
413 if(patch == fNPatch-1){
418 fBenchmark->Start("Vertex Finder Read");
419 fVertexFinder->Reset();
420 fVertexFinder->Read(npoints,points);
421 fBenchmark->Stop("Vertex Finder Read");
422 fBenchmark->Start("Vertex Finder");
423 fVertexFinder->Analyze();
424 AliL3VertexData vertex[1];
425 fVertexFinder->Write(vertex);
426 fVertex->Read(vertex);
427 fBenchmark->Stop("Vertex Finder");
430 //use 0,0,0 for vertex
433 fTrackMerger->SetVertex(fVertex);
435 fTracker->InitSector(slice,fRow[patch]);//,fEta);
436 fTracker->SetVertex(fVertex);
437 fBenchmark->Start("Tracker Read Hits");
438 fTracker->ReadHits(npoints,points);
439 fBenchmark->Stop("Tracker Read Hits");
440 fBenchmark->Start("MainVertexTracking A");
441 fTracker->MainVertexTracking();
442 //fTracker->MainVertexTracking_a();
443 fBenchmark->Stop("MainVertexTracking A");
444 //fBenchmark->Start("MainVertexTracking B");
445 //fTracker->MainVertexTracking_b();
446 //fBenchmark->Stop("MainVertexTracking B");
447 fBenchmark->Start("Tracking fit");
449 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
450 fTracker->FillTracks();
451 fBenchmark->Stop("Tracking fit");
454 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
460 fFileHandler->Free();
463 AliL3TrackSegmentData *trackdata0 =
464 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
465 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
469 sprintf(name,"%stracks_tr_%d_%d.raw",fWriteOutPath,slice,patch);
470 memory->SetBinaryOutput(name);
471 memory->Memory2Binary(ntracks0,trackdata0);
472 memory->CloseBinaryOutput();
475 fInterMerger->Reset();
476 fInterMerger->SetTransformer(fTransformer);
477 fInterMerger->Init(fRow[patch],patch);
479 fInterMerger->FillTracks(ntracks0,trackdata0);
480 fBenchmark->Start("Inter Merger");
481 // fInterMerger->Merge();
482 // fInterMerger->SlowMerge();
484 fBenchmark->Stop("Inter Merger");
486 //write inter merged tracks
488 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
489 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
495 AliL3TrackSegmentData *trackdata1 =
496 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
497 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
499 fTrackMerger->InitSector(slice,patch);
500 fTrackMerger->FillTracks(ntracks1,trackdata1);
504 fBenchmark->Start("Patch Merger");
505 // fTrackMerger->SlowMerge();
506 //fTrackMerger->AddAllTracks();
507 fTrackMerger->Merge();
508 fBenchmark->Stop("Patch Merger");
510 //write merged tracks
512 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
513 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
516 fTrackData = (AliL3TrackSegmentData *)
517 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
519 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
520 fTrackMerger->GetOutTracks());
525 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
526 Int_t slice,Int_t patch){
528 sprintf(name,"%spoints_%d_%d.raw",fWriteOutPath,slice,patch);
529 AliL3MemHandler * memory = new AliL3MemHandler();
530 memory->SetBinaryOutput(name);
531 memory->Transform(npoints,points,slice,fTransformer);
532 memory->Memory2Binary(npoints,points);
533 memory->CloseBinaryOutput();
538 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
539 AliL3MemHandler *memory = new AliL3MemHandler();
540 memory->SetBinaryOutput(filename);
541 if(opt=='a'||opt=='i'){ //add intracks
542 for(Int_t i=0;i<merger->GetNIn();i++){
543 AliL3TrackArray *tr=merger->GetInTracks(i);
544 memory->TrackArray2Binary(tr);
548 if(opt=='o'||opt=='a'){
549 AliL3TrackArray *tr=merger->GetOutTracks();
550 memory->TrackArray2Binary(tr);
553 memory->CloseBinaryOutput();
558 void AliLevel3::WriteResults()
560 //Write the resulting tracks to outputfile
562 sprintf(fname,"%stracks.raw",fWriteOutPath);
563 WriteTracks(fname,fGlobalMerger,'a');
564 //WriteTracks("tracks.raw",fGlobalMerger,'a');
565 sprintf(fname,"%stracks_gl.raw",fWriteOutPath);
566 WriteTracks(fname,fGlobalMerger,'o');
567 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');