1 //**************************************************************************
2 //* This file is property of and copyright by the ALICE HLT Project *
3 //* ALICE Experiment at CERN, All rights reserved. *
5 //* Primary Authors: S.Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
6 //* for The ALICE HLT Project. *
8 //* Permission to use, copy, modify and distribute this software and its *
9 //* documentation strictly for non-commercial purposes is hereby granted *
10 //* without fee, provided that the above copyright notice appears in all *
11 //* copies and that both the copyright notice and this permission notice *
12 //* appear in the supporting documentation. The authors make no claims *
13 //* about the suitability of this software for any purpose. It is *
14 //* provided "as is" without express or implied warranty. *
15 //**************************************************************************
17 /** @file AliHLTGlobalVertexerComponent.cxx
18 @author Sergey Gorbunov
19 @brief Component for reconstruct primary vertex and V0's
26 #include "AliHLTGlobalVertexerComponent.h"
27 #include "AliCDBEntry.h"
28 #include "AliCDBManager.h"
31 #include "TObjString.h"
32 #include "TObjArray.h"
35 #include "AliESDEvent.h"
36 #include "AliESDtrack.h"
37 #include "AliESDVertex.h"
39 #include "AliHLTMessage.h"
40 #include "AliHLTVertexer.h"
42 #include "AliKFParticle.h"
43 #include "AliKFVertex.h"
46 /** ROOT macro for the implementation of ROOT specific class methods */
47 ClassImp(AliHLTGlobalVertexerComponent)
49 AliHLTGlobalVertexerComponent::AliHLTGlobalVertexerComponent()
59 fFillVtxConstrainedTracks(1),
60 fConstrainedTrackDeviation(4.),
61 fV0DaughterPrimDeviation( 2.5 ),
62 fV0PrimDeviation( 3.5 ),
64 fV0DecayLengthInSigmas(3.)
66 // see header file for class documentation
68 // refer to README to build package
70 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
74 AliHLTGlobalVertexerComponent::~AliHLTGlobalVertexerComponent()
76 // see header file for class documentation
79 delete fHistPrimVertexXY;
80 delete fHistPrimVertexZX;
81 delete fHistPrimVertexZY;
84 // Public functions to implement AliHLTComponent's interface.
85 // These functions are required for the registration process
87 const char* AliHLTGlobalVertexerComponent::GetComponentID()
89 // see header file for class documentation
91 return "GlobalVertexer";
94 void AliHLTGlobalVertexerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
96 // see header file for class documentation
98 list.push_back( kAliHLTDataTypeESDObject|kAliHLTDataOriginOut );
101 AliHLTComponentDataType AliHLTGlobalVertexerComponent::GetOutputDataType()
103 // see header file for class documentation
104 return kAliHLTMultipleDataType;
107 int AliHLTGlobalVertexerComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
110 // see header file for class documentation
112 tgtList.push_back(kAliHLTDataTypeESDObject|kAliHLTDataOriginOut);
113 tgtList.push_back(kAliHLTDataTypeHistogram);
114 return tgtList.size();
117 void AliHLTGlobalVertexerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
119 // see header file for class documentation
120 // XXX TODO: Find more realistic values.
122 inputMultiplier = 2.;
125 AliHLTComponent* AliHLTGlobalVertexerComponent::Spawn()
127 // see header file for class documentation
128 return new AliHLTGlobalVertexerComponent;
131 int AliHLTGlobalVertexerComponent::DoInit( int argc, const char** argv )
135 fHistPrimVertexXY = new TH2F("primVertexXY","HLT: Primary vertex distribution in XY",60,-5.,5.,60,-5.,5.);
136 fHistPrimVertexXY->SetMarkerStyle(8);
137 fHistPrimVertexXY->SetMarkerSize(0.4);
138 fHistPrimVertexXY->SetYTitle("Y");
139 fHistPrimVertexXY->SetXTitle("X");
140 fHistPrimVertexXY->SetStats(0);
141 fHistPrimVertexXY->SetOption("COLZ");
143 fHistPrimVertexZX = new TH2F("primVertexZX","HLT: Primary vertex distribution in ZX",60,-15.,15.,60,-5.,5.);
144 fHistPrimVertexZX->SetMarkerStyle(8);
145 fHistPrimVertexZX->SetMarkerSize(0.4);
146 fHistPrimVertexZX->SetYTitle("X");
147 fHistPrimVertexZX->SetXTitle("Z");
148 fHistPrimVertexZX->SetStats(0);
149 fHistPrimVertexZX->SetOption("COLZ");
151 fHistPrimVertexZY = new TH2F("primVertexZY","HLT: Primary vertex distribution in ZY",60,-15.,15.,60,-5.,5.);
152 fHistPrimVertexZY->SetMarkerStyle(8);
153 fHistPrimVertexZY->SetMarkerSize(0.4);
154 fHistPrimVertexZY->SetYTitle("Y");
155 fHistPrimVertexZY->SetXTitle("Z");
156 fHistPrimVertexZY->SetStats(0);
157 fHistPrimVertexZY->SetOption("COLZ");
162 TString configuration="";
164 for (int i=0; i<argc && iResult>=0; i++) {
166 if (!configuration.IsNull()) configuration+=" ";
167 configuration+=argument;
170 if (!configuration.IsNull()) {
171 iResult=Configure(configuration.Data());
177 int AliHLTGlobalVertexerComponent::DoDeinit()
179 // see header file for class documentation
181 delete[] fTrackInfos;
182 delete fHistPrimVertexXY;
183 delete fHistPrimVertexZX;
184 delete fHistPrimVertexZY;
187 fHistPrimVertexXY = 0;
188 fHistPrimVertexZX = 0;
189 fHistPrimVertexZY = 0;
192 fFillVtxConstrainedTracks = 1;
193 fConstrainedTrackDeviation = 4.;
194 fV0DaughterPrimDeviation = 2.5 ;
195 fV0PrimDeviation =3.5;
197 fV0DecayLengthInSigmas = 3.;
202 int AliHLTGlobalVertexerComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
205 if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) )
210 for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDObject); iter != NULL; iter = GetNextInputObject() ) {
212 AliESDEvent *event = dynamic_cast<AliESDEvent*>(const_cast<TObject*>( iter ) );
213 event->GetStdContent();
215 // primary vertex & V0's
217 AliHLTVertexer vertexer;
218 vertexer.SetESD( event );
219 vertexer.SetFillVtxConstrainedTracks( fFillVtxConstrainedTracks );
220 vertexer.FindPrimaryVertex();
222 const AliESDVertex *vPrim = event->GetPrimaryVertexTracks();
226 if( fPlotHistograms ){
227 if( vPrim && vPrim->GetNContributors()>=3 ){
228 fHistPrimVertexXY->Fill( vPrim->GetX(),vPrim->GetY() );
229 fHistPrimVertexZX->Fill( vPrim->GetZ(),vPrim->GetX() );
230 fHistPrimVertexZY->Fill( vPrim->GetZ(),vPrim->GetY() );
232 if( fHistPrimVertexXY ) PushBack( (TObject*) fHistPrimVertexXY, kAliHLTDataTypeHistogram,0);
233 if( fHistPrimVertexZX ) PushBack( (TObject*) fHistPrimVertexZX, kAliHLTDataTypeHistogram,0);
234 if( fHistPrimVertexZY ) PushBack( (TObject*) fHistPrimVertexZY, kAliHLTDataTypeHistogram,0);
237 PushBack( (TObject*) event, kAliHLTDataTypeESDObject, 0);
243 int AliHLTGlobalVertexerComponent::Configure(const char* arguments)
247 if (!arguments) return iResult;
249 TString allArgs=arguments;
252 TObjArray* pTokens=allArgs.Tokenize(" ");
256 for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
257 argument=((TObjString*)pTokens->At(i))->GetString();
258 if (argument.IsNull()) continue;
260 if (argument.CompareTo("-fitTracksToVertex")==0) {
261 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
262 HLTInfo("fitTracksToVertex is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
263 fFillVtxConstrainedTracks=((TObjString*)pTokens->At(i))->GetString().Atoi();
266 else if (argument.CompareTo("-plotHistograms")==0) {
267 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
268 HLTInfo("plotHistograms is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
269 fPlotHistograms=((TObjString*)pTokens->At(i))->GetString().Atoi();
272 else if (argument.CompareTo("-fillVtxConstrainedTracks")==0) {
273 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
274 HLTInfo("Filling of vertex constrained tracks is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
275 fFillVtxConstrainedTracks=((TObjString*)pTokens->At(i))->GetString().Atoi();
278 else if (argument.CompareTo("-constrainedTrackDeviation")==0) {
279 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
280 HLTInfo("constrainedTrackDeviation is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
281 fConstrainedTrackDeviation=((TObjString*)pTokens->At(i))->GetString().Atof();
284 else if (argument.CompareTo("-v0DaughterPrimDeviation")==0) {
285 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
286 HLTInfo("v0DaughterPrimDeviation is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
287 fV0DaughterPrimDeviation=((TObjString*)pTokens->At(i))->GetString().Atof();
290 else if (argument.CompareTo("-v0PrimDeviation")==0) {
291 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
292 HLTInfo("v0PrimDeviation is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
293 fV0PrimDeviation=((TObjString*)pTokens->At(i))->GetString().Atof();
296 else if (argument.CompareTo("-v0Chi")==0) {
297 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
298 HLTInfo("v0Chi is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
299 fV0Chi=((TObjString*)pTokens->At(i))->GetString().Atof();
302 else if (argument.CompareTo("-v0DecayLengthInSigmas")==0) {
303 if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
304 HLTInfo("v0DecayLengthInSigmas is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
305 fV0DecayLengthInSigmas=((TObjString*)pTokens->At(i))->GetString().Atof();
309 HLTError("unknown argument %s", argument.Data());
317 HLTError("missing parameter for argument %s", argument.Data());
324 int AliHLTGlobalVertexerComponent::Reconfigure(const char* cdbEntry, const char* chainId)
326 // see header file for class documentation
328 const char* path="HLT/ConfigTPC/KryptonHistoComponent";
329 const char* defaultNotify="";
332 defaultNotify=" (default)";
335 HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
336 AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
338 TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
340 HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
341 iResult=Configure(pString->GetString().Data());
343 HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
346 HLTError("can not fetch object \"%s\" from CDB", path);
355 void AliHLTGlobalVertexerComponent::SetESD( AliESDEvent *event )
357 //* Fill fTrackInfo array
359 delete[] fTrackInfos;
362 AliKFParticle::SetField( fESD->GetMagneticField() );
364 Int_t nESDTracks=event->GetNumberOfTracks();
365 fTrackInfos = new AliESDTrackInfo[ nESDTracks ];
367 for (Int_t iTr=0; iTr<nESDTracks; iTr++){
369 AliESDTrackInfo &info = fTrackInfos[iTr];
371 info.fPrimUsedFlag = 0;
373 //* track quality check
375 AliESDtrack *pTrack = event->GetTrack(iTr);
376 if( !pTrack ) continue;
377 if (pTrack->GetKinkIndex(0)>0) continue;
378 if ( !( pTrack->GetStatus()&AliESDtrack::kTPCin ) ) continue;
380 //* Construct KFParticle for the track
382 info.fParticle = AliKFParticle( *pTrack->GetInnerParam(), 211 );
388 void AliHLTGlobalVertexerComponent::FindPrimaryVertex( )
390 //* Find event primary vertex
392 int nTracks = fESD->GetNumberOfTracks();
394 const AliKFParticle **vSelected = new const AliKFParticle*[nTracks]; //* Selected particles for vertex fit
395 Int_t *vIndex = new int [nTracks]; //* Indices of selected particles
396 Bool_t *vFlag = new bool [nTracks]; //* Flags returned by the vertex finder
398 fPrimaryVtx.Initialize();
399 fPrimaryVtx.SetBeamConstraint(fESD->GetDiamondX(),fESD->GetDiamondY(),0,
400 TMath::Sqrt(fESD->GetSigma2DiamondX()),TMath::Sqrt(fESD->GetSigma2DiamondY()),5.3);
403 for( Int_t i = 0; i<nTracks; i++){
404 if(!fTrackInfos[i].fOK ) continue;
405 //if( fESD->GetTrack(i)->GetTPCNcls()<60 ) continue;
406 const AliKFParticle &p = fTrackInfos[i].fParticle;
407 Double_t chi = p.GetDeviationFromVertex( fPrimaryVtx );
408 if( chi > fConstrainedTrackDeviation ) continue;
409 vSelected[nSelected] = &(fTrackInfos[i].fParticle);
410 vIndex[nSelected] = i;
413 fPrimaryVtx.ConstructPrimaryVertex( vSelected, nSelected, vFlag, fConstrainedTrackDeviation );
414 for( Int_t i = 0; i<nSelected; i++){
415 if( vFlag[i] ) fTrackInfos[vIndex[i]].fPrimUsedFlag = 1;
418 for( Int_t i = 0; i<nTracks; i++ ){
419 AliESDTrackInfo &info = fTrackInfos[i];
420 info.fPrimDeviation = info.fParticle.GetDeviationFromVertex( fPrimaryVtx );
423 if( fPrimaryVtx.GetNContributors()>=3 ){
424 AliESDVertex vESD( fPrimaryVtx.Parameters(), fPrimaryVtx.CovarianceMatrix(), fPrimaryVtx.GetChi2(), fPrimaryVtx.GetNContributors() );
425 fESD->SetPrimaryVertexTracks( &vESD );
427 // relate the tracks to vertex
429 if( fFillVtxConstrainedTracks ){
430 for( Int_t i = 0; i<nTracks; i++ ){
431 if( !fTrackInfos[i].fPrimUsedFlag ) continue;
432 if( fTrackInfos[i].fPrimDeviation > fConstrainedTrackDeviation ) continue;
433 fESD->GetTrack(i)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
438 for( Int_t i = 0; i<nTracks; i++)
439 fTrackInfos[i].fPrimUsedFlag = 0;
449 void AliHLTGlobalVertexerComponent::FindV0s( )
453 int nTracks = fESD->GetNumberOfTracks();
454 //AliKFVertex primVtx( *fESD->GetPrimaryVertexTracks() );
455 AliKFVertex &primVtx = fPrimaryVtx;
456 if( primVtx.GetNContributors()<3 ) return;
458 bool *constrainedV0 = new bool[nTracks];
459 for( Int_t iTr = 0; iTr<nTracks; iTr++ ){
460 constrainedV0[iTr] = 0;
464 for( Int_t iTr = 0; iTr<nTracks; iTr++ ){ //* first daughter
466 AliESDTrackInfo &info = fTrackInfos[iTr];
467 if( !info.fOK ) continue;
468 if( info.fParticle.GetQ() >0 ) continue;
469 if( info.fPrimDeviation < fV0DaughterPrimDeviation ) continue;
471 for( Int_t jTr = 0; jTr<nTracks; jTr++ ){ //* second daughter
473 AliESDTrackInfo &jnfo = fTrackInfos[jTr];
474 if( !jnfo.fOK ) continue;
475 if( jnfo.fParticle.GetQ() < 0 ) continue;
476 if( jnfo.fPrimDeviation < fV0DaughterPrimDeviation ) continue;
478 //* construct V0 mother
480 AliKFParticle v0( info.fParticle, jnfo.fParticle );
484 if( v0.GetChi2()<0 || v0.GetChi2() > fV0Chi*fV0Chi*v0.GetNDF() ) continue;
486 //* subtruct daughters from primary vertex
488 AliKFVertex primVtxCopy = primVtx;
490 if( info.fPrimUsedFlag ){
491 if( primVtxCopy.GetNContributors()<=2 ) continue;
492 primVtxCopy -= info.fParticle;
494 if( jnfo.fPrimUsedFlag ){
495 if( primVtxCopy.GetNContributors()<=2 ) continue;
496 primVtxCopy -= jnfo.fParticle;
498 //* Check v0 Chi^2 deviation from primary vertex
500 if( v0.GetDeviationFromVertex( primVtxCopy ) > fV0PrimDeviation ) continue;
502 //* Add V0 to primary vertex to improve the primary vertex resolution
506 //* Set production vertex for V0
508 v0.SetProductionVertex( primVtxCopy );
510 //* Get V0 decay length with estimated error
512 Double_t length, sigmaLength;
513 if( v0.GetDecayLength( length, sigmaLength ) ) continue;
515 //* Reject V0 if it decays too close[sigma] to the primary vertex
517 if( length < fV0DecayLengthInSigmas*sigmaLength ) continue;
521 AliESDv0 v0ESD( *fESD->GetTrack( iTr ), iTr, *fESD->GetTrack( jTr ), jTr );
522 fESD->AddV0( &v0ESD );
524 // relate the tracks to vertex
526 if( fFillVtxConstrainedTracks ){
527 if( constrainedV0[iTr] || constrainedV0[jTr]
528 || info.fPrimDeviation < fConstrainedTrackDeviation || jnfo.fPrimDeviation < fConstrainedTrackDeviation ) continue;
529 AliESDVertex vESD(v0.Parameters(), v0.CovarianceMatrix(), v0.GetChi2(), 2);
530 fESD->GetTrack(iTr)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
531 fESD->GetTrack(jTr)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
532 constrainedV0[iTr] = 1;
533 constrainedV0[jTr] = 1;
537 delete[] constrainedV0;