]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/BASE/AliHLTOUT.h
- HLT simulation writes digit data in addition to raw data
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTOUT.h
index 23bc252bffdb6c3e3307593f2721f7d068462f79..2e923b6c3889af0120da982964cd656733b04bba 100644 (file)
@@ -19,6 +19,8 @@
 
 class AliHLTOUTHandler;
 class AliHLTOUTHandlerDesc; // AliHLTModuleAgent.h
+class AliESDEvent;
+class AliHLTReconstructor;
 
 #define AliHLTOUTInvalidIndex (~(AliHLTUInt32_t)0)
 
@@ -40,76 +42,6 @@ class AliHLTOUT : public AliHLTLogging {
   /** standard destructor */
   virtual ~AliHLTOUT();
 
-  /**
-   * Init for processing.
-   * The HLTOUT is scanned for all available data blocks and the
-   * AliHLTOUTHandler objects for the data blocks are created according
-   * to the module agents (see AliHLTModuleAgent).
-   */
-  int Init();
-
-  /**
-   * Get number of data blocks in the HLTOUT data
-   */
-  int GetNofDataBlocks();
-
-  /**
-   * Select the first data block of a certain data type and specification.
-   * The selection criteria can be of kAliHLTAnyDataType and/or
-   * kAliHLTVoidDataSpec in order to be ignored and just match any data block.
-   *
-   * The search criteria can be combined with a handler type (e.g. kRawReader)
-   * @param dt    [in]  data type to match                                <br>
-   * @param spec  [in]  data specification to match                       <br>
-   * @param handlerType [in]  type of the handler
-   * @return identifier >0 if success, 0 if no block found                <br>
-   *         neg. error code if failed                                    <br>
-   *                        -EPERM if access denied (object locked)
-   */
-  int SelectFirstDataBlock(AliHLTComponentDataType dt=kAliHLTAnyDataType,
-                          AliHLTUInt32_t spec=kAliHLTVoidDataSpec,
-                          AliHLTModuleAgent::AliHLTOUTHandlerType handlerType=AliHLTModuleAgent::kUnknownOutput);
-
-  /**
-   * Select the next data block of data type and specification of the previous
-   * call to @ref SelectFirstDataBlock.
-   * @return identifier >0 if success, 0 if no block found                <br>
-   *         neg. error code if failed                                    <br>
-   *                        -EPERM if access denied (object locked)
-   */
-  int SelectNextDataBlock();
-
-  /**
-   * Get properties of the selected data block.
-   * @param dt    [out] data type of the selected block
-   * @param spec  [out] data specification of the selected block
-   */
-  int GetDataBlockDescription(AliHLTComponentDataType& dt, AliHLTUInt32_t& spec);
-
-  /**
-   * Get the index of the current data block.
-   * @return index, AliHLTOUTInvalidIndex if no block selected
-   */
-  AliHLTUInt32_t GetDataBlockIndex();
-
-  /**
-   * Get buffer of the selected data block.
-   * @param pBuffer [out] buffer of the selected data block
-   * @param size    [out] size of the selected data block
-   */
-  int GetDataBuffer(const AliHLTUInt8_t* &pBuffer, AliHLTUInt32_t& size);
-
-  /**
-   * Release buffer after use.
-   * @param pBuffer [in]  buffer of the selected data block
-   */
-  int ReleaseDataBuffer(const AliHLTUInt8_t* pBuffer);
-
-  /**
-   * Get handler for the selected data block.
-   */
-  AliHLTOUTHandler* GetHandler();
-
   /**
    * Locking guard for the AliHLTOUT object.
    * If the object is locked, the selection of data blocks can not be changed.
@@ -199,6 +131,185 @@ class AliHLTOUT : public AliHLTLogging {
     AliHLTUInt32_t          fIndex; //!transient
   };
 
+  class AliHLTOUTHandlerListEntry {
+  public:
+    AliHLTOUTHandlerListEntry(AliHLTOUTHandler* pHandler, 
+                             AliHLTModuleAgent::AliHLTOUTHandlerDesc& handlerDesc,
+                             AliHLTModuleAgent* pAgent,
+                             AliHLTUInt32_t index);
+
+    /** copy constructor for vector handling */
+    AliHLTOUTHandlerListEntry(const AliHLTOUTHandlerListEntry& src);
+
+    /** assignment operator for vector handling */
+    AliHLTOUTHandlerListEntry& operator=(const AliHLTOUTHandlerListEntry& src);
+
+    ~AliHLTOUTHandlerListEntry();
+
+    static const AliHLTOUTHandlerListEntry fgkVoidHandlerListEntry; //! initializer
+
+    operator AliHLTOUTHandler*() const {return fpHandler;}
+
+    // please note that fpHandlerDesc is really a pointer and is created
+    // in the constructor. Thats why it is dereferenced here. The pointer
+    // type is on purpose, even though it is a bit confusing with the 
+    // argument by reference in the AliHLTOUTHandlerListEntry constructor.
+    operator const AliHLTModuleAgent::AliHLTOUTHandlerDesc&() const 
+    {return fpHandlerDesc?*fpHandlerDesc:AliHLTModuleAgent::fgkVoidHandlerDesc;}
+    operator AliHLTModuleAgent*() const {return fpAgent;}
+
+    /**
+     * Two list entries are considered to be equal if the handlers
+     * are equal.
+     */
+    bool operator==(const AliHLTOUTHandlerListEntry& entry) const;
+
+    bool operator==(const AliHLTModuleAgent::AliHLTOUTHandlerType handlerType) const;
+
+    AliHLTUInt32_t operator[](int i) const;
+
+    /**
+     * Add a block index to this descriptor.
+     * One descriptor can serve multiple blocks if the agent returns the
+     * same handler for all of the blocks. Instead of creating a new entry
+     * the block index ist just added
+     */
+    void AddIndex(AliHLTUInt32_t index);
+
+    /**
+     * Add all indexes of the descriptor.
+     */
+    void AddIndex(AliHLTOUTHandlerListEntry &desc);
+
+    /**
+     * Check if an index is served by this descriptor.
+     * @return true if the index is in the table
+     */
+    bool HasIndex(AliHLTUInt32_t index);
+
+  private:
+    /** standard constructor prohibited */
+    AliHLTOUTHandlerListEntry();
+
+    /** pointer to the handler */
+    AliHLTOUTHandler* fpHandler; //! transient
+
+    /** pointer to handler description */
+    AliHLTModuleAgent::AliHLTOUTHandlerDesc* fpHandlerDesc; //! transient
+
+    /** pointer to module agent */
+    AliHLTModuleAgent* fpAgent; //! transient
+
+    /** list of block indexes */
+    AliHLTOUTIndexList fBlocks; //!transient
+  };
+
+  typedef vector<AliHLTOUTHandlerListEntry> AliHLTOUTHandlerListEntryVector;
+  typedef vector<AliHLTOUTBlockDescriptor>  AliHLTOUTBlockDescriptorVector;
+
+  /**
+   * Init for processing.
+   * The HLTOUT is scanned for all available data blocks and the
+   * AliHLTOUTHandler objects for the data blocks are created according
+   * to the module agents (see AliHLTModuleAgent).
+   */
+  int Init();
+
+  /**
+   * Get number of data blocks in the HLTOUT data
+   */
+  int GetNofDataBlocks();
+
+  /**
+   * Select the first data block of a certain data type and specification.
+   * The selection criteria can be of kAliHLTAnyDataType and/or
+   * kAliHLTVoidDataSpec in order to be ignored and just match any data block.
+   *
+   * The search criteria can be combined with a handler type (e.g. kRawReader)
+   * @param dt    [in]  data type to match                                <br>
+   * @param spec  [in]  data specification to match                       <br>
+   * @param handlerType [in]  type of the handler
+   * @return identifier >0 if success, 0 if no block found                <br>
+   *         neg. error code if failed                                    <br>
+   *                        -EPERM if access denied (object locked)
+   */
+  int SelectFirstDataBlock(AliHLTComponentDataType dt=kAliHLTAnyDataType,
+                          AliHLTUInt32_t spec=kAliHLTVoidDataSpec,
+                          AliHLTModuleAgent::AliHLTOUTHandlerType handlerType=AliHLTModuleAgent::kUnknownOutput);
+
+  /**
+   * Select the next data block of data type and specification of the previous
+   * call to @ref SelectFirstDataBlock.
+   * @return identifier >0 if success, 0 if no block found                <br>
+   *         neg. error code if failed                                    <br>
+   *                        -EPERM if access denied (object locked)
+   */
+  int SelectNextDataBlock();
+
+  /**
+   * Get properties of the selected data block.
+   * @param dt    [out] data type of the selected block
+   * @param spec  [out] data specification of the selected block
+   */
+  int GetDataBlockDescription(AliHLTComponentDataType& dt, AliHLTUInt32_t& spec);
+
+  /**
+   * Get handler description of the current data block.
+   */
+  const AliHLTOUTHandlerListEntry& GetDataBlockHandlerDesc();
+
+  /**
+   * Get handler type of the selected data block.
+   * @return handler type for the selected data block
+   */
+  AliHLTModuleAgent::AliHLTOUTHandlerType GetDataBlockHandlerType();
+
+  /**
+   * Get the index of the current data block.
+   * @return index, AliHLTOUTInvalidIndex if no block selected
+   */
+  AliHLTUInt32_t GetDataBlockIndex();
+
+  /**
+   * Get buffer of the selected data block.
+   * @param pBuffer [out] buffer of the selected data block
+   * @param size    [out] size of the selected data block
+   */
+  int GetDataBuffer(const AliHLTUInt8_t* &pBuffer, AliHLTUInt32_t& size);
+
+  /**
+   * Release buffer after use.
+   * @param pBuffer [in]  buffer of the selected data block
+   */
+  int ReleaseDataBuffer(const AliHLTUInt8_t* pBuffer);
+
+  /**
+   * Get module agent for the selected data block.
+   */
+  AliHLTModuleAgent* GetAgent();
+
+  /**
+   * Get handler for the selected data block.
+   */
+  AliHLTOUTHandler* GetHandler();
+
+  /**
+   * Convert data buffer to ESD.
+   * The buffer is supposed to describe a streamed AliESDEvent object.
+   * If no target object is specified, the ESD is written to a file AliHLTdetESDs.root,
+   * where 'det' is derived from the data type origin. Each time the function is invoked
+   * a new event is created. Dummy events are added if the previous events did not contain
+   *
+   * The function needs AliRoot and might not be implemented by all AliHLTOUT
+   * implementations.
+   * a data block of this specification.
+   * @param pBuffer  [in] the data buffer
+   * @param size     [in] data buffer size
+   * @param dt       [in] data type of the block
+   * @param tgtesd   [out] optional target
+   */
+  virtual int WriteESD(const AliHLTUInt8_t* pBuffer, AliHLTUInt32_t size, AliHLTComponentDataType dt, AliESDEvent* tgtesd=NULL) const;
+
   enum AliHLTOUTByteOrder {
     /** no data block selected */
     kInvalidByteOrder=-1,
@@ -236,6 +347,17 @@ class AliHLTOUT : public AliHLTLogging {
    */
   static AliHLTUInt32_t ByteSwap32(AliHLTUInt32_t src);
 
+  /**
+   * Insert a handler item.
+   * The current list entries are checked if the handler is already in
+   * the list. It is added if not in the list, otherwise the block index
+   * is added to the existing entry.
+   * @param entry    handler list entry
+   * @return 0 if added, EEXIST (non negative!) if merged with existing entry <br>
+   *         neg. error code if failed
+   */
+  static int InsertHandler(AliHLTOUTHandlerListEntryVector& list, const AliHLTOUTHandlerListEntry &entry);
+  
  protected:
   /**
    * Add a block descriptor.
@@ -280,78 +402,6 @@ class AliHLTOUT : public AliHLTLogging {
     kAlignmentWarning = 0x20
   };
 
-  class AliHLTOUTHandlerListEntry {
-  public:
-    AliHLTOUTHandlerListEntry(AliHLTOUTHandler* pHandler, 
-                             AliHLTModuleAgent::AliHLTOUTHandlerDesc& handlerDesc,
-                             AliHLTModuleAgent* pAgent,
-                             AliHLTUInt32_t index);
-
-    /** copy constructor for vector handling */
-    AliHLTOUTHandlerListEntry(const AliHLTOUTHandlerListEntry& src);
-
-    /** assignment operator for vector handling */
-    AliHLTOUTHandlerListEntry& operator=(const AliHLTOUTHandlerListEntry& src);
-
-    ~AliHLTOUTHandlerListEntry();
-
-    static const AliHLTOUTHandlerListEntry fgkVoidHandlerListEntry; //! initializer
-
-    operator AliHLTOUTHandler*() const {return fpHandler;}
-
-    // please note that fpHandlerDesc is really a pointer and is created
-    // in the constructor. Thats why it is dereferenced here. The pointer
-    // type is on purpose, even though it is a bit confusing with the 
-    // argument by reference in the AliHLTOUTHandlerListEntry constructor.
-    operator AliHLTModuleAgent::AliHLTOUTHandlerDesc&() const {return *fpHandlerDesc;}
-    operator AliHLTModuleAgent*() const {return fpAgent;}
-
-    /**
-     * Two list entries are considered to be equal if the handlers
-     * are equal.
-     */
-    bool operator==(const AliHLTOUTHandlerListEntry& entry) const;
-
-    bool operator==(const AliHLTModuleAgent::AliHLTOUTHandlerType handlerType) const;
-
-    AliHLTUInt32_t operator[](int i) const;
-
-    /**
-     * Add a block index to this descriptor.
-     * One descriptor can serve multiple blocks if the agent returns the
-     * same handler for all of the blocks. Instead of creating a new entry
-     * the block index ist just added
-     */
-    void AddIndex(AliHLTUInt32_t index);
-
-    /**
-     * Add all indexes of the descriptor.
-     */
-    void AddIndex(AliHLTOUTHandlerListEntry &desc);
-
-    /**
-     * Check if an index is served by this descriptor.
-     * @return true if the index is in the table
-     */
-    bool HasIndex(AliHLTUInt32_t index);
-
-  private:
-    /** standard constructor prohibited */
-    AliHLTOUTHandlerListEntry();
-
-    /** pointer to the handler */
-    AliHLTOUTHandler* fpHandler; //! transient
-
-    /** pointer to handler description */
-    AliHLTModuleAgent::AliHLTOUTHandlerDesc* fpHandlerDesc; //! transient
-
-    /** pointer to module agent */
-    AliHLTModuleAgent* fpAgent; //! transient
-
-    /** list of block indexes */
-    AliHLTOUTIndexList fBlocks; //!transient
-  };
-  
   /**
    * Generate the index of the HLTOUT data.
    * Must be implemented by the child classes.
@@ -416,17 +466,6 @@ class AliHLTOUT : public AliHLTLogging {
    */
   int CheckStatusFlag(unsigned int flag) const {return (fFlags&flag)==flag;}
 
-  /**
-   * Insert a handler item.
-   * The current list entries are checked if the handler is already in
-   * the list. It is added if not in the list, otherwise the block index
-   * is added to the existing entry.
-   * @param entry    handler list entry
-   * @return 0 if added, EEXIST (non negative!) if merged with existing entry <br>
-   *         neg. error code if failed
-   */
-  int InsertHandler(const AliHLTOUTHandlerListEntry &entry);
-
   /**
    * Find handler description for a certain block index.
    */
@@ -444,9 +483,6 @@ class AliHLTOUT : public AliHLTLogging {
   /** instance flags: locked, collecting, ... */
   unsigned int fFlags; //!transient
 
-  typedef vector<AliHLTOUTHandlerListEntry> AliHLTOUTHandlerListEntryVector;
-  typedef vector<AliHLTOUTBlockDescriptor>  AliHLTOUTBlockDescriptorVector;
-
   /** list of block descriptors */
   AliHLTOUTBlockDescriptorVector fBlockDescList; //!transient