]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliVertexerTracks.cxx
- Three classes by MinJung Kweon AliHFEpriVtx, AliHFEsecVtx and AliHFEmcQA for primar...
[u/mrichter/AliRoot.git] / STEER / AliVertexerTracks.cxx
index b1c9a3251456339792dc3fa292aa6583309f8a77..0219c978787549e3eab68a484f6f78f42e033196 100644 (file)
@@ -35,6 +35,7 @@
 #include "AliLog.h"
 #include "AliStrLine.h"
 #include "AliExternalTrackParam.h"
+#include "AliNeutralTrackParam.h"
 #include "AliVEvent.h"
 #include "AliVTrack.h"
 #include "AliESDEvent.h"
@@ -69,7 +70,8 @@ fITSrefit(kTRUE),
 fFiducialR(3.),
 fFiducialZ(30.),
 fnSigmaForUi00(1.5),
-fAlgo(1)
+fAlgo(1),
+fAlgoIter0(4)
 {
 //
 // Default constructor
@@ -102,7 +104,8 @@ fITSrefit(kTRUE),
 fFiducialR(3.),
 fFiducialZ(30.),
 fnSigmaForUi00(1.5),
-fAlgo(1)
+fAlgo(1),
+fAlgoIter0(4)
 {
 //
 // Standard constructor
@@ -117,11 +120,11 @@ AliVertexerTracks::~AliVertexerTracks()
   // The objects pointed by the following pointer are not owned
   // by this class and are not deleted
   fCurrentVertex = 0;
-  if(fTrksToSkip) { delete [] fTrksToSkip; fTrksToSkip=NULL; }
-  if(fIdSel) { delete [] fIdSel; fIdSel=NULL; }
+  if(fTrksToSkip) { delete fTrksToSkip; fTrksToSkip=NULL; }
+  if(fIdSel) { delete fIdSel; fIdSel=NULL; }
 }
 //----------------------------------------------------------------------------
-AliESDVertex* AliVertexerTracks::FindPrimaryVertex(const AliVEvent *vEvent)
+AliESDVertex* AliVertexerTracks::FindPrimaryVertex(AliVEvent *vEvent)
 {
 //
 // Primary vertex for current ESD or AOD event
@@ -173,11 +176,13 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(const AliVEvent *vEvent)
     }
     if(skipThis) continue;
 
+    // kITSrefit
+    if(fMode==0 && fITSrefit && !(track->GetStatus()&AliESDtrack::kITSrefit)) continue;
+
     if(!inputAOD) {  // ESD
       AliESDtrack* esdt = (AliESDtrack*)track;
       if(esdt->GetNcls(fMode) < fMinClusters) continue;
       if(fMode==0) {        // ITS mode
-       if(fITSrefit && !(esdt->GetStatus()&AliESDtrack::kITSrefit)) continue;
        Double_t x,p[5],cov[15];
        esdt->GetExternalParameters(x,p);
        esdt->GetExternalCovariance(cov);
@@ -203,7 +208,7 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(const AliVEvent *vEvent)
   FindPrimaryVertex(&trkArrayOrig,idOrig);
 
   if(fMode==0) trkArrayOrig.Delete();
-  delete [] idOrig; idOrig=NULL;
+  delete idOrig; idOrig=NULL;
 
   if(f) {
     f->Close(); delete f; f = NULL;
@@ -211,6 +216,17 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(const AliVEvent *vEvent)
     olddir->cd();
   }
 
+  // set vertex ID for tracks used in the fit
+  // (only for ESD)
+  if(!inputAOD) {
+    Int_t nIndices = fCurrentVertex->GetNIndices();
+    UShort_t *indices = fCurrentVertex->GetIndices();
+    for(Int_t ind=0; ind<nIndices; ind++) {
+      AliESDtrack *esdt = (AliESDtrack*)vEvent->GetTrack(indices[ind]);
+      esdt->SetVertexID(-1);
+    }
+  }
+
   return fCurrentVertex;
 }
 //----------------------------------------------------------------------------
@@ -245,10 +261,18 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(TObjArray *trkArrayOrig,
     // fill fTrkArraySel, for VertexFinder()
     fIdSel = new UShort_t[nTrksOrig];
     PrepareTracks(*trkArrayOrig,idOrig,0);
-    if(fIdSel) { delete [] fIdSel; fIdSel=NULL; }
+    if(fIdSel) { delete fIdSel; fIdSel=NULL; }
     Double_t cutsave = fDCAcut;  
     fDCAcut = fDCAcutIter0;
-    VertexFinder(1); // using weights, cutting dca < fDCAcutIter0
+    // vertex finder
+    switch (fAlgoIter0) {
+    case 1: StrLinVertexFinderMinDist(1); break;
+    case 2: StrLinVertexFinderMinDist(0); break;
+    case 3: HelixVertexFinder();          break;
+    case 4: VertexFinder(1);              break;
+    case 5: VertexFinder(0);              break;
+    default: printf("Wrong algorithm\n"); break;  
+    }
     fDCAcut = cutsave;
     if(fVert.GetNContributors()>0) {
       fVert.GetXYZ(fNominalPos);
@@ -277,7 +301,7 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(TObjArray *trkArrayOrig,
   //                   between initVertex and fCurrentVertex) 
   for(Int_t iter=1; iter<=2; iter++) {
     if(fOnlyFitter && iter==1) continue; 
-    if(fIdSel) { delete [] fIdSel; fIdSel=NULL; }
+    if(fIdSel) { delete fIdSel; fIdSel=NULL; }
     fIdSel = new UShort_t[nTrksOrig];
     Int_t nTrksSel = PrepareTracks(*trkArrayOrig,idOrig,iter);
     AliDebug(1,Form("N tracks selected in iteration %d: %d",iter,nTrksSel));
@@ -318,7 +342,7 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(TObjArray *trkArrayOrig,
       indices[jj] = fIdSel[jj];
     fCurrentVertex->SetIndices(nIndices,indices);
   }
-  delete [] indices; indices=NULL;
+  if (indices) {delete indices; indices=NULL;}
   //
 
   // set vertex title
@@ -333,9 +357,9 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(TObjArray *trkArrayOrig,
   AliDebug(1,Form("xyz: %f %f %f; nc %d",fCurrentVertex->GetXv(),fCurrentVertex->GetYv(),fCurrentVertex->GetZv(),fCurrentVertex->GetNContributors()));
 
   // clean up
-  delete [] fIdSel; fIdSel=NULL;
+  delete fIdSel; fIdSel=NULL;
   fTrkArraySel.Delete();
-  if(fTrksToSkip) { delete [] fTrksToSkip; fTrksToSkip=NULL; }
+  if(fTrksToSkip) { delete fTrksToSkip; fTrksToSkip=NULL; }
   //
   
   return fCurrentVertex;
@@ -563,7 +587,13 @@ Int_t AliVertexerTracks::PrepareTracks(TObjArray &trkArrayOrig,
 
   // loop on tracks
   for(Int_t i=0; i<nTrksOrig; i++) {
-    track = new AliExternalTrackParam(*(AliExternalTrackParam*)trkArrayOrig.At(i));
+    AliExternalTrackParam *trackOrig=(AliExternalTrackParam*)trkArrayOrig.At(i);
+    if(trackOrig->Charge()!=0) { // normal tracks
+      track = new AliExternalTrackParam(*(AliExternalTrackParam*)trkArrayOrig.At(i));
+    } else { // neutral tracks (from a V0)
+      track = new AliNeutralTrackParam(*(AliNeutralTrackParam*)trkArrayOrig.At(i));
+    }
+
     // tgl cut
     if(TMath::Abs(track->GetTgl())>fMaxTgl) {
       AliDebug(1,Form(" rejecting track with tgl = %f",track->GetTgl()));
@@ -672,7 +702,7 @@ Bool_t AliVertexerTracks::PropagateTrackTo(AliExternalTrackParam *track,
     //
     Double_t ca=TMath::Cos(alphan-track->GetAlpha()), 
       sa=TMath::Sin(alphan-track->GetAlpha());
-    Double_t sf=track->GetSnp(), cf=TMath::Sqrt(1.- sf*sf);
+    Double_t sf=track->GetSnp(), cf=TMath::Sqrt((1.-sf)*(1.+sf));
     Double_t sinNew =  sf*ca - cf*sa;
     if(TMath::Abs(sinNew) >= maxSnp) return kFALSE;
     if(!track->Rotate(alphan)) return kFALSE;
@@ -795,7 +825,7 @@ AliESDVertex* AliVertexerTracks::RemoveTracksFromVertex(AliESDVertex *inVtx,
     }
   }
   outVtx->SetIndices(nIndices,outindices);
-  delete [] outindices;
+  if (outindices) delete outindices;
 
   /*
     printf("Vertex before removing tracks:");
@@ -824,6 +854,8 @@ void AliVertexerTracks::SetCuts(Double_t *cuts)
   SetMinDetFitter(cuts[6]);
   SetMaxTgl(cuts[7]);
   SetFiducialRZ(cuts[8],cuts[9]);
+  fAlgo=(Int_t)(cuts[10]);
+  fAlgoIter0=(Int_t)(cuts[11]);
 
   return;
 }
@@ -837,7 +869,9 @@ void AliVertexerTracks::SetITSMode(Double_t dcacut,
                                   Double_t mindetfitter,
                                   Double_t maxtgl,
                                   Double_t fidR,
-                                  Double_t fidZ) 
+                                  Double_t fidZ,
+                                  Int_t finderAlgo,
+                                  Int_t finderAlgoIter0)
 {
 //
 //  Cut values for ITS mode
@@ -857,6 +891,8 @@ void AliVertexerTracks::SetITSMode(Double_t dcacut,
   SetMinDetFitter(mindetfitter);
   SetMaxTgl(maxtgl);
   SetFiducialRZ(fidR,fidZ);
+  fAlgo=finderAlgo;
+  fAlgoIter0=finderAlgoIter0;
 
   return; 
 }
@@ -870,7 +906,9 @@ void AliVertexerTracks::SetTPCMode(Double_t dcacut,
                                   Double_t mindetfitter,
                                   Double_t maxtgl,
                                   Double_t fidR,
-                                  Double_t fidZ) 
+                                  Double_t fidZ,
+                                  Int_t finderAlgo,
+                                  Int_t finderAlgoIter0) 
 {
 //
 //  Cut values for TPC mode
@@ -886,6 +924,8 @@ void AliVertexerTracks::SetTPCMode(Double_t dcacut,
   SetMinDetFitter(mindetfitter);
   SetMaxTgl(maxtgl);
   SetFiducialRZ(fidR,fidZ);
+  fAlgo=finderAlgo;
+  fAlgoIter0=finderAlgoIter0;
 
   return; 
 }
@@ -916,7 +956,7 @@ void AliVertexerTracks::StrLinVertexFinderMinDist(Int_t optUseWeights)
 {
   AliExternalTrackParam *track1;
   const Int_t knacc = (Int_t)fTrkArraySel.GetEntriesFast();
-  static TClonesArray linarray("AliStrLine",knacc);
+  AliStrLine **linarray = new AliStrLine* [knacc];
   for(Int_t i=0; i<knacc; i++){
     track1 = (AliExternalTrackParam*)fTrkArraySel.At(i);
     Double_t alpha=track1->GetAlpha();
@@ -929,7 +969,7 @@ void AliVertexerTracks::StrLinVertexFinderMinDist(Int_t optUseWeights)
     sigmasq[2]=track1->GetSigmaZ2();
     TMatrixD ri(3,1);
     TMatrixD wWi(3,3);
-    if(!TrackToPoint(track1,ri,wWi)) optUseWeights=kFALSE;
+    if(!TrackToPoint(track1,ri,wWi)) {optUseWeights=kFALSE;printf("WARNING\n");}
     Double_t wmat[9];
     Int_t iel=0;
     for(Int_t ia=0;ia<3;ia++){
@@ -938,17 +978,31 @@ void AliVertexerTracks::StrLinVertexFinderMinDist(Int_t optUseWeights)
        iel++;
       }    
     }
-    new(linarray[i]) AliStrLine(pos,sigmasq,wmat,dir);     
+    linarray[i] = new AliStrLine(pos,sigmasq,wmat,dir);
   }
-  fVert=TrackletVertexFinder(&linarray,optUseWeights);
-  linarray.Clear("C");
+  fVert=TrackletVertexFinder(linarray,knacc,optUseWeights);
+  for(Int_t i=0; i<knacc; i++) delete linarray[i];
+  delete [] linarray;
 }
 //---------------------------------------------------------------------------
 AliESDVertex AliVertexerTracks::TrackletVertexFinder(TClonesArray *lines, Int_t optUseWeights)
 {
-  // Calculate the point at minimum distance to prepared tracks 
-  
+  // Calculate the point at minimum distance to prepared tracks (TClonesArray)
   const Int_t knacc = (Int_t)lines->GetEntriesFast();
+  AliStrLine** lines2 = new AliStrLine* [knacc];
+  for(Int_t i=0; i<knacc; i++){
+    lines2[i]= (AliStrLine*)lines->At(i);
+  }
+  AliESDVertex vert = TrackletVertexFinder(lines2,knacc,optUseWeights); 
+  delete [] lines2;
+  return vert;
+}
+
+//---------------------------------------------------------------------------
+AliESDVertex AliVertexerTracks::TrackletVertexFinder(AliStrLine **lines, const Int_t knacc, Int_t optUseWeights)
+{
+  // Calculate the point at minimum distance to prepared tracks (array of AliStrLine) 
+
   Double_t initPos[3]={0.,0.,0.};
 
   Double_t (*vectP0)[3]=new Double_t [knacc][3];
@@ -965,9 +1019,10 @@ AliESDVertex AliVertexerTracks::TrackletVertexFinder(TClonesArray *lines, Int_t
   }
 
   for(Int_t i=0; i<knacc; i++){
-    AliStrLine* line1 = (AliStrLine*)lines->At(i)
+    AliStrLine *line1 = lines[i]
     Double_t p0[3],cd[3],sigmasq[3];
     Double_t wmat[9];
+    if(!line1) printf("ERROR %d %d\n",i,knacc);
     line1->GetP0(p0);
     line1->GetCd(cd);
     line1->GetSigma2P0(sigmasq);
@@ -1045,6 +1100,7 @@ AliESDVertex AliVertexerTracks::TrackletVertexFinder(TClonesArray *lines, Int_t
   delete vectP1;
   return theVert;
 }
+
 //---------------------------------------------------------------------------
 Bool_t AliVertexerTracks::TrackToPoint(AliExternalTrackParam *t,
                                       TMatrixD &ri,TMatrixD &wWi,
@@ -1182,8 +1238,8 @@ void AliVertexerTracks::TooFewTracks()
   }
 
   if(!fTrkArraySel.IsEmpty()) fTrkArraySel.Delete(); 
-  if(fIdSel) {delete [] fIdSel; fIdSel=NULL;}
-  if(fTrksToSkip) {delete [] fTrksToSkip; fTrksToSkip=NULL;}
+  if(fIdSel) {delete fIdSel; fIdSel=NULL;}
+  if(fTrksToSkip) {delete fTrksToSkip; fTrksToSkip=NULL;}
 
   return;
 }
@@ -1513,7 +1569,7 @@ AliESDVertex* AliVertexerTracks::VertexForSelectedTracks(TObjArray *trkArray,
   Double_t d0z0[2],covd0z0[3];
   AliExternalTrackParam *t = 0;
   if(fCurrentVertex->GetNContributors()>0) {
-    indices = new UShort_t[fCurrentVertex->GetNContributors()];
+    indices = new UShort_t[fTrkArraySel.GetEntriesFast()];
     for(Int_t jj=0; jj<(Int_t)fTrkArraySel.GetEntriesFast(); jj++) {
       indices[jj] = fIdSel[jj];
       t = (AliExternalTrackParam*)fTrkArraySel.At(jj);
@@ -1530,8 +1586,8 @@ AliESDVertex* AliVertexerTracks::VertexForSelectedTracks(TObjArray *trkArray,
   }
 
   // clean up
-  delete [] indices; indices=NULL;
-  delete [] fIdSel; fIdSel=NULL;
+  if (indices) {delete indices; indices=NULL;}
+  delete fIdSel; fIdSel=NULL;
   fTrkArraySel.Delete();
   
   return fCurrentVertex;
@@ -1556,7 +1612,7 @@ AliESDVertex* AliVertexerTracks::VertexForSelectedESDTracks(TObjArray *trkArray,
     
   VertexForSelectedTracks(trkArray,id,optUseFitter,optPropagate);
 
-  delete [] id; id=NULL;
+  delete id; id=NULL;
 
   return fCurrentVertex;
 }