]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliLevel3.cxx
Compiler Warning removed
[u/mrichter/AliRoot.git] / HLT / src / AliLevel3.cxx
CommitLineData
3e87ef69 1// @(#) $Id$
532bd2d0 2
3e87ef69 3// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
4//*-- Copyright &copy ALICE HLT Group
108615fc 5
118c26c3 6#include "AliL3StandardIncludes.h"
7
73d9267f 8#ifndef no_root
108615fc 9#include <TFile.h>
10#include <TDirectory.h>
11#include <TClonesArray.h>
12#include <TStopwatch.h>
73d9267f 13#endif
108615fc 14
2e1fe9ef 15#include "AliL3Logging.h"
108615fc 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"
f3e63a47 26#include "AliL3ClustFinderNew.h"
108615fc 27#include "AliL3DigitData.h"
28#include "AliL3TrackArray.h"
29#include "AliL3MemHandler.h"
3e87ef69 30#include "AliL3Fitter.h"
2e1fe9ef 31#ifdef use_aliroot
108615fc 32#include "AliL3FileHandler.h"
2e1fe9ef 33#endif
108615fc 34#include "AliL3Benchmark.h"
108615fc 35#include "AliL3DigitData.h"
36#include "AliL3TrackSegmentData.h"
37#include "AliL3SpacePointData.h"
38#include "AliL3VertexData.h"
b2a02bce 39#include "AliL3DDLDataFileHandler.h"
108615fc 40
3e87ef69 41/** \class AliLevel3
42<pre>
82bd465a 43//_____________________________________________________________
108615fc 44//
45// AliLevel3
46//
47// Interface class for Level3 tracker.
045549b7 48// For example how to use, see exa/runtracker.C (root)
49// or programs/runtracker.cxx (standalone program).
3e87ef69 50//Begin_Html
51//<img src="tpcsectorsnb.gif">
82bd465a 52//End_Html
3e87ef69 53</pre>
54*/
108615fc 55
56ClassImp(AliLevel3)
57
6f388e0d 58Bool_t AliLevel3::fSetTracks2FirstPoint = kTRUE;//Define track parameters at first point
59
f59eed2d 60AliLevel3::AliLevel3()
61{
045549b7 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.
65
108615fc 66 fInputFile=0;
108615fc 67}
68
f59eed2d 69AliLevel3::AliLevel3(Char_t *infile)
70{
045549b7 71 //Constructor to use for when input is anything else but binary files,
72 //meaning rootfiles or raw files.
108615fc 73
a27af97b 74 fInputFile = infile;
b2a02bce 75
b2a02bce 76}
02f030e3 77
b2a02bce 78void AliLevel3::Init(Char_t *path,EFileType filetype,Int_t npatches)
79{
045549b7 80 if((filetype!=kBinary) && (filetype!=kDate) && !fInputFile)
f59eed2d 81 {
82 LOG(AliL3Log::kError,"AliLevel3::Init","Files")
83 <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
84 return;
85 }
494fad94 86
108615fc 87 fWriteOut = kFALSE;
3e87ef69 88 fPileUp = kFALSE;
89 fNoCF=kFALSE;
a27af97b 90 fUseBinary = (filetype==kBinary);
eeddc64d 91 SetPath(path);
3e87ef69 92
108615fc 93 fDoRoi = kFALSE;
532bd2d0 94 fDoNonVertex = kFALSE;
eeddc64d 95 fFindVertex = kFALSE;
96 SetClusterFinderParam();
97
697056ae 98 fEta[0] = 0.;
e968605e 99 fEta[1] = 1.1;
eeddc64d 100
532bd2d0 101 fEvent=0;
986840b3 102
103 switch(npatches){
3e87ef69 104 case 0:
105 fNPatch = 1;
106 fRow[0][0] = AliL3Transform::GetFirstRow(3);
107 fRow[0][1] = AliL3Transform::GetLastRow(5);
108 break;
986840b3 109 case 1:
110 fNPatch = 1; //number of patches change row in process
68a27388 111 fRow[0][0] = 0;
3e87ef69 112 fRow[0][1] = AliL3Transform::GetLastRow(-1);
986840b3 113 break;
114 case 2:
115 fNPatch = 2; //number of patches change row in process
21896bc6 116 fRow[0][0] = 0; // first row
68a27388 117 fRow[0][1] = AliL3Transform::GetLastRow(1);
118 fRow[1][0] = AliL3Transform::GetFirstRow(2);
119 fRow[1][1] = AliL3Transform::GetLastRow(5);
986840b3 120 break;
68a27388 121 default:
122 fNPatch = 6;
123 fRow[0][0] = AliL3Transform::GetFirstRow(0);
124 fRow[0][1] = AliL3Transform::GetLastRow(0);
125 fRow[1][0] = AliL3Transform::GetFirstRow(1);
126 fRow[1][1] = AliL3Transform::GetLastRow(1);
127 fRow[2][0] = AliL3Transform::GetFirstRow(2);
128 fRow[2][1] = AliL3Transform::GetLastRow(2);
129 fRow[3][0] = AliL3Transform::GetFirstRow(3);
130 fRow[3][1] = AliL3Transform::GetLastRow(3);
131 fRow[4][0] = AliL3Transform::GetFirstRow(4);
132 fRow[4][1] = AliL3Transform::GetLastRow(4);
133 fRow[5][0] = AliL3Transform::GetFirstRow(5);
134 fRow[5][1] = AliL3Transform::GetLastRow(5);
88d19ba2 135 }
986840b3 136
108615fc 137 fVertexFinder = new AliL3VertexFinder();
138 fVertex = new AliL3Vertex();
139 fTracker = new AliL3ConfMapper();
140 fTrackMerger = new AliL3TrackMerger(fNPatch);
141 fInterMerger = new AliL3InterMerger();
0a86fbb7 142 fGlobalMerger = new AliL3GlobalMerger();
143 SetMergerParameters();//Set default merger parameters
f59eed2d 144#ifdef use_aliroot
a27af97b 145 if(filetype==kRoot){
146 fFileHandler = new AliL3FileHandler();
147 fFileHandler->SetAliInput(fInputFile);
148 }else if(filetype==kRaw){
149 fFileHandler = new AliL3DDLDataFileHandler();
150 fFileHandler->SetReaderInput(fInputFile);
045549b7 151 }else if(filetype==kDate){
152 fFileHandler = new AliL3DDLDataFileHandler();
153 fFileHandler->SetReaderInput(fInputFile,-1);
a27af97b 154 }else{
155 fFileHandler = new AliL3MemHandler();
156 }
f59eed2d 157#else
b2a02bce 158 if(filetype==kRaw){
159 fFileHandler = new AliL3DDLDataFileHandler();
160 fFileHandler->SetReaderInput(fInputFile);
161 }else{
162 fFileHandler = new AliL3MemHandler();
163 }
f59eed2d 164#endif
108615fc 165 fBenchmark = new AliL3Benchmark();
166}
167
168void AliLevel3::DoBench(char* name){
169 fBenchmark->Analyze(name);
3e87ef69 170 delete fBenchmark;
171 fBenchmark = new AliL3Benchmark();
108615fc 172}
173
174void AliLevel3::DoMc(char* file){
82bd465a 175#ifdef use_aliroot
68a27388 176 if(!fFileHandler->IsDigit(fEvent))
108615fc 177 fFileHandler->SetMCOutput(file);
82bd465a 178#endif
108615fc 179}
180
181AliLevel3::~AliLevel3(){
182 //Destructor
eeddc64d 183 if(fVertexFinder) delete fVertexFinder;
184 if(fVertex) delete fVertex;
108615fc 185 if(fTracker) delete fTracker;
108615fc 186 if(fTrackMerger) delete fTrackMerger;
187 if(fInterMerger) delete fInterMerger;
188 if(fFileHandler) delete fFileHandler;
0a86fbb7 189 if(fGlobalMerger) delete fGlobalMerger;
108615fc 190}
191
eeddc64d 192void AliLevel3::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
193{
194 fXYClusterError=fXYError;
195 fZClusterError=fZError;
196 fClusterDeconv=deconv;
197}
198
108615fc 199void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
83f458e3 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)
108615fc 206{
207 //Set parameters input to the tracker
208 //If no arguments are given, default parameters will be used
209
210 fTracker->SetNSegments(phi_segments,eta_segments);
108615fc 211 fTracker->SetMaxDca(min_pt_fit);
532bd2d0 212 fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
213 fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
214 if(vertexconstraint)
83f458e3 215 fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
532bd2d0 216 else
217 fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
4ce675df 218 fTracker->InitVolumes();
108615fc 219}
220
0a86fbb7 221void AliLevel3::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
222{
223 fGlobalMerger->SetParameter(maxy,maxz,maxkappa,maxpsi,maxtgl);
224}
225
532bd2d0 226void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event){
108615fc 227 //Do tracking on all slices in region [first,last]
eeddc64d 228 //Slices numbering in TPC goes from 0-35, which means that one slice
108615fc 229 //corresponds to inner+outer sector.E.g. slice 2 corresponds to
230 //inner=2 + outer=38.
0a86fbb7 231
232 fGlobalMerger->Setup(first,last);
532bd2d0 233 fEvent=event;
108615fc 234 for(Int_t i=first; i<=last; i++){
235 ProcessSlice(i);
236 fGlobalMerger->SetVertex(fVertex);
108615fc 237 fGlobalMerger->InitSlice(i);
108615fc 238 fGlobalMerger->FillTracks(fNTrackData,fTrackData);
108615fc 239 fFileHandler->Free(); //free the memory
240 fNTrackData=0;
241 fTrackData=0;
242 }
3e87ef69 243 fBenchmark->Start("Global track merger");
244 //fGlobalMerger->AddAllTracks();
3e87ef69 245 fGlobalMerger->Merge();
0a86fbb7 246 //fGlobalMerger->SlowMerge(fWriteOutPath);
3e87ef69 247 fBenchmark->Stop("Global track merger");
248
249 FitGlobalTracks();
250
108615fc 251 if(fWriteOut) WriteResults();
3e87ef69 252 fFileHandler->FreeDigitsTree();
108615fc 253}
254
255void AliLevel3::ProcessSlice(Int_t slice){
256 char name[256];
91f3257c 257 Bool_t UseCF = kFALSE;
e0ea9951 258#ifdef use_aliroot
68a27388 259 UseCF = fFileHandler->IsDigit(fEvent);
a27af97b 260#endif
95a00d93 261 if(fUseBinary)
b2a02bce 262 UseCF = kTRUE; //In case you are not using aliroot
3e87ef69 263 if(fNoCF == kTRUE) //In case you don't want to run with cluster finder
264 UseCF = kFALSE;
265
266 const Int_t maxpoints=120000;
108615fc 267 const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
268 AliL3MemHandler *memory = new AliL3MemHandler();
eeddc64d 269
108615fc 270 fTrackMerger->Reset();
e0ea9951 271 fTrackMerger->SetRows(fRow[0]);
e968605e 272
108615fc 273 for(Int_t patch=fNPatch-1;patch>=0;patch--){
eeddc64d 274 fFileHandler->Init(slice,patch,&fRow[patch][0]);
108615fc 275 UInt_t npoints=0;
276 AliL3SpacePointData *points =0;
277 UInt_t ndigits=0;
278 AliL3DigitRowData *digits =0;
91f3257c 279 if(UseCF){
280 if(fUseBinary){
281 if(!fDoRoi){
6e32a12a 282 if(1){ //Binary to Memory
95a00d93 283 fFileHandler->Free();
e968605e 284 if(fNPatch == 1)
3e87ef69 285 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
e968605e 286 else
3e87ef69 287 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
95a00d93 288 if(!fFileHandler->SetBinaryInput(name)) return;
3e87ef69 289 if(fPileUp)
290 { //Read binary files which are not RLE
291 digits = (AliL3DigitRowData*)fFileHandler->Allocate();
292 fFileHandler->Binary2Memory(ndigits,digits);
293 }
294 else //Read RLE binary files
295 digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
296
e968605e 297 fFileHandler->CloseBinaryInput();
91f3257c 298 }
299
6e32a12a 300 if(0){ //Binary to Memory with Benchmark
3e87ef69 301 fFileHandler->Free();
302 if(fNPatch == 1)
303 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
304 else
305 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
1c5eccbd 306 if(!memory->SetBinaryInput(name)) return;
91f3257c 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=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
313 fBenchmark->Start("Unpacker");
314 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
315 fBenchmark->Stop("Unpacker");
316 memory->Free();
317 }
318
88d19ba2 319 if(0){ //Binary to Memory with Random
91f3257c 320 fFileHandler->Free();
321 fFileHandler->ResetRandom();
322 fFileHandler->SetRandomCluster(100);
323 fFileHandler->SetNGenerate(100);
3e87ef69 324 if(fNPatch == 1)
325 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
326 else
327 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
1c5eccbd 328 if(!memory->SetBinaryInput(name)) return;
91f3257c 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=(AliL3DigitRowData*)fFileHandler->Allocate(dsize+rsize);
336 fBenchmark->Start("Unpacker");
337 fFileHandler->CompMemory2Memory(ndigits,digits,comp);
338 fBenchmark->Stop("Unpacker");
339 memory->Free();
340 }
108615fc 341 }
342
91f3257c 343 else{ //Binary to Memory with Roi
108615fc 344 fFileHandler->Free();
91f3257c 345 Int_t sli[2]={0,0};
346 fFileHandler->SetROI(fEta,sli);
3e87ef69 347 if(fNPatch==1)
348 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
349 else
350 sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
1c5eccbd 351 if(!memory->SetBinaryInput(name)) return;
108615fc 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=(AliL3DigitRowData *)fFileHandler->Allocate(datasize);
358 fBenchmark->Start("Unpacker");
91f3257c 359 datasize = fFileHandler->CompMemory2Memory(ndigits,digits,comp);
360 fBenchmark->Stop("Unpacker");
108615fc 361 memory->Free();
108615fc 362 }
91f3257c 363 }//end UseBinary
364 else{
2e1fe9ef 365#ifdef use_aliroot
21896bc6 366 fBenchmark->Start("Dummy Unpacker");
3e87ef69 367 if(fNPatch==1)
368 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,-1);
369 else
370 sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,patch);
21896bc6 371 fBenchmark->Stop("Dummy Unpacker");
2e1fe9ef 372
02f030e3 373 if(0){ //Ali to Binary
108615fc 374 fFileHandler->SetBinaryOutput(name);
375 fFileHandler->AliDigits2CompBinary();
376 fFileHandler->CloseBinaryOutput();
377 }
378
b2a02bce 379 if(1){ //Ali to Memory
3e87ef69 380 digits=(AliL3DigitRowData *)fFileHandler->AliAltroDigits2Memory(ndigits,fEvent);
02f030e3 381 if(0){ //Memory to Binary
108615fc 382 fFileHandler->SetBinaryOutput(name);
383 fFileHandler->Memory2CompBinary(ndigits,digits);
384 fFileHandler->CloseBinaryOutput();
385 }
386 }
2e1fe9ef 387#endif
91f3257c 388 }//end else UseBinary
108615fc 389
e0ea9951 390 points = (AliL3SpacePointData *) memory->Allocate(pointsize);
494fad94 391 fClusterFinder = new AliL3ClustFinderNew();
eeddc64d 392 fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],maxpoints);
532bd2d0 393 fClusterFinder->SetDeconv(fClusterDeconv);
eeddc64d 394 fClusterFinder->SetXYError(fXYClusterError);
395 fClusterFinder->SetZError(fZClusterError);
c3dd27a3 396 if((fXYClusterError>0)&&(fZClusterError>0))
397 fClusterFinder->SetCalcErr(kFALSE);
e0ea9951 398 fClusterFinder->SetOutputArray(points);
3e87ef69 399 fBenchmark->Start("Cluster finder");
e968605e 400 fClusterFinder->Read(ndigits,digits);
e0ea9951 401 fClusterFinder->ProcessDigits();
3e87ef69 402 fBenchmark->Stop("Cluster finder");
e0ea9951 403 npoints = fClusterFinder->GetNumberOfClusters();
404 delete fClusterFinder;
c3dd27a3 405 fClusterFinder = 0;
e0ea9951 406 fFileHandler->Free();
91f3257c 407 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
408 <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
91f3257c 409 }//end UseCF
410 else{// if not use Clusterfinder
411 if(fUseBinary){//Binary to Memory
412 memory->Free();
3e87ef69 413 if(fNPatch==1)
414 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,-1);
415 else
416 sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,patch);
1c5eccbd 417 if(!memory->SetBinaryInput(name)) return;
91f3257c 418 points = (AliL3SpacePointData *) memory->Allocate();
419 memory->Binary2Memory(npoints,points);
420 memory->CloseBinaryInput();
421 LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Read Cluster")
422 <<AliL3Log::kDec<<"Found "<<npoints<<" Points in File"<<ENDLOG;
423 }
e0ea9951 424#ifdef use_aliroot
91f3257c 425 else{
426 points = fFileHandler->AliPoints2Memory(npoints);
427 }
e0ea9951 428#endif
91f3257c 429 fBenchmark->Start("Dummy Unpacker");
430 fBenchmark->Stop("Dummy Unpacker");
431 fBenchmark->Start("Dummy CF");
432 fBenchmark->Stop("Dummy CF");
433 }
e0ea9951 434
108615fc 435 if(patch == fNPatch-1){
436 // Vertex
437 if(fFindVertex){
438 // Vertex Finder
439
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 AliL3VertexData vertex[1];
447 fVertexFinder->Write(vertex);
448 fVertex->Read(vertex);
449 fBenchmark->Stop("Vertex Finder");
450 }
451 else{
452 //use 0,0,0 for vertex
453 fVertex->SetZero();
454 }
455 fTrackMerger->SetVertex(fVertex);
456 }
3e87ef69 457
e968605e 458 fTracker->InitSector(slice,fRow[patch],fEta);
108615fc 459 fTracker->SetVertex(fVertex);
3e87ef69 460 fBenchmark->Start("Tracker setup");
108615fc 461 fTracker->ReadHits(npoints,points);
3e87ef69 462 fTracker->MainVertexTracking_a();
463 fBenchmark->Stop("Tracker setup");
464 fBenchmark->Start("Track follower");
465 fTracker->MainVertexTracking_b();
466 fBenchmark->Stop("Track follower");
532bd2d0 467 if(fDoNonVertex)
468 fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
3e87ef69 469 fBenchmark->Start("Sector track fitting");
108615fc 470 fTracker->FillTracks();
3e87ef69 471 fBenchmark->Stop("Sector track fitting");
108615fc 472
473 if(fWriteOut)
474 WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
e0ea9951 475
476 //free memory
477 if(UseCF)
478 memory->Free();
479 else
480 fFileHandler->Free();
108615fc 481
482 UInt_t ntracks0 =0;
483 AliL3TrackSegmentData *trackdata0 =
484 (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
485 memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
e968605e 486
108615fc 487 //write tracks
488 if(fWriteOut){
3e87ef69 489 if(fNPatch==1)
490 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
491 else
492 sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
108615fc 493 memory->SetBinaryOutput(name);
494 memory->Memory2Binary(ntracks0,trackdata0);
495 memory->CloseBinaryOutput();
496 }
e968605e 497
108615fc 498 fInterMerger->Reset();
e0ea9951 499 fInterMerger->Init(fRow[patch],patch);
108615fc 500
108615fc 501 fInterMerger->FillTracks(ntracks0,trackdata0);
4baac26f 502
503 //fBenchmark->Start("Inter Merger");
82bd465a 504 // fInterMerger->Merge();
4baac26f 505 // fInterMerger->SlowMerge();
108615fc 506
4baac26f 507 //fBenchmark->Stop("Inter Merger");
6e32a12a 508 /*
108615fc 509 //write inter merged tracks
510 if(fWriteOut){
6e32a12a 511 sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
108615fc 512 WriteTracks(name,fInterMerger,'i'); //write output of intermerger
6e32a12a 513 }
514 */
108615fc 515 memory->Free();
516
517 UInt_t ntracks1 =0;
518 AliL3TrackSegmentData *trackdata1 =
519 (AliL3TrackSegmentData *) memory->Allocate(fInterMerger->GetInTracks(0));
520 memory->TrackArray2Memory(ntracks1,trackdata1,fInterMerger->GetInTracks(0));
521
522 fTrackMerger->InitSector(slice,patch);
108615fc 523 fTrackMerger->FillTracks(ntracks1,trackdata1);
108615fc 524
525 memory->Free();
526 }
3e87ef69 527 //fBenchmark->Start("Patch Merger");
68a27388 528 //fTrackMerger->SlowMerge();
e968605e 529 fTrackMerger->AddAllTracks();
530 //fTrackMerger->Merge();
3e87ef69 531 //fBenchmark->Stop("Patch Merger");
6e32a12a 532 /*
108615fc 533 //write merged tracks
534 if(fWriteOut){
6e32a12a 535 sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
108615fc 536 WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
537 }
6e32a12a 538 */
108615fc 539 fTrackData = (AliL3TrackSegmentData *)
540 fFileHandler->Allocate(fTrackMerger->GetOutTracks());
541
542 fFileHandler->TrackArray2Memory(fNTrackData,fTrackData,
543 fTrackMerger->GetOutTracks());
544
545 delete memory;
546}
547
3e87ef69 548void AliLevel3::FitGlobalTracks()
549{
550 AliL3Fitter *fitter = new AliL3Fitter(fVertex);
551 if(fNPatch==1)
552 fitter->LoadClusters(fWriteOutPath,fEvent,kTRUE);
553 else
554 fitter->LoadClusters(fWriteOutPath,fEvent,kFALSE);
555
556 fBenchmark->Start("Global track fitter");
557 AliL3TrackArray *tracks = fGlobalMerger->GetOutTracks();
558 for(Int_t i=0; i<tracks->GetNTracks(); i++)
559 {
560 AliL3Track *tr = tracks->GetCheckedTrack(i);
561 if(!tr) continue;
562 fitter->FitHelix(tr);
0a86fbb7 563 fitter->UpdateTrack(tr);
3e87ef69 564 }
565 fBenchmark->Stop("Global track fitter");
566 delete fitter;
567}
568
108615fc 569void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
3e87ef69 570 Int_t slice,Int_t patch)
571{
108615fc 572 char name[256];
3e87ef69 573 if(fNPatch==1)
574 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
575 else
576 sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
108615fc 577 AliL3MemHandler * memory = new AliL3MemHandler();
578 memory->SetBinaryOutput(name);
c51c6aaa 579 memory->Transform(npoints,points,slice);
108615fc 580 memory->Memory2Binary(npoints,points);
581 memory->CloseBinaryOutput();
582 delete memory;
583}
584
3e87ef69 585Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt)
586{
2e1fe9ef 587 AliL3MemHandler *memory = new AliL3MemHandler();
108615fc 588 memory->SetBinaryOutput(filename);
589 if(opt=='a'||opt=='i'){ //add intracks
590 for(Int_t i=0;i<merger->GetNIn();i++){
591 AliL3TrackArray *tr=merger->GetInTracks(i);
592 memory->TrackArray2Binary(tr);
593 }
594 }
595
596 if(opt=='o'||opt=='a'){
597 AliL3TrackArray *tr=merger->GetOutTracks();
598 memory->TrackArray2Binary(tr);
599 }
600
601 memory->CloseBinaryOutput();
602
603 return 1;
604}
605
606void AliLevel3::WriteResults()
607{
608 //Write the resulting tracks to outputfile
6e32a12a 609 Char_t fname[256];
3e87ef69 610 sprintf(fname,"%s/tracks_%d.raw",fWriteOutPath,fEvent);
6e32a12a 611 WriteTracks(fname,fGlobalMerger,'a');
612 //WriteTracks("tracks.raw",fGlobalMerger,'a');
3e87ef69 613 sprintf(fname,"%s/tracks_gl_%d.raw",fWriteOutPath,fEvent);
6e32a12a 614 WriteTracks(fname,fGlobalMerger,'o');
615 //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');
108615fc 616}