]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Adding a new method for the vertex reconstruction using just one track (F.Prino)
authorbelikov <belikov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 1 Dec 2006 17:51:45 +0000 (17:51 +0000)
committerbelikov <belikov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 1 Dec 2006 17:51:45 +0000 (17:51 +0000)
STEER/AliVertexerTracks.cxx
STEER/AliVertexerTracks.h

index cd64e15663cad3aa0d7b283d19e01bfb38f701e8..bae346cab7cd5a1efc8e5252f2519faf8a752d2c 100644 (file)
@@ -42,7 +42,7 @@ AliVertexerTracks::AliVertexerTracks():
 TObject(),
 fVert(),
 fCurrentVertex(0),
-fMinTracks(2),
+fMinTracks(1),
 fMinITSClusters(5),
 fTrkArray(),
 fTrksToSkip(0),
@@ -68,7 +68,7 @@ AliVertexerTracks::AliVertexerTracks(Double_t xStart, Double_t yStart):
 TObject(),
 fVert(),
 fCurrentVertex(0),
-fMinTracks(2),
+fMinTracks(1),
 fMinITSClusters(5),
 fTrkArray(),
 fTrksToSkip(0),
@@ -153,14 +153,19 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(const AliESD *esdEvent)
     return fCurrentVertex; 
   }
 
+  if(nTrksPrep==1){
+    if(fDebug) printf("Just one track\n");
+    OneTrackVertFinder();
+  }else{
   // vertex finder
-  switch (fAlgo) {
+    switch (fAlgo) {
     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;  
+    }
   }
   if(fDebug) printf(" vertex finding completed\n");
 
@@ -184,13 +189,18 @@ AliESDVertex* AliVertexerTracks::FindPrimaryVertex(const AliESD *esdEvent)
   }
 
   // vertex finder
-  switch (fAlgo) {
+  if(nTrksPrep==1){
+    if(fDebug) printf("Just one track\n");
+    OneTrackVertFinder();
+  }else{
+    switch (fAlgo) {
     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;  
+    }
   }
   if(fDebug) printf(" vertex finding completed\n");
 
@@ -326,6 +336,36 @@ Double_t AliVertexerTracks::GetStrLinMinDist(Double_t *p0,Double_t *p1,Double_t
   return ((x10*x10+y10*y10+z10*z10)*(x12*x12+y12*y12+z12*z12)-(x10*x12+y10*y12+z10*z12)*(x10*x12+y10*y12+z10*z12))/(x12*x12+y12*y12+z12*z12);
 }
 //---------------------------------------------------------------------------
+void AliVertexerTracks::OneTrackVertFinder() {
+  // find vertex for events with 1 track, using DCA to nominal beam axis
+  if(fDebug) printf("Number of prepared tracks =%d - Call OneTrackVertFinder",fTrkArray.GetEntries());
+  AliESDtrack *track1;
+  track1 = (AliESDtrack*)fTrkArray.At(0);
+  Double_t field=GetField();
+  Double_t alpha=track1->GetAlpha();
+  Double_t mindist = TMath::Cos(alpha)*fNominalPos[0]+TMath::Sin(alpha)*fNominalPos[1];
+  Double_t pos[3],dir[3]; 
+  track1->GetXYZAt(mindist,field,pos);
+  track1->GetPxPyPzAt(mindist,field,dir);
+  AliStrLine *line1 = new AliStrLine(pos,dir);
+  Double_t p1[3]={fNominalPos[0],fNominalPos[1],0.}; 
+  Double_t p2[3]={fNominalPos[0],fNominalPos[1],10.}; 
+  AliStrLine *zeta=new AliStrLine(p1,p2,kTRUE);
+  Double_t crosspoint[3]={0.,0.,0.};
+  Double_t sigma=999.;
+  Int_t nContrib=-1;
+  Int_t retcode = zeta->Cross(line1,crosspoint);
+  if(retcode>=0){
+    sigma=line1->GetDistFromPoint(crosspoint);
+    nContrib=1;
+  }
+  delete zeta;
+  delete line1;
+  fVert.SetXYZ(crosspoint);
+  fVert.SetDispersion(sigma);
+  fVert.SetNContributors(nContrib);  
+}
+//---------------------------------------------------------------------------
 void AliVertexerTracks::HelixVertexFinder() {
 
   // Get estimate of vertex position in (x,y) from tracks DCA
@@ -905,7 +945,7 @@ AliVertex* AliVertexerTracks::VertexForSelectedTracks(TTree *trkTree) {
 
   // get tracks and propagate them to initial vertex position
   Int_t nTrksPrep = PrepareTracks(*trkTree,1);
-  if(nTrksPrep < fMinTracks) {
+  if(nTrksPrep <  TMath::Max(2,fMinTracks) ) {
     if(fDebug) printf("TooFewTracks\n");
     Double_t vtx[3]={0,0,0};
     fVert.SetXYZ(vtx);
@@ -947,7 +987,7 @@ AliVertex* AliVertexerTracks::VertexForSelectedTracks(TObjArray *trkArray) {
 
   // get tracks and propagate them to initial vertex position
   Int_t nTrks = trkArray->GetEntriesFast();
-  if(nTrks < fMinTracks) {
+  if(nTrks < TMath::Max(2,fMinTracks) ) {
     if(fDebug) printf("TooFewTracks\n");
     Double_t vtx[3]={0,0,0};
     fVert.SetXYZ(vtx);
index f812ae079b8c7617e093d28df1830bfcf92a3bd9..e541ea0259bf6cf38ac5ff902b37e91996a9b584 100644 (file)
@@ -42,7 +42,7 @@ class AliVertexerTracks : public TObject {
   AliVertex* VertexForSelectedTracks(TTree *trkTree);
   AliVertex* VertexForSelectedTracks(TObjArray *trkArray);
   AliESDVertex* FindPrimaryVertex(const AliESD *esdEvent);
-  void  SetMinTracks(Int_t n=2) { fMinTracks = n; return; }
+  void  SetMinTracks(Int_t n=1) { fMinTracks = n; return; }
   void  SetITSNotRequired() { fITSrefit=kFALSE;fITSin=kFALSE; return; }
   void  SetITSrefitNotRequired() { fITSrefit=kFALSE; return; }
   void  SetMinITSClusters(Int_t n=5) { fMinITSClusters = n; return; }
@@ -69,6 +69,7 @@ class AliVertexerTracks : public TObject {
       AliFatal("Field map not set; use AliTracker::SetFieldMap()!");
     return AliTracker::GetBz(); } 
   Int_t    PrepareTracks(TTree &trkTree,Int_t OptImpParCut);
+  void     OneTrackVertFinder();
   void     VertexFinder(Int_t optUseWeights=0);
   void     HelixVertexFinder();
   void     StrLinVertexFinderMinDist(Int_t OptUseWeights=0);