1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 #include "AliHLTVertexer.h"
18 #include "AliTracker.h"
20 #include "AliESDtrack.h"
22 #include "AliESDVertex.h"
23 #include "AliESDEvent.h"
24 #include "AliKFParticle.h"
25 #include "AliKFVertex.h"
27 ClassImp(AliHLTVertexer)
29 AliHLTVertexer::AliHLTVertexer():
36 AliHLTVertexer::AliHLTVertexer(const AliHLTVertexer & ):
43 void AliHLTVertexer::SetESD( AliESDEvent *event )
45 //* Fill fTrackInfo array
50 AliKFParticle::SetField( fESD->GetMagneticField() );
52 Int_t nESDTracks=event->GetNumberOfTracks();
53 fTrackInfos = new AliESDTrackInfo[ nESDTracks ];
55 for (Int_t iTr=0; iTr<nESDTracks; iTr++){
57 AliESDTrackInfo &info = fTrackInfos[iTr];
59 info.fPrimUsedFlag = 0;
61 //* track quality check
63 AliESDtrack *pTrack = event->GetTrack(iTr);
64 if( !pTrack ) continue;
65 if (pTrack->GetKinkIndex(0)>0) continue;
66 if ( !( pTrack->GetStatus()&AliESDtrack::kTPCin ) ) continue;
68 //* Construct KFParticle for the track
70 info.fParticle = AliKFParticle( *pTrack->GetInnerParam(), 211 );
76 void AliHLTVertexer::FindPrimaryVertex( )
78 //* Find event primary vertex
80 int nTracks = fESD->GetNumberOfTracks();
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
86 fPrimaryVtx.Initialize();
87 fPrimaryVtx.SetBeamConstraint(fESD->GetDiamondX(),fESD->GetDiamondY(),0,
88 TMath::Sqrt(fESD->GetSigma2DiamondX()),TMath::Sqrt(fESD->GetSigma2DiamondY()),5.3);
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;
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;
106 if( fPrimaryVtx.GetNContributors()>3 ){
107 AliESDVertex vESD( fPrimaryVtx.Parameters(), fPrimaryVtx.CovarianceMatrix(), fPrimaryVtx.GetChi2(), fPrimaryVtx.GetNContributors() );
108 fESD->SetPrimaryVertexTracks( &vESD );
110 for( Int_t i = 0; i<nTracks; i++)
111 fTrackInfos[i].fPrimUsedFlag = 0;
120 void AliHLTVertexer::FindV0s( )
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 );
133 for( Int_t iTr = 0; iTr<nTracks; iTr++ ){ //* first daughter
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;
141 for( Int_t jTr = 0; jTr<nTracks; jTr++ ){ //* second daughter
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;
149 //* construct V0 mother
151 AliKFParticle V0( info.fParticle, jnfo.fParticle );
155 if( V0.GetChi2()<0 || V0.GetChi2() > 9.*V0.GetNDF() ) continue;
157 //* subtruct daughters from primary vertex
159 AliKFVertex primVtxCopy = primVtx;
161 if( info.fPrimUsedFlag ){
162 if( primVtxCopy.GetNContributors()<=2 ) continue;
163 primVtxCopy -= info.fParticle;
165 if( jnfo.fPrimUsedFlag ){
166 if( primVtxCopy.GetNContributors()<=2 ) continue;
167 primVtxCopy -= jnfo.fParticle;
169 //* Check V0 Chi^2 deviation from primary vertex
171 if( V0.GetDeviationFromVertex( primVtxCopy ) >3. ) continue;
173 //* Add V0 to primary vertex to improve the primary vertex resolution
177 //* Set production vertex for V0
179 V0.SetProductionVertex( primVtxCopy );
181 //* Check chi^2 for a case
183 if( V0.GetChi2()<0 || V0.GetChi2()> 9.*V0.GetNDF() ) continue;
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;
193 //* Get V0 decay length with estimated error
195 Double_t length, sigmaLength;
196 if( V0.GetDecayLength( length, sigmaLength ) ) continue;
198 //* Reject V0 if it decays too close[sigma] to the primary vertex
200 if( length <3.5*sigmaLength ) continue;
202 //* Get V0 invariant mass
204 // Double_t mass, sigmaMass;
205 //if( V0.GetMass( mass, sigmaMass ) ) continue;
209 AliESDv0 v0ESD( *fESD->GetTrack( iTr ), iTr, *fESD->GetTrack( jTr ), jTr );
210 fESD->AddV0( &v0ESD );