-//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 © ASV
#include <TFile.h>
#include <TDirectory.h>
#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;
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();
}
}
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
fTrackData=0;
}
fBenchmark->Start("Global Merger");
- fGlobalMerger->Merge();
-// fGlobalMerger->SlowMerge();
+ //fGlobalMerger->AddAllTracks();
+ //fGlobalMerger->Merge();
+ fGlobalMerger->SlowMerge();
fBenchmark->Stop("Global Merger");
if(fWriteOut) WriteResults();
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;
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;
}
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);
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");
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
}
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");
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;
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());
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);
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');
}