]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/src/AliLevel3.cxx
Make AliTRDgeometryFull default
[u/mrichter/AliRoot.git] / HLT / src / AliLevel3.cxx
index 5da639750cbdbe7fe895c0acf5e28e387bf1650c..0407da18e4caa20cd5285bc8f78bcd179290f41c 100644 (file)
@@ -1,13 +1,16 @@
-//$Id$
+// @(#) $Id$
 
-// Author: Anders Vestbo <mailto:vestbo$fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
-//*-- Copyright &copy ASV
+// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
+//*-- Copyright &copy ALICE HLT Group
 
+#include "AliL3StandardIncludes.h"
+
+#ifndef no_root
 #include <TFile.h>
 #include <TDirectory.h>
 #include <TClonesArray.h>
 #include <TStopwatch.h>
-#include <iostream.h>
+#endif
 
 #include "AliL3Logging.h"
 #include "AliLevel3.h"
 #include "AliL3DigitData.h"
 #include "AliL3TrackArray.h"
 #include "AliL3MemHandler.h"
+#include "AliL3Fitter.h"
 #ifdef use_aliroot
 #include "AliL3FileHandler.h"
 #endif
 #include "AliL3Benchmark.h"
-
 #include "AliL3DigitData.h"
 #include "AliL3TrackSegmentData.h"
 #include "AliL3SpacePointData.h"
 #include "AliL3VertexData.h"
+#include "AliL3DDLDataFileHandler.h"
 
+/** \class AliLevel3
+<pre>
 //_____________________________________________________________
 //
 //  AliLevel3
 //
 //  Interface class for Level3 tracker.
-//  Tracking is done by calling constructor with input,output 
-//  given as argument. 
-//  You must always remember to set the tracking parameters. E.g.:
-// 
-//  AliLevel3 *level3 = new AliLevel3(inputfile,outputfile);
-//  level3->SetTrackerParam(); //Sets default tracking parameters
-//  level3->ProcessSector(2,2);  //Does tracking on sector 2 (actually 2+38)
-//Begin_Html
-/*
-<img src="tpcsectorsnb.gif">
-*/
+//  For example how to use, see exa/runtracker.C (root)
+//  or programs/runtracker.cxx (standalone program).
+//Begin_Html 
+//<img src="tpcsectorsnb.gif">
 //End_Html
+</pre>
+*/
 
 ClassImp(AliLevel3)
 
+Bool_t AliLevel3::fDoVertexFit = kTRUE;//Include the vertex in the final track fit
+
 AliLevel3::AliLevel3()
 {
+  //Default constructor. Should also be used when input is from binary files.
+  //In that case the path to where the binary files are located has to be
+  //passed to the AliLevel::Init function.
+  
   fInputFile=0;
 }
 
 AliLevel3::AliLevel3(Char_t *infile)
 {
-  //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
-  
-  fInputFile = new TFile(infile,"READ");
-  
-  if(!fInputFile->IsOpen())
-    {
-      LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
-       <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
-      return;
-    }
-  
-}
-
-AliLevel3::AliLevel3(TFile *in)
-{
-  fInputFile  =  in;
-  if(!in){
-    LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
-    <<"Pointer to InFile 0x0!"<<ENDLOG;
-    return;
-  }  
+  //Constructor to use for when input is anything else but binary files,
+  //meaning rootfiles or raw files.
   
-  if(!fInputFile->IsOpen())
-    {
-    LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
-    <<"Inputfile does not exist"<<ENDLOG;
-      return;
-    }
+  fInputFile = infile;
 }
 
-void AliLevel3::Init(Char_t *path,Bool_t binary=kTRUE,Int_t npatches=6)
+void AliLevel3::Init(Char_t *path,EFileType filetype,Int_t npatches)
 {
-  if(!binary && !fInputFile)
+  if((filetype!=kBinary) && (filetype!=kDate) && !fInputFile)
     {
       LOG(AliL3Log::kError,"AliLevel3::Init","Files")
        <<"You have not supplied the input rootfile; use the appropriate ctor!"<<ENDLOG;
       return;
     }
   
-  AliL3Transform::Init(path);//Initialize the detector parameters.
   fWriteOut = kFALSE;
-  fUseBinary = binary;
+  fPileUp = kFALSE;
+  fNoCF=kFALSE;
+  fUseBinary = (filetype==kBinary);
   SetPath(path);
-  fGlobalMerger = 0;
-
+  
   fDoRoi = kFALSE;
   fDoNonVertex = kFALSE;
   fFindVertex = kFALSE;
   SetClusterFinderParam();
 
   fEta[0] = 0.;
-  fEta[1] = 0.9;
+  fEta[1] = 1.1;
 
   fEvent=0;
+#ifdef use_aliroot /*just to be sure*/
+  AliL3FileHandler::CleanStaticIndex();
+#endif
 
   switch(npatches){
+  case 0:
+    fNPatch = 1;
+    fRow[0][0] = AliL3Transform::GetFirstRow(3);
+    fRow[0][1] = AliL3Transform::GetLastRow(5);
+    break;
   case 1:
     fNPatch = 1;        //number of patches change row in process
-    fRow[0][0] = 0;     // first row
-    fRow[0][1] = 175;   // last row
+    fRow[0][0] = 0;
+    fRow[0][1] = AliL3Transform::GetLastRow(-1);
     break;
   case 2:
     fNPatch = 2;        //number of patches change row in process
     fRow[0][0] = 0;     // first row
-    fRow[0][1] = 54;
-    fRow[1][0] = 55;
-    fRow[1][1] = 175;   // last row
+    fRow[0][1] = AliL3Transform::GetLastRow(1);
+    fRow[1][0] = AliL3Transform::GetFirstRow(2);
+    fRow[1][1] = AliL3Transform::GetLastRow(5);
     break;
-  case 5:
-    fNPatch = 5;        //number of patches change row in process
-    fRow[0][0] = 0;     // first row
-    fRow[0][1] = 45;
-    fRow[1][0] = 46;
-    fRow[1][1] = 77;
-    fRow[2][0] = 78;
-    fRow[2][1] = 109;
-    fRow[3][0] = 110; 
-    fRow[3][1] = 141;
-    fRow[4][0] = 142;
-    fRow[4][1] = 175;   // last row
-    break;
-  default: //should match entries in AliL3Transform
-    fNPatch = 6;        //number of patches change row in process
-    fRow[0][0] = 0;     // first row
-    fRow[0][1] = 31;
-    fRow[1][0] = 32;
-    fRow[1][1] = 63;
-    fRow[2][0] = 64;
-    fRow[2][1] = 91;
-    fRow[3][0] = 92;
-    fRow[3][1] = 119;
-    fRow[4][0] = 120;
-    fRow[4][1] = 143;   
-    fRow[5][0] = 144;
-    fRow[5][1] = 175;   // last row 
+  default: 
+    fNPatch = 6;        
+    fRow[0][0] = AliL3Transform::GetFirstRow(0);
+    fRow[0][1] = AliL3Transform::GetLastRow(0);
+    fRow[1][0] = AliL3Transform::GetFirstRow(1);
+    fRow[1][1] = AliL3Transform::GetLastRow(1);
+    fRow[2][0] = AliL3Transform::GetFirstRow(2);
+    fRow[2][1] = AliL3Transform::GetLastRow(2);
+    fRow[3][0] = AliL3Transform::GetFirstRow(3);
+    fRow[3][1] = AliL3Transform::GetLastRow(3);
+    fRow[4][0] = AliL3Transform::GetFirstRow(4);
+    fRow[4][1] = AliL3Transform::GetLastRow(4);
+    fRow[5][0] = AliL3Transform::GetFirstRow(5);
+    fRow[5][1] = AliL3Transform::GetLastRow(5);
   }
 
   fVertexFinder = new AliL3VertexFinder();
@@ -163,22 +141,41 @@ void AliLevel3::Init(Char_t *path,Bool_t binary=kTRUE,Int_t npatches=6)
   fTracker = new AliL3ConfMapper();
   fTrackMerger = new AliL3TrackMerger(fNPatch);
   fInterMerger = new AliL3InterMerger();
+  fGlobalMerger = new AliL3GlobalMerger();
+  SetMergerParameters();//Set default merger parameters
 #ifdef use_aliroot
-  fFileHandler = new AliL3FileHandler();
-  fFileHandler->SetAliInput(fInputFile);
+  if(filetype==kRoot){
+    fFileHandler = new AliL3FileHandler(kTRUE); //static version
+    fFileHandler->SetAliInput(fInputFile);
+  }else if(filetype==kRaw){
+    fFileHandler = new AliL3DDLDataFileHandler();
+    fFileHandler->SetReaderInput(fInputFile);
+  }else if(filetype==kDate){
+    fFileHandler = new AliL3DDLDataFileHandler();
+    fFileHandler->SetReaderInput(fInputFile,-1);
+  }else{
+    fFileHandler = new AliL3MemHandler();
+  }
 #else
-  fFileHandler = new AliL3MemHandler();
+  if(filetype==kRaw){
+    fFileHandler = new AliL3DDLDataFileHandler();
+    fFileHandler->SetReaderInput(fInputFile);
+  }else{
+    fFileHandler = new AliL3MemHandler();
+  }
 #endif
   fBenchmark = new AliL3Benchmark();
 }
 
 void AliLevel3::DoBench(char* name){
   fBenchmark->Analyze(name);
+  delete fBenchmark;
+  fBenchmark = new AliL3Benchmark();
 }
 
 void AliLevel3::DoMc(char* file){
 #ifdef use_aliroot
-  if(!fFileHandler->IsDigit())
+  if(!fFileHandler->IsDigit(fEvent))
     fFileHandler->SetMCOutput(file);
 #endif
 }
@@ -191,6 +188,7 @@ AliLevel3::~AliLevel3(){
   if(fTrackMerger) delete fTrackMerger;
   if(fInterMerger) delete fInterMerger;
   if(fFileHandler) delete fFileHandler;
+  if(fGlobalMerger) delete fGlobalMerger;
 }
 
 void AliLevel3::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
@@ -206,7 +204,8 @@ void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
                                Double_t min_pt_fit, Double_t maxangle,
                                Double_t goodDist, Double_t hitChi2Cut,
                                Double_t goodHitChi2, Double_t trackChi2Cut,
-                               Int_t maxdist,Double_t maxphi,Double_t maxeta,Bool_t vertexconstraint)
+                               Int_t maxdist,Double_t maxphi,Double_t maxeta,
+                               Bool_t vertexconstraint)
 {
   //Set parameters input to the tracker
   //If no arguments are given, default parameters will be used
@@ -219,17 +218,24 @@ void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
     fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
   else
     fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
-  
-  fTracker->SetParamDone(true);
   fTracker->InitVolumes();
 }
 
+void AliLevel3::SetMergerParameters(Double_t maxy,Double_t maxz,Double_t maxkappa,Double_t maxpsi,Double_t maxtgl)
+{
+  fGlobalMerger->SetParameter(maxy,maxz,maxkappa,maxpsi,maxtgl);
+}
+
 void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event){
   //Do tracking on all slices in region [first,last]
   //Slices numbering in TPC goes from 0-35, which means that one slice
   //corresponds to inner+outer sector.E.g. slice 2 corresponds to
   //inner=2 + outer=38.
-  fGlobalMerger= new AliL3GlobalMerger(first,last);  
+
+  fGlobalMerger->Setup(first,last);
+#ifdef use_aliroot
+  if(fEvent!=event) AliL3FileHandler::CleanStaticIndex();
+#endif
   fEvent=event;
   for(Int_t i=first; i<=last; i++){
     ProcessSlice(i);
@@ -240,31 +246,36 @@ void AliLevel3::ProcessEvent(Int_t first,Int_t last,Int_t event){
     fNTrackData=0;
     fTrackData=0;
   }
-  fBenchmark->Start("Global Merger");
+  fBenchmark->Start("Global track merger");
   //fGlobalMerger->AddAllTracks();
-  //fGlobalMerger->Merge();
-  fGlobalMerger->SlowMerge();
-  fBenchmark->Stop("Global Merger");
-
+  fGlobalMerger->Merge();
+  //fGlobalMerger->SlowMerge(fWriteOutPath);
+  fBenchmark->Stop("Global track merger");
+  
+  FitGlobalTracks();
+  
   if(fWriteOut) WriteResults(); 
-  delete fGlobalMerger; fGlobalMerger = 0;
+  fFileHandler->FreeDigitsTree();
 }
 
 void AliLevel3::ProcessSlice(Int_t slice){
   char name[256];
   Bool_t UseCF = kFALSE;
 #ifdef use_aliroot
-  UseCF = fFileHandler->IsDigit();
-#else
-  if(fUseBinary)
-    UseCF = kTRUE; //In case you are not using aliroot
+  UseCF = fFileHandler->IsDigit(fEvent);
 #endif
-  const Int_t maxpoints=100000;
+  if(fUseBinary)
+    UseCF = kTRUE;   //In case you are not using aliroot
+  if(fNoCF == kTRUE) //In case you don't want to run with cluster finder
+    UseCF = kFALSE;
+
+  const Int_t maxpoints=120000;
   const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
   AliL3MemHandler *memory = new AliL3MemHandler();
 
   fTrackMerger->Reset();
   fTrackMerger->SetRows(fRow[0]);
+  
   for(Int_t patch=fNPatch-1;patch>=0;patch--){
     fFileHandler->Init(slice,patch,&fRow[patch][0]);
     UInt_t npoints=0;
@@ -276,15 +287,28 @@ void AliLevel3::ProcessSlice(Int_t slice){
         if(!fDoRoi){ 
           if(1){     //Binary to Memory
            fFileHandler->Free();
-            sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
+            if(fNPatch == 1)
+             sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
+           else
+             sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
            if(!fFileHandler->SetBinaryInput(name)) return;
-           digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
-            fFileHandler->CloseBinaryInput(); 
+           if(fPileUp)
+             { //Read binary files which are not RLE
+               digits = (AliL3DigitRowData*)fFileHandler->Allocate();
+               fFileHandler->Binary2Memory(ndigits,digits); 
+             }
+           else //Read RLE binary files
+             digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
+
+           fFileHandler->CloseBinaryInput(); 
           }
 
           if(0){     //Binary to Memory with Benchmark 
-            fFileHandler->Free();
-            sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
+           fFileHandler->Free();
+            if(fNPatch == 1)
+             sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
+           else
+             sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
             if(!memory->SetBinaryInput(name)) return;
             UInt_t compsize=memory->GetFileSize();
             UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
@@ -303,7 +327,10 @@ void AliLevel3::ProcessSlice(Int_t slice){
             fFileHandler->ResetRandom();
             fFileHandler->SetRandomCluster(100);
             fFileHandler->SetNGenerate(100);
-            sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
+            if(fNPatch == 1)
+             sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
+           else
+             sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
             if(!memory->SetBinaryInput(name)) return;
             UInt_t compsize=memory->GetFileSize();
             UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
@@ -323,7 +350,10 @@ void AliLevel3::ProcessSlice(Int_t slice){
           fFileHandler->Free();
           Int_t sli[2]={0,0};
           fFileHandler->SetROI(fEta,sli);
-          sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
+          if(fNPatch==1)
+           sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,-1);
+         else
+           sprintf(name,"%sdigits_%d_%d_%d.raw",fPath,fEvent,slice,patch);
           if(!memory->SetBinaryInput(name)) return;
           UInt_t compsize=memory->GetFileSize();
           UInt_t *comp=(UInt_t *)memory->Allocate(compsize);
@@ -340,18 +370,21 @@ void AliLevel3::ProcessSlice(Int_t slice){
       else{
 #ifdef use_aliroot
         fBenchmark->Start("Dummy Unpacker");
-        sprintf(name,"digits_%d_%d.raw",slice,patch);
+        if(fNPatch==1)
+         sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,-1);
+       else
+         sprintf(name,"digits_%d_%d_%d.raw",fEvent,slice,patch);
         fBenchmark->Stop("Dummy Unpacker");
 
-        if(0){    //Ali to Binary
+        if(0){   //Ali to Binary
           fFileHandler->SetBinaryOutput(name);
           fFileHandler->AliDigits2CompBinary();
           fFileHandler->CloseBinaryOutput();
         }
   
-        if(1){     //Ali to Memory
-          digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits,fEvent);
-          if(fWriteOut){   //Memory to Binary
+        if(1){   //Ali to Memory
+          digits=(AliL3DigitRowData *)fFileHandler->AliAltroDigits2Memory(ndigits,fEvent);
+          if(0){ //Memory to Binary
             fFileHandler->SetBinaryOutput(name);
             fFileHandler->Memory2CompBinary(ndigits,digits);
             fFileHandler->CloseBinaryOutput();
@@ -361,20 +394,21 @@ void AliLevel3::ProcessSlice(Int_t slice){
       }//end else UseBinary
 
       points = (AliL3SpacePointData *) memory->Allocate(pointsize);
-  
       fClusterFinder = new AliL3ClustFinderNew();
       fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1],maxpoints);
       fClusterFinder->SetDeconv(fClusterDeconv);
       fClusterFinder->SetXYError(fXYClusterError);
       fClusterFinder->SetZError(fZClusterError);
+      if((fXYClusterError>0)&&(fZClusterError>0))
+       fClusterFinder->SetCalcErr(kFALSE);
       fClusterFinder->SetOutputArray(points);
+      fBenchmark->Start("Cluster finder");
       fClusterFinder->Read(ndigits,digits);
-      fBenchmark->Start("Cluster Finder");
       fClusterFinder->ProcessDigits();
-      fBenchmark->Stop("Cluster Finder");
+      fBenchmark->Stop("Cluster finder");
       npoints = fClusterFinder->GetNumberOfClusters();
       delete fClusterFinder;
-      fClusterFinder =0;
+      fClusterFinder = 0;
       fFileHandler->Free();
       LOG(AliL3Log::kInformational,"AliLevel3::ProcessSlice","Cluster Finder")
         <<AliL3Log::kDec<<"Found "<<npoints<<" Points"<<ENDLOG;
@@ -382,7 +416,10 @@ void AliLevel3::ProcessSlice(Int_t slice){
     else{// if not use Clusterfinder
       if(fUseBinary){//Binary to Memory
         memory->Free();
-        sprintf(name,"/%spoints_%d_%d.raw",fPath,slice,patch);
+        if(fNPatch==1)
+         sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,-1);
+       else
+         sprintf(name,"%s/points_%d_%d_%d.raw",fPath,fEvent,slice,patch);
         if(!memory->SetBinaryInput(name)) return;
         points = (AliL3SpacePointData *) memory->Allocate();
         memory->Binary2Memory(npoints,points);
@@ -423,23 +460,21 @@ void AliLevel3::ProcessSlice(Int_t slice){
       }
       fTrackMerger->SetVertex(fVertex);
     }
-    fTracker->InitSector(slice,fRow[patch]);//,fEta);
+
+    fTracker->InitSector(slice,fRow[patch],fEta);
     fTracker->SetVertex(fVertex);
-    fBenchmark->Start("Tracker Read Hits");
+    fBenchmark->Start("Tracker setup"); 
     fTracker->ReadHits(npoints,points);
-    fBenchmark->Stop("Tracker Read Hits");
-    fBenchmark->Start("MainVertexTracking A"); 
-    fTracker->MainVertexTracking();
-    //fTracker->MainVertexTracking_a();
-    fBenchmark->Stop("MainVertexTracking A");
-    //fBenchmark->Start("MainVertexTracking B"); 
-    //fTracker->MainVertexTracking_b();
-    //fBenchmark->Stop("MainVertexTracking B");
-    fBenchmark->Start("Tracking fit");
+    fTracker->MainVertexTracking_a();
+    fBenchmark->Stop("Tracker setup");
+    fBenchmark->Start("Track follower");
+    fTracker->MainVertexTracking_b();
+    fBenchmark->Stop("Track follower");
     if(fDoNonVertex)
       fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
+    fBenchmark->Start("Sector track fitting");
     fTracker->FillTracks();
-    fBenchmark->Stop("Tracking fit");
+    fBenchmark->Stop("Sector track fitting");
 
     if(fWriteOut) 
        WriteSpacePoints(npoints, points, slice, patch); //do after Tracking
@@ -454,24 +489,28 @@ void AliLevel3::ProcessSlice(Int_t slice){
     AliL3TrackSegmentData *trackdata0  = 
          (AliL3TrackSegmentData *) memory->Allocate(fTracker->GetTracks());
     memory->TrackArray2Memory(ntracks0,trackdata0,fTracker->GetTracks());
-    /*
+
     //write tracks
     if(fWriteOut){
-      sprintf(name,"%stracks_tr_%d_%d.raw",fWriteOutPath,slice,patch);
+      if(fNPatch==1)
+       sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
+      else
+       sprintf(name,"%s/tracks_tr_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
       memory->SetBinaryOutput(name);
       memory->Memory2Binary(ntracks0,trackdata0);
       memory->CloseBinaryOutput();
     }
-    */
+
     fInterMerger->Reset();
     fInterMerger->Init(fRow[patch],patch);
 
     fInterMerger->FillTracks(ntracks0,trackdata0);
-    fBenchmark->Start("Inter Merger");
+    
+    //fBenchmark->Start("Inter Merger");
     // fInterMerger->Merge();
-//    fInterMerger->SlowMerge();
+    //    fInterMerger->SlowMerge();
     
-    fBenchmark->Stop("Inter Merger");
+    //fBenchmark->Stop("Inter Merger");
     /*
     //write inter merged tracks
     if(fWriteOut){
@@ -491,11 +530,11 @@ void AliLevel3::ProcessSlice(Int_t slice){
 
     memory->Free();
   }
-  fBenchmark->Start("Patch Merger");
-  fTrackMerger->SlowMerge();
-  //fTrackMerger->AddAllTracks();
+  //fBenchmark->Start("Patch Merger");
+  //fTrackMerger->SlowMerge();
+  fTrackMerger->AddAllTracks();
   //fTrackMerger->Merge();
-  fBenchmark->Stop("Patch Merger");
+  //fBenchmark->Stop("Patch Merger");
   /*
   //write merged tracks
   if(fWriteOut){
@@ -512,10 +551,35 @@ void AliLevel3::ProcessSlice(Int_t slice){
   delete memory;
 }
 
+void AliLevel3::FitGlobalTracks()
+{
+  AliL3Fitter *fitter = new AliL3Fitter(fVertex,AliLevel3::DoVertexFit());
+  if(fNPatch==1)
+    fitter->LoadClusters(fWriteOutPath,fEvent,kTRUE);
+  else
+    fitter->LoadClusters(fWriteOutPath,fEvent,kFALSE);
+  
+  fBenchmark->Start("Global track fitter");
+  AliL3TrackArray *tracks = fGlobalMerger->GetOutTracks();
+  for(Int_t i=0; i<tracks->GetNTracks(); i++)
+    {
+      AliL3Track *tr = tracks->GetCheckedTrack(i);
+      if(!tr) continue;
+      fitter->FitHelix(tr);
+      tr->UpdateToFirstPoint();
+    }
+  fBenchmark->Stop("Global track fitter");
+  delete fitter;
+}
+
 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
-                                                      Int_t slice,Int_t patch){
+                                Int_t slice,Int_t patch)
+{
   char name[256];
-  sprintf(name,"%spoints_%d_%d.raw",fWriteOutPath,slice,patch);
+  if(fNPatch==1)
+    sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,-1);
+  else
+    sprintf(name,"%s/points_%d_%d_%d.raw",fWriteOutPath,fEvent,slice,patch);
   AliL3MemHandler * memory = new AliL3MemHandler();
   memory->SetBinaryOutput(name);
   memory->Transform(npoints,points,slice);
@@ -524,7 +588,8 @@ void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
   delete  memory;
 }
 
-Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
+Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt)
+{
   AliL3MemHandler *memory = new AliL3MemHandler();
   memory->SetBinaryOutput(filename);
   if(opt=='a'||opt=='i'){  //add intracks
@@ -548,10 +613,10 @@ void AliLevel3::WriteResults()
 {
   //Write the resulting tracks to outputfile
   Char_t fname[256];
-  sprintf(fname,"%stracks.raw",fWriteOutPath);
+  sprintf(fname,"%s/tracks_%d.raw",fWriteOutPath,fEvent);
   WriteTracks(fname,fGlobalMerger,'a');
   //WriteTracks("tracks.raw",fGlobalMerger,'a');
-  sprintf(fname,"%stracks_gl.raw",fWriteOutPath);
+  sprintf(fname,"%s/tracks_gl_%d.raw",fWriteOutPath,fEvent);
   WriteTracks(fname,fGlobalMerger,'o');
   //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');
 }