]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
corrected CDB and run number initialization for usage from external interface, AliHLT...
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 17 Jul 2008 14:24:44 +0000 (14:24 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 17 Jul 2008 14:24:44 +0000 (14:24 +0000)
HLT/BASE/AliHLTComponent.cxx
HLT/BASE/AliHLTComponent.h
HLT/BASE/AliHLTComponentHandler.cxx
HLT/BASE/AliHLTComponentHandler.h
HLT/BASE/AliHLTDataTypes.cxx
HLT/BASE/AliHLTDataTypes.h
HLT/BASE/AliHLT_C_Component_WrapperInterface.cxx
HLT/BASE/AliHLT_C_Component_WrapperInterface.h

index a42dfcd089bb4fa2d2252a702e628402f61c4108..6e8796a2fc77240dc623b71ec694bf8530ad6d26 100644 (file)
@@ -105,6 +105,10 @@ AliHLTComponent::~AliHLTComponent()
     }
     element++;
   }
+  if (fpRunDesc) {
+    delete fpRunDesc;
+    fpRunDesc=NULL;
+  }
 }
 
 AliHLTComponentHandler* AliHLTComponent::fgpComponentHandler=NULL;
@@ -244,6 +248,30 @@ int AliHLTComponent::SetCDBRunNo(int runNo)
   return (*((AliHLTMiscSetCDBRunNo_t)fCDBSetRunNoFunc))(runNo);
 }
 
+int AliHLTComponent::SetRunDescription(const AliHLTRunDesc* desc, const char* /*runType*/)
+{
+  // see header file for function documentation
+  if (!desc) return -EINVAL;
+  if (desc->fStructSize!=sizeof(AliHLTRunDesc)) {
+    HLTError("invalid size of RunDesc struct (%ul)", desc->fStructSize);
+    return -EINVAL;
+  }
+
+  if (!fpRunDesc) {
+    fpRunDesc=new AliHLTRunDesc;
+    if (!fpRunDesc) return -ENOMEM;
+    *fpRunDesc=kAliHLTVoidRunDesc;
+  }
+
+  if (fpRunDesc->fRunNo!=kAliHLTVoidRunNo && fpRunDesc->fRunNo!=desc->fRunNo) {
+    HLTWarning("Run description has already been set");
+  }
+  *fpRunDesc=*desc;
+  SetCDBRunNo(fpRunDesc->fRunNo);
+  // TODO: we have to decide about the runType
+  return 0;
+}
+
 int AliHLTComponent::DoInit( int /*argc*/, const char** /*argv*/)
 {
   // default implementation, childs can overload
@@ -272,6 +300,21 @@ int AliHLTComponent::ReadPreprocessorValues(const char* /*modules*/)
   return 0;
 }
 
+int AliHLTComponent::StartOfRun()
+{
+  // default implementation, childs can overload
+  HLTLogKeyword("dummy");
+  return 0;
+}
+
+int AliHLTComponent::EndOfRun()
+{
+  // default implementation, childs can overload
+  HLTLogKeyword("dummy");
+  return 0;
+}
+
+
 int AliHLTComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& /*tgtList*/)
 {
   // default implementation, childs can overload
@@ -1141,9 +1184,18 @@ int AliHLTComponent::ProcessEvent( const AliHLTComponentEventData& evtData,
   outputBlockCnt=0;
   outputBlocks=NULL;
 
-  bool bSkipDataProcessing=false;
+  // data processing is skipped if there are only steering events
+  // in the block list. It is not skipped if there is no block list
+  // at all for the sake of data source components. Data processing
+  // is always skipped if the event is of type
+  // - gkAliEventTypeConfiguration
+  // - gkAliEventTypeReadPreprocessor
+  const unsigned int skipModeDefault=0x1;
+  const unsigned int skipModeForce=0x2;
+  unsigned int bSkipDataProcessing=skipModeDefault;
+
   // find special events
-  if (fpInputBlocks) {
+  if (fpInputBlocks && evtData.fBlockCnt>0) {
     // first look for all special events and execute in the appropriate
     // sequence afterwords
     AliHLTUInt32_t eventType=gkAliEventTypeUnknown;
@@ -1154,8 +1206,18 @@ int AliHLTComponent::ProcessEvent( const AliHLTComponentEventData& evtData,
     for (unsigned int i=0; i<evtData.fBlockCnt && iResult>=0; i++) {
       if (fpInputBlocks[i].fDataType==kAliHLTDataTypeSOR) {
        indexSOREvent=i;
+       // the AliHLTCalibrationProcessor relies on the SOR and EOR events
+       bSkipDataProcessing&=~skipModeDefault;
+      } else if (fpInputBlocks[i].fDataType==kAliHLTDataTypeRunType) {
+       // run type string
+       // handling is not clear yet
+       if (fpInputBlocks[i].fPtr) {
+         HLTDebug("got run type \"%s\"\n", fpInputBlocks[i].fPtr);
+       }
       } else if (fpInputBlocks[i].fDataType==kAliHLTDataTypeEOR) {
        indexEOREvent=i;
+       // the calibration processor relies on the SOR and EOR events
+       bSkipDataProcessing&=~skipModeDefault;
       } else if (fpInputBlocks[i].fDataType==kAliHLTDataTypeDDL) {
        // DDL list
        // this event is most likely deprecated
@@ -1165,24 +1227,34 @@ int AliHLTComponent::ProcessEvent( const AliHLTComponentEventData& evtData,
        indexUpdtDCSEvent=i;
       } else if (fpInputBlocks[i].fDataType==kAliHLTDataTypeEvent) {
        eventType=fpInputBlocks[i].fSpecification;
-       bSkipDataProcessing|=(fpInputBlocks[i].fSpecification==gkAliEventTypeConfiguration);
-       bSkipDataProcessing|=(fpInputBlocks[i].fSpecification==gkAliEventTypeReadPreprocessor);
+       if (fpInputBlocks[i].fSpecification==gkAliEventTypeConfiguration) bSkipDataProcessing|=skipModeForce;
+       if (fpInputBlocks[i].fSpecification==gkAliEventTypeReadPreprocessor) bSkipDataProcessing|=skipModeForce;
+      } else {
+       // the processing function is called if there is at least one
+       // non-steering data block. Steering blocks are not filtered out
+       // for sake of performance 
+       bSkipDataProcessing&=~skipModeDefault;
       }
     }
+
     if (indexSOREvent>=0) {
       // start of run
       if (fpRunDesc==NULL) {
        fpRunDesc=new AliHLTRunDesc;
-       if (fpRunDesc) {
-         if ((iResult=CopyStruct(fpRunDesc, sizeof(AliHLTRunDesc), indexSOREvent, "AliHLTRunDesc", "SOR"))>0) {
+      }
+      if (fpRunDesc) {
+       AliHLTRunDesc rundesc;
+       if ((iResult=CopyStruct(&rundesc, sizeof(AliHLTRunDesc), indexSOREvent, "AliHLTRunDesc", "SOR"))>0) {
+         if (fpRunDesc->fRunNo==kAliHLTVoidRunNo) {
+           *fpRunDesc=rundesc;
            HLTDebug("set run decriptor, run no %d", fpRunDesc->fRunNo);
            SetCDBRunNo(fpRunDesc->fRunNo);
+         } else if (fpRunDesc->fRunNo!=rundesc.fRunNo) {
+           HLTWarning("already set run properties run no %d, ignoring SOR with run no %d", fpRunDesc->fRunNo, rundesc.fRunNo);
          }
-       } else {
-         iResult=-ENOMEM;
        }
       } else {
-       HLTWarning("already received SOR event run no %d, ignoring SOR", fpRunDesc->fRunNo);
+       iResult=-ENOMEM;
       }
     }
     if (indexEOREvent>=0) {
@@ -1226,9 +1298,14 @@ int AliHLTComponent::ProcessEvent( const AliHLTComponentEventData& evtData,
        HLTWarning("preprocessor update of component %p (%s) failed with error code %d", this, GetComponentID(), tmpResult);
       }
     }
+  } else {
+    // processing function needs to be called if there are no input data
+    // blocks in order to make data source components working.
+    bSkipDataProcessing&=~skipModeDefault;
   }
   
   AliHLTComponentBlockDataList blockData;
+  if (iResult>=0 && !bSkipDataProcessing)
   { // dont delete, sets the scope for the stopwatch guard
     // do not use ALIHLTCOMPONENT_DA_STOPWATCH(); macro
     // in order to avoid 'shadowed variable' warning
@@ -1399,14 +1476,14 @@ int AliHLTComponent::SetStopwatches(TObjArray* pStopwatches)
 AliHLTUInt32_t AliHLTComponent::GetRunNo() const
 {
   // see header file for function documentation
-  if (fpRunDesc==NULL) return 0;
+  if (fpRunDesc==NULL) return kAliHLTVoidRunNo;
   return fpRunDesc->fRunNo;
 }
 
 AliHLTUInt32_t AliHLTComponent::GetRunType() const
 {
   // see header file for function documentation
-  if (fpRunDesc==NULL) return 0;
+  if (fpRunDesc==NULL) return kAliHLTVoidRunType;
   return fpRunDesc->fRunType;
 }
 
index b29115a748f4873b1b4ed0cc9328cd96c275a5b1..98a574b75c089d34c640c7636803d2c560aa4ce9 100644 (file)
@@ -1,11 +1,11 @@
 //-*- Mode: C++ -*-
-// @(#) $Id$
+// $Id$
 
 #ifndef ALIHLTCOMPONENT_H
 #define ALIHLTCOMPONENT_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                               */
+//* 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   AliHLTComponent.h
     @author Matthias Richter, Timm Steinbeck
     @brief  Base class declaration for HLT components. 
     @note   The class is both used in Online (PubSub) and Offline (AliRoot)
             context
+*/
 
-// see below for class documentation
-// or
-// refer to README to build package
-// or
-// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
-                                                                          */
 /**
  * @defgroup alihlt_component Component handling of the HLT module
- * This section describes the the component handling for the HLT module.
+ * This section describes the the component base classes and handling for
+ * the HLT module.
+ *
+ * @section alihlt_component_intro General remarks
+ * HLT analysis is organized in so called components. Each component can
+ * subscribe to the data produced by other components and can from the
+ * analysis publish new data for the subsequent components. Only the
+ * input data blocks and entries from CDB are available for the analysis. 
+ *
+ * @section alihlt_component_intro Component implementation
+ * AliHLTComponent provides the interface for all components, see there
+ * for details. Three types are provided:
+ * - AliHLTProcessor
+ * - AliHLTDataSource
+ * - AliHLTDataSink
+ *
+ * The two last represent data sinks and sources for the HLT integration
+ * into AliRoot. When running only, only the processors are relevant,
+ * sources and sinks are provided by the HLT PubSub framework. Please check
+ * AliHLTComponent for detailed description.
+ *
+ * @section alihlt_component_registration Component registration
+ * Components need to be registered with the AliHLTComponentHandler in
+ * order to be used with the system. Registration is purely done from the
+ * module library. Two methods are possible:
+ * - the module library implements an AliHLTModuleAgent and overloads the
+ *   AliHLTModuleAgent::RegisterComponents() function
+ * - in the implementation file, one object is defined. The global object is
+ *   automatically instantiated when the library is loaded for the first
+ *   time and the object is used for registration.
+ *
+ * In both cases, the library must be loaded via the method
+ * <pre>
+ *  AliHLTComponentHandler::LoadComponentLibraries()
+ * </pre>
+ * For the global object approach it is important that the library is
+ * not loaded elsewhere before (e.g. a gSystem->Load operation in your
+ * rootlogon.C).
+ *
+ *
  */
 
 #include <vector>
@@ -346,12 +380,26 @@ class AliHLTComponent : public AliHLTLogging {
    * The function must not be called when running in AliRoot unless it it
    * really wanted. The CDB path will be set to the specified path, which might
    * override the run no initialized at the beginning of the AliRoot reconstruction.
+   * InitCDB() has to be called before in order to really change the CDB settings.
    *
    * The method is used from the external interface in order to set the correct
    * path when running on-line.
    */
   int SetCDBRunNo(int runNo);
 
+  /**
+   * Set the run description.
+   * The run description is set before the call of Init() -> DoInit().
+   * @note: This functionality has been added in Juli 2008. The transmission of
+   * run properties by a special SOR (SOD event in DAQ terminalogy but this was
+   * changed after the HLT interface was designed) event is not sufficient because
+   * the data might be needed already in the DoInit handler of the component.
+   * @param desc    run descriptor, currently only the run no member is used
+   * @param runType originally, run type was supposed to be a number and part
+   *                of the run descriptor. But it was defined as string later
+   */
+  int SetRunDescription(const AliHLTRunDesc* desc, const char* runType);
+
   // Information member functions for registration.
 
   /**
@@ -644,6 +692,36 @@ class AliHLTComponent : public AliHLTLogging {
    */
   virtual int ReadPreprocessorValues(const char* modules);
 
+  /**
+   * Custom handler for the SOR event.
+   * Is invoked from the base class if an SOR event is in the block list.
+   * The handler is called before the processing function. The processing
+   * function is skipped if there are no other data blocks available.
+   *
+   * The SOR event is generated by the PubSub framework in response to
+   * the DAQ start of data (SOD - has been renamed after HLT interface
+   * was designed). The SOD event consists of 3 blocks:
+   * - ::kAliHLTDataTypeEvent block: spec ::gkAliEventTypeStartOfRun
+   * - SOD block of type ::kAliHLTDataTypeSOR, payload: AliHLTRunDesc struct
+   * - run type block ::kAliHLTDataTypeRunType, payload: run type string 
+   *
+   * Run properties can be retrieved by getters like GetRunNo().
+   * @return neg. error code if failed
+   */
+  virtual int StartOfRun();
+
+  /**
+   * Custom handler for the EOR event.
+   * Is invoked from the base class if an EOR event is in the block list.
+   * The handler is called before the processing function. The processing
+   * function is skipped if there are no other data blocks available.
+   *
+   * See StartOfRun() for mor ecomments of the sequence of steering events.
+   *
+   * @return neg. error code if failed
+   */
+  virtual int EndOfRun();
+
   /**
    * General memory allocation method.
    * All memory which is going to be used 'outside' of the interface must
index 55d9ee6d0516a6f345fafbde524b2cd00c725680..c81318a0cb11c2059d72f28ce3b83f1b96ddba39 100644 (file)
@@ -55,7 +55,9 @@ AliHLTComponentHandler::AliHLTComponentHandler()
   fLibraryList(),
   fEnvironment(),
   fOwnedComponents(),
-  fLibraryMode(kDynamic)
+  fLibraryMode(kDynamic),
+  fRunDesc(kAliHLTVoidRunDesc),
+  fRunType(NULL)
 {
   // see header file for class documentation
   // or
@@ -74,7 +76,9 @@ AliHLTComponentHandler::AliHLTComponentHandler(AliHLTComponentEnvironment* pEnv)
   fLibraryList(),
   fEnvironment(),
   fOwnedComponents(),
-  fLibraryMode(kDynamic)
+  fLibraryMode(kDynamic),
+  fRunDesc(kAliHLTVoidRunDesc),
+  fRunType(NULL)
 {
   // see header file for class documentation
   if (pEnv) {
@@ -103,6 +107,8 @@ AliHLTComponentHandler::~AliHLTComponentHandler()
   // see header file for class documentation
   DeleteOwnedComponents();
   UnloadLibraries();
+  if (fRunType) delete [] fRunType;
+  fRunType=NULL;
 }
 
 AliHLTComponentHandler* AliHLTComponentHandler::fgpInstance=NULL;
@@ -213,7 +219,10 @@ int AliHLTComponentHandler::CreateComponent(const char* componentID, void* pEnvP
       component=pSample->Spawn();
       if (component) {
        HLTDebug("component \"%s\" created (%p)", componentID, component);
-       component->InitCDB(cdbPath, this);
+       if (cdbPath && cdbPath[0]!=0) {
+         component->InitCDB(cdbPath, this);
+         component->SetRunDescription(&fRunDesc, fRunType);
+       }
        if ((iResult=component->Init(&fEnvironment, pEnvParam, argc, argv))!=0) {
          HLTError("Initialization of component \"%s\" failed with error %d", componentID, iResult);
          delete component;
@@ -631,3 +640,23 @@ int AliHLTComponentHandler::DeleteOwnedComponents()
   }
   return iResult;
 }
+
+int AliHLTComponentHandler::SetRunDescription(const AliHLTRunDesc* desc, const char* runType)
+{
+  // see header file for class documentation
+  if (!desc) return -EINVAL;
+  if (desc->fStructSize!=sizeof(AliHLTRunDesc)) {
+    HLTError("invalid size of RunDesc struct (%ul)", desc->fStructSize);
+    return -EINVAL;
+  }
+
+  memcpy(&fRunDesc, desc, sizeof(AliHLTRunDesc));
+  if (runType) {
+    if (fRunType) delete [] fRunType;
+    fRunType=new char[sizeof(runType)+1];
+    if (fRunType) {
+      strcpy(fRunType, runType);
+    }
+  }
+  return 0;
+}
index a06839430088f6160b53dcf6e5cffc6b1df3070a..ee6fd0b5d69f3a37ad46289cb0e35f9ffceec590 100644 (file)
@@ -212,6 +212,18 @@ class AliHLTComponentHandler : public AliHLTLogging {
     return CreateComponent( componentID, pEnvParam, 0, NULL, component );
     }
 
+  /**
+   * Set the run description.
+   * The run description is set globally for all components. Each component
+   * is initialized from the global run description after creation and before
+   * call of AliHLTComponent::Init().
+   *
+   * @param desc    run descriptor, currently only the run no member is used
+   * @param runType originally, run type was supposed to be a number and part
+   *                of the run descriptor. But it was defined as string later
+   */
+  int SetRunDescription(const AliHLTRunDesc* desc, const char* runType);
+
   /**
    * Check if a registered component has output data, e.g. is of type
    * kSource or kProcessor (see @ref AliHLTComponent::TComponentType).
@@ -320,12 +332,17 @@ class AliHLTComponentHandler : public AliHLTLogging {
   /** library mode effects all loaded libraries until a new mode is set */
   TLibraryMode fLibraryMode;                                       // see above 
 
+  /** run descriptor */
+  AliHLTRunDesc fRunDesc;                                          //!transient 
+  /** run type string */
+  char* fRunType;                                                  //!transient 
+
   /** the global singleton */
   static AliHLTComponentHandler* fgpInstance;                      //!transient
   /** number of used instances of the global singleton */
   static int fgNofInstances;                                       //!transient 
 
-  ClassDef(AliHLTComponentHandler, 1);
+  ClassDef(AliHLTComponentHandler, 2);
 
 };
 #endif
index 5f446e342350013faa350d68e8aa0d2febf9206c..6ed8cff7421120602fcac76d275e4a9510f8c323 100644 (file)
@@ -63,6 +63,13 @@ const AliHLTComponentDataType kAliHLTDataTypeEOR  =  (AliHLTComponentDataType) {
   kAliHLTDataOriginAny
 }|kAliHLTDataOriginPrivate;
 
+/** run type data block */
+const AliHLTComponentDataType kAliHLTDataTypeRunType  =  (AliHLTComponentDataType) {
+  sizeof(AliHLTComponentDataType),
+  kAliHLTRunTypeDataTypeID,
+  kAliHLTDataOriginAny
+}|kAliHLTDataOriginPrivate;
+
 /** Event type specification */
 const AliHLTComponentDataType kAliHLTDataTypeEvent  =  (AliHLTComponentDataType) {
   sizeof(AliHLTComponentDataType),
index 299f4f189c7cb3a5478f2cb0862e47c0c990cefe..b706a5df95e605d2decbcfbc99ab72975ac60595 100644 (file)
@@ -33,6 +33,7 @@
  *   6       Common data types for TreeD and TreeR defined
  *           kAliHLTAllDataTypes and kAliHLTDataOriginSample added
  *           kAliHLTDataOriginEMCAL added
+ *           kAliHLTDataTypeRunType added
  */
 #define ALIHLT_DATA_TYPES_VERSION 6
 
@@ -162,6 +163,12 @@ const int kAliHLTComponentDataTypefIDsize=8;
  */
 # define kAliHLTEORDataTypeID      {'E','N','D','O','F','R','U','N'}
 
+/** run type data block
+ * string with run type as payload
+ * @ingroup alihlt_component_datatypes
+ */
+# define kAliHLTRunTypeDataTypeID  {'R','U','N','T','Y','P','E',' '}
+
 /** DDL list event 
  * @ref AliHLTEventDDL
  * @ingroup alihlt_component_datatypes
@@ -448,7 +455,13 @@ extern "C" {
   /**
    * @struct AliHLTRunDesc
    * Event descriptor.
-   * The struct is send with the SOR and EOR events.
+   * The struct is sent with the SOR and EOR events.
+   *
+   * @note
+   * Originally, run type was supposed to be a number and part
+   * of the run descriptor. But it was defined as string later.
+   * The string is passed as argument of the AliHLT_C_SetRunDescription
+   * interface function.
    */
   struct AliHLTRunDesc
   {
@@ -557,6 +570,21 @@ extern "C" {
    */
   const AliHLTUInt32_t kAliHLTVoidDataSpec = ~(AliHLTUInt32_t)0;
 
+  /** invalid run no
+   * @ingroup alihlt_component_datatypes
+   */
+  const AliHLTUInt32_t kAliHLTVoidRunNo = ~(AliHLTUInt32_t)0;
+
+  /** invalid run type
+   * @ingroup alihlt_component_datatypes
+   */
+  const AliHLTUInt32_t kAliHLTVoidRunType = ~(AliHLTUInt32_t)0;
+
+  /** invalid run descriptor
+   * @ingroup alihlt_component_datatypes
+   */
+  const AliHLTRunDesc kAliHLTVoidRunDesc={sizeof(AliHLTRunDesc), kAliHLTVoidRunNo, kAliHLTVoidRunType};
+
   /** invalid shared memory type */
   const AliHLTUInt32_t gkAliHLTComponentInvalidShmType = 0;
 
@@ -619,6 +647,11 @@ extern "C" {
    */
   extern const AliHLTComponentDataType kAliHLTDataTypeEOR;
 
+  /** Run type data block 
+   * @ingroup alihlt_component_datatypes
+   */
+  extern const AliHLTComponentDataType kAliHLTDataTypeRunType;
+
   /** Event type specification 
    * @ingroup alihlt_component_datatypes
    */
index 4101f4a004f88c51d222c5770d1fe1d4fdbe1194..ce4657a090e0a76be8a877debc8e527fdffbdc57 100644 (file)
@@ -34,7 +34,6 @@ using namespace std;
 
 static AliHLTComponentHandler *gComponentHandler_C = NULL;
 
-
 int AliHLT_C_Component_InitSystem( AliHLTComponentEnvironment* comenv )
 {
   if ( gComponentHandler_C )
@@ -107,6 +106,17 @@ void AliHLT_C_DestroyComponent( AliHLTComponentHandle handle )
   delete pComp;
 }
 
+int AliHLT_C_SetRunDescription(const AliHLTRunDesc* desc, const char* runType)
+{
+  if (!desc) return -EINVAL;
+  if (desc->fStructSize<sizeof(AliHLTUInt32_t)) return -EINVAL;
+  if (!gComponentHandler_C) return ENXIO;
+
+  AliHLTRunDesc internalDesc=kAliHLTVoidRunDesc;
+  memcpy(&internalDesc, desc, desc->fStructSize<sizeof(internalDesc)?desc->fStructSize:sizeof(internalDesc));
+  return gComponentHandler_C->SetRunDescription(&internalDesc, runType);
+}
+
 int AliHLT_C_ProcessEvent( AliHLTComponentHandle handle, const AliHLTComponentEventData* evtData, const AliHLTComponentBlockData* blocks, 
                            AliHLTComponentTriggerData* trigData, AliHLTUInt8_t* outputPtr,
                            AliHLTUInt32_t* size, AliHLTUInt32_t* outputBlockCnt, 
index 14448c69ea21588e07e6b2c3ab717b246f270d15..60ee2b77ec24a9c67de725e871d2109b45d47de1 100644 (file)
@@ -93,6 +93,12 @@ int AliHLT_C_CreateComponent( const char* componentType, void* environ_param, in
  */
 void AliHLT_C_DestroyComponent( AliHLTComponentHandle );
 
+/**
+ * 
+ * @ingroup alihlt_wrapper_interface
+ */
+int AliHLT_C_SetRunDescription(const AliHLTRunDesc* desc, const char* runType);
+
 /**
  * 
  * @ingroup alihlt_wrapper_interface