1 // Author: Anders Vestbo <mailto:vestbo$fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
2 //*-- Copyright © ASV
5 #include <TDirectory.h>
6 #include <TClonesArray.h>
7 #include <TStopwatch.h>
10 #include "AliL3Logging.h"
11 #include "AliLevel3.h"
12 #include "AliL3ConfMapper.h"
13 #include "AliL3Vertex.h"
14 #include "AliL3VertexFinder.h"
15 #include "AliL3TrackMerger.h"
16 #include "AliL3GlobalMerger.h"
17 #include "AliL3InterMerger.h"
18 #include "AliL3ConfMapPoint.h"
19 #include "AliL3ConfMapTrack.h"
20 #include "AliL3Transform.h"
21 #include "AliL3ClustFinderNew.h"
22 #include "AliL3DigitData.h"
23 #include "AliL3TrackArray.h"
24 #include "AliL3MemHandler.h"
26 #include "AliL3FileHandler.h"
28 #include "AliL3Benchmark.h"
30 #include "AliL3DigitData.h"
31 #include "AliL3TrackSegmentData.h"
32 #include "AliL3SpacePointData.h"
33 #include "AliL3VertexData.h"
35 //_____________________________________________________________
39 // Interface class for Level3 tracker.
40 // Tracking is done by calling constructor with input,output
42 // You must always remember to set the tracking parameters. E.g.:
44 // AliLevel3 *level3 = new AliLevel3(inputfile,outputfile);
45 // level3->SetTrackerParam(); //Sets default tracking parameters
46 // level3->ProcessSector(2,2); //Does tracking on sector 2 (actually 2+38)
49 <img src="tpcsectorsnb.gif">
55 AliLevel3::AliLevel3(){
61 AliLevel3::AliLevel3(Char_t *infile,Char_t *outfile){
62 //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
64 fOutputFile = new TFile(outfile,"NEW");
66 if(!fOutputFile->IsOpen())
68 LOG(AliL3Log::kWarning, "AliLevel3::AliLevel3","File Open")
69 <<"Delete your old "<<outfile<<" file!"<<ENDLOG;
71 fInputFile = new TFile(infile,"READ");
73 if(!fInputFile->IsOpen())
75 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
76 <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
83 AliLevel3::AliLevel3(TFile *in, TFile *out){
87 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
88 <<"Pointer to InFile 0x0!"<<ENDLOG;
92 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
93 <<"Pointer to OutFile 0x0!"<<ENDLOG;
97 if(!fOutputFile->IsOpen())
99 LOG(AliL3Log::kWarning,"AliLevel3::AliLevel3","File Open")
100 <<"no output file!"<<ENDLOG;
103 if(!fInputFile->IsOpen())
105 LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
106 <<"Inputfile does not exist"<<ENDLOG;
112 void AliLevel3::Init(){
115 fTransformer = new AliL3Transform();
123 fNPatch = 1; //number of patches change row in process
124 fRow[0][0] = 0; // first row
125 fRow[0][1] = 175; // last row
128 fNPatch = 2; //number of patches change row in process
129 fRow[0][0] = 0; // first row
132 fRow[1][1] = 175; // last row
135 fNPatch = 5; //number of patches change row in process
136 fRow[0][0] = 0; // first row
145 fRow[4][1] = 175; // last row
148 fNPatch = 6; //number of patches change row in process
149 fRow[0][0] = 0; // first row
160 fRow[5][1] = 175; // last row
162 fVertexFinder = new AliL3VertexFinder();
163 fVertex = new AliL3Vertex();
164 fTracker = new AliL3ConfMapper();
165 fTrackMerger = new AliL3TrackMerger(fNPatch);
166 fInterMerger = new AliL3InterMerger();
168 fFileHandler = new AliL3FileHandler();
169 fFileHandler->SetAliInput(fInputFile);
171 fFileHandler = new AliL3MemHandler();
173 fBenchmark = new AliL3Benchmark();
176 void AliLevel3::DoBench(char* name){
177 fBenchmark->Analyze(name);
180 void AliLevel3::DoMc(char* file){
182 if(!fFileHandler->IsDigit())
183 fFileHandler->SetMCOutput(file);
187 AliLevel3::~AliLevel3(){
189 if(fVertexFinder) delete fVertexFinder;
190 if(fVertex) delete fVertex;
191 if(fTracker) delete fTracker;
192 if(fTransformer) delete fTransformer;
193 if(fTrackMerger) delete fTrackMerger;
194 if(fInterMerger) delete fInterMerger;
195 if(fFileHandler) delete fFileHandler;
198 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
199 Int_t trackletlength, Int_t tracklength,
200 Int_t rowscopetracklet, Int_t rowscopetrack,
201 Double_t min_pt_fit, Double_t maxangle,
202 Double_t goodDist, Double_t hitChi2Cut,
203 Double_t goodHitChi2, Double_t trackChi2Cut,
206 //Set parameters input to the tracker
207 //If no arguments are given, default parameters will be used
209 fTracker->SetNSegments(phi_segments,eta_segments);
210 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
211 fTracker->SetMaxDca(min_pt_fit);
212 fTracker->SetTrackletCuts(maxangle,goodDist,true);
213 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist);
215 fTracker->SetParamDone(true);
218 void AliLevel3::ProcessEvent(Int_t first,Int_t last){
219 //Do tracking on all slices in region [first,last]
220 //Slices numbering in TPC goes from 0-35, which means that 1 slice
221 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
222 //inner=2 + outer=38.
223 fGlobalMerger= new AliL3GlobalMerger(first,last);
224 for(Int_t i=first; i<=last; i++){
226 fGlobalMerger->SetVertex(fVertex);
227 fGlobalMerger->SetTransformer(fTransformer);
228 fGlobalMerger->InitSlice(i);
229 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
230 fFileHandler->Free(); //free the memory
234 fBenchmark->Start("Global Merger");
235 fGlobalMerger->AddAllTracks();
236 //fGlobalMerger->Merge();
237 fGlobalMerger->SlowMerge();
238 fBenchmark->Stop("Global Merger");
240 if(fWriteOut) WriteResults();
241 delete fGlobalMerger; fGlobalMerger = 0;
244 void AliLevel3::ProcessSlice(Int_t slice){
246 Bool_t UseCF = kFALSE;
248 UseCF = fFileHandler->IsDigit();
250 const Int_t maxpoints=100000;
251 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
252 AliL3MemHandler *memory = new AliL3MemHandler();
254 fTrackMerger->Reset();
255 fTrackMerger->SetTransformer(fTransformer);
256 fTrackMerger->SetRows(fRow[0]);
257 for(Int_t patch=fNPatch-1;patch>=0;patch--){
258 fFileHandler->Init(slice,patch,fRow[patch]);
259 fFileHandler->Init(fTransformer);
261 AliL3SpacePointData *points =0;
263 AliL3DigitRowData *digits =0;
267 if(0){ //Binary to Memory
268 fFileHandler->Free();
269 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
270 if(!fFileHandler->SetBinaryInput(name)) return;
271 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
272 fFileHandler->CloseBinaryInput();
275 if(1){ //Binary to Memory with Benchmark
276 fFileHandler->Free();
277 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
278 if(!memory->SetBinaryInput(name)) return;
279 UInt_t compsize=memory->GetFileSize();
280 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
281 memory->CompBinary2CompMemory(ndigits,comp);
282 memory->CloseBinaryInput();
283 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
284 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
285 fBenchmark->Start("Unpacker");
286 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
287 fBenchmark->Stop("Unpacker");
291 if(0){ //Binary to Memory with Random
292 fFileHandler->Free();
293 fFileHandler->ResetRandom();
294 fFileHandler->SetRandomCluster(100);
295 fFileHandler->SetNGenerate(100);
296 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
297 if(!memory->SetBinaryInput(name)) return;
298 UInt_t compsize=memory->GetFileSize();
299 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
300 memory->CompBinary2CompMemory(ndigits,comp);
301 memory->CloseBinaryInput();
302 UInt_t dsize=memory->GetMemorySize(ndigits,comp);
303 UInt_t rsize=fFileHandler->GetRandomSize();
304 digits=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
305 fBenchmark->Start("Unpacker");
306 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
307 fBenchmark->Stop("Unpacker");
312 else{ //Binary to Memory with Roi
313 fFileHandler->Free();
315 fFileHandler->SetROI(fEta,sli);
316 sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
317 if(!memory->SetBinaryInput(name)) return;
318 UInt_t compsize=memory->GetFileSize();
319 UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
320 memory->CompBinary2CompMemory(ndigits,comp);
321 memory->CloseBinaryInput();
322 UInt_t datasize=memory->GetMemorySize(ndigits,comp);
323 digits=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
324 fBenchmark->Start("Unpacker");
325 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
326 fBenchmark->Stop("Unpacker");
332 fBenchmark->Start("Dummy Unpacker");
333 sprintf(name,"digits_%d_%d.raw",slice,patch);
334 fBenchmark->Stop("Dummy Unpacker");
336 if(0){ //Ali to Binary
337 fFileHandler->SetBinaryOutput(name);
338 fFileHandler->AliDigits2CompBinary();
339 fFileHandler->CloseBinaryOutput();
342 if(1){ //Ali to Memory
343 digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits);
344 if(fWriteOut){ //Memory to Binary
345 fFileHandler->SetBinaryOutput(name);
346 fFileHandler->Memory2CompBinary(ndigits,digits);
347 fFileHandler->CloseBinaryOutput();
351 }//end else UseBinary
353 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
355 fClusterFinder = new AliL3ClustFinderNew(fTransformer);
356 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1]
358 fClusterFinder->SetXYError(0.1);
359 fClusterFinder->SetZError(0.2);
360 fClusterFinder->SetOutputArray(points);
361 fClusterFinder->Read(ndigits,digits);
362 fBenchmark->Start("Cluster Finder");
363 fClusterFinder->ProcessDigits();
364 fBenchmark->Stop("Cluster Finder");
365 npoints = fClusterFinder->GetNumberOfClusters();
366 delete fClusterFinder;
368 fFileHandler->Free();
369 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
370 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
374 else{// if not use Clusterfinder
375 if(fUseBinary){//Binary to Memory
377 sprintf(name,"/%spoints_%d_%d.raw",fPath,slice,patch);
378 if(!memory->SetBinaryInput(name)) return;
379 points = (AliL3SpacePointData *) memory->Allocate();
380 memory->Binary2Memory(npoints,points);
381 memory->CloseBinaryInput();
382 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Read Cluster")
383 <<AliL3Log::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
387 points = fFileHandler->AliPoints2Memory(npoints);
390 fBenchmark->Start("Dummy Unpacker");
391 fBenchmark->Stop("Dummy Unpacker");
392 fBenchmark->Start("Dummy CF");
393 fBenchmark->Stop("Dummy CF");
396 if(patch == fNPatch-1){
401 fBenchmark->Start("Vertex Finder Read");
402 fVertexFinder->Reset();
403 fVertexFinder->Read(npoints,points);
404 fBenchmark->Stop("Vertex Finder Read");
405 fBenchmark->Start("Vertex Finder");
406 fVertexFinder->Analyze();
407 AliL3VertexData vertex[1];
408 fVertexFinder->Write(vertex);
409 fVertex->Read(vertex);
410 fBenchmark->Stop("Vertex Finder");
413 //use 0,0,0 for vertex
416 fTrackMerger->SetVertex(fVertex);
418 fTracker->InitSector(slice,fRow[patch]);//,fEta);
419 fTracker->SetVertex(fVertex);
420 fBenchmark->Start("Tracker Read Hits");
421 fTracker->ReadHits(npoints,points);
422 fBenchmark->Stop("Tracker Read Hits");
423 fBenchmark->Start("MainVertexTracking A");
424 fTracker->MainVertexTracking_a();
425 fBenchmark->Stop("MainVertexTracking A");
426 fBenchmark->Start("MainVertexTracking B");
427 fTracker->MainVertexTracking_b();
428 fBenchmark->Stop("MainVertexTracking B");
429 fBenchmark->Start("Tracking fit");
430 fTracker->FillTracks();
431 fBenchmark->Stop("Tracking fit");
434 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
440 fFileHandler->Free();
443 AliL3TrackSegmentData *trackdata0 =
444 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
445 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
449 sprintf(name,"tracks_tr_%d_%d.raw",slice,patch);
450 memory->SetBinaryOutput(name);
451 memory->Memory2Binary(ntracks0,trackdata0);
452 memory->CloseBinaryOutput();
455 fInterMerger->Reset();
456 fInterMerger->SetTransformer(fTransformer);
457 fInterMerger->Init(fRow[patch],patch);
459 fInterMerger->FillTracks(ntracks0,trackdata0);
460 fBenchmark->Start("Inter Merger");
461 // fInterMerger->Merge();
462 // fInterMerger->SlowMerge();
464 fBenchmark->Stop("Inter Merger");
466 //write inter merged tracks
468 sprintf(name,"tracks_im_%d_%d.raw",slice,patch);
469 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
474 AliL3TrackSegmentData *trackdata1 =
475 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
476 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
478 fTrackMerger->InitSector(slice,patch);
479 fTrackMerger->FillTracks(ntracks1,trackdata1);
483 fBenchmark->Start("Patch Merger");
484 // fTrackMerger->SlowMerge();
485 fTrackMerger->AddAllTracks();
486 fTrackMerger->Merge();
487 fBenchmark->Stop("Patch Merger");
488 //write merged tracks
490 sprintf(name,"tracks_tm_%d.raw",slice);
491 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
494 fTrackData = (AliL3TrackSegmentData *)
495 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
497 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
498 fTrackMerger->GetOutTracks());
503 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
504 Int_t slice,Int_t patch){
506 sprintf(name,"points_%d_%d.raw",slice,patch);
507 AliL3MemHandler * memory = new AliL3MemHandler();
508 memory->SetBinaryOutput(name);
509 memory->Transform(npoints,points,slice,fTransformer);
510 memory->Memory2Binary(npoints,points);
511 memory->CloseBinaryOutput();
516 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
517 AliL3MemHandler *memory = new AliL3MemHandler();
518 memory->SetBinaryOutput(filename);
519 if(opt=='a'||opt=='i'){ //add intracks
520 for(Int_t i=0;i<merger->GetNIn();i++){
521 AliL3TrackArray *tr=merger->GetInTracks(i);
522 memory->TrackArray2Binary(tr);
526 if(opt=='o'||opt=='a'){
527 AliL3TrackArray *tr=merger->GetOutTracks();
528 memory->TrackArray2Binary(tr);
531 memory->CloseBinaryOutput();
536 void AliLevel3::WriteResults()
538 //Write the resulting tracks to outputfile
539 WriteTracks("tracks.raw",fGlobalMerger,'a');
540 WriteTracks("tracks_gl.raw",fGlobalMerger,'o');