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