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

#ifndef ALIHLTOUTHANDLERCHAIN_H
#define ALIHLTOUTHANDLERCHAIN_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   AliHLTOUTHandlerChain.h
/// @author Matthias Richter
/// @date   24.06.2008
/// @brief  HLTOUT handler of type kChain.
///

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

class AliHLTSystem;
class AliHLTConfiguration;
class AliHLTConfigurationHandler;

/**
 * @class AliHLTOUTHandlerChain
 * The default HLTOUT handler for type kChain.
 *
 * The handler implements the kChain processing of HLTOUT data.
 * The ids of the chains to be run during processing are provided
 * as parameter to the constructor. The AliHLTModuleAgent
 * can just create a new instance and specify the chains in order
 * to define the HLTOUT handling of type kChain for a certain data
 * block. The same instance can be returned for multiple data blocks.
 * The handler will run once on all data blocks.
 *
 * The AliHLTOUTPublisherComponent must be used as data source in order
 * to publish the data blocks from HLTOUT into the chain. The component
 * publishes all data blocks selected for the handler. Additional
 * filter rules can be applied.
 *
 * <h2>Chain configuration</h2>
 * The tasks in the chain to be run can be defined either by
 * the AliHLTModuleAgent in conjunction with all other configurations or
 * by an implementation of CreateConfigurations().
 *
 * The handler is controlled by arguments passed to the constructor, the
 * syntax is equal to the AliHLTSystem (see AliHLTSystem::ScanOptions).
 *
 * <h2>Usage example:</h2>
 * An agent implementation for some sample histograms. Asumes a chain to
 * be registered with name 'SAMPLE-my-histo-converter'
 * <pre>
 *  AliHLTOUTHandler* AliHLTMyAgent::GetOutputHandler(AliHLTComponentDataType dt,
 *                                                    AliHLTUInt32_t spec)
 *  {
 *   // afterburner for some histograms
 *   if (dt==kAliHLTDataTypeHistogram|kAliHLTDataOriginSample) {
 *     return new AliHLTOUTHandlerChain("chains=SAMPLE-my-histo-converter");
 *   }
 *
 *   return NULL;
 *  }
 * </pre>
 *
 * <h2>Data output</h2>
 * The chain can produce output data as usual. All produced data blocks are
 * added to the HLTOUT. This means a chain can e.g. produce ESD data blocks
 * out of the HLT output by applying a converter component as an afterburner.
 * The produced output of the chain is automatically subject to HLTOUT
 * standard processing.
 *
 * HLTOUT processing sequence:
 * - first handlers of type kChain
 * - handlers of type kEsd
 * - handlers of type kProprietary
 *
 * @ingroup alihlt_aliroot_reconstruction
 */
class AliHLTOUTHandlerChain : public AliHLTOUTHandler {
 public:
  /** constructor */
  AliHLTOUTHandlerChain(const char* arguments);
  /** standard destructor */
  virtual ~AliHLTOUTHandlerChain();

  /**
   * Process a data block.
   * The handler runs a normal HLT chain for processing of the selected blocks.
   * The input of the chain is provided by the AliHLTOUTPublisher component.
   * @return equipment id the block should be used for.
   */
  virtual int ProcessData(AliHLTOUT* pData);
 protected:
  /**
   * Create configurations.
   * The configurations of the chain to be run can be defined either by
   * the AliHLTModuleAgent in conjunction with all other configurations or
   * by an implementation of the function.
   */
  virtual int CreateConfigurations(AliHLTConfigurationHandler* handler);

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

  /**
   * Create and init AliHLTSystem.
   * Read the arguments and create the AliHLTOUTTask as data dump.
   */
  int InitSystem();

  TString fChains; //! transient
  TString fOptions; //! transient

  AliHLTSystem* fpSystem; //!transient
  bool fbHaveOutput; //!transient

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