vertex finder moved from GlobalESDConverter to a separate component GlobalVertexer
authorsgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 30 Oct 2009 12:24:30 +0000 (12:24 +0000)
committersgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 30 Oct 2009 12:24:30 +0000 (12:24 +0000)
It has to be called after the ESD converter
The component produces primary vertex histograms

HLT/global/AliHLTGlobalAgent.cxx
HLT/global/AliHLTGlobalEsdConverterComponent.cxx
HLT/global/AliHLTGlobalEsdConverterComponent.h
HLT/global/AliHLTGlobalVertexerComponent.cxx [new file with mode: 0644]
HLT/global/AliHLTGlobalVertexerComponent.h [new file with mode: 0644]
HLT/global/AliHLTVertexer.cxx [deleted file]
HLT/global/AliHLTVertexer.h [deleted file]
HLT/global/physics/AliHLTV0HistoComponent.cxx
HLT/global/physics/AliHLTV0HistoComponent.h
HLT/libAliHLTGlobal.pkg

index 30b26c3..5cbc4b4 100644 (file)
@@ -31,6 +31,7 @@
 // header files of library components
 #include "AliHLTGlobalTrackMergerComponent.h"
 #include "AliHLTGlobalEsdConverterComponent.h"
+#include "AliHLTGlobalVertexerComponent.h"
 #include "AliHLTV0HistoComponent.h"
 
 /** global instance for agent registration */
@@ -62,6 +63,7 @@ int AliHLTGlobalAgent::RegisterComponents(AliHLTComponentHandler* pHandler) cons
   if (!pHandler) return -EINVAL;
   pHandler->AddComponent(new AliHLTGlobalTrackMergerComponent);
   pHandler->AddComponent(new AliHLTGlobalEsdConverterComponent);
+  pHandler->AddComponent(new AliHLTGlobalVertexerComponent);
   pHandler->AddComponent(new AliHLTV0HistoComponent );
   return 0;
 }
index 5f91720..2c259bf 100644 (file)
@@ -45,8 +45,6 @@
 #include "AliHLTCaloClusterDataStruct.h"
 #include "AliHLTCaloClusterReader.h"
 #include "AliESDCaloCluster.h"
-#include "AliHLTVertexer.h"
-//#include "AliTPCseed.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTGlobalEsdConverterComponent)
@@ -57,7 +55,6 @@ AliHLTGlobalEsdConverterComponent::AliHLTGlobalEsdConverterComponent()
   , fVerbosity(0)
   , fESD(NULL)
   , fSolenoidBz(-5.00668)
-  , fFillVtxConstrainedTracks( 0 )
 {
   // see header file for class documentation
   // or
@@ -94,12 +91,6 @@ int AliHLTGlobalEsdConverterComponent::Configure(const char* arguments)
        HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
        fSolenoidBz=((TObjString*)pTokens->At(i))->GetString().Atof();
        continue;
-      }
-      else if (argument.CompareTo("-fitTracksToVertex")==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 {
        HLTError("unknown argument %s", argument.Data());
        iResult=-EINVAL;
@@ -184,11 +175,6 @@ int AliHLTGlobalEsdConverterComponent::DoInit(int argc, const char** argv)
       // -tree
     } else if (argument.CompareTo("-tree")==0) {
       fWriteTree=1;
-    }else if (argument.CompareTo("-fitTracksToVertex")==0) {
-      if ((bMissingParam=(++i>=argc))) break;
-         argument = argv[i];
-         HLTInfo("Filling of vertex constrained tracks is set set to: %s", argument.Data());
-         fFillVtxConstrainedTracks=argument.Atoi();
     } else {
       HLTError("unknown argument %s", argument.Data());
       break;
@@ -451,14 +437,7 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
       iAddedDataBlocks++;
     }
       
-      // primary vertex & V0's 
-      
-      AliHLTVertexer vertexer;
-      vertexer.SetESD( pESD );
-      vertexer.SetFillVtxConstrainedTracks( fFillVtxConstrainedTracks );
-      vertexer.FindPrimaryVertex();
-      vertexer.FindV0s();
-      
+       
       if (iAddedDataBlocks>0 && pTree) {
        pTree->Fill();
       }
index 9a4b96b..415cdae 100644 (file)
@@ -102,9 +102,6 @@ protected:
   /// solenoid b field
   Double_t fSolenoidBz; //! transient
 
-  /// fill track parameters, constrained to vertex
-  Bool_t fFillVtxConstrainedTracks; //! transient
-
   ClassDef(AliHLTGlobalEsdConverterComponent, 0)
 };
 #endif
diff --git a/HLT/global/AliHLTGlobalVertexerComponent.cxx b/HLT/global/AliHLTGlobalVertexerComponent.cxx
new file mode 100644 (file)
index 0000000..4ae2a66
--- /dev/null
@@ -0,0 +1,539 @@
+//**************************************************************************
+//* 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;
+}
+
diff --git a/HLT/global/AliHLTGlobalVertexerComponent.h b/HLT/global/AliHLTGlobalVertexerComponent.h
new file mode 100644 (file)
index 0000000..6b157f9
--- /dev/null
@@ -0,0 +1,117 @@
+#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
diff --git a/HLT/global/AliHLTVertexer.cxx b/HLT/global/AliHLTVertexer.cxx
deleted file mode 100644 (file)
index 39042aa..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/**************************************************************************
- * 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;
-}
-
diff --git a/HLT/global/AliHLTVertexer.h b/HLT/global/AliHLTVertexer.h
deleted file mode 100644 (file)
index c15ecf3..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef ALIHLTVERTEXER_H
-#define ALIHLTVERTEXER_H
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */
-
-
-#include "AliKFParticle.h"
-#include "AliKFVertex.h"
-
-class AliESDtrack;
-class AliESDVertex;
-class AliTracker;
-class AliESDtrack;
-class AliESDEvent;
-
-class AliHLTVertexer
-{
-public:
-
-  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
-    };
-
-  AliHLTVertexer();
-  virtual ~AliHLTVertexer(){ delete[] fTrackInfos; }
-
-  void SetESD( AliESDEvent *event );
-  void FindPrimaryVertex();
-  void FindV0s();
-  void SetFillVtxConstrainedTracks( bool v ){ fFillVtxConstrainedTracks = v; }
-  const AliESDTrackInfo *TrackInfos(){ return fTrackInfos; }  
-
- private:
-  
-  AliHLTVertexer(const AliHLTVertexer &t);
-  AliHLTVertexer &operator = (const AliHLTVertexer & ){ return *this; }
-
-  AliESDEvent *fESD; // pointer to esd event
-  AliESDTrackInfo *fTrackInfos; // information about esd tracks
-  AliKFVertex fPrimaryVtx; // reconstructed KF primary vertex
-  bool fFillVtxConstrainedTracks; // flag to fill vtx constrained tracks to esd
-
-  ClassDef(AliHLTVertexer,0)   //HLT vertex finder
-};
-
-
-
-#endif
-
-
index e75bc6f..604980b 100644 (file)
@@ -53,6 +53,7 @@ AliHLTV0HistoComponent::AliHLTV0HistoComponent()
   fLambda(0),
   fAP(0),
   fGammaXY(0),
+  fNEvents(0),
   fNGammas(0),
   fNKShorts(0),
   fNLambdas(0)
@@ -136,6 +137,7 @@ int AliHLTV0HistoComponent::DoInit( int argc, const char** argv )
   fGammaXY->SetStats(0);
   fGammaXY->SetOption("COLZ");
 
+  fNEvents =0;
   fNGammas = 0;
   fNKShorts = 0;
   fNLambdas = 0;
@@ -173,6 +175,8 @@ int AliHLTV0HistoComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/,
   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 ) );
@@ -275,6 +279,7 @@ int AliHLTV0HistoComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/,
       if( t1->GetTPCNcls()>=60 && t2->GetTPCNcls()>=60 
          && dev1>=3. && dev2>=3. 
          && length>=4. 
+         && TMath::Abs( ap )>.4
          ){
        
        AliKFParticle kP, kpi;
@@ -310,7 +315,7 @@ int AliHLTV0HistoComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/,
     if( fGammaXY ) PushBack( (TObject*) fGammaXY, kAliHLTDataTypeHistogram,0);
   }  
   
-  HLTInfo("Found %d Gammas, %d KShorts and %d Lambdas total", fNGammas, fNKShorts, fNLambdas );
+  HLTInfo("Found %d Gammas, %d KShorts and %d Lambdas in %d events", fNGammas, fNKShorts, fNLambdas, fNEvents );
   
   return 0;
 }
@@ -332,16 +337,10 @@ int AliHLTV0HistoComponent::Configure(const char* arguments)
       if (argument.IsNull()) continue;
       
       if (argument.CompareTo("-plot-all")==0) {
-       HLTInfo("Ploting charge of all clusters");
-       //fPlotAll = kTRUE;
-       continue;
-      }
-      
-      else if (argument.CompareTo("-plot-trackclusters")==0) {
-       HLTInfo("Ploting charge of clusters used on a track");
-       //fPlotAll = kFALSE;
-       continue;
-      }
+      //HLTInfo("Ploting charge of all clusters");
+      //fPlotAll = kTRUE;
+      //continue;
+      }      
       else {
        HLTError("unknown argument %s", argument.Data());
        iResult=-EINVAL;
index 6c428b7..2113185 100644 (file)
@@ -73,6 +73,7 @@ private:
   TH1F *fLambda;   // Lambda inv. mass
   TH2F *fAP;       // Armenteros-Podolanski 
   TH2F *fGammaXY;  // XY distribution of gamma convertions
+  Int_t fNEvents; // n of processed events
   Int_t fNGammas; // n found total
   Int_t fNKShorts; // n found total
   Int_t fNLambdas; // n found total
index 524863f..b364d85 100644 (file)
@@ -5,7 +5,7 @@ CLASS_HDRS:=    AliHLTGlobalEsdConverterComponent.h \
                AliHLTGlobalTrackMergerComponent.h \
                AliHLTGlobalTrackMerger.h \
                AliHLTGlobalAgent.h \
-               AliHLTVertexer.h \
+               AliHLTGlobalVertexerComponent.h \
                physics/AliHLTV0HistoComponent.h
 
 #