- bugfix HLTOUT processing: handler execution for sub-collections
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 9 Jul 2008 06:31:18 +0000 (06:31 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 9 Jul 2008 06:31:18 +0000 (06:31 +0000)
- bugfix HLTOUT: selection and marking of data blocks was scrambled in
  presence of sub-collections
- added output of AliHLTRecontruction chains as sub-collection to HLTOUT
- improved robustness of HLTOUTTask (controlled reset)

HLT/BASE/AliHLTOUT.cxx
HLT/BASE/AliHLTOUT.h
HLT/BASE/AliHLTOUTHandlerChain.cxx
HLT/BASE/AliHLTOUTTask.cxx
HLT/BASE/AliHLTOUTTask.h
HLT/BASE/AliHLTSystem.cxx
HLT/BASE/AliHLTSystem.h

index 79a3053..4c8b000 100644 (file)
@@ -65,6 +65,13 @@ int AliHLTOUT::Init()
 {
   // see header file for class documentation
   int iResult=0;
+
+  // ignore if already initialized
+  if (fBlockDescList.size()>0) {
+    fLog.LoggingVarargs(kHLTLogWarning, "AliHLTOUT", "Init" , __FILE__ , __LINE__ , "instance %p already initialized, skipping ...", this);
+    return 0;
+  }
+
   SetStatusFlag(kCollecting);
   if ((iResult=GenerateIndex())>=0) {
     if ((iResult=InitHandlers())>=0) {
@@ -400,12 +407,8 @@ int AliHLTOUT::InvalidateBlocks(AliHLTOUTHandlerListEntryVector& list)
 const AliHLTOUT::AliHLTOUTHandlerListEntry& AliHLTOUT::FindHandlerDesc(AliHLTUInt32_t blockIndex)
 {
   // see header file for class documentation
-  AliHLTOUTHandlerListEntryVector::iterator element=fDataHandlers.begin();
-  while (element!=fDataHandlers.end()) {
-    if (element->HasIndex(blockIndex)) {
-      return *element;
-    }
-    element++;
+  if (blockIndex<fBlockDescList.size()) {
+    return fBlockDescList[blockIndex].GetHandlerDesc();
   }
   return const_cast<AliHLTOUT::AliHLTOUTHandlerListEntry&>(AliHLTOUT::AliHLTOUTHandlerListEntry::fgkVoidHandlerListEntry);
 }
@@ -655,7 +658,7 @@ int AliHLTOUT::SelectDataBlocks(const AliHLTOUTHandlerListEntry* pHandlerDesc)
   for (AliHLTOUTBlockDescriptorVector::iterator block=fBlockDescList.begin();
        block!=fBlockDescList.end();
        block++) {
-    if (pHandlerDesc->HasIndex(block->GetIndex()))
+    if (block->GetHandlerDesc()==*pHandlerDesc && pHandlerDesc->HasIndex(block->GetIndex()))
       block->Select(true);
     else
       block->Select(false);
@@ -709,7 +712,7 @@ int AliHLTOUT::MarkDataBlocksProcessed(const AliHLTOUTHandlerListEntry* pHandler
   for (AliHLTOUTBlockDescriptorVector::iterator block=fBlockDescList.begin();
        block!=fBlockDescList.end();
        block++) {
-    if (pHandlerDesc->HasIndex(block->GetIndex()))
+    if (block->GetHandlerDesc()==*pHandlerDesc && pHandlerDesc->HasIndex(block->GetIndex()))
       block->MarkProcessed();
   }
   
@@ -791,3 +794,18 @@ int AliHLTOUT::ResetInput()
   // default implementation, nothing to do
   return 0;
 }
+
+const AliHLTOUT::AliHLTOUTHandlerListEntry& AliHLTOUT::AliHLTOUTBlockDescriptor::GetHandlerDesc()
+{
+  // see header file for class documentation
+  if (fpCollection) {
+    AliHLTOUTHandlerListEntryVector::iterator element=fpCollection->fDataHandlers.begin();
+    while (element!=fpCollection->fDataHandlers.end()) {
+      if (element->HasIndex(GetIndex())) {
+       return *element;
+      }
+      element++;
+    }
+  }
+  return const_cast<AliHLTOUT::AliHLTOUTHandlerListEntry&>(AliHLTOUT::AliHLTOUTHandlerListEntry::fgkVoidHandlerListEntry);
+}
index 820dcf2..0dc1011 100644 (file)
@@ -170,6 +170,7 @@ class AliHLTOUT {
     kCDHFlagsHLTPayload=7 //! see above
   };
 
+  class AliHLTOUTHandlerListEntry;
   /**
    * Block descriptor.
    */
@@ -207,6 +208,11 @@ class AliHLTOUT {
       return -ENODEV;
     }
 
+    /**
+     * Get the handler descriptor
+     */
+    const AliHLTOUTHandlerListEntry& GetHandlerDesc();
+
   private:      
     /** data type of the block */
     AliHLTComponentDataType fDataType; //!transient
@@ -260,6 +266,7 @@ class AliHLTOUT {
     /**
      * Compare the handler descriptor of this list entry with another
      * descriptor.
+     * @return true if both handler and agent match
      */
     bool operator==(const AliHLTModuleAgent::AliHLTOUTHandlerDesc desc) const; 
 
index 1f88e73..954e2a2 100644 (file)
@@ -88,12 +88,13 @@ int AliHLTOUTHandlerChain::ProcessData(AliHLTOUT* pData)
     return iResult;
   }
 
-  if (fpSystem->CheckStatus(AliHLTSystem::kError)) {
+  if (fpSystem->CheckStatus(AliHLTSystem::kError) || !fpTask) {
     HLTWarning("kChain handler '%s': system in error state, skipping processing of associated HLTOUT blocks", fChains.Data());
     return -EACCES;
   }
 
   // run one event and do not stop the chain
+  fpTask->Reset();
   {
     AliHLTOUT::AliHLTOUTGlobalInstanceGuard g(pData);
     if ((iResult=fpSystem->Run(1,0))>=0) {
index 6c2a701..b7e33ef 100644 (file)
@@ -148,6 +148,13 @@ int AliHLTOUTTask::ResetInput()
 {
   // see header file for class documentation
   int iResult=0;
+  if (!fpDataBuffer) return 0;
+
+  if (fBlockDescList.size()==0 && fpDataBuffer->GetNofPendingConsumers()>0) {
+    // not yet subscribed
+    fpDataBuffer->Subscribe(fpDummyTask->GetComponent(), fBlockDescList);
+  }
+
   for (unsigned int i=0; i<fBlockDescList.size(); i++) {
     fpDataBuffer->Release(&(fBlockDescList[i]), fpDummyTask->GetComponent(), this);
   }
index adf98dd..2a64808 100644 (file)
@@ -21,6 +21,7 @@
  * order to be run at the end of a reconstruction chain and generation of
  * an HLTOUT sub-collection.
  * 
+ * The constructor takes the chains as a blank separated list of chain ids.
  */
 class AliHLTOUTTask : public AliHLTOUT, public AliHLTTask {
  public:
index a3c1a1d..032f406 100644 (file)
@@ -39,6 +39,7 @@ using namespace std;
 #include "AliHLTDataSource.h"
 #include "AliHLTOUT.h"
 #include "AliHLTOUTHandler.h"
+#include "AliHLTOUTTask.h"
 #include <TObjArray.h>
 #include <TObjString.h>
 #include <TStopwatch.h>
@@ -74,7 +75,8 @@ AliHLTSystem::AliHLTSystem(AliHLTComponentLogSeverity loglevel)
   fGoodEvents(-1),
   fpChainHandlers(NULL),
   fpEsdHandlers(NULL),
-  fpProprietaryHandlers(NULL)
+  fpProprietaryHandlers(NULL),
+  fpHLTOUTTask(NULL)
 {
   // see header file for class documentation
   // or
@@ -361,6 +363,13 @@ int AliHLTSystem::Run(Int_t iNofEvents, int bStop)
        ResumeBenchmarking(fStopwatches);    
       }
       for (int i=fEventCount; i<fEventCount+iNofEvents && iResult>=0; i++) {
+       if (fpHLTOUTTask) {
+         if (iNofEvents>1 && i==fEventCount) {
+           HLTWarning("can not add more than one event to the HLTOUT, skipping all but last block");
+         }
+         // reset and prepare for new data
+         fpHLTOUTTask->Reset();
+       }
        if ((iResult=ProcessTasks(i))>=0) {
          fGoodEvents++;
          iCount++;
@@ -742,6 +751,20 @@ int AliHLTSystem::ProcessHLTOUT(AliHLTOUT* pHLTOUT, AliESDEvent* esd)
   if (!pHLTOUT) return -EINVAL;
   HLTDebug("processing %d HLT data blocks", pHLTOUT->GetNofDataBlocks());
 
+  // add the current HLTOUT task to the collection
+  if (fpHLTOUTTask) {
+    AliHLTOUT* pTask=dynamic_cast<AliHLTOUT*>(fpHLTOUTTask);
+    if (pTask && (iResult=pTask->Init())>=0) {
+      if (pTask->GetNofDataBlocks()>0) {
+       pHLTOUT->AddSubCollection(pTask);
+      }
+    } else {
+      HLTWarning("can not initialize HLTOUT sub collection %s for reconstruction chain (%d), data blocks are lost", pTask?fpHLTOUTTask->GetName():"nil", iResult);
+      iResult=0;
+    }
+  }
+
+  
   //
   // process all kChain handlers first
   //
@@ -1192,10 +1215,12 @@ int AliHLTSystem::BuildTaskListsFromReconstructionChains(AliRawReader* rawReader
       AliHLTConfiguration* pConf=fpConfigurationHandler->FindConfiguration(pCID);
       if (pConf) {
        iResult=BuildTaskList(pConf);
-       if (runloader) {
+       if (true) { // condition was deprecated but kept for sake of svn diff
+         // bHaveOutput variable has to be set for both running modes
+         // AliHLTSimulation and AliHLTReconstruction
          assert(fpComponentHandler!=NULL);
          TString cid=pConf->GetComponentID();
-         if (cid.CompareTo("HLTOUT")==0) {
+         if (runloader!=NULL && cid.CompareTo("HLTOUT")==0) {
            // remove from the input of a global HLTOUT configuration
            chains.ReplaceAll(pCID, "");
          } else if (bHaveOutput==0) {
@@ -1229,6 +1254,33 @@ int AliHLTSystem::BuildTaskListsFromReconstructionChains(AliRawReader* rawReader
     }
   }
 
+  // build HLTOUT task for reconstruction
+  // Matthias 08.07.2008 the rawReader is never set when running embedded into
+  // AliReconstruction. The system is configured during AliHLTReconstructor::Init
+  // where the RawReader is not available. It is available in the first invocation
+  // of Reconstruct.
+  // 
+  // That means that policy is slightly changed:
+  // - if the run loader is available -> AliSimulation
+  // - no run loader available -> AliReconstruction
+  if (iResult>=0 && !runloader) {
+    if (bHaveOutput) {
+      // there are components in the chain which produce data which need to be
+      // piped to an HLTOUT sub-collection
+      if (!fpHLTOUTTask) {
+       fpHLTOUTTask=new AliHLTOUTTask(chains.Data());
+       if (fpHLTOUTTask) {
+         if (fpHLTOUTTask->GetConf() && fpHLTOUTTask->GetConf()->SourcesResolved()>=0) {
+           iResult=InsertTask(fpHLTOUTTask);
+         } else {
+           HLTError("HLTOUT task (%s) sources not resolved", fpHLTOUTTask->GetName());
+           iResult=-ENOENT;
+         }
+       }
+      }
+    }
+  }
+
   if (iResult>=0) SetStatusFlags(kTaskListCreated);
 
   return iResult;
index b3df41f..b64b7b9 100644 (file)
@@ -28,6 +28,7 @@ class AliHLTConfiguration;
 class AliHLTConfigurationHandler;
 class AliHLTTask;
 class AliHLTOUT;
+class AliHLTOUTTask;
 class AliRunLoader;
 class AliRawReader;
 class AliESDEvent;
@@ -471,7 +472,10 @@ class AliHLTSystem : public AliHLTLogging {
   /** active kProprietary handlers (AliHLTOUT::AliHLTOUTHandlerListEntryVector*) */
   void* fpProprietaryHandlers;                                     //!transient
 
-  ClassDef(AliHLTSystem, 8);
+  /** active HLTOUT task for the reconstruction */
+  AliHLTOUTTask* fpHLTOUTTask;                                     //!transient
+
+  ClassDef(AliHLTSystem, 10);
 };
 
 #endif