]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSVertexer3D.cxx
Memory leak fixed.
[u/mrichter/AliRoot.git] / ITS / AliITSVertexer3D.cxx
index 72a99b52b4a72c882c579780bd1576cadd85558f..c0251f399941a02af249357e60e3bec8ecfd89dc 100644 (file)
@@ -12,7 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-#include <TH3F.h>
 #include <TTree.h>
 #include "AliESDVertex.h"
 #include "AliLog.h"
@@ -55,7 +54,7 @@ fMeanPtSelTrk(0.)
   SetMaxRCut();
   SetZCutDiamond();
   SetMaxZCut();
-  SetDCAcut();
+  SetDCACut();
   SetDiffPhiMax();
   SetMeanPSelTracks();
   SetMeanPtSelTracks();
@@ -122,6 +121,8 @@ AliESDVertex* AliITSVertexer3D::FindVertexForCurrentEvent(TTree *itsClusterTree)
   if(!fCurrentVertex){
     AliITSVertexerZ vertz(GetNominalPos()[0],GetNominalPos()[1]);
     AliDebug(1,"Call Vertexer Z\n");
+    vertz.SetLowLimit(-fZCutDiamond);
+    vertz.SetHighLimit(fZCutDiamond);
     AliESDVertex* vtxz = vertz.FindVertexForCurrentEvent(itsClusterTree);
     if(vtxz){
       Double_t position[3]={GetNominalPos()[0],GetNominalPos()[1],vtxz->GetZv()};
@@ -163,7 +164,8 @@ Int_t AliITSVertexer3D::FindTracklets(TTree *itsClusterTree, Int_t optCuts){
   branch = tR->GetBranch("ITSRecPoints");
 
   // Set values for cuts
-  Float_t xbeam=0., ybeam=0.;
+  Float_t xbeam=GetNominalPos()[0]; 
+  Float_t ybeam=GetNominalPos()[1];
   Float_t zvert=0.;
   Float_t deltaPhi=fCoarseDiffPhiCut;
   Float_t deltaR=fCoarseMaxRCut;
@@ -332,8 +334,8 @@ Int_t  AliITSVertexer3D::Prepare3DVertex(Int_t optCuts){
   // Finds the 3D vertex information using tracklets
   Int_t retcode = -1;
 
-  Float_t xbeam=0.;
-  Float_t ybeam=0.;
+  Float_t xbeam=GetNominalPos()[0];
+  Float_t ybeam=GetNominalPos()[1];
   Float_t zvert=0.;
   Float_t deltaR=fCoarseMaxRCut;
   Float_t dZmax=fZCutDiamond;
@@ -354,12 +356,14 @@ Int_t  AliITSVertexer3D::Prepare3DVertex(Int_t optCuts){
   Float_t binsizer=(rh-rl)/nbr;
   Float_t binsizez=(zh-zl)/nbz;
   TH3F *h3d = new TH3F("h3d","xyz distribution",nbr,rl,rh,nbr,rl,rh,nbz,zl,zh);
+  Int_t nbrcs=25;
+  Int_t nbzcs=50;
+  TH3F *h3dcs = new TH3F("h3dcs","xyz distribution",nbrcs,rl,rh,nbrcs,rl,rh,nbzcs,zl,zh);
 
   // cleanup of the TCLonesArray of tracklets (i.e. fakes are removed)
   Int_t *validate = new Int_t [fLines.GetEntriesFast()];
   for(Int_t i=0; i<fLines.GetEntriesFast();i++)validate[i]=0;
   for(Int_t i=0; i<fLines.GetEntriesFast()-1;i++){
-    if(validate[i]==1)continue;
     AliStrLine *l1 = (AliStrLine*)fLines.At(i);
     for(Int_t j=i+1;j<fLines.GetEntriesFast();j++){
       AliStrLine *l2 = (AliStrLine*)fLines.At(j);
@@ -379,6 +383,7 @@ Int_t  AliITSVertexer3D::Prepare3DVertex(Int_t optCuts){
       validate[i]=1;
       validate[j]=1;
       h3d->Fill(point[0],point[1],point[2]);
+      h3dcs->Fill(point[0],point[1],point[2]);
     }
   }
 
@@ -386,7 +391,7 @@ Int_t  AliITSVertexer3D::Prepare3DVertex(Int_t optCuts){
 
   Int_t numbtracklets=0;
   for(Int_t i=0; i<fLines.GetEntriesFast();i++)if(validate[i]>=1)numbtracklets++;
-  if(numbtracklets<2){delete [] validate; delete h3d; return retcode; }
+  if(numbtracklets<2){delete [] validate; delete h3d; delete h3dcs; return retcode; }
 
   for(Int_t i=0; i<fLines.GetEntriesFast();i++){
     if(validate[i]<1)fLines.RemoveAt(i);
@@ -395,32 +400,25 @@ Int_t  AliITSVertexer3D::Prepare3DVertex(Int_t optCuts){
   AliDebug(1,Form("Number of tracklets (after compress)%d ",fLines.GetEntriesFast()));
   delete [] validate;
 
+  //        Find peaks in histos
 
-  // finds peak in histo
-  TAxis *xax = h3d->GetXaxis();  
-  TAxis *yax = h3d->GetYaxis();
-  TAxis *zax = h3d->GetZaxis();
   Double_t peak[3]={0.,0.,0.};
-  Float_t contref = 0.;
-  for(Int_t i=xax->GetFirst();i<=xax->GetLast();i++){
-    Float_t xval = xax->GetBinCenter(i);
-    for(Int_t j=yax->GetFirst();j<=yax->GetLast();j++){
-      Float_t yval = yax->GetBinCenter(j);
-      for(Int_t k=zax->GetFirst();k<=zax->GetLast();k++){
-       Float_t bc = h3d->GetBinContent(i,j,k);
-       Float_t zval = zax->GetBinCenter(k);
-       if(bc>contref){
-         contref = bc;
-         peak[2] = zval;
-         peak[1] = yval;
-         peak[0] = xval;
-       }
-      }
-    }
-  }
+  Int_t ntrkl,ntimes;
+  FindPeaks(h3d,peak,ntrkl,ntimes);  
   delete h3d;
 
+  if(optCuts==0 && ntrkl<=2){
+    ntrkl=0;
+    ntimes=0;
+    FindPeaks(h3dcs,peak,ntrkl,ntimes);  
+    binsizer=(rh-rl)/nbrcs;
+    binsizez=(zh-zl)/nbzcs;
+    if(ntrkl==1 || ntimes>1){delete h3dcs; return retcode;}
+  }
+  delete h3dcs;
+
   //         Second selection loop
+
   Float_t bs=(binsizer+binsizez)/2.;
   for(Int_t i=0; i<fLines.GetEntriesFast();i++){
     AliStrLine *l1 = (AliStrLine*)fLines.At(i);
@@ -471,6 +469,39 @@ void AliITSVertexer3D::SetMeanPPtSelTracks(Float_t fieldTesla){
   }
 }
 
+//________________________________________________________
+void AliITSVertexer3D::FindPeaks(TH3F* histo, Double_t *peak, Int_t &nOfTracklets, Int_t &nOfTimes){
+  // Finds bin with max contents in 3D histo of tracket intersections
+  TAxis *xax = histo->GetXaxis();  
+  TAxis *yax = histo->GetYaxis();
+  TAxis *zax = histo->GetZaxis();
+  peak[0]=0.;
+  peak[1]=0.;
+  peak[2]=0.;
+  nOfTracklets = 0;
+  nOfTimes=0;
+  for(Int_t i=xax->GetFirst();i<=xax->GetLast();i++){
+    Float_t xval = xax->GetBinCenter(i);
+    for(Int_t j=yax->GetFirst();j<=yax->GetLast();j++){
+      Float_t yval = yax->GetBinCenter(j);
+      for(Int_t k=zax->GetFirst();k<=zax->GetLast();k++){
+       Float_t zval = zax->GetBinCenter(k);
+       Int_t bc =(Int_t)histo->GetBinContent(i,j,k);
+       if(bc>nOfTracklets){
+         nOfTracklets = bc;
+         peak[2] = zval;
+         peak[1] = yval;
+         peak[0] = xval;
+         nOfTimes = 1;
+       }
+       if(bc==nOfTracklets){
+         nOfTimes++;
+       }
+      }
+    }
+  }
+  
+}
 
 //________________________________________________________
 void AliITSVertexer3D::PrintStatus() const {