--- /dev/null
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project *
+//* ALICE Experiment at CERN, All rights reserved. *
+//* *
+//* Primary Authors: S.Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
+//* for The ALICE HLT Project. *
+//* *
+//* Permission to use, copy, modify and distribute this software and its *
+//* documentation strictly for non-commercial purposes is hereby granted *
+//* without fee, provided that the above copyright notice appears in all *
+//* copies and that both the copyright notice and this permission notice *
+//* appear in the supporting documentation. The authors make no claims *
+//* about the suitability of this software for any purpose. It is *
+//* provided "as is" without express or implied warranty. *
+//**************************************************************************
+
+/** @file AliHLTGlobalVertexerComponent.cxx
+ @author Sergey Gorbunov
+ @brief Component for reconstruct primary vertex and V0's
+*/
+
+#if __GNUC__>= 3
+using namespace std;
+#endif
+
+#include "AliHLTGlobalVertexerComponent.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
+#include <TFile.h>
+#include <TString.h>
+#include "TObjString.h"
+#include "TObjArray.h"
+#include "TH1F.h"
+#include "TH2F.h"
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
+#include "AliESDVertex.h"
+#include "AliESDv0.h"
+#include "AliHLTMessage.h"
+#include "AliHLTVertexer.h"
+#include "TMath.h"
+#include "AliKFParticle.h"
+#include "AliKFVertex.h"
+
+
+/** ROOT macro for the implementation of ROOT specific class methods */
+ClassImp(AliHLTGlobalVertexerComponent)
+
+AliHLTGlobalVertexerComponent::AliHLTGlobalVertexerComponent()
+:
+ fESD(0),
+ fTrackInfos(0),
+ fPrimaryVtx(),
+ fHistPrimVertexXY(0),
+ fHistPrimVertexZX(0),
+ fHistPrimVertexZY(0),
+ fNEvents(0),
+ fPlotHistograms(1),
+ fFillVtxConstrainedTracks(1),
+ fConstrainedTrackDeviation(4.),
+ fV0DaughterPrimDeviation( 2.5 ),
+ fV0PrimDeviation( 3.5 ),
+ fV0Chi(3.5),
+ fV0DecayLengthInSigmas(3.)
+{
+ // see header file for class documentation
+ // or
+ // refer to README to build package
+ // or
+ // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+}
+
+AliHLTGlobalVertexerComponent::~AliHLTGlobalVertexerComponent()
+{
+ // see header file for class documentation
+
+ delete[] fTrackInfos;
+ delete fHistPrimVertexXY;
+ delete fHistPrimVertexZX;
+ delete fHistPrimVertexZY;
+}
+
+// Public functions to implement AliHLTComponent's interface.
+// These functions are required for the registration process
+
+const char* AliHLTGlobalVertexerComponent::GetComponentID()
+{
+ // see header file for class documentation
+
+ return "GlobalVertexer";
+}
+
+void AliHLTGlobalVertexerComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
+{
+ // see header file for class documentation
+ list.clear();
+ list.push_back( kAliHLTDataTypeESDObject|kAliHLTDataOriginOut );
+}
+
+AliHLTComponentDataType AliHLTGlobalVertexerComponent::GetOutputDataType()
+{
+ // see header file for class documentation
+ return kAliHLTMultipleDataType;
+}
+
+int AliHLTGlobalVertexerComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
+
+{
+ // see header file for class documentation
+ tgtList.clear();
+ tgtList.push_back(kAliHLTDataTypeESDObject|kAliHLTDataOriginOut);
+ tgtList.push_back(kAliHLTDataTypeHistogram);
+ return tgtList.size();
+}
+
+void AliHLTGlobalVertexerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
+{
+ // see header file for class documentation
+ // XXX TODO: Find more realistic values.
+ constBase = 80000;
+ inputMultiplier = 2.;
+}
+
+AliHLTComponent* AliHLTGlobalVertexerComponent::Spawn()
+{
+ // see header file for class documentation
+ return new AliHLTGlobalVertexerComponent;
+}
+
+int AliHLTGlobalVertexerComponent::DoInit( int argc, const char** argv )
+{
+ // init
+
+ fHistPrimVertexXY = new TH2F("primVertexXY","HLT: Primary vertex distribution in XY",60,-5.,5.,60,-5.,5.);
+ fHistPrimVertexXY->SetMarkerStyle(8);
+ fHistPrimVertexXY->SetMarkerSize(0.4);
+ fHistPrimVertexXY->SetYTitle("Y");
+ fHistPrimVertexXY->SetXTitle("X");
+ fHistPrimVertexXY->SetStats(0);
+ fHistPrimVertexXY->SetOption("COLZ");
+
+ fHistPrimVertexZX = new TH2F("primVertexZX","HLT: Primary vertex distribution in ZX",60,-15.,15.,60,-5.,5.);
+ fHistPrimVertexZX->SetMarkerStyle(8);
+ fHistPrimVertexZX->SetMarkerSize(0.4);
+ fHistPrimVertexZX->SetYTitle("X");
+ fHistPrimVertexZX->SetXTitle("Z");
+ fHistPrimVertexZX->SetStats(0);
+ fHistPrimVertexZX->SetOption("COLZ");
+
+ fHistPrimVertexZY = new TH2F("primVertexZY","HLT: Primary vertex distribution in ZY",60,-15.,15.,60,-5.,5.);
+ fHistPrimVertexZY->SetMarkerStyle(8);
+ fHistPrimVertexZY->SetMarkerSize(0.4);
+ fHistPrimVertexZY->SetYTitle("Y");
+ fHistPrimVertexZY->SetXTitle("Z");
+ fHistPrimVertexZY->SetStats(0);
+ fHistPrimVertexZY->SetOption("COLZ");
+
+ fNEvents =0;
+
+ int iResult=0;
+ TString configuration="";
+ TString argument="";
+ for (int i=0; i<argc && iResult>=0; i++) {
+ argument=argv[i];
+ if (!configuration.IsNull()) configuration+=" ";
+ configuration+=argument;
+ }
+
+ if (!configuration.IsNull()) {
+ iResult=Configure(configuration.Data());
+ }
+
+ return iResult;
+}
+
+int AliHLTGlobalVertexerComponent::DoDeinit()
+{
+ // see header file for class documentation
+
+ delete[] fTrackInfos;
+ delete fHistPrimVertexXY;
+ delete fHistPrimVertexZX;
+ delete fHistPrimVertexZY;
+
+ fTrackInfos = 0;
+ fHistPrimVertexXY = 0;
+ fHistPrimVertexZX = 0;
+ fHistPrimVertexZY = 0;
+
+ fPlotHistograms = 1;
+ fFillVtxConstrainedTracks = 1;
+ fConstrainedTrackDeviation = 4.;
+ fV0DaughterPrimDeviation = 2.5 ;
+ fV0PrimDeviation =3.5;
+ fV0Chi = 3.5;
+ fV0DecayLengthInSigmas = 3.;
+ fNEvents = 0;
+ return 0;
+}
+
+int AliHLTGlobalVertexerComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
+{
+
+ if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) )
+ return 0;
+
+ fNEvents++;
+
+ for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDObject); iter != NULL; iter = GetNextInputObject() ) {
+
+ AliESDEvent *event = dynamic_cast<AliESDEvent*>(const_cast<TObject*>( iter ) );
+ event->GetStdContent();
+
+ // primary vertex & V0's
+
+ AliHLTVertexer vertexer;
+ vertexer.SetESD( event );
+ vertexer.SetFillVtxConstrainedTracks( fFillVtxConstrainedTracks );
+ vertexer.FindPrimaryVertex();
+ vertexer.FindV0s();
+ const AliESDVertex *vPrim = event->GetPrimaryVertexTracks();
+
+ // plot histograms
+
+ if( fPlotHistograms ){
+ if( vPrim && vPrim->GetNContributors()>=3 ){
+ fHistPrimVertexXY->Fill( vPrim->GetX(),vPrim->GetY() );
+ fHistPrimVertexZX->Fill( vPrim->GetZ(),vPrim->GetX() );
+ fHistPrimVertexZY->Fill( vPrim->GetZ(),vPrim->GetY() );
+ }
+ if( fHistPrimVertexXY ) PushBack( (TObject*) fHistPrimVertexXY, kAliHLTDataTypeHistogram,0);
+ if( fHistPrimVertexZX ) PushBack( (TObject*) fHistPrimVertexZX, kAliHLTDataTypeHistogram,0);
+ if( fHistPrimVertexZY ) PushBack( (TObject*) fHistPrimVertexZY, kAliHLTDataTypeHistogram,0);
+ }
+
+ PushBack( (TObject*) event, kAliHLTDataTypeESDObject, 0);
+ }
+
+ return 0;
+}
+
+int AliHLTGlobalVertexerComponent::Configure(const char* arguments)
+{
+
+ int iResult=0;
+ if (!arguments) return iResult;
+
+ TString allArgs=arguments;
+ TString argument;
+
+ TObjArray* pTokens=allArgs.Tokenize(" ");
+ int bMissingParam=0;
+
+ if (pTokens) {
+ for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
+ argument=((TObjString*)pTokens->At(i))->GetString();
+ if (argument.IsNull()) continue;
+
+ if (argument.CompareTo("-fitTracksToVertex")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("fitTracksToVertex is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fFillVtxConstrainedTracks=((TObjString*)pTokens->At(i))->GetString().Atoi();
+ continue;
+ }
+ else if (argument.CompareTo("-plotHistograms")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("plotHistograms is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fPlotHistograms=((TObjString*)pTokens->At(i))->GetString().Atoi();
+ continue;
+ }
+ else if (argument.CompareTo("-fillVtxConstrainedTracks")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("Filling of vertex constrained tracks is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fFillVtxConstrainedTracks=((TObjString*)pTokens->At(i))->GetString().Atoi();
+ continue;
+ }
+ else if (argument.CompareTo("-constrainedTrackDeviation")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("constrainedTrackDeviation is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fConstrainedTrackDeviation=((TObjString*)pTokens->At(i))->GetString().Atof();
+ continue;
+ }
+ else if (argument.CompareTo("-v0DaughterPrimDeviation")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("v0DaughterPrimDeviation is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fV0DaughterPrimDeviation=((TObjString*)pTokens->At(i))->GetString().Atof();
+ continue;
+ }
+ else if (argument.CompareTo("-v0PrimDeviation")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("v0PrimDeviation is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fV0PrimDeviation=((TObjString*)pTokens->At(i))->GetString().Atof();
+ continue;
+ }
+ else if (argument.CompareTo("-v0Chi")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("v0Chi is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fV0Chi=((TObjString*)pTokens->At(i))->GetString().Atof();
+ continue;
+ }
+ else if (argument.CompareTo("-v0DecayLengthInSigmas")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("v0DecayLengthInSigmas is set set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fV0DecayLengthInSigmas=((TObjString*)pTokens->At(i))->GetString().Atof();
+ continue;
+ }
+ else {
+ HLTError("unknown argument %s", argument.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ }
+ delete pTokens;
+ }
+ if (bMissingParam) {
+ HLTError("missing parameter for argument %s", argument.Data());
+ iResult=-EINVAL;
+ }
+
+ return iResult;
+}
+
+int AliHLTGlobalVertexerComponent::Reconfigure(const char* cdbEntry, const char* chainId)
+{
+ // see header file for class documentation
+ int iResult=0;
+ const char* path="HLT/ConfigTPC/KryptonHistoComponent";
+ const char* defaultNotify="";
+ if (cdbEntry) {
+ path=cdbEntry;
+ defaultNotify=" (default)";
+ }
+ if (path) {
+ HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
+ AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
+ if (pEntry) {
+ TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
+ if (pString) {
+ HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
+ iResult=Configure(pString->GetString().Data());
+ } else {
+ HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
+ }
+ } else {
+ HLTError("can not fetch object \"%s\" from CDB", path);
+ }
+ }
+
+ return iResult;
+}
+
+
+
+void AliHLTGlobalVertexerComponent::SetESD( AliESDEvent *event )
+{
+ //* Fill fTrackInfo array
+
+ delete[] fTrackInfos;
+ fESD = event;
+
+ AliKFParticle::SetField( fESD->GetMagneticField() );
+
+ Int_t nESDTracks=event->GetNumberOfTracks();
+ fTrackInfos = new AliESDTrackInfo[ nESDTracks ];
+
+ for (Int_t iTr=0; iTr<nESDTracks; iTr++){
+
+ AliESDTrackInfo &info = fTrackInfos[iTr];
+ info.fOK = 0;
+ info.fPrimUsedFlag = 0;
+
+ //* track quality check
+
+ AliESDtrack *pTrack = event->GetTrack(iTr);
+ if( !pTrack ) continue;
+ if (pTrack->GetKinkIndex(0)>0) continue;
+ if ( !( pTrack->GetStatus()&AliESDtrack::kTPCin ) ) continue;
+
+ //* Construct KFParticle for the track
+
+ info.fParticle = AliKFParticle( *pTrack->GetInnerParam(), 211 );
+ info.fOK = 1;
+ }
+}
+
+
+void AliHLTGlobalVertexerComponent::FindPrimaryVertex( )
+{
+ //* Find event primary vertex
+
+ int nTracks = fESD->GetNumberOfTracks();
+
+ const AliKFParticle **vSelected = new const AliKFParticle*[nTracks]; //* Selected particles for vertex fit
+ Int_t *vIndex = new int [nTracks]; //* Indices of selected particles
+ Bool_t *vFlag = new bool [nTracks]; //* Flags returned by the vertex finder
+
+ fPrimaryVtx.Initialize();
+ fPrimaryVtx.SetBeamConstraint(fESD->GetDiamondX(),fESD->GetDiamondY(),0,
+ TMath::Sqrt(fESD->GetSigma2DiamondX()),TMath::Sqrt(fESD->GetSigma2DiamondY()),5.3);
+
+ Int_t nSelected = 0;
+ for( Int_t i = 0; i<nTracks; i++){
+ if(!fTrackInfos[i].fOK ) continue;
+ //if( fESD->GetTrack(i)->GetTPCNcls()<60 ) continue;
+ const AliKFParticle &p = fTrackInfos[i].fParticle;
+ Double_t chi = p.GetDeviationFromVertex( fPrimaryVtx );
+ if( chi > fConstrainedTrackDeviation ) continue;
+ vSelected[nSelected] = &(fTrackInfos[i].fParticle);
+ vIndex[nSelected] = i;
+ nSelected++;
+ }
+ fPrimaryVtx.ConstructPrimaryVertex( vSelected, nSelected, vFlag, fConstrainedTrackDeviation );
+ for( Int_t i = 0; i<nSelected; i++){
+ if( vFlag[i] ) fTrackInfos[vIndex[i]].fPrimUsedFlag = 1;
+ }
+
+ for( Int_t i = 0; i<nTracks; i++ ){
+ AliESDTrackInfo &info = fTrackInfos[i];
+ info.fPrimDeviation = info.fParticle.GetDeviationFromVertex( fPrimaryVtx );
+ }
+
+ if( fPrimaryVtx.GetNContributors()>=3 ){
+ AliESDVertex vESD( fPrimaryVtx.Parameters(), fPrimaryVtx.CovarianceMatrix(), fPrimaryVtx.GetChi2(), fPrimaryVtx.GetNContributors() );
+ fESD->SetPrimaryVertexTracks( &vESD );
+
+ // relate the tracks to vertex
+
+ if( fFillVtxConstrainedTracks ){
+ for( Int_t i = 0; i<nTracks; i++ ){
+ if( !fTrackInfos[i].fPrimUsedFlag ) continue;
+ if( fTrackInfos[i].fPrimDeviation > fConstrainedTrackDeviation ) continue;
+ fESD->GetTrack(i)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
+ }
+ }
+
+ } else {
+ for( Int_t i = 0; i<nTracks; i++)
+ fTrackInfos[i].fPrimUsedFlag = 0;
+ }
+
+
+ delete[] vSelected;
+ delete[] vIndex;
+ delete[] vFlag;
+}
+
+
+void AliHLTGlobalVertexerComponent::FindV0s( )
+{
+ //* V0 finder
+
+ int nTracks = fESD->GetNumberOfTracks();
+ //AliKFVertex primVtx( *fESD->GetPrimaryVertexTracks() );
+ AliKFVertex &primVtx = fPrimaryVtx;
+ if( primVtx.GetNContributors()<3 ) return;
+
+ bool *constrainedV0 = new bool[nTracks];
+ for( Int_t iTr = 0; iTr<nTracks; iTr++ ){
+ constrainedV0[iTr] = 0;
+ }
+
+
+ for( Int_t iTr = 0; iTr<nTracks; iTr++ ){ //* first daughter
+
+ AliESDTrackInfo &info = fTrackInfos[iTr];
+ if( !info.fOK ) continue;
+ if( info.fParticle.GetQ() >0 ) continue;
+ if( info.fPrimDeviation < fV0DaughterPrimDeviation ) continue;
+
+ for( Int_t jTr = 0; jTr<nTracks; jTr++ ){ //* second daughter
+
+ AliESDTrackInfo &jnfo = fTrackInfos[jTr];
+ if( !jnfo.fOK ) continue;
+ if( jnfo.fParticle.GetQ() < 0 ) continue;
+ if( jnfo.fPrimDeviation < fV0DaughterPrimDeviation ) continue;
+
+ //* construct V0 mother
+
+ AliKFParticle v0( info.fParticle, jnfo.fParticle );
+
+ //* check V0 Chi^2
+
+ if( v0.GetChi2()<0 || v0.GetChi2() > fV0Chi*fV0Chi*v0.GetNDF() ) continue;
+
+ //* subtruct daughters from primary vertex
+
+ AliKFVertex primVtxCopy = primVtx;
+
+ if( info.fPrimUsedFlag ){
+ if( primVtxCopy.GetNContributors()<=2 ) continue;
+ primVtxCopy -= info.fParticle;
+ }
+ if( jnfo.fPrimUsedFlag ){
+ if( primVtxCopy.GetNContributors()<=2 ) continue;
+ primVtxCopy -= jnfo.fParticle;
+ }
+ //* Check v0 Chi^2 deviation from primary vertex
+
+ if( v0.GetDeviationFromVertex( primVtxCopy ) > fV0PrimDeviation ) continue;
+
+ //* Add V0 to primary vertex to improve the primary vertex resolution
+
+ primVtxCopy += v0;
+
+ //* Set production vertex for V0
+
+ v0.SetProductionVertex( primVtxCopy );
+
+ //* Get V0 decay length with estimated error
+
+ Double_t length, sigmaLength;
+ if( v0.GetDecayLength( length, sigmaLength ) ) continue;
+
+ //* Reject V0 if it decays too close[sigma] to the primary vertex
+
+ if( length < fV0DecayLengthInSigmas*sigmaLength ) continue;
+
+ //* add ESD v0
+
+ AliESDv0 v0ESD( *fESD->GetTrack( iTr ), iTr, *fESD->GetTrack( jTr ), jTr );
+ fESD->AddV0( &v0ESD );
+
+ // relate the tracks to vertex
+
+ if( fFillVtxConstrainedTracks ){
+ if( constrainedV0[iTr] || constrainedV0[jTr]
+ || info.fPrimDeviation < fConstrainedTrackDeviation || jnfo.fPrimDeviation < fConstrainedTrackDeviation ) continue;
+ AliESDVertex vESD(v0.Parameters(), v0.CovarianceMatrix(), v0.GetChi2(), 2);
+ fESD->GetTrack(iTr)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
+ fESD->GetTrack(jTr)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
+ constrainedV0[iTr] = 1;
+ constrainedV0[jTr] = 1;
+ }
+ }
+ }
+ delete[] constrainedV0;
+}
+
--- /dev/null
+#ifndef ALIHLTGLOBALVERTEXERCOMPONENT_H
+#define ALIHLTGLOBALVERTEXEROMPONENT_H
+//* This file is property of and copyright by the ALICE HLT Project *
+//* ALICE Experiment at CERN, All rights reserved. *
+//* See cxx source for full Copyright notice *
+
+/** @file AliHLTGlobalVertexerComponent.h
+ @author Sergey Gorbunov
+ @brief Component for monitor V0 physics
+*/
+
+#include "AliHLTProcessor.h"
+#include "AliKFParticle.h"
+#include "AliKFVertex.h"
+class TH1F;
+class TH2F;
+class AliESDtrack;
+class AliESDVertex;
+class AliTracker;
+class AliESDtrack;
+class AliESDEvent;
+
+/**
+ * @class AliHLTTPCGlobalVertexerComponent
+ * Component for reconstruct primary vertex and V0's
+ */
+class AliHLTGlobalVertexerComponent : public AliHLTProcessor
+{
+public:
+ /** default constructor */
+ AliHLTGlobalVertexerComponent();
+ /** destructor */
+ virtual ~AliHLTGlobalVertexerComponent();
+
+ // Public functions to implement AliHLTComponent's interface.
+ // These functions are required for the registration process
+
+ /** interface function, see AliHLTComponent for description */
+ const char* GetComponentID();
+ /** interface function, see AliHLTComponent for description */
+ void GetInputDataTypes(AliHLTComponentDataTypeList& list);
+ /** interface function, see AliHLTComponent for description */
+ AliHLTComponentDataType GetOutputDataType();
+ /** interface function, see AliHLTComponent for description */
+ int GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList);
+
+ /** interface function, see AliHLTComponent for description */
+ virtual void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
+ /** interface function, see AliHLTComponent for description */
+ AliHLTComponent* Spawn();
+
+protected:
+
+ // Protected functions to implement AliHLTComponent's interface.
+ // These functions provide initialization as well as the actual processing
+ // capabilities of the component.
+
+ /** interface function, see AliHLTComponent for description */
+ int DoInit( int argc, const char** argv );
+ /** interface function, see AliHLTComponent for description */
+ int DoDeinit();
+ /** interface function, see AliHLTComponent for description */
+ int DoEvent( const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& trigData );
+
+ int Reconfigure(const char* cdbEntry, const char* chainId);
+
+ using AliHLTProcessor::DoEvent;
+
+private:
+ /** copy constructor prohibited */
+ AliHLTGlobalVertexerComponent(const AliHLTGlobalVertexerComponent&);
+ /** assignment operator prohibited */
+ AliHLTGlobalVertexerComponent& operator=(const AliHLTGlobalVertexerComponent&);
+ /**
+ * Configure the component.
+ * Parse a string for the configuration arguments and set the component
+ * properties.
+ */
+ int Configure(const char* arguments);
+
+ class AliESDTrackInfo
+ {
+ public:
+ AliESDTrackInfo(): fParticle(),fPrimDeviation(0),fPrimUsedFlag(0),fOK(0){}
+
+ AliKFParticle fParticle; //* assigned KFParticle
+ Double_t fPrimDeviation; //* deviation from the primary vertex
+ Bool_t fPrimUsedFlag; //* flag shows that the particle was used for primary vertex fit
+ Bool_t fOK; //* is the track good enough
+ };
+ void SetESD( AliESDEvent *event );
+ void FindPrimaryVertex();
+ void FindV0s();
+
+
+ AliESDEvent *fESD; // pointer to esd event
+ AliESDTrackInfo *fTrackInfos; // information about esd tracks
+ AliKFVertex fPrimaryVtx; // reconstructed KF primary vertex
+
+ TH2F *fHistPrimVertexXY; // primary vertex distribution in XY;
+ TH2F *fHistPrimVertexZX; // primary vertex distribution in ZX;
+ TH2F *fHistPrimVertexZY; // primary vertex distribution in ZY;
+ Int_t fNEvents; // n of processed events
+
+ Bool_t fPlotHistograms;// flag to produce histogramms
+ Bool_t fFillVtxConstrainedTracks; // flag to store vertex constrained track parameters
+ Double_t fConstrainedTrackDeviation; // deviation of a track from prim.vtx <=cut
+ Double_t fV0DaughterPrimDeviation; // v0: daughters deviation from prim vertex >= cut
+ Double_t fV0PrimDeviation; // v0: v0 deviation from prim vertex <= cut
+ Double_t fV0Chi; // v0: v0 sqrt(chi^2/NDF) <= cut
+ Double_t fV0DecayLengthInSigmas; // v0: v0 decay length/sigma_length >= cut
+
+
+ ClassDef(AliHLTGlobalVertexerComponent, 0);
+
+};
+#endif
+++ /dev/null
-/**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * *
- * Author: The ALICE Off-line Project. *
- * Contributors are mentioned in the code where appropriate. *
- * *
- * Permission to use, copy, modify and distribute this software and its *
- * documentation strictly for non-commercial purposes is hereby granted *
- * without fee, provided that the above copyright notice appears in all *
- * copies and that both the copyright notice and this permission notice *
- * appear in the supporting documentation. The authors make no claims *
- * about the suitability of this software for any purpose. It is *
- * provided "as is" without express or implied warranty. *
- **************************************************************************/
-
-
-#include "AliHLTVertexer.h"
-#include "AliTracker.h"
-#include "TMath.h"
-#include "AliESDtrack.h"
-#include "AliESDv0.h"
-#include "AliESDVertex.h"
-#include "AliESDEvent.h"
-#include "AliKFParticle.h"
-#include "AliKFVertex.h"
-
-ClassImp(AliHLTVertexer)
-
-AliHLTVertexer::AliHLTVertexer():
- fESD(0),
- fTrackInfos(0),
- fPrimaryVtx(),
- fFillVtxConstrainedTracks(1)
-{
-}
-
-AliHLTVertexer::AliHLTVertexer(const AliHLTVertexer & ):
- fESD(0),
- fTrackInfos(0),
- fPrimaryVtx(),
- fFillVtxConstrainedTracks(1)
-{
-}
-
-void AliHLTVertexer::SetESD( AliESDEvent *event )
-{
- //* Fill fTrackInfo array
-
- delete[] fTrackInfos;
- fESD = event;
-
- AliKFParticle::SetField( fESD->GetMagneticField() );
-
- Int_t nESDTracks=event->GetNumberOfTracks();
- fTrackInfos = new AliESDTrackInfo[ nESDTracks ];
-
- for (Int_t iTr=0; iTr<nESDTracks; iTr++){
-
- AliESDTrackInfo &info = fTrackInfos[iTr];
- info.fOK = 0;
- info.fPrimUsedFlag = 0;
-
- //* track quality check
-
- AliESDtrack *pTrack = event->GetTrack(iTr);
- if( !pTrack ) continue;
- if (pTrack->GetKinkIndex(0)>0) continue;
- if ( !( pTrack->GetStatus()&AliESDtrack::kTPCin ) ) continue;
-
- //* Construct KFParticle for the track
-
- info.fParticle = AliKFParticle( *pTrack->GetInnerParam(), 211 );
- info.fOK = 1;
- }
-}
-
-void AliHLTVertexer::FindPrimaryVertex( )
-{
- //* Find event primary vertex
-
- int nTracks = fESD->GetNumberOfTracks();
-
- const AliKFParticle **vSelected = new const AliKFParticle*[nTracks]; //* Selected particles for vertex fit
- Int_t *vIndex = new int [nTracks]; //* Indices of selected particles
- Bool_t *vFlag = new bool [nTracks]; //* Flags returned by the vertex finder
-
- fPrimaryVtx.Initialize();
- fPrimaryVtx.SetBeamConstraint(fESD->GetDiamondX(),fESD->GetDiamondY(),0,
- TMath::Sqrt(fESD->GetSigma2DiamondX()),TMath::Sqrt(fESD->GetSigma2DiamondY()),5.3);
-
- Int_t nSelected = 0;
- for( Int_t i = 0; i<nTracks; i++){
- if(!fTrackInfos[i].fOK ) continue;
- //if( fESD->GetTrack(i)->GetTPCNcls()<60 ) continue;
- const AliKFParticle &p = fTrackInfos[i].fParticle;
- Double_t chi = p.GetDeviationFromVertex( fPrimaryVtx );
- if( chi > 3.5 ) continue;
- vSelected[nSelected] = &(fTrackInfos[i].fParticle);
- vIndex[nSelected] = i;
- nSelected++;
- }
- fPrimaryVtx.ConstructPrimaryVertex( vSelected, nSelected, vFlag, 3. );
- for( Int_t i = 0; i<nSelected; i++){
- if( vFlag[i] ) fTrackInfos[vIndex[i]].fPrimUsedFlag = 1;
- }
-
- if( fPrimaryVtx.GetNContributors()>3 ){
- AliESDVertex vESD( fPrimaryVtx.Parameters(), fPrimaryVtx.CovarianceMatrix(), fPrimaryVtx.GetChi2(), fPrimaryVtx.GetNContributors() );
- fESD->SetPrimaryVertexTracks( &vESD );
-
- // relate the tracks to vertex
-
- if( fFillVtxConstrainedTracks ){
- for( Int_t i = 0; i<nTracks; i++ ){
- if( !fTrackInfos[i].fPrimUsedFlag ) continue;
- fESD->GetTrack(i)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
- }
- }
-
- } else {
- for( Int_t i = 0; i<nTracks; i++)
- fTrackInfos[i].fPrimUsedFlag = 0;
- }
-
-
- delete[] vSelected;
- delete[] vIndex;
- delete[] vFlag;
-}
-
-void AliHLTVertexer::FindV0s( )
-{
- //* V0 finder
-
- int nTracks = fESD->GetNumberOfTracks();
- //AliKFVertex primVtx( *fESD->GetPrimaryVertexTracks() );
- AliKFVertex &primVtx = fPrimaryVtx;
- if( primVtx.GetNContributors()<3 ) return;
-
- bool *constrainedV0 = new bool[nTracks];
- for( Int_t iTr = 0; iTr<nTracks; iTr++ ){
- AliESDTrackInfo &info = fTrackInfos[iTr];
- info.fPrimDeviation = info.fParticle.GetDeviationFromVertex( primVtx );
- constrainedV0[iTr] = 0;
- }
-
-
- for( Int_t iTr = 0; iTr<nTracks; iTr++ ){ //* first daughter
-
- AliESDTrackInfo &info = fTrackInfos[iTr];
- if( !info.fOK ) continue;
- if( info.fParticle.GetQ() >0 ) continue;
- if( info.fPrimDeviation <2.5 ) continue;
-
- for( Int_t jTr = 0; jTr<nTracks; jTr++ ){ //* second daughter
-
- AliESDTrackInfo &jnfo = fTrackInfos[jTr];
- if( !jnfo.fOK ) continue;
- if( jnfo.fParticle.GetQ() < 0 ) continue;
- if( jnfo.fPrimDeviation <2.5 ) continue;
-
- //* construct V0 mother
-
- AliKFParticle v0( info.fParticle, jnfo.fParticle );
-
- //* check V0 Chi^2
-
- if( v0.GetChi2()<0 || v0.GetChi2() > 9.*v0.GetNDF() ) continue;
-
- //* subtruct daughters from primary vertex
-
- AliKFVertex primVtxCopy = primVtx;
-
- if( info.fPrimUsedFlag ){
- if( primVtxCopy.GetNContributors()<=2 ) continue;
- primVtxCopy -= info.fParticle;
- }
- if( jnfo.fPrimUsedFlag ){
- if( primVtxCopy.GetNContributors()<=2 ) continue;
- primVtxCopy -= jnfo.fParticle;
- }
- //* Check v0 Chi^2 deviation from primary vertex
-
- if( v0.GetDeviationFromVertex( primVtxCopy ) >3. ) continue;
-
- //* Add V0 to primary vertex to improve the primary vertex resolution
-
- primVtxCopy += v0;
-
- //* Set production vertex for V0
-
- v0.SetProductionVertex( primVtxCopy );
-
- //* Check chi^2 for a case
-
- if( v0.GetChi2()<0 || v0.GetChi2()> 9.*v0.GetNDF() ) continue;
-
- //* Get V0 decay length with estimated error
-
- Double_t length, sigmaLength;
- if( v0.GetDecayLength( length, sigmaLength ) ) continue;
-
- //* Reject V0 if it decays too close[sigma] to the primary vertex
-
- if( length <3.5*sigmaLength ) continue;
-
- //* add ESD v0
-
- AliESDv0 v0ESD( *fESD->GetTrack( iTr ), iTr, *fESD->GetTrack( jTr ), jTr );
- fESD->AddV0( &v0ESD );
-
- // relate the tracks to vertex
-
- if( fFillVtxConstrainedTracks ){
- if( constrainedV0[iTr] || constrainedV0[jTr]
- || info.fPrimDeviation < 4. || jnfo.fPrimDeviation <4. ) continue;
- AliESDVertex vESD(v0.Parameters(), v0.CovarianceMatrix(), v0.GetChi2(), 2);
- fESD->GetTrack(iTr)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
- fESD->GetTrack(jTr)->RelateToVertex( &vESD, fESD->GetMagneticField(),100. );
- constrainedV0[iTr] = 1;
- constrainedV0[jTr] = 1;
- }
- }
- }
- delete[] constrainedV0;
-}
-