]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/global/AliHLTGlobalEsdConverterComponent.cxx
Add method as parameter output
[u/mrichter/AliRoot.git] / HLT / global / AliHLTGlobalEsdConverterComponent.cxx
index 9d055d82c19bcbd44b44c02774b55eb937d5f0f6..fc5cb03b6e74e0064d54e0b3636e89efe41bdd90 100644 (file)
@@ -38,6 +38,7 @@
 #include "AliESDEvent.h"
 #include "AliESDtrack.h"
 #include "AliESDMuonTrack.h"
+#include "AliESDMuonCluster.h"
 #include "AliCDBEntry.h"
 #include "AliCDBManager.h"
 #include "AliPID.h"
@@ -50,6 +51,7 @@
 #include "AliESDCaloCluster.h"
 #include "AliESDVZERO.h"
 #include "AliHLTGlobalVertexerComponent.h"
+#include "AliHLTVertexFinderBase.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTGlobalEsdConverterComponent)
@@ -89,7 +91,7 @@ int AliHLTGlobalEsdConverterComponent::Configure(const char* arguments)
   TObjArray* pTokens=allArgs.Tokenize(" ");
   if (pTokens) {
     for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
-      argument=((TObjString*)pTokens->At(i))->GetString();     
+      argument=((TObjString*)pTokens->At(i))->String();        
       if (argument.IsNull()) continue;
       
       if (argument.CompareTo("-solenoidBz")==0) {
@@ -128,8 +130,8 @@ int AliHLTGlobalEsdConverterComponent::Reconfigure(const char* cdbEntry, const c
     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());
+       HLTInfo("received configuration object string: \'%s\'", pString->String().Data());
+       iResult=Configure(pString->String().Data());
       } else {
        HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
       }
@@ -152,6 +154,9 @@ void AliHLTGlobalEsdConverterComponent::GetInputDataTypes(AliHLTComponentDataTyp
   list.push_back(kAliHLTDataTypeESDObject);
   list.push_back(kAliHLTDataTypeTObject);
   list.push_back(kAliHLTDataTypeGlobalVertexer);
+  list.push_back(kAliHLTDataTypeV0Finder); // array of track ids for V0s
+  list.push_back(kAliHLTDataTypeKFVertex); // KFVertex object from vertexer
+  list.push_back(kAliHLTDataTypePrimaryFinder); // array of track ids for prim vertex
   list.push_back(kAliHLTDataTypeESDContent);
 }
 
@@ -206,7 +211,7 @@ int AliHLTGlobalEsdConverterComponent::DoInit(int argc, const char** argv)
   TObjArray* pTokens=allArgs.Tokenize(" ");
   if (pTokens) {
     for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
-      argument=((TObjString*)pTokens->At(i))->GetString();     
+      argument=((TObjString*)pTokens->At(i))->String();        
       if (argument.IsNull()) continue;
 
       // -notree
@@ -218,7 +223,7 @@ int AliHLTGlobalEsdConverterComponent::DoInit(int argc, const char** argv)
        fWriteTree=1;
       } else if (argument.CompareTo("-solenoidBz")==0) {
        if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
-       HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+       HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->String().Data());
        HLTWarning("argument '-solenoidBz' is deprecated, solenoid field initiaized from CDB settings");
        continue;
       } else if (argument.Contains("-skipobject=")) {
@@ -251,7 +256,7 @@ int AliHLTGlobalEsdConverterComponent::DoInit(int argc, const char** argv)
          TIter next(pTokens);
          TObject* pObject=NULL;
          while ((pObject=next())!=NULL) {
-           id=((TObjString*)pObject)->GetString().Data();
+           id=((TObjString*)pObject)->String().Data();
            TObject* pObj=fESD->GetList()->FindObject(id);
            if (pObj) {
              HLTDebug("removing object %s", id);
@@ -356,6 +361,19 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
   int iResult=0;
   int iAddedDataBlocks=0;
 
+  // check if there is an ESD block in the input and copy its content first to the
+  // ESD
+  const TObject* pEsdObj = GetFirstInputObject(kAliHLTDataTypeESDObject, "AliESDEvent");
+  AliESDEvent* pInputESD=NULL;
+  if (pEsdObj) pInputESD=dynamic_cast<AliESDEvent*>(const_cast<TObject*>(pEsdObj));
+  if (pInputESD) {
+    pInputESD->GetStdContent();
+    *pESD=*pInputESD;
+  }
+  if (GetNextInputObject()!=NULL) {
+    HLTWarning("handling of multiple ESD input objects not implemented, skipping input");
+  }
+
   // Barrel tracking
   // tracks are based on the TPC tracks, and only updated from the ITS information
   // Sequence:
@@ -426,16 +444,18 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
   AliHLTFloat32_t *dEdxTPC = 0; 
   Int_t ndEdxTPC = 0;
   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypedEdx|kAliHLTDataOriginTPC);
-       pBlock!=NULL; pBlock=GetNextInputBlock()) {
+       pBlock!=NULL; pBlock=NULL/*GetNextInputBlock() there is only one block*/) {
     fBenchmark.AddInput(pBlock->fSize);
     dEdxTPC = reinterpret_cast<AliHLTFloat32_t*>( pBlock->fPtr );
     ndEdxTPC = pBlock->fSize / (3*sizeof(AliHLTFloat32_t));
-    break;
   }
 
   // 2) convert the TPC tracks to ESD tracks
   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeTrack|kAliHLTDataOriginTPC);
        pBlock!=NULL; pBlock=GetNextInputBlock()) {
+    if (pInputESD && pInputESD->GetNumberOfTracks()>0) {
+      HLTWarning("Tracks array already filled from the input esd block, additional filling from TPC tracks block might cause inconsistent content");
+    }
     fBenchmark.AddInput(pBlock->fSize);
     vector<AliHLTGlobalBarrelTrack> tracks;
     if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>=0) {
@@ -596,13 +616,41 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
   }
 
   // update with  vertices and vertex-fitted tracks
-
+  // output of the GlobalVertexerComponent
   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeGlobalVertexer);
        pBlock!=NULL; pBlock=GetNextInputBlock()) {
     fBenchmark.AddInput(pBlock->fSize);   
     AliHLTGlobalVertexerComponent::FillESD( pESD, reinterpret_cast<AliHLTGlobalVertexerComponent::AliHLTGlobalVertexerData* >(pBlock->fPtr) );
   }
 
+  // update with  vertices and vertex-fitted tracks
+  // output of PrimaryVertexer and V0Finder components
+  TObject* pBase = (TObject*)GetFirstInputObject(kAliHLTDataTypeKFVertex | kAliHLTDataOriginOut);
+  if (pBase) {
+    AliKFVertex* kfVertex = dynamic_cast<AliKFVertex *>(pBase);
+    if (kfVertex) {
+      const AliHLTComponentBlockData* pP = GetFirstInputBlock(kAliHLTDataTypePrimaryFinder | kAliHLTDataOriginOut);
+      if (pP && pP->fSize && pP->fPtr) {
+       const AliHLTComponentBlockData* pV0 = GetFirstInputBlock(kAliHLTDataTypeV0Finder | kAliHLTDataOriginOut);
+       if (pV0 && pV0->fPtr && pInputESD && pInputESD->GetNumberOfV0s()>0) {
+         const int* v0s = static_cast<const int*>(pV0->fPtr);
+         HLTWarning("V0 array already filled from the input esd block, additional filling from V0 block of %d entries might cause inconsistent content", v0s[0]);
+       }
+       AliHLTVertexFinderBase::FillESD(pESD, kfVertex, pP->fPtr, pV0?pV0->fPtr:NULL);
+      } else
+       HLTWarning("Problem with primary finder's data block");
+    } else {
+      HLTWarning("primary vertex block of wrong type, expecting AliKFVertex instead of %s", pBase->GetName());
+    }
+  } else {
+    // throw an error if there is a V0 data block which can not be handled without
+    // the AliKFVertex object
+    if (GetFirstInputBlock(kAliHLTDataTypeV0Finder | kAliHLTDataOriginOut)!=NULL) {
+      ALIHLTERRORGUARD(1, "missing AliKFVertex object ignoring V0 data block of type %s",
+                      DataType2Text(kAliHLTDataTypeV0Finder|kAliHLTDataOriginOut).c_str());
+    }
+  }
+
   // Fill DCA parameters for TPC tracks
   // TODO 2010-07-12 this propagates also the TPC inner param to beamline
   // sounds not very reasonable
@@ -728,7 +776,7 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
     }
   }
 
-  // Add tracks from MUON.
+  // Add tracks and clusters from MUON.
   for( const AliHLTComponentBlockData *i= GetFirstInputBlock(kAliHLTAnyDataType | kAliHLTDataOriginMUON); i!=NULL; i=GetNextInputBlock() ){
     fBenchmark.AddInput(i->fSize);
   }
@@ -739,6 +787,7 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
       )
   {
     const TClonesArray* tracklist = NULL;
+    const TClonesArray* clusterlist = NULL;
     if (obj->IsA() == AliESDEvent::Class())
     {
       const AliESDEvent* event = static_cast<const AliESDEvent*>(obj);
@@ -746,31 +795,59 @@ int AliHLTGlobalEsdConverterComponent::ProcessBlocks(TTree* pTree, AliESDEvent*
       if (event->GetList() == NULL) continue;
       tracklist = dynamic_cast<const TClonesArray*>(event->GetList()->FindObject("MuonTracks"));
       if (tracklist == NULL) continue;
+      clusterlist = dynamic_cast<const TClonesArray*>(event->GetList()->FindObject("MuonClusters"));
+      if (clusterlist == NULL) continue;
     }
     else if (obj->IsA() == TClonesArray::Class())
     {
-      tracklist = static_cast<const TClonesArray*>(obj);
-      HLTDebug("Received a MUON TClonesArray of tracks with specification: 0x%X", GetSpecification(obj));
+      if (!strcmp(obj->GetName(), "MuonTracks")) {
+       tracklist = static_cast<const TClonesArray*>(obj);
+       HLTDebug("Received a MUON TClonesArray of tracks with specification: 0x%X", GetSpecification(obj));
+      } else {
+       clusterlist = static_cast<const TClonesArray*>(obj);
+       HLTDebug("Received a MUON TClonesArray of clusters with specification: 0x%X", GetSpecification(obj));
+      }
     }
     else
     {
       // Cannot handle this object type.
       continue;
     }
-    HLTDebug("Received %d MUON tracks.", tracklist->GetEntriesFast());
-    if (tracklist->GetEntriesFast() > 0)
-    {
-      const AliESDMuonTrack* track = dynamic_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(0));
-      if (track == NULL)
+    // copy tracks
+    if (tracklist) {
+      HLTDebug("Received %d MUON tracks.", tracklist->GetEntriesFast());
+      if (tracklist->GetEntriesFast() > 0)
       {
-        HLTError(Form("%s from MUON does not contain AliESDMuonTrack objects.", obj->ClassName()));
-        continue;
+       const AliESDMuonTrack* track = dynamic_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(0));
+       if (track == NULL)
+       {
+         HLTError(Form("%s from MUON does not contain AliESDMuonTrack objects.", obj->ClassName()));
+         continue;
+       }
+      }
+      for (Int_t i = 0; i < tracklist->GetEntriesFast(); ++i)
+      {
+       AliESDMuonTrack* track = pESD->NewMuonTrack();
+       *track = *(static_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(i)));
       }
     }
-    for (Int_t i = 0; i < tracklist->GetEntriesFast(); ++i)
-    {
-      const AliESDMuonTrack* track = static_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(i));
-      pESD->AddMuonTrack(track);
+    // copy clusters
+    if (clusterlist) {
+      HLTDebug("Received %d MUON clusters.", clusterlist->GetEntriesFast());
+      if (clusterlist->GetEntriesFast() > 0)
+      {
+       const AliESDMuonCluster* cluster = dynamic_cast<const AliESDMuonCluster*>(clusterlist->UncheckedAt(0));
+       if (cluster == NULL)
+       {
+         HLTError(Form("%s from MUON does not contain AliESDMuonCluster objects.", obj->ClassName()));
+         continue;
+       }
+      }
+      for (Int_t i = 0; i < clusterlist->GetEntriesFast(); ++i)
+      {
+       AliESDMuonCluster* cluster = pESD->NewMuonCluster();
+       *cluster = *(static_cast<const AliESDMuonCluster*>(clusterlist->UncheckedAt(i)));
+      }
     }
   }