ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTCALIBRATIONPROCESSOR_H
#define ALIHLTCALIBRATIONPROCESSOR_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                               */

/**
 * Class takes care of handling and shipping of freshly produced calibration
 * data. this data will be shipped to the FXS of the HLT
 *
 * @file   AliHLTCalibrationProcessor.h
 * @author Jochen Thaeder, Sebastian Bablok
 * @date 
 * @brief  Base class of HLT calibration components.
 */

#include "AliHLTProcessor.h"
#include "AliHLTMessage.h"
#include "AliHLTDataTypes.h"

class AliHLTReadoutList;

/**
 * @class AliHLTCalibrationProcessor
 * Base class of HLT calibration components.
 * The class provides a common interface for the implementation of HLT
 * calibration components. It takes care of handling and shipping of 
 * produced calibration data to the FXS of the HLT. The child class must 
 * implement the functions:
 * - @ref InitCalibration (optional)
 * - @ref ScanArgument (optional)
 * - @ref DeinitCalibration (optional)
 * - @ref ProcessCalibration
 * - @ref ShipDataToFXS
 * - @ref GetComponentID
 * - @ref GetInputDataTypes
 * - @ref GetOutputDataType
 * - @ref GetOutputDataSize
 * - @ref Spawn

 * @ingroup alihlt_component
 */
class AliHLTCalibrationProcessor : public AliHLTProcessor {
  
 public: 
  /** standard constructor */
  AliHLTCalibrationProcessor();

  /** standard destructor */
  virtual ~AliHLTCalibrationProcessor();

 protected:

  /*
   * ######################## PushToFXS #####################
   */

  /**
   * Insert an object into the output. FXS header will be inserted before the root object.
   * @param pObject     pointer to root object
   * @param pDetector   4 byte Detector identifier
   * @param pFileID     name of the file to which the data shall be stored
   * @param pDDLList    pointer to ReadoutList ( class @ref AliHLTReadoutList) of
   *                    participating DDLs. Have to be set or unset with @ref
   *                    AliHLTComponent::EnableDDLBit() and @ref AliHLTComponent::DisableDDLBit(). 
   *			Will be filled automatically if not supplied by the component.
   * @return neg. error code if failed 
   */
  Int_t PushToFXS(TObject* pObject, const char* pDetector, const char* pFileID, const AliHLTReadoutList* pDDLList);

  /**
   * Insert an object into the output. FXS header will be inserted before the root object.
   * @param pBuffer     pointer to buffer
   * @param iSize       size of the buffer
   * @param pDetector   4 byte Detector identifier
   * @param pFileID     name of the file to which the data shall be stored
   * @param pDDLList    pointer to ReadoutList ( class @ref AliHLTReadoutList) of
   *                    participating DDLs. Have to be set or unset with @ref
   *                    AliHLTComponent::EnableDDLBit() and @ref AliHLTComponent::DisableDDLBit().
   *			Will be filled automatically if not supplied by the component.
   * @return neg. error code if failed 
   */
   Int_t PushToFXS(void* pBuffer, int iSize, const char* pDetector, const char* pFileID, const AliHLTReadoutList* pDDLList);

  /** Constants  */ 
  static const AliHLTUInt32_t fgkFXSProtocolHeaderSize;
  static const AliHLTUInt32_t fgkFXSProtocolHeaderVersion;

  /*
   * ######################## ProcessCalibaration #####################
   */

  /**
   * The low-level data processing method for the component,
   * called for every data event. This is the custom processing 
   * method and can be overloaded by the component.
   * @param [in] evtData       event data structure
   * @param [in] blocks        input data block descriptors
   * @param [in] trigData	  trigger data structure
   * @param [in] outputPtr	  pointer to target buffer
   * @param [in,out] size	  <i>input</i>: size of target buffer
   *            	  <i>output</i>:size of produced data
   * @param [in] outputBlocks  list to receive output block descriptors
   * @return neg. error code if failed
   */
  virtual Int_t ProcessCalibration(const AliHLTComponent_EventData& evtData,
			  const AliHLTComponent_BlockData* blocks,
			  AliHLTComponent_TriggerData& trigData, AliHLTUInt8_t* outputPtr,
			  AliHLTUInt32_t& size,
			  vector<AliHLTComponent_BlockData>& outputBlocks);
 
  /**  
   * The high-level data processing method for the component,
   * called for every data event. This is the custom processing 
   * method and can be overloaded by the component.
   * This is the default processing method; the method is called
   * if no low level @ref ProcessCalibration method is overloaded by the component.
   * @param evtData       event data structure
   * @param trigData	  trigger data structure
   * @return neg. error code if failed
   */
  virtual Int_t ProcessCalibration( const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData);

  /*
   * ######################## ShipDataToFXS #####################
   */

  /**
   * The low-level data processing method for the component,
   * called for the END_OF_RUN event. This is the custom processing 
   * method and can be overloaded by the component.
   * @param [in] evtData       event data structure
   * @param [in] blocks        input data block descriptors
   * @param [in] trigData	  trigger data structure
   * @param [in] outputPtr	  pointer to target buffer
   * @param [in,out] size	  <i>input</i>: size of target buffer
   *            	  <i>output</i>:size of produced data
   * @param [in] outputBlocks  list to receive output block descriptors
   * @return neg. error code if failed
   */
  virtual Int_t ShipDataToFXS(const AliHLTComponent_EventData& evtData,
			  const AliHLTComponent_BlockData* blocks,
			  AliHLTComponent_TriggerData& trigData, AliHLTUInt8_t* outputPtr,
			  AliHLTUInt32_t& size,
			  vector<AliHLTComponent_BlockData>& outputBlocks);
 
  /**  
   * The high-level data processing method for the component,
   * called for the END_OF_RUN event. This is the custom processing 
   * method and can be overloaded by the component.
   * This is the default processing method; the method is called
   * if no low level @ref ShipDataToFXS method is overloaded by the component.
   * @param evtData       event data structure
   * @param trigData	  trigger data structure
   * @return neg. error code if failed
   */
  virtual Int_t ShipDataToFXS( const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& trigData);

 private:

  /*
   * ######################## InitCalibration #####################
   */

  /**
   * Internal initialization method, which is not available for child classes. InitCalibration is the
   * corresponding function for classes derived from AliHLTCalibrationProcessor.
   */
  Int_t DoInit( int argc, const char** argv );

  /**
   * Default method for the internal initialization.
   * The method is called by @ref DoInit.
   * This class can be overridden by the child class.
   */
  virtual Int_t InitCalibration();

  /**
   * Scan one argument and adjacent parameters.
   * Can be overloaded by child classes in order to add additional arguments
   * beyond the standard arguments of the calibration processor. The method is called
   * whenever a non-standard argument is recognized. Make sure to return 
   * <tt> -EPROTO </tt> if the argument is not recognized be the child.
   * @param argc           size of the argument array
   * @param argv           agument array for component initialization
   * @return number of processed members of the argv <br>
   *         -EINVAL unknown argument <br>
   *         -EPROTO parameter for argument missing <br>
   */
  virtual Int_t ScanArgument(int argc, const char** argv);

  /*
   * ######################## DeinitCalibration #####################
   */

  /**
   * Internal deinitialization method, which is not available for child classes. DeinitCalibration is the
   * corresponding function for classes derived from AliHLTCalibrationProcessor.
   */
  Int_t DoDeinit();

  /**
   * Default method for the internal clean-up.
   * The method is called by @ref DoDeinit.
   * This class can be overridden by the child class.
   */
  virtual Int_t DeinitCalibration();

  /*
   * ######################## DoEvent #####################
   */
  
  /**
   * The low-level data processing method for the component.
   * It decides wether to call @ref ProcessCalibration or @ref ShipDataToFXS
   * according to the event type - END_OF_RUN / DATA / CALIBRATION
   * If commandline paramater  "-eventmodulo x"is given and x > 0, data will 
   * be also shipped to the FXS with this modulo.
   * @param [in] evtData       event data structure
   * @param [in] blocks        input data block descriptors
   * @param [in] trigData	  trigger data structure
   * @param [in] outputPtr	  pointer to target buffer
   * @param [in,out] size	  <i>input</i>: size of target buffer
   *            	  <i>output</i>:size of produced data
   * @param [in] outputBlocks  list to receive output block descriptors
   * @return neg. error code if failed
   */
  Int_t DoEvent( const AliHLTComponentEventData& evtData,
		 const AliHLTComponentBlockData* blocks, 
		       AliHLTComponentTriggerData& trigData,
		       AliHLTUInt8_t* outputPtr, 
		       AliHLTUInt32_t& size,
		       vector<AliHLTComponentBlockData>& outputBlocks );

  using AliHLTProcessor::DoEvent;
  
  /*
   * ######################## CreateFXSHeader #####################
   */

  /**
   * Insert an object into the output. FXS header will be inserted before the root object.
   * @param pHeader     pointer to AliHLTFXSHeader
   * @param pDetector   4 byte Detector identifier
   * @param pFileID     name of the file to which the data shall be stored
   * @param pDDLList    pointer to ReadoutList ( class @ref AliHLTReadoutList) of
   *                    participating DDLs. Will be filled automatically if not 
   *                    supplied by the component.
   * @return neg. error code if failed 
   */
  Int_t CreateFXSHeader( AliHLTFXSHeader &pHeader, const char* pDetector, const char* pFileID, const AliHLTReadoutList* pDDLList );

  /*
   * ######################## Members #####################
   */

  /** 
   * Event modulo, when Data should shipped to FXS additionally.
   * Default is 0, eventmodulo is deactivated.
   */
  Int_t fEventModulo;                                  // see above

  /** 
   * if kTrue corrupt events will be passed through,
   * if kFalse (default) they will be filtered
   */
  Bool_t fUseCorruptEvents;                            // see above

  /** Event counter */
  Int_t fEventCounter;                                 // see above

  /** 
   * Bit Array of participating DDL Numbers.
   * Scheme: every 4 Bits of each Byte convert digit 
   * (0 - F), before writing to FXS Header
   */
  //Char_t fDDLNumber[gkAliHLTFXSHeaderfDDLNumberSize];// see above
  Char_t fDDLNumber[64];                               // see above

  /** Dummy in order to cope with RC 11 */
  Int_t fDummy;                                        // see above

  ClassDef(AliHLTCalibrationProcessor, 0)

};

#endif // ALIHLTCALIBRATIONPROCESSOR_H
 AliHLTCalibrationProcessor.h:1
 AliHLTCalibrationProcessor.h:2
 AliHLTCalibrationProcessor.h:3
 AliHLTCalibrationProcessor.h:4
 AliHLTCalibrationProcessor.h:5
 AliHLTCalibrationProcessor.h:6
 AliHLTCalibrationProcessor.h:7
 AliHLTCalibrationProcessor.h:8
 AliHLTCalibrationProcessor.h:9
 AliHLTCalibrationProcessor.h:10
 AliHLTCalibrationProcessor.h:11
 AliHLTCalibrationProcessor.h:12
 AliHLTCalibrationProcessor.h:13
 AliHLTCalibrationProcessor.h:14
 AliHLTCalibrationProcessor.h:15
 AliHLTCalibrationProcessor.h:16
 AliHLTCalibrationProcessor.h:17
 AliHLTCalibrationProcessor.h:18
 AliHLTCalibrationProcessor.h:19
 AliHLTCalibrationProcessor.h:20
 AliHLTCalibrationProcessor.h:21
 AliHLTCalibrationProcessor.h:22
 AliHLTCalibrationProcessor.h:23
 AliHLTCalibrationProcessor.h:24
 AliHLTCalibrationProcessor.h:25
 AliHLTCalibrationProcessor.h:26
 AliHLTCalibrationProcessor.h:27
 AliHLTCalibrationProcessor.h:28
 AliHLTCalibrationProcessor.h:29
 AliHLTCalibrationProcessor.h:30
 AliHLTCalibrationProcessor.h:31
 AliHLTCalibrationProcessor.h:32
 AliHLTCalibrationProcessor.h:33
 AliHLTCalibrationProcessor.h:34
 AliHLTCalibrationProcessor.h:35
 AliHLTCalibrationProcessor.h:36
 AliHLTCalibrationProcessor.h:37
 AliHLTCalibrationProcessor.h:38
 AliHLTCalibrationProcessor.h:39
 AliHLTCalibrationProcessor.h:40
 AliHLTCalibrationProcessor.h:41
 AliHLTCalibrationProcessor.h:42
 AliHLTCalibrationProcessor.h:43
 AliHLTCalibrationProcessor.h:44
 AliHLTCalibrationProcessor.h:45
 AliHLTCalibrationProcessor.h:46
 AliHLTCalibrationProcessor.h:47
 AliHLTCalibrationProcessor.h:48
 AliHLTCalibrationProcessor.h:49
 AliHLTCalibrationProcessor.h:50
 AliHLTCalibrationProcessor.h:51
 AliHLTCalibrationProcessor.h:52
 AliHLTCalibrationProcessor.h:53
 AliHLTCalibrationProcessor.h:54
 AliHLTCalibrationProcessor.h:55
 AliHLTCalibrationProcessor.h:56
 AliHLTCalibrationProcessor.h:57
 AliHLTCalibrationProcessor.h:58
 AliHLTCalibrationProcessor.h:59
 AliHLTCalibrationProcessor.h:60
 AliHLTCalibrationProcessor.h:61
 AliHLTCalibrationProcessor.h:62
 AliHLTCalibrationProcessor.h:63
 AliHLTCalibrationProcessor.h:64
 AliHLTCalibrationProcessor.h:65
 AliHLTCalibrationProcessor.h:66
 AliHLTCalibrationProcessor.h:67
 AliHLTCalibrationProcessor.h:68
 AliHLTCalibrationProcessor.h:69
 AliHLTCalibrationProcessor.h:70
 AliHLTCalibrationProcessor.h:71
 AliHLTCalibrationProcessor.h:72
 AliHLTCalibrationProcessor.h:73
 AliHLTCalibrationProcessor.h:74
 AliHLTCalibrationProcessor.h:75
 AliHLTCalibrationProcessor.h:76
 AliHLTCalibrationProcessor.h:77
 AliHLTCalibrationProcessor.h:78
 AliHLTCalibrationProcessor.h:79
 AliHLTCalibrationProcessor.h:80
 AliHLTCalibrationProcessor.h:81
 AliHLTCalibrationProcessor.h:82
 AliHLTCalibrationProcessor.h:83
 AliHLTCalibrationProcessor.h:84
 AliHLTCalibrationProcessor.h:85
 AliHLTCalibrationProcessor.h:86
 AliHLTCalibrationProcessor.h:87
 AliHLTCalibrationProcessor.h:88
 AliHLTCalibrationProcessor.h:89
 AliHLTCalibrationProcessor.h:90
 AliHLTCalibrationProcessor.h:91
 AliHLTCalibrationProcessor.h:92
 AliHLTCalibrationProcessor.h:93
 AliHLTCalibrationProcessor.h:94
 AliHLTCalibrationProcessor.h:95
 AliHLTCalibrationProcessor.h:96
 AliHLTCalibrationProcessor.h:97
 AliHLTCalibrationProcessor.h:98
 AliHLTCalibrationProcessor.h:99
 AliHLTCalibrationProcessor.h:100
 AliHLTCalibrationProcessor.h:101
 AliHLTCalibrationProcessor.h:102
 AliHLTCalibrationProcessor.h:103
 AliHLTCalibrationProcessor.h:104
 AliHLTCalibrationProcessor.h:105
 AliHLTCalibrationProcessor.h:106
 AliHLTCalibrationProcessor.h:107
 AliHLTCalibrationProcessor.h:108
 AliHLTCalibrationProcessor.h:109
 AliHLTCalibrationProcessor.h:110
 AliHLTCalibrationProcessor.h:111
 AliHLTCalibrationProcessor.h:112
 AliHLTCalibrationProcessor.h:113
 AliHLTCalibrationProcessor.h:114
 AliHLTCalibrationProcessor.h:115
 AliHLTCalibrationProcessor.h:116
 AliHLTCalibrationProcessor.h:117
 AliHLTCalibrationProcessor.h:118
 AliHLTCalibrationProcessor.h:119
 AliHLTCalibrationProcessor.h:120
 AliHLTCalibrationProcessor.h:121
 AliHLTCalibrationProcessor.h:122
 AliHLTCalibrationProcessor.h:123
 AliHLTCalibrationProcessor.h:124
 AliHLTCalibrationProcessor.h:125
 AliHLTCalibrationProcessor.h:126
 AliHLTCalibrationProcessor.h:127
 AliHLTCalibrationProcessor.h:128
 AliHLTCalibrationProcessor.h:129
 AliHLTCalibrationProcessor.h:130
 AliHLTCalibrationProcessor.h:131
 AliHLTCalibrationProcessor.h:132
 AliHLTCalibrationProcessor.h:133
 AliHLTCalibrationProcessor.h:134
 AliHLTCalibrationProcessor.h:135
 AliHLTCalibrationProcessor.h:136
 AliHLTCalibrationProcessor.h:137
 AliHLTCalibrationProcessor.h:138
 AliHLTCalibrationProcessor.h:139
 AliHLTCalibrationProcessor.h:140
 AliHLTCalibrationProcessor.h:141
 AliHLTCalibrationProcessor.h:142
 AliHLTCalibrationProcessor.h:143
 AliHLTCalibrationProcessor.h:144
 AliHLTCalibrationProcessor.h:145
 AliHLTCalibrationProcessor.h:146
 AliHLTCalibrationProcessor.h:147
 AliHLTCalibrationProcessor.h:148
 AliHLTCalibrationProcessor.h:149
 AliHLTCalibrationProcessor.h:150
 AliHLTCalibrationProcessor.h:151
 AliHLTCalibrationProcessor.h:152
 AliHLTCalibrationProcessor.h:153
 AliHLTCalibrationProcessor.h:154
 AliHLTCalibrationProcessor.h:155
 AliHLTCalibrationProcessor.h:156
 AliHLTCalibrationProcessor.h:157
 AliHLTCalibrationProcessor.h:158
 AliHLTCalibrationProcessor.h:159
 AliHLTCalibrationProcessor.h:160
 AliHLTCalibrationProcessor.h:161
 AliHLTCalibrationProcessor.h:162
 AliHLTCalibrationProcessor.h:163
 AliHLTCalibrationProcessor.h:164
 AliHLTCalibrationProcessor.h:165
 AliHLTCalibrationProcessor.h:166
 AliHLTCalibrationProcessor.h:167
 AliHLTCalibrationProcessor.h:168
 AliHLTCalibrationProcessor.h:169
 AliHLTCalibrationProcessor.h:170
 AliHLTCalibrationProcessor.h:171
 AliHLTCalibrationProcessor.h:172
 AliHLTCalibrationProcessor.h:173
 AliHLTCalibrationProcessor.h:174
 AliHLTCalibrationProcessor.h:175
 AliHLTCalibrationProcessor.h:176
 AliHLTCalibrationProcessor.h:177
 AliHLTCalibrationProcessor.h:178
 AliHLTCalibrationProcessor.h:179
 AliHLTCalibrationProcessor.h:180
 AliHLTCalibrationProcessor.h:181
 AliHLTCalibrationProcessor.h:182
 AliHLTCalibrationProcessor.h:183
 AliHLTCalibrationProcessor.h:184
 AliHLTCalibrationProcessor.h:185
 AliHLTCalibrationProcessor.h:186
 AliHLTCalibrationProcessor.h:187
 AliHLTCalibrationProcessor.h:188
 AliHLTCalibrationProcessor.h:189
 AliHLTCalibrationProcessor.h:190
 AliHLTCalibrationProcessor.h:191
 AliHLTCalibrationProcessor.h:192
 AliHLTCalibrationProcessor.h:193
 AliHLTCalibrationProcessor.h:194
 AliHLTCalibrationProcessor.h:195
 AliHLTCalibrationProcessor.h:196
 AliHLTCalibrationProcessor.h:197
 AliHLTCalibrationProcessor.h:198
 AliHLTCalibrationProcessor.h:199
 AliHLTCalibrationProcessor.h:200
 AliHLTCalibrationProcessor.h:201
 AliHLTCalibrationProcessor.h:202
 AliHLTCalibrationProcessor.h:203
 AliHLTCalibrationProcessor.h:204
 AliHLTCalibrationProcessor.h:205
 AliHLTCalibrationProcessor.h:206
 AliHLTCalibrationProcessor.h:207
 AliHLTCalibrationProcessor.h:208
 AliHLTCalibrationProcessor.h:209
 AliHLTCalibrationProcessor.h:210
 AliHLTCalibrationProcessor.h:211
 AliHLTCalibrationProcessor.h:212
 AliHLTCalibrationProcessor.h:213
 AliHLTCalibrationProcessor.h:214
 AliHLTCalibrationProcessor.h:215
 AliHLTCalibrationProcessor.h:216
 AliHLTCalibrationProcessor.h:217
 AliHLTCalibrationProcessor.h:218
 AliHLTCalibrationProcessor.h:219
 AliHLTCalibrationProcessor.h:220
 AliHLTCalibrationProcessor.h:221
 AliHLTCalibrationProcessor.h:222
 AliHLTCalibrationProcessor.h:223
 AliHLTCalibrationProcessor.h:224
 AliHLTCalibrationProcessor.h:225
 AliHLTCalibrationProcessor.h:226
 AliHLTCalibrationProcessor.h:227
 AliHLTCalibrationProcessor.h:228
 AliHLTCalibrationProcessor.h:229
 AliHLTCalibrationProcessor.h:230
 AliHLTCalibrationProcessor.h:231
 AliHLTCalibrationProcessor.h:232
 AliHLTCalibrationProcessor.h:233
 AliHLTCalibrationProcessor.h:234
 AliHLTCalibrationProcessor.h:235
 AliHLTCalibrationProcessor.h:236
 AliHLTCalibrationProcessor.h:237
 AliHLTCalibrationProcessor.h:238
 AliHLTCalibrationProcessor.h:239
 AliHLTCalibrationProcessor.h:240
 AliHLTCalibrationProcessor.h:241
 AliHLTCalibrationProcessor.h:242
 AliHLTCalibrationProcessor.h:243
 AliHLTCalibrationProcessor.h:244
 AliHLTCalibrationProcessor.h:245
 AliHLTCalibrationProcessor.h:246
 AliHLTCalibrationProcessor.h:247
 AliHLTCalibrationProcessor.h:248
 AliHLTCalibrationProcessor.h:249
 AliHLTCalibrationProcessor.h:250
 AliHLTCalibrationProcessor.h:251
 AliHLTCalibrationProcessor.h:252
 AliHLTCalibrationProcessor.h:253
 AliHLTCalibrationProcessor.h:254
 AliHLTCalibrationProcessor.h:255
 AliHLTCalibrationProcessor.h:256
 AliHLTCalibrationProcessor.h:257
 AliHLTCalibrationProcessor.h:258
 AliHLTCalibrationProcessor.h:259
 AliHLTCalibrationProcessor.h:260
 AliHLTCalibrationProcessor.h:261
 AliHLTCalibrationProcessor.h:262
 AliHLTCalibrationProcessor.h:263
 AliHLTCalibrationProcessor.h:264
 AliHLTCalibrationProcessor.h:265
 AliHLTCalibrationProcessor.h:266
 AliHLTCalibrationProcessor.h:267
 AliHLTCalibrationProcessor.h:268
 AliHLTCalibrationProcessor.h:269
 AliHLTCalibrationProcessor.h:270
 AliHLTCalibrationProcessor.h:271
 AliHLTCalibrationProcessor.h:272
 AliHLTCalibrationProcessor.h:273
 AliHLTCalibrationProcessor.h:274
 AliHLTCalibrationProcessor.h:275
 AliHLTCalibrationProcessor.h:276
 AliHLTCalibrationProcessor.h:277
 AliHLTCalibrationProcessor.h:278
 AliHLTCalibrationProcessor.h:279
 AliHLTCalibrationProcessor.h:280
 AliHLTCalibrationProcessor.h:281
 AliHLTCalibrationProcessor.h:282
 AliHLTCalibrationProcessor.h:283
 AliHLTCalibrationProcessor.h:284
 AliHLTCalibrationProcessor.h:285
 AliHLTCalibrationProcessor.h:286
 AliHLTCalibrationProcessor.h:287
 AliHLTCalibrationProcessor.h:288
 AliHLTCalibrationProcessor.h:289