]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/global/AliHLTVertexer.cxx
ba0031b20622219f192e9e5b4cf4d8a8b7418ce6
[u/mrichter/AliRoot.git] / HLT / global / AliHLTVertexer.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17 #include "AliHLTVertexer.h"
18 #include "AliTracker.h"
19 #include "TMath.h"
20 #include "AliESDtrack.h"
21 #include "AliESDv0.h"
22 #include "AliESDVertex.h"
23 #include "AliESDEvent.h"
24 #include "AliKFParticle.h"
25 #include "AliKFVertex.h"
26
27 ClassImp(AliHLTVertexer)
28
29 AliHLTVertexer::AliHLTVertexer():
30   fESD(0),
31   fTrackInfos(0),
32   fPrimaryVtx()
33 {
34 }
35
36 AliHLTVertexer::AliHLTVertexer(const AliHLTVertexer & ):
37   fESD(0),
38   fTrackInfos(0),
39   fPrimaryVtx()
40 {
41 }
42
43 void AliHLTVertexer::SetESD( AliESDEvent *event )
44 {
45   //* Fill fTrackInfo array
46
47   delete[] fTrackInfos;
48   fESD = event;
49
50   AliKFParticle::SetField( fESD->GetMagneticField() );
51
52   Int_t nESDTracks=event->GetNumberOfTracks(); 
53   fTrackInfos = new AliESDTrackInfo[ nESDTracks ];
54
55   for (Int_t iTr=0; iTr<nESDTracks; iTr++){ 
56   
57     AliESDTrackInfo &info = fTrackInfos[iTr];
58     info.fOK = 0;
59     info.fPrimUsedFlag = 0;
60     
61     //* track quality check
62
63     AliESDtrack *pTrack = event->GetTrack(iTr);    
64     if( !pTrack  ) continue;
65     if (pTrack->GetKinkIndex(0)>0) continue;
66     if ( !( pTrack->GetStatus()&AliESDtrack::kTPCin ) ) continue;
67     
68     //* Construct KFParticle for the track
69
70     info.fParticle = AliKFParticle( *pTrack->GetInnerParam(), 211 );    
71     info.fOK = 1;
72   }
73 }
74
75
76 void AliHLTVertexer::FindPrimaryVertex(  )
77 {
78   //* Find event primary vertex
79
80   int nTracks = fESD->GetNumberOfTracks();
81
82   const AliKFParticle **vSelected = new const AliKFParticle*[nTracks]; //* Selected particles for vertex fit
83   Int_t *vIndex = new int [nTracks];                    //* Indices of selected particles
84   Bool_t *vFlag = new bool [nTracks];                    //* Flags returned by the vertex finder
85
86   fPrimaryVtx.Initialize();
87   fPrimaryVtx.SetBeamConstraint(fESD->GetDiamondX(),fESD->GetDiamondY(),0,
88                                 TMath::Sqrt(fESD->GetSigma2DiamondX()),TMath::Sqrt(fESD->GetSigma2DiamondY()),5.3);
89   
90   Int_t nSelected = 0;
91   for( Int_t i = 0; i<nTracks; i++){ 
92     if(!fTrackInfos[i].fOK ) continue;
93     if( fESD->GetTrack(i)->GetTPCNcls()<60  ) continue;
94     const AliKFParticle &p = fTrackInfos[i].fParticle;
95     Double_t chi = p.GetDeviationFromVertex( fPrimaryVtx );      
96     if( chi > 3.5 ) continue;
97     vSelected[nSelected] = &(fTrackInfos[i].fParticle);
98     vIndex[nSelected] = i;
99     nSelected++;  
100   }
101   fPrimaryVtx.ConstructPrimaryVertex( vSelected, nSelected, vFlag, 3. );
102   for( Int_t i = 0; i<nSelected; i++){ 
103     if( vFlag[i] ) fTrackInfos[vIndex[i]].fPrimUsedFlag = 1;
104   }
105   
106   if( fPrimaryVtx.GetNContributors()>3 ){
107     AliESDVertex vESD( fPrimaryVtx.Parameters(), fPrimaryVtx.CovarianceMatrix(), fPrimaryVtx.GetChi2(), fPrimaryVtx.GetNContributors() );
108     fESD->SetPrimaryVertexTracks( &vESD );
109   } else {
110     for( Int_t i = 0; i<nTracks; i++)
111       fTrackInfos[i].fPrimUsedFlag = 0;
112   }
113
114
115   delete[] vSelected;
116   delete[] vIndex;
117   delete[] vFlag;
118 }
119
120 void AliHLTVertexer::FindV0s(  )
121 {
122   //* V0 finder
123
124   int nTracks = fESD->GetNumberOfTracks();
125   //AliKFVertex primVtx( *fESD->GetPrimaryVertexTracks() );
126   AliKFVertex &primVtx = fPrimaryVtx;
127   if( primVtx.GetNContributors()<3 ) return;
128   for( Int_t iTr = 0; iTr<nTracks; iTr++ ){ 
129     AliESDTrackInfo &info = fTrackInfos[iTr];
130     info.fPrimDeviation = info.fParticle.GetDeviationFromVertex( primVtx );
131   }
132
133   for( Int_t iTr = 0; iTr<nTracks; iTr++ ){ //* first daughter
134
135     if( fESD->GetTrack(iTr)->GetTPCNcls()<60  ) continue;
136     AliESDTrackInfo &info = fTrackInfos[iTr];
137     if( !info.fOK ) continue;    
138     if( info.fParticle.GetQ() >0 ) continue;    
139     if( info.fPrimDeviation <2.5 ) continue;
140
141     for( Int_t jTr = 0; jTr<nTracks; jTr++ ){  //* second daughter
142
143       if( fESD->GetTrack(jTr)->GetTPCNcls()<60  ) continue;
144       AliESDTrackInfo &jnfo = fTrackInfos[jTr];
145       if( !jnfo.fOK ) continue;
146       if( jnfo.fParticle.GetQ() < 0 ) continue;
147       if( jnfo.fPrimDeviation <2.5 ) continue;
148    
149       //* construct V0 mother
150
151       AliKFParticle V0( info.fParticle, jnfo.fParticle );     
152
153       //* check V0 Chi^2
154       
155       if( V0.GetChi2()<0 || V0.GetChi2() > 9.*V0.GetNDF() ) continue;
156
157       //* subtruct daughters from primary vertex 
158
159       AliKFVertex primVtxCopy = primVtx;    
160        
161       if( info.fPrimUsedFlag ){ 
162         if( primVtxCopy.GetNContributors()<=2 ) continue;
163         primVtxCopy -= info.fParticle;
164       }
165       if( jnfo.fPrimUsedFlag ){
166         if( primVtxCopy.GetNContributors()<=2 ) continue;
167         primVtxCopy -= jnfo.fParticle;
168       }
169       //* Check V0 Chi^2 deviation from primary vertex 
170
171       if( V0.GetDeviationFromVertex( primVtxCopy ) >3. ) continue;
172
173       //* Add V0 to primary vertex to improve the primary vertex resolution
174
175       primVtxCopy += V0;      
176
177       //* Set production vertex for V0
178
179       V0.SetProductionVertex( primVtxCopy );
180
181       //* Check chi^2 for a case
182
183       if( V0.GetChi2()<0 || V0.GetChi2()> 9.*V0.GetNDF() ) continue;
184
185       // Abschtand in [cm]
186
187       double dx = V0.GetX()-primVtxCopy.GetX();
188       double dy = V0.GetY()-primVtxCopy.GetY();
189       double r = sqrt(dx*dx + dy*dy);
190       //if( r>30 ) continue;
191       if( r<.2 ) continue;
192
193      //* Get V0 decay length with estimated error
194
195       Double_t length, sigmaLength;
196       if( V0.GetDecayLength( length, sigmaLength ) ) continue;
197
198       //* Reject V0 if it decays too close[sigma] to the primary vertex
199
200       if( length  <3.5*sigmaLength ) continue;
201
202       //* Get V0 invariant mass 
203
204       // Double_t mass, sigmaMass;
205       //if( V0.GetMass( mass, sigmaMass ) ) continue;   
206       
207       //* add ESD v0 
208       
209       AliESDv0 v0ESD( *fESD->GetTrack( iTr ), iTr, *fESD->GetTrack( jTr ), jTr );  
210       fESD->AddV0( &v0ESD );
211     }
212   }
213 }
214