]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/BASE/AliHLTOUT.h
Cosmetics. Fixed bug preventing creation of async block list
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTOUT.h
index 00eb8ee39d85c5d99a9db4beb51328eb1bfc5f67..747cfbad0e6c15e5cfc71c6e9ebe2645b21a3cae 100644 (file)
@@ -21,6 +21,8 @@ class AliHLTOUTHandler;
 class AliHLTOUTHandlerDesc; // AliHLTModuleAgent.h
 class AliESDEvent;
 class AliHLTReconstructor;
+class AliRawReader;
+class TTree;
 
 #define AliHLTOUTInvalidIndex (~(AliHLTUInt32_t)0)
 
@@ -35,13 +37,50 @@ typedef vector<AliHLTUInt32_t> AliHLTOUTIndexList;
  * abstracts access to the complete HLTOUT data.
  * 
  */
-class AliHLTOUT : public AliHLTLogging {
+class AliHLTOUT {
  public:
   /** standard constructor */
   AliHLTOUT();
   /** standard destructor */
   virtual ~AliHLTOUT();
 
+  /**
+   * Create an AliHLTOUTRawReader instance.
+   * Helper function to transparently access classes from the
+   * libHLTrec library.
+   */
+  static AliHLTOUT* New(AliRawReader* pRawReader);
+
+  /**
+   * Create an AliHLTOUTDigitReader instance
+   * Helper function to transparently access classes from the
+   * libHLTrec library.
+   */
+  static AliHLTOUT* New(TTree* pDigitTree, int event=-1);
+
+  /**
+   * Create an AliHLTOUTDigitReader instance
+   * Helper function to transparently access classes from the
+   * libHLTrec library.
+   */
+  static AliHLTOUT* New(const char* filename, int event=-1);
+
+  /**
+   * Get the global instance.
+   * The global instance is set temporarily by the AliHLTOUTGlobalInstanceGuard
+   * mainly for the sake of data input to an analysis chain. The
+   * AliHLTOUTPublisherComponent objects can access the global instance.
+   */
+  static AliHLTOUT* GetGlobalInstance() {return fgGlobalInstance;}
+
+  /**
+   * Delete an instance of the HLTOUT.
+   * Helper function to transparently access classes from the
+   * libHLTrec library. Before deleting, the availability of the
+   * library is checked.
+   */
+  static void Delete(AliHLTOUT* pInstance);
+
   /**
    * Locking guard for the AliHLTOUT object.
    * If the object is locked, the selection of data blocks can not be changed.
@@ -67,6 +106,35 @@ class AliHLTOUT : public AliHLTLogging {
     AliHLTOUT* fpInstance; //!transient
   };
 
+  /**
+   * Guard for handling of global AliHLTOUT instance.
+   * The global HLTOUT instance can be set for certain steps of the
+   * processing. The initial objective is to support input to the
+   * AliHLTOUTPublisherComponent running in a kChain handler.
+   *
+   * The Guard restores the original instance when closed.
+   */
+  class AliHLTOUTGlobalInstanceGuard {
+  public:
+    /** constructor */
+    AliHLTOUTGlobalInstanceGuard(AliHLTOUT* pInstance) : fpLastInstance(AliHLTOUT::fgGlobalInstance)
+    {AliHLTOUT::fgGlobalInstance=pInstance;}
+    /** destructor */
+    ~AliHLTOUTGlobalInstanceGuard()
+    {AliHLTOUT::fgGlobalInstance=fpLastInstance;}
+
+  private:
+    /** standard constructor prohibited */
+    AliHLTOUTGlobalInstanceGuard();
+    /** copy constructor prohibited */
+    AliHLTOUTGlobalInstanceGuard(const AliHLTOUTGlobalInstanceGuard&);
+    /** assignment operator prohibited */
+    AliHLTOUTGlobalInstanceGuard& operator=(const AliHLTOUTGlobalInstanceGuard&);
+
+    /** the AliHLTOUT instance the guard is locking */
+    AliHLTOUT* fpLastInstance; //!transient
+  };
+
   /**
    * The HLT OUT Event Header.
    * Defined between HLT and DAQ.
@@ -109,28 +177,62 @@ class AliHLTOUT : public AliHLTLogging {
     kCDHFlagsHLTPayload=7 //! see above
   };
 
+  class AliHLTOUTHandlerListEntry;
   /**
    * Block descriptor.
    */
   class AliHLTOUTBlockDescriptor {
   public:
-    AliHLTOUTBlockDescriptor(AliHLTComponentDataType dt, AliHLTUInt32_t spec, AliHLTUInt32_t index)
-      : fDataType(dt), fSpecification(spec), fIndex(index) {};
+    AliHLTOUTBlockDescriptor(AliHLTComponentDataType dt, AliHLTUInt32_t spec, AliHLTUInt32_t index, AliHLTOUT* pCollection)
+      : fDataType(dt), fSpecification(spec), fIndex(index), fSelected(false), fProcessed(false), fpCollection(pCollection) {};
+    AliHLTOUTBlockDescriptor(const AliHLTOUTBlockDescriptor& src)
+      : fDataType(src.fDataType), fSpecification(src.fSpecification), fIndex(src.fIndex), fSelected(false), fProcessed(false), fpCollection(src.fpCollection) {}
+    AliHLTOUTBlockDescriptor& operator=(const AliHLTOUTBlockDescriptor& src)
+    { fDataType=src.fDataType; fSpecification=src.fSpecification; fIndex=src.fIndex; fSelected=false; fProcessed=false; fpCollection=src.fpCollection; return *this; }
     ~AliHLTOUTBlockDescriptor() {}
 
     operator AliHLTComponentDataType() const {return fDataType;}
     operator AliHLTUInt32_t() const {return fSpecification;}
     int operator==(AliHLTComponentDataType dt) const {return dt==fDataType;}
     int operator==(AliHLTUInt32_t spec) const {return spec==fSpecification;}
+    int operator==(AliHLTOUT* collection) const {return collection==fpCollection;}
 
     AliHLTUInt32_t GetIndex() const {return fIndex;}
-  private:
+    AliHLTOUT* GetCollection() const {return fpCollection;}
+
+    bool IsSelected() const {return fSelected;}
+    void Select(bool selected=true) {fSelected=selected;}
+    bool IsProcessed() const {return fProcessed;}
+    void MarkProcessed() {fProcessed=true;}
+
+    /**
+     * Get the data buffer
+     * @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) {
+      if (fpCollection) return fpCollection->GetDataBuffer(GetIndex(), pBuffer, size);
+      return -ENODEV;
+    }
+
+    /**
+     * Get the handler descriptor
+     */
+    const AliHLTOUTHandlerListEntry& GetHandlerDesc();
+
+  private:      
     /** data type of the block */
     AliHLTComponentDataType fDataType; //!transient
     /** data specification of the block */
     AliHLTUInt32_t          fSpecification; //!transient
     /** index in the data stream */
     AliHLTUInt32_t          fIndex; //!transient
+    /** selection flag */
+    bool                    fSelected; //!transient
+    /** processed flag */
+    bool                    fProcessed; //!transient
+    /** the collection */
+    AliHLTOUT*              fpCollection; //!transient
   };
 
   class AliHLTOUTHandlerListEntry {
@@ -168,6 +270,13 @@ class AliHLTOUT : public AliHLTLogging {
 
     bool operator==(const AliHLTModuleAgent::AliHLTOUTHandlerType handlerType) const;
 
+    /**
+     * 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; 
+
     AliHLTUInt32_t operator[](int i) const;
 
     /**
@@ -179,7 +288,7 @@ class AliHLTOUT : public AliHLTLogging {
     void AddIndex(AliHLTUInt32_t index);
 
     /**
-     * Add all indexes of the descriptor.
+     * Add all indices of the descriptor.
      */
     void AddIndex(AliHLTOUTHandlerListEntry &desc);
 
@@ -187,7 +296,17 @@ class AliHLTOUT : public AliHLTLogging {
      * Check if an index is served by this descriptor.
      * @return true if the index is in the table
      */
-    bool HasIndex(AliHLTUInt32_t index);
+    bool HasIndex(AliHLTUInt32_t index) const;
+
+    /**
+     * Invalidate all block indices
+     */
+    void InvalidateBlocks() {fBlocks.clear();}
+
+    /**
+     * Check whether the entry has valid blocks.
+     */
+    bool IsEmpty() {return fBlocks.size()==0;}
 
   private:
     /** standard constructor prohibited */
@@ -202,12 +321,41 @@ class AliHLTOUT : public AliHLTLogging {
     /** pointer to module agent */
     AliHLTModuleAgent* fpAgent; //! transient
 
-    /** list of block indexes */
+    /** list of block indices */
     AliHLTOUTIndexList fBlocks; //!transient
   };
 
   typedef vector<AliHLTOUTHandlerListEntry> AliHLTOUTHandlerListEntryVector;
   typedef vector<AliHLTOUTBlockDescriptor>  AliHLTOUTBlockDescriptorVector;
+  typedef vector<AliHLTOUT*>                AliHLTOUTPVector;
+
+  /**
+   * Selection guard for the AliHLTOUT object.
+   * If the object is locked, the selection of data blocks can not be changed.
+   */
+  class AliHLTOUTSelectionGuard {
+  public:
+    /** constructor */
+    AliHLTOUTSelectionGuard(AliHLTOUT* pInstance) : fpInstance(pInstance)
+    {if (fpInstance) fpInstance->SelectDataBlock();}
+    /** constructor */
+    AliHLTOUTSelectionGuard(AliHLTOUT* pInstance, const AliHLTOUTHandlerListEntry* pHandlerDesc) : fpInstance(pInstance)
+    {if (fpInstance) fpInstance->SelectDataBlocks(pHandlerDesc);}
+    /** destructor */
+    ~AliHLTOUTSelectionGuard()
+    {if (fpInstance) fpInstance->DisableBlockSelection();}
+
+  private:
+    /** standard constructor prohibited */
+    AliHLTOUTSelectionGuard();
+    /** copy constructor prohibited */
+    AliHLTOUTSelectionGuard(const AliHLTOUTSelectionGuard&);
+    /** assignment operator prohibited */
+    AliHLTOUTSelectionGuard& operator=(const AliHLTOUTSelectionGuard&);
+
+    /** the AliHLTOUT instance the guard is locking */
+    AliHLTOUT* fpInstance; //!transient
+  };
 
   /**
    * Init for processing.
@@ -217,6 +365,20 @@ class AliHLTOUT : public AliHLTLogging {
    */
   int Init();
 
+  /**
+   * Reset and clear all data block descriptors.
+   * @note Since sub-collections are only referred via the block
+   * descriptors, all information on sub-collections is also lost.
+   * Child classes should implement ResetInput in order to cleanup
+   * the input devices.
+   */
+  int Reset();
+
+  /**
+   * Get the current event id
+   */
+  AliHLTUInt64_t EventId() {return fCurrentEventId;}
+
   /**
    * Get number of data blocks in the HLTOUT data
    */
@@ -231,18 +393,20 @@ class AliHLTOUT : public AliHLTLogging {
    * @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>
+   * @param skipProcessed [in] skip all block marked processed
+   * @return block index: >= 0 if success, -ENOENT 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);
+                          AliHLTModuleAgent::AliHLTOUTHandlerType handlerType=AliHLTModuleAgent::kUnknownOutput,
+                          bool skipProcessed=true);
 
   /**
    * 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>
+   * @return block index: >= 0 if success, -ENOENT if no block found      <br>
    *         neg. error code if failed                                    <br>
    *                        -EPERM if access denied (object locked)
    */
@@ -285,6 +449,65 @@ class AliHLTOUT : public AliHLTLogging {
    */
   int ReleaseDataBuffer(const AliHLTUInt8_t* pBuffer);
 
+  /**
+   * Get a TObject from the data buffer
+   * @return TObject pointer if data block is a streamed object
+   */
+  TObject* GetDataObject();
+
+  /**
+   * Release data object
+   */
+  int ReleaseDataObject(TObject* pObject);
+
+  /**
+   * Add the current data block to the selection.
+   * Note: enables also the block selection
+   */
+  int SelectDataBlock();
+
+  /**
+   * Add the all data blocks of a certain handler to the selection.
+   * Note: enables also the block selection
+   */
+  int SelectDataBlocks(const AliHLTOUTHandlerListEntry* pHandlerDesc);
+
+  /**
+   * Enable the selection of data blocks.
+   */
+  int EnableBlockSelection();
+
+  /**
+   * Disable the selection of data blocks.
+   */
+  int DisableBlockSelection();
+
+  /**
+   * Reset the data block selection.
+   * Resets the selection list, none of the blocks is selected.
+   */
+  int ResetBlockSelection();
+
+  /**
+   * Mark the current block as processed.
+   */
+  int MarkDataBlockProcessed();
+
+  /**
+   * Mark all data blocks of a certain handler processed.
+   */
+  int MarkDataBlocksProcessed(const AliHLTOUTHandlerListEntry* pHandlerDesc);
+
+  /**
+   * Add a sub collection to the HLTOUT.
+   */
+  int AddSubCollection(AliHLTOUT* pCollection);
+
+  /**
+   * Release a previously added sub collection.
+   */
+  int ReleaseSubCollection(AliHLTOUT* pCollection);
+
   /**
    * Get module agent for the selected data block.
    */
@@ -361,6 +584,27 @@ class AliHLTOUT : public AliHLTLogging {
    */
   static int InsertHandler(AliHLTOUTHandlerListEntryVector& list, const AliHLTOUTHandlerListEntry &entry);
   
+  /**
+   * Insert all handlers of the specified type to the list.
+   */
+  int FillHandlerList(AliHLTOUTHandlerListEntryVector& list, AliHLTModuleAgent::AliHLTOUTHandlerType handlerType);
+
+  /**
+   * Remove empty items which have a duplicate in the list.
+   */
+  static int RemoveEmptyDuplicateHandlers(AliHLTOUTHandlerListEntryVector& list);
+
+  /**
+   * Find an entry of a certain description in the list.
+   * @return index of the entry if found, -ENOENT if not found
+   */
+  static int FindHandler(AliHLTOUTHandlerListEntryVector& list, const AliHLTModuleAgent::AliHLTOUTHandlerDesc desc);
+
+  /**
+   * Invalidate all blocks of the handlers in the list
+   */
+  static int InvalidateBlocks(AliHLTOUTHandlerListEntryVector& list);
+
  protected:
   /**
    * Add a block descriptor.
@@ -371,6 +615,11 @@ class AliHLTOUT : public AliHLTLogging {
    */
   int AddBlockDescriptor(const AliHLTOUTBlockDescriptor desc);
 
+  /**
+   * Set the event id, only for child classes
+   */
+  void SetEventId(AliHLTUInt64_t id);
+
   /**
    * Print output or suppress.
    */
@@ -391,7 +640,7 @@ class AliHLTOUT : public AliHLTLogging {
    * Internal status flags
    */
   enum {
-    /** the HLTOUT object is locked with the current data block */
+    /** the HLTOUT object is locked with the current data block selection */
     kLocked = 0x1,
     /** childs can add block descriptors */
     kCollecting = 0x2,
@@ -402,7 +651,13 @@ class AliHLTOUT : public AliHLTLogging {
     /** user of the data block has checked the alignment */
     kAlignmentChecked = 0x10,
     /** warning on alignment missmatch has been printed */
-    kAlignmentWarning = 0x20
+    kAlignmentWarning = 0x20,
+    /** enable block selection list */
+    kBlockSelection = 0x40,
+    /** skip processed data blocks */
+    kSkipProcessed = 0x80,
+    /** marked as sub collection */
+    kIsSubCollection = 0x100
   };
 
   /**
@@ -418,6 +673,11 @@ class AliHLTOUT : public AliHLTLogging {
    */
   int InitHandlers();
 
+  /**
+   * Cleanup and reset the data input.
+   */
+  virtual int ResetInput();
+
   /**
    * Get the data buffer
    * @param index   [in]  index of the block
@@ -441,7 +701,11 @@ class AliHLTOUT : public AliHLTLogging {
    * Select the data block of data type and specification of the previous
    * call to @ref SelectFirstDataBlock. Core function of @ref SelectFirstDataBlock
    * and @ref SelectNextDataBlock, starts to find a block at the current list
-   * position. 
+   * position.
+   * 
+   * The data block is searched from the conditions of fSearchDataType,
+   * fSearchSpecification, fSearchHandlerType and the selection list.
+   *
    * @return identifier >=0 if success, neg. error code if failed         <br>
    *                        -ENOENT if no block found                     <br>
    *                        -EPERM if access denied (object locked)
@@ -474,6 +738,27 @@ class AliHLTOUT : public AliHLTLogging {
    */
   const AliHLTOUTHandlerListEntry& FindHandlerDesc(AliHLTUInt32_t blockIndex);
 
+  /**
+   * Set the RawReader as parameter.
+   * The function is for internal use only in conjunction with the
+   * New() functions.
+   */
+  virtual void SetParam(AliRawReader* pRawReader);
+
+  /**
+   * Set the RunLoader as parameter
+   * The function is for internal use only in conjunction with the
+   * New() functions.
+   */
+  virtual void SetParam(TTree* pDigitTree, int event=-1);
+
+  /**
+   * Set name of the digit file as parameter
+   * The function is for internal use only in conjunction with the
+   * New() functions.
+   */
+  virtual void SetParam(const char* filename, int event=-1);
+
   /** data type for the current block search, set from @ref SelectFirstDataBlock */
   AliHLTComponentDataType fSearchDataType; //!transient
 
@@ -490,7 +775,7 @@ class AliHLTOUT : public AliHLTLogging {
   AliHLTOUTBlockDescriptorVector fBlockDescList; //!transient
 
   /** current position in the list */
-  AliHLTOUTBlockDescriptorVector::iterator fCurrent; //!transient
+  unsigned int fCurrent; //!transient
 
   /** data buffer under processing */
   const AliHLTUInt8_t* fpBuffer; //!transient
@@ -501,6 +786,20 @@ class AliHLTOUT : public AliHLTLogging {
   /** verbose or silent output */
   bool fbVerbose; //!transient
 
-  ClassDef(AliHLTOUT, 2)
+  /** gobal instance set for certain steps of the analysis */
+  static AliHLTOUT* fgGlobalInstance; //! transient
+
+  /** logging methods */
+  AliHLTLogging fLog; //! transient
+
+  /** current buffer converted to a TObject */
+  TObject* fpDataObject; //!
+  const AliHLTUInt8_t* fpObjectBuffer; //!
+  AliHLTUInt32_t fObjectBufferSize; //!
+
+  /** current event id */
+  AliHLTUInt64_t fCurrentEventId; //!
+
+  ClassDef(AliHLTOUT, 6)
 };
 #endif