]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/src/AliLevel3.cxx
Changes done to make the Cluser Finder calculate the errors in Pad and Time direction...
[u/mrichter/AliRoot.git] / HLT / src / AliLevel3.cxx
index aefa02b122aff32169fbc4751c15c544ef152d7a..24c870d6a3f1a10f2307ddf71e24d51b4940ff44 100644 (file)
@@ -1,6 +1,7 @@
-//Author:        Uli Frankenfeld
-//Author:        Anders Strand Vestbo
-//Last Modified: 13.12.2000
+//$Id$
+
+// Author: Anders Vestbo <mailto:vestbo$fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
+//*-- Copyright &copy ASV
 
 #include <TFile.h>
 #include <TDirectory.h>
@@ -33,7 +34,7 @@
 #include "AliL3SpacePointData.h"
 #include "AliL3VertexData.h"
 
-//_______________________________________
+//_____________________________________________________________
 //
 //  AliLevel3
 //
 //  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">
+*/
+//End_Html
 
 ClassImp(AliLevel3)
 
-AliLevel3::AliLevel3(){
+AliLevel3::AliLevel3()
+{
   fInputFile=0;
-  fOutputFile=0;
-  Init();
 }
 
-AliLevel3::AliLevel3(Char_t *infile,Char_t *outfile){
+AliLevel3::AliLevel3(Char_t *infile)
+{
   //Constructor. Calls constructor of the tracker, vertexfinder and merger classes.
-
-  fOutputFile = new TFile(outfile,"NEW");
   
-  if(!fOutputFile->IsOpen())
-    {
-    LOG(AliL3Log::kWarning, "AliLevel3::AliLevel3","File Open")
-    <<"Delete your old "<<outfile<<" file!"<<ENDLOG;
-    }
   fInputFile = new TFile(infile,"READ");
   
   if(!fInputFile->IsOpen())
     {
-    LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
-    <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
-    return;
+      LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
+       <<"Inputfile "<<infile<<" does not exist"<<ENDLOG;
+      return;
     }
   
-  Init();
 }
 
-AliLevel3::AliLevel3(TFile *in, TFile *out){
-  fOutputFile = out;
+AliLevel3::AliLevel3(TFile *in)
+{
   fInputFile  =  in;
   if(!in){
     LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
     <<"Pointer to InFile 0x0!"<<ENDLOG;
     return;
   }  
-  if(!out){
-    LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
-    <<"Pointer to OutFile 0x0!"<<ENDLOG;
-    return;
-  }  
   
-  if(!fOutputFile->IsOpen())
-    {
-    LOG(AliL3Log::kWarning,"AliLevel3::AliLevel3","File Open")
-    <<"no output file!"<<ENDLOG;
-      return;
-    }
   if(!fInputFile->IsOpen())
     {
     LOG(AliL3Log::kError,"AliLevel3::AliLevel3","File Open")
     <<"Inputfile does not exist"<<ENDLOG;
       return;
     }
-  Init();
 }
 
-void AliLevel3::Init(){
+void AliLevel3::Init(Char_t *path,Bool_t binary=kTRUE,Int_t npatches=6)
+{
+  if(!binary && !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;
-  fGlobalMerger=0;
-  fTransformer = new AliL3Transform();
+  fUseBinary = binary;
+  SetPath(path);
+  fGlobalMerger = 0;
+
   fDoRoi = kFALSE;
+  fDoNonVertex = kFALSE;
+  fFindVertex = kFALSE;
+  SetClusterFinderParam();
+
   fEta[0] = 0.;
   fEta[1] = 0.9;
-  fUseBinary =kFALSE;
-  SetPath("");
-  fFindVertex =kTRUE;
-  if(0){
-    fNPatch = 1;   //number of patches change row in process
+
+  fEvent=0;
+
+  switch(npatches){
+  case 1:
+    fNPatch = 1;        //number of patches change row in process
     fRow[0][0] = 0;     // first row
     fRow[0][1] = 175;   // last row
-  }
-  if(0){
-    fNPatch = 2;   //number of patches change row in process
+    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
-  }
-  if(0){
-    fNPatch = 5;   //number of patches change row in process
+    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][0] = 110; 
     fRow[3][1] = 141;
     fRow[4][0] = 142;
     fRow[4][1] = 175;   // last row
-  }
-  if(1){
-    fNPatch = 6;   //number of patches change row in process
+    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;
@@ -155,17 +157,18 @@ void AliLevel3::Init(){
     fRow[5][0] = 144;
     fRow[5][1] = 175;   // last row 
   }
+
   fVertexFinder = new AliL3VertexFinder();
   fVertex = new AliL3Vertex();
   fTracker = new AliL3ConfMapper();
   fTrackMerger = new AliL3TrackMerger(fNPatch);
   fInterMerger = new AliL3InterMerger();
-  #ifdef use_aliroot
+#ifdef use_aliroot
   fFileHandler = new AliL3FileHandler();
   fFileHandler->SetAliInput(fInputFile);
-  #else
+#else
   fFileHandler = new AliL3MemHandler();
-  #endif
+#endif
   fBenchmark = new AliL3Benchmark();
 }
 
@@ -174,53 +177,63 @@ void AliLevel3::DoBench(char* name){
 }
 
 void AliLevel3::DoMc(char* file){
-  #ifdef use_aliroot
+#ifdef use_aliroot
   if(!fFileHandler->IsDigit())
     fFileHandler->SetMCOutput(file);
-  #endif
+#endif
 }
 
 AliLevel3::~AliLevel3(){
   //Destructor
-  if(fVertexFinder)  delete fVertexFinder;
-  if(fVertex)  delete fVertex;
+  if(fVertexFinder) delete fVertexFinder;
+  if(fVertex) delete fVertex;
   if(fTracker) delete fTracker;
-  if(fTransformer) delete fTransformer;
   if(fTrackMerger) delete fTrackMerger;
   if(fInterMerger) delete fInterMerger;
   if(fFileHandler) delete fFileHandler;
 }
 
+void AliLevel3::SetClusterFinderParam(Float_t fXYError, Float_t fZError, Bool_t deconv)
+{
+  fXYClusterError=fXYError;
+  fZClusterError=fZError;
+  fClusterDeconv=deconv;
+}
+
 void AliLevel3::SetTrackerParam(Int_t phi_segments, Int_t eta_segments,
-                                  Int_t trackletlength, Int_t tracklength,
-                                  Int_t rowscopetracklet, Int_t rowscopetrack,
-                                  Double_t min_pt_fit, Double_t maxangle,
-                                  Double_t goodDist, Double_t hitChi2Cut,
-                                  Double_t goodHitChi2, Double_t trackChi2Cut,
-                                  Int_t maxdist)
+                               Int_t trackletlength, Int_t tracklength,
+                               Int_t rowscopetracklet, Int_t rowscopetrack,
+                               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)
 {
   //Set parameters input to the tracker
   //If no arguments are given, default parameters will be used
   
   fTracker->SetNSegments(phi_segments,eta_segments);
-  fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
   fTracker->SetMaxDca(min_pt_fit);
-  fTracker->SetTrackletCuts(maxangle,goodDist,true);
-  fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist);
-
+  fTracker->SetTrackCuts(hitChi2Cut,goodHitChi2,trackChi2Cut,maxdist,vertexconstraint);
+  fTracker->SetTrackletCuts(maxangle,goodDist,vertexconstraint);
+  if(vertexconstraint)
+    fTracker->MainVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack,maxphi,maxeta);
+  else
+    fTracker->NonVertexSettings(trackletlength,tracklength,rowscopetracklet,rowscopetrack);
+  
   fTracker->SetParamDone(true);
+  fTracker->InitVolumes();
 }
 
-void AliLevel3::ProcessEvent(Int_t first,Int_t last){
+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 1 slice
+  //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);  
+  fEvent=event;
   for(Int_t i=first; i<=last; i++){
     ProcessSlice(i);
     fGlobalMerger->SetVertex(fVertex);
-    fGlobalMerger->SetTransformer(fTransformer);
     fGlobalMerger->InitSlice(i);
     fGlobalMerger->FillTracks(fNTrackData,fTrackData);
     fFileHandler->Free();   //free the memory
@@ -228,8 +241,9 @@ void AliLevel3::ProcessEvent(Int_t first,Int_t last){
     fTrackData=0;
   }
   fBenchmark->Start("Global Merger");
-  fGlobalMerger->Merge();
-//  fGlobalMerger->SlowMerge();
+  //fGlobalMerger->AddAllTracks();
+  //fGlobalMerger->Merge();
+  fGlobalMerger->SlowMerge();
   fBenchmark->Stop("Global Merger");
 
   if(fWriteOut) WriteResults(); 
@@ -241,17 +255,18 @@ void AliLevel3::ProcessSlice(Int_t slice){
   Bool_t UseCF = kFALSE;
 #ifdef use_aliroot
   UseCF = fFileHandler->IsDigit();
+#else
+  if(fUseBinary)
+    UseCF = kTRUE; //In case you are not using aliroot
 #endif
   const Int_t maxpoints=100000;
   const Int_t pointsize = maxpoints * sizeof(AliL3SpacePointData);
   AliL3MemHandler *memory = new AliL3MemHandler();
 
   fTrackMerger->Reset();
-  fTrackMerger->SetTransformer(fTransformer);
   fTrackMerger->SetRows(fRow[0]);
   for(Int_t patch=fNPatch-1;patch>=0;patch--){
-    fFileHandler->Init(slice,patch,fRow[patch]);
-    fFileHandler->Init(fTransformer);
+    fFileHandler->Init(slice,patch,&fRow[patch][0]);
     UInt_t npoints=0;
     AliL3SpacePointData *points =0;
     UInt_t ndigits=0;
@@ -259,15 +274,15 @@ void AliLevel3::ProcessSlice(Int_t slice){
     if(UseCF){
       if(fUseBinary){
         if(!fDoRoi){ 
-          if(0){     //Binary to Memory
-            fFileHandler->Free();
+          if(1){     //Binary to Memory
+           fFileHandler->Free();
             sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
-            if(!fFileHandler->SetBinaryInput(name)) return;
-            digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
+           if(!fFileHandler->SetBinaryInput(name)) return;
+           digits= (AliL3DigitRowData *)fFileHandler->CompBinary2Memory(ndigits);
             fFileHandler->CloseBinaryInput(); 
           }
 
-          if(1){     //Binary to Memory with Benchmark 
+          if(0){     //Binary to Memory with Benchmark 
             fFileHandler->Free();
             sprintf(name,"%sdigits_%d_%d.raw",fPath,slice,patch);
             if(!memory->SetBinaryInput(name)) return;
@@ -335,7 +350,7 @@ void AliLevel3::ProcessSlice(Int_t slice){
         }
   
         if(1){     //Ali to Memory
-          digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits);
+          digits=(AliL3DigitRowData *)fFileHandler->AliDigits2Memory(ndigits,fEvent);
           if(fWriteOut){   //Memory to Binary
             fFileHandler->SetBinaryOutput(name);
             fFileHandler->Memory2CompBinary(ndigits,digits);
@@ -347,11 +362,13 @@ void AliLevel3::ProcessSlice(Int_t slice){
 
       points = (AliL3SpacePointData *) memory->Allocate(pointsize);
   
-      fClusterFinder = new AliL3ClustFinderNew(fTransformer);
-      fClusterFinder->InitSlice(slice,patch,fRow[patch][0],fRow[patch][1]
-                                                               ,maxpoints);
-      fClusterFinder->SetXYError(0.1);
-      fClusterFinder->SetZError(0.2);
+      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);
       fClusterFinder->Read(ndigits,digits);
       fBenchmark->Start("Cluster Finder");
@@ -359,12 +376,10 @@ void AliLevel3::ProcessSlice(Int_t slice){
       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;
-    
-    
     }//end UseCF
     else{// if not use Clusterfinder
       if(fUseBinary){//Binary to Memory
@@ -410,18 +425,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");
     fTracker->ReadHits(npoints,points);
     fBenchmark->Stop("Tracker Read Hits");
     fBenchmark->Start("MainVertexTracking A"); 
-    fTracker->MainVertexTracking_a();
+    fTracker->MainVertexTracking();
+    //fTracker->MainVertexTracking_a();
     fBenchmark->Stop("MainVertexTracking A");
-    fBenchmark->Start("MainVertexTracking B"); 
-    fTracker->MainVertexTracking_b();
-    fBenchmark->Stop("MainVertexTracking B");
+    //fBenchmark->Start("MainVertexTracking B"); 
+    //fTracker->MainVertexTracking_b();
+    //fBenchmark->Stop("MainVertexTracking B");
     fBenchmark->Start("Tracking fit");
+    if(fDoNonVertex)
+      fTracker->NonVertexTracking();//Do a second pass for nonvertex tracks
     fTracker->FillTracks();
     fBenchmark->Stop("Tracking fit");
 
@@ -438,31 +456,31 @@ 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,"tracks_tr_%d_%d.raw",slice,patch);
+      sprintf(name,"%stracks_tr_%d_%d.raw",fWriteOutPath,slice,patch);
       memory->SetBinaryOutput(name);
       memory->Memory2Binary(ntracks0,trackdata0);
       memory->CloseBinaryOutput();
     }
-    
+    */
     fInterMerger->Reset();
-    fInterMerger->SetTransformer(fTransformer);
     fInterMerger->Init(fRow[patch],patch);
 
     fInterMerger->FillTracks(ntracks0,trackdata0);
     fBenchmark->Start("Inter Merger");
-    fInterMerger->Merge();
+    // fInterMerger->Merge();
 //    fInterMerger->SlowMerge();
     
     fBenchmark->Stop("Inter Merger");
-
+    /*
     //write inter merged tracks
     if(fWriteOut){
-      sprintf(name,"tracks_im_%d_%d.raw",slice,patch);
+      sprintf(name,"%stracks_im_%d_%d.raw",fWriteOutPath,slice,patch);
       WriteTracks(name,fInterMerger,'i'); //write output of intermerger
-    }
+      }
+    */
     memory->Free();
     
     UInt_t ntracks1 =0;
@@ -476,16 +494,17 @@ void AliLevel3::ProcessSlice(Int_t slice){
     memory->Free();
   }
   fBenchmark->Start("Patch Merger");
-//  fTrackMerger->SlowMerge();
-  fTrackMerger->AddAllTracks();
-//  fTrackMerger->Merge();
+  fTrackMerger->SlowMerge();
+  //fTrackMerger->AddAllTracks();
+  //fTrackMerger->Merge();
   fBenchmark->Stop("Patch Merger");
+  /*
   //write merged tracks
   if(fWriteOut){
-    sprintf(name,"tracks_tm_%d.raw",slice);
+    sprintf(name,"%stracks_tm_%d.raw",fWriteOutPath,slice);
     WriteTracks(name,fTrackMerger,'o'); //write output of trackmerger
   }
+  */
   fTrackData = (AliL3TrackSegmentData *) 
                          fFileHandler->Allocate(fTrackMerger->GetOutTracks());
 
@@ -498,16 +517,15 @@ void AliLevel3::ProcessSlice(Int_t slice){
 void AliLevel3::WriteSpacePoints(UInt_t npoints,AliL3SpacePointData *points,
                                                       Int_t slice,Int_t patch){
   char name[256];
-  sprintf(name,"points_%d_%d.raw",slice,patch);
+  sprintf(name,"%spoints_%d_%d.raw",fWriteOutPath,slice,patch);
   AliL3MemHandler * memory = new AliL3MemHandler();
   memory->SetBinaryOutput(name);
-  memory->Transform(npoints,points,slice,fTransformer);
+  memory->Transform(npoints,points,slice);
   memory->Memory2Binary(npoints,points);
   memory->CloseBinaryOutput();
   delete  memory;
 }
 
-
 Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
   AliL3MemHandler *memory = new AliL3MemHandler();
   memory->SetBinaryOutput(filename);
@@ -531,6 +549,11 @@ Int_t AliLevel3::WriteTracks(char *filename,AliL3Merger *merger,char opt){
 void AliLevel3::WriteResults()
 {
   //Write the resulting tracks to outputfile
-  WriteTracks("tracks.raw",fGlobalMerger,'a');
-  WriteTracks("tracks_gl.raw",fGlobalMerger,'o');
+  Char_t fname[256];
+  sprintf(fname,"%stracks.raw",fWriteOutPath);
+  WriteTracks(fname,fGlobalMerger,'a');
+  //WriteTracks("tracks.raw",fGlobalMerger,'a');
+  sprintf(fname,"%stracks_gl.raw",fWriteOutPath);
+  WriteTracks(fname,fGlobalMerger,'o');
+  //WriteTracks("tracks_gl.raw",fGlobalMerger,'o');
 }