ROOT logo
//-*- Mode: C++ -*-
// $Id$

#ifndef ALIHLTOUTHANDLERESDBRANCH_H
#define ALIHLTOUTHANDLERESDBRANCH_H
//* This file is property of and copyright by the                          * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//* See cxx source for full Copyright notice                               *

/// @file   AliHLTOUTHandlerEsdBranch.h
/// @author Matthias Richter
/// @date   01.07.2010
/// @brief  HLTOUT handler of type kEsd to merge objects into the hltEsd.

#include "AliHLTOUTHandler.h"
#include "TString.h"

class TArrayC;
class TObject;
class AliHLTEsdManager;

/**
 * @class AliHLTOUTHandlerEsdBranch
 * An HLTOUT handler of type kEsd to add objects to hltEsd branches.
 *
 * The handler extracts objects from HLTOUT data blocks or converts
 * data to objects to be added to hltEsd branches. The default implementation
 * covers the first case right away, the class can be used directly for single
 * objects streamed to the HLTOUT.
 *
 * <h2>Object conversion</h2>
 * The method ExtractAndAddObjects() has to loop over all input blocks and
 * provide an appropriate conversion. If the data block simply contains a
 * streamed object it just needs to be extracted and added to the ESD using
 * the function Add(). This case is covered by the default implementation.
 * Child classes can overload ExtractAndAddObjects() if there is further
 * conversion/formatting required.
 *
 * <h2>Usage example:</h2>
 * An agent implementation must announce to ability to process a certain
 * data block by implementing AliHLTModuleAgent::GetHandlerDescription()
 * and AliHLTModuleAgent::GetOutputHandler(). See AliHLTModuleAgent for
 * more details.
 * <pre>
 *  int AliHLTMyAgent::GetHandlerDescription(AliHLTComponentDataType dt,
 *  					     AliHLTUInt32_t spec,
 *  					     AliHLTOUTHandlerDesc& desc) const
 *  {
 *    // add TObject data blocks of type {ROOTTOBJ:SMPL} to ESD
 *    if (dt==(kAliHLTDataTypeTObject|kAliHLTDataOriginSample)) {
 *        desc=AliHLTOUTHandlerDesc(kEsd, dt, GetModuleId());
 *        return 1;
 *    }
 *  
 *    return 0;
 *  }
 *
 *  AliHLTOUTHandler* AliHLTMyAgent::GetOutputHandler(AliHLTComponentDataType dt,
 *                                                    AliHLTUInt32_t spec)
 *  {
 *   // merge my objects into the hltEsd
 *   if (dt==(kAliHLTDataTypeTObject|kAliHLTDataOriginSample)) {
 *     static AliHLTOUTHandlerEsdBranch handler;
 *     return &handler;
 *   }
 *
 *   return NULL;
 *  }
 * </pre>
 *
 * <h2>Data output</h2>
 * The handler produces a partial ESD containing the data objects. The framework
 * merges all the different partial ESDs in the AliHLTEsdManager, respectively the
 * specific implementation AliHLTEsdManagerImplementation.
 *
 * HLTOUT processing sequence:
 * - first handlers of type kChain
 * - handlers of type kEsd
 * - handlers of type kProprietary
 *
 * @ingroup alihlt_aliroot_reconstruction
 */
class AliHLTOUTHandlerEsdBranch : public AliHLTOUTHandler {
 public:
  /** constructor */
  AliHLTOUTHandlerEsdBranch(const char* branchname=NULL);
  /** standard destructor */
  virtual ~AliHLTOUTHandlerEsdBranch();

  /**
   * Process a data block.
   * @return 
   */
  int ProcessData(AliHLTOUT* pData);

  int GetProcessedData(const AliHLTUInt8_t* &pData);
  int ReleaseProcessedData(const AliHLTUInt8_t* pData, int size);

 protected:
  /**
   * Extract and add objects
   * Loop over input blocks and extract/format the objects. Child class
   * can implement specific conversion. The default implementation just
   * extracts and adds objects.
   */
  virtual int ExtractAndAddObjects(AliHLTOUT* pData);

 private:
  /** copy constructor prohibited */
  AliHLTOUTHandlerEsdBranch(const AliHLTOUTHandlerEsdBranch&);
  /** assignment operator prohibited */
  AliHLTOUTHandlerEsdBranch& operator=(const AliHLTOUTHandlerEsdBranch&);

  TString fBranch; //! transient
  TObject* fESD; //! transient
  TArrayC* fpData;  //! transient
  int fSize; //! transient
  AliHLTEsdManager* fManager; //! transient

  ClassDef(AliHLTOUTHandlerEsdBranch, 0)
};
#endif
 AliHLTOUTHandlerEsdBranch.h:1
 AliHLTOUTHandlerEsdBranch.h:2
 AliHLTOUTHandlerEsdBranch.h:3
 AliHLTOUTHandlerEsdBranch.h:4
 AliHLTOUTHandlerEsdBranch.h:5
 AliHLTOUTHandlerEsdBranch.h:6
 AliHLTOUTHandlerEsdBranch.h:7
 AliHLTOUTHandlerEsdBranch.h:8
 AliHLTOUTHandlerEsdBranch.h:9
 AliHLTOUTHandlerEsdBranch.h:10
 AliHLTOUTHandlerEsdBranch.h:11
 AliHLTOUTHandlerEsdBranch.h:12
 AliHLTOUTHandlerEsdBranch.h:13
 AliHLTOUTHandlerEsdBranch.h:14
 AliHLTOUTHandlerEsdBranch.h:15
 AliHLTOUTHandlerEsdBranch.h:16
 AliHLTOUTHandlerEsdBranch.h:17
 AliHLTOUTHandlerEsdBranch.h:18
 AliHLTOUTHandlerEsdBranch.h:19
 AliHLTOUTHandlerEsdBranch.h:20
 AliHLTOUTHandlerEsdBranch.h:21
 AliHLTOUTHandlerEsdBranch.h:22
 AliHLTOUTHandlerEsdBranch.h:23
 AliHLTOUTHandlerEsdBranch.h:24
 AliHLTOUTHandlerEsdBranch.h:25
 AliHLTOUTHandlerEsdBranch.h:26
 AliHLTOUTHandlerEsdBranch.h:27
 AliHLTOUTHandlerEsdBranch.h:28
 AliHLTOUTHandlerEsdBranch.h:29
 AliHLTOUTHandlerEsdBranch.h:30
 AliHLTOUTHandlerEsdBranch.h:31
 AliHLTOUTHandlerEsdBranch.h:32
 AliHLTOUTHandlerEsdBranch.h:33
 AliHLTOUTHandlerEsdBranch.h:34
 AliHLTOUTHandlerEsdBranch.h:35
 AliHLTOUTHandlerEsdBranch.h:36
 AliHLTOUTHandlerEsdBranch.h:37
 AliHLTOUTHandlerEsdBranch.h:38
 AliHLTOUTHandlerEsdBranch.h:39
 AliHLTOUTHandlerEsdBranch.h:40
 AliHLTOUTHandlerEsdBranch.h:41
 AliHLTOUTHandlerEsdBranch.h:42
 AliHLTOUTHandlerEsdBranch.h:43
 AliHLTOUTHandlerEsdBranch.h:44
 AliHLTOUTHandlerEsdBranch.h:45
 AliHLTOUTHandlerEsdBranch.h:46
 AliHLTOUTHandlerEsdBranch.h:47
 AliHLTOUTHandlerEsdBranch.h:48
 AliHLTOUTHandlerEsdBranch.h:49
 AliHLTOUTHandlerEsdBranch.h:50
 AliHLTOUTHandlerEsdBranch.h:51
 AliHLTOUTHandlerEsdBranch.h:52
 AliHLTOUTHandlerEsdBranch.h:53
 AliHLTOUTHandlerEsdBranch.h:54
 AliHLTOUTHandlerEsdBranch.h:55
 AliHLTOUTHandlerEsdBranch.h:56
 AliHLTOUTHandlerEsdBranch.h:57
 AliHLTOUTHandlerEsdBranch.h:58
 AliHLTOUTHandlerEsdBranch.h:59
 AliHLTOUTHandlerEsdBranch.h:60
 AliHLTOUTHandlerEsdBranch.h:61
 AliHLTOUTHandlerEsdBranch.h:62
 AliHLTOUTHandlerEsdBranch.h:63
 AliHLTOUTHandlerEsdBranch.h:64
 AliHLTOUTHandlerEsdBranch.h:65
 AliHLTOUTHandlerEsdBranch.h:66
 AliHLTOUTHandlerEsdBranch.h:67
 AliHLTOUTHandlerEsdBranch.h:68
 AliHLTOUTHandlerEsdBranch.h:69
 AliHLTOUTHandlerEsdBranch.h:70
 AliHLTOUTHandlerEsdBranch.h:71
 AliHLTOUTHandlerEsdBranch.h:72
 AliHLTOUTHandlerEsdBranch.h:73
 AliHLTOUTHandlerEsdBranch.h:74
 AliHLTOUTHandlerEsdBranch.h:75
 AliHLTOUTHandlerEsdBranch.h:76
 AliHLTOUTHandlerEsdBranch.h:77
 AliHLTOUTHandlerEsdBranch.h:78
 AliHLTOUTHandlerEsdBranch.h:79
 AliHLTOUTHandlerEsdBranch.h:80
 AliHLTOUTHandlerEsdBranch.h:81
 AliHLTOUTHandlerEsdBranch.h:82
 AliHLTOUTHandlerEsdBranch.h:83
 AliHLTOUTHandlerEsdBranch.h:84
 AliHLTOUTHandlerEsdBranch.h:85
 AliHLTOUTHandlerEsdBranch.h:86
 AliHLTOUTHandlerEsdBranch.h:87
 AliHLTOUTHandlerEsdBranch.h:88
 AliHLTOUTHandlerEsdBranch.h:89
 AliHLTOUTHandlerEsdBranch.h:90
 AliHLTOUTHandlerEsdBranch.h:91
 AliHLTOUTHandlerEsdBranch.h:92
 AliHLTOUTHandlerEsdBranch.h:93
 AliHLTOUTHandlerEsdBranch.h:94
 AliHLTOUTHandlerEsdBranch.h:95
 AliHLTOUTHandlerEsdBranch.h:96
 AliHLTOUTHandlerEsdBranch.h:97
 AliHLTOUTHandlerEsdBranch.h:98
 AliHLTOUTHandlerEsdBranch.h:99
 AliHLTOUTHandlerEsdBranch.h:100
 AliHLTOUTHandlerEsdBranch.h:101
 AliHLTOUTHandlerEsdBranch.h:102
 AliHLTOUTHandlerEsdBranch.h:103
 AliHLTOUTHandlerEsdBranch.h:104
 AliHLTOUTHandlerEsdBranch.h:105
 AliHLTOUTHandlerEsdBranch.h:106
 AliHLTOUTHandlerEsdBranch.h:107
 AliHLTOUTHandlerEsdBranch.h:108
 AliHLTOUTHandlerEsdBranch.h:109
 AliHLTOUTHandlerEsdBranch.h:110
 AliHLTOUTHandlerEsdBranch.h:111
 AliHLTOUTHandlerEsdBranch.h:112
 AliHLTOUTHandlerEsdBranch.h:113
 AliHLTOUTHandlerEsdBranch.h:114
 AliHLTOUTHandlerEsdBranch.h:115
 AliHLTOUTHandlerEsdBranch.h:116
 AliHLTOUTHandlerEsdBranch.h:117
 AliHLTOUTHandlerEsdBranch.h:118
 AliHLTOUTHandlerEsdBranch.h:119
 AliHLTOUTHandlerEsdBranch.h:120
 AliHLTOUTHandlerEsdBranch.h:121
 AliHLTOUTHandlerEsdBranch.h:122