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

/// @file   AliHLTDataDeflater.h
/// @author Matthias Richter, Timm Steinbeck
/// @date   2011-08-10
/// @brief  Data deflater class storing only necessary bits
/// @note   Code original from AliHLTTPCCompModelDeflater

#include "AliHLTLogging.h"
#include "AliHLTDataTypes.h"
#include "AliHLTStdIncludes.h"
#include <bitset>

class TObjArray;
class TH1;
class TH2;

/**
 * @class AliHLTDataDeflater
 * Data deflater class to write a bitstream into a buffer. The necessary
 * number of bits for each value is written to a stream without gaps.
 * The buffer can be padded to fill full bytes and continue writing at the
 * next byte.
 *
 * @ingroup alihlt_base
 */
class AliHLTDataDeflater : public AliHLTLogging
{
public:
  /// standard constructor
  AliHLTDataDeflater();
  /// destructor
  ~AliHLTDataDeflater();

  /** function to initialise bit data output
   * @param output AliHLTUInt8_t* pointer to output data
   * @param outputSize UInt_t output size
   */
  int InitBitDataOutput( AliHLTUInt8_t* output, UInt_t outputSize );

  /** function to close bit data output */
  void CloseBitDataOutput();

  /** function to get current byte output position
   * @return unsigned long value for current byte output position
   */
  unsigned long GetCurrentByteOutputPosition() const
  {
    return (unsigned long)( fBitDataCurrentOutput - fBitDataCurrentOutputStart );
  }

  /** function to get current bit output position
   * @return unsigned long value for current bit output position
   */
  unsigned GetCurrentBitOutputPosition() const
  {
    return fBitDataCurrentPosInWord;
  }

  /** function to get current output byte
   * @param offset Int_t (set to zero if not specified explicitly)
   * @return AliHLTUInt8_t value for current output byte
   */
  AliHLTUInt8_t GetCurrentOutputByte( Int_t offset=0 ) const;
      
  /** function to get bit data output size bytes
   * @return UInt_t value of bit data output size bytes
   */
  UInt_t GetBitDataOutputSizeBytes() const
  {
    return fBitDataCurrentOutput-fBitDataCurrentOutputStart;
  }
      
  /** function for output bit
   * @param value  AliHLTUInt32_t const & input
   * @return boolean (output bit)
   */
  bool OutputBit( AliHLTUInt32_t const & value );

  /** function to output bits 
   * @param value     AliHLTUInt64_t const &
   * @param bitCount  UInt_t const &
   * @return zero upon success
   */
  bool OutputBits( AliHLTUInt64_t const & value, UInt_t const & bitCount );

  /** function to output bits from a bitset
   * @param value     AliHLTUInt64_t const &
   * @param bitCount  UInt_t const &
   * @return zero upon success
   */
  bool OutputBits( std::bitset<64> const & value, UInt_t const & bitCount );

  /* function pad 8 bits */
  void Pad8Bits();

  /** function to output bytes
   * @param data  AliHLTUInt8_t const *
   * @param byteCount UInt_t const &
   * @return boolean (output bytes)
   */
  bool OutputBytes( AliHLTUInt8_t const * data, UInt_t const & byteCount );      

  /// add a histogram for deflater statistic of the corresponding parameter
  /// a histogram is created with default settings if h is not specified; if
  /// provided, the ownership goes over to the base class
  int AddHistogram(int id, const char* name, int bitWidth, TH1* h=NULL);

  /// enable statistics accounting
  int EnableStatistics();

  /// check if statistics writing is enabled
  bool DoStatistics() const {return fHistograms!=NULL;}

  /// fill statistics for a parameter
  /// @param id           id of the parameter
  /// @param value        value
  /// @param length       bit length
  /// @param codingWeight fraction of bit lenght used for this value
  int FillStatistics(int id, AliHLTUInt64_t value, unsigned length, float codingWeight=0.0);

  static float CalcEntropy(TH1* histo, const char* option="", int mode=0);

  /// save data according to option
  virtual void SaveAs(const char *filename="",Option_t *option="") const;

  /// clear the object and reset pointer references
  virtual void Clear(Option_t * /*option*/ ="");

  /// print info
  virtual void Print(Option_t *option="") const;

  /// print info
  virtual void Print(ostream& out, Option_t *option="") const;

  /// find object
  virtual TObject *FindObject(const char */*name*/) const {return NULL;}

  /// write bit pattern of a parameter to the current byte and position
  virtual bool OutputParameterBits( int parameterId, AliHLTUInt64_t const & value );

  /// write bit pattern of a parameter to the current byte and position
  virtual bool OutputParameterBits( int parameterId, AliHLTUInt64_t const & value, int lengthOffset );

  /// return unique version of the deflater, base class has version 0
  virtual int GetDeflaterVersion() const {return 0;}

protected:

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

  /// bit data current word
  AliHLTUInt8_t fBitDataCurrentWord; //! bit data current word
  /// bit data current position in word
  UInt_t fBitDataCurrentPosInWord; //! data current position in word
  /// bit data current output
  AliHLTUInt8_t *fBitDataCurrentOutput; //! bit data current output
  /// bit data current output start
  AliHLTUInt8_t *fBitDataCurrentOutputStart; //! bit data current output start
  /// bit data current output end
  AliHLTUInt8_t *fBitDataCurrentOutputEnd; //! bit data current output end 

  TObjArray* fHistograms; //! list of histograms for parameters
  TH2* fParameterCompression; //! compression for individual parameters
  TH2* fParameterSize; //! accumulated size for individual parameters

  ClassDef(AliHLTDataDeflater, 0)
};

ostream& operator<<(ostream &out, const AliHLTDataDeflater& me);

#endif
 AliHLTDataDeflater.h:1
 AliHLTDataDeflater.h:2
 AliHLTDataDeflater.h:3
 AliHLTDataDeflater.h:4
 AliHLTDataDeflater.h:5
 AliHLTDataDeflater.h:6
 AliHLTDataDeflater.h:7
 AliHLTDataDeflater.h:8
 AliHLTDataDeflater.h:9
 AliHLTDataDeflater.h:10
 AliHLTDataDeflater.h:11
 AliHLTDataDeflater.h:12
 AliHLTDataDeflater.h:13
 AliHLTDataDeflater.h:14
 AliHLTDataDeflater.h:15
 AliHLTDataDeflater.h:16
 AliHLTDataDeflater.h:17
 AliHLTDataDeflater.h:18
 AliHLTDataDeflater.h:19
 AliHLTDataDeflater.h:20
 AliHLTDataDeflater.h:21
 AliHLTDataDeflater.h:22
 AliHLTDataDeflater.h:23
 AliHLTDataDeflater.h:24
 AliHLTDataDeflater.h:25
 AliHLTDataDeflater.h:26
 AliHLTDataDeflater.h:27
 AliHLTDataDeflater.h:28
 AliHLTDataDeflater.h:29
 AliHLTDataDeflater.h:30
 AliHLTDataDeflater.h:31
 AliHLTDataDeflater.h:32
 AliHLTDataDeflater.h:33
 AliHLTDataDeflater.h:34
 AliHLTDataDeflater.h:35
 AliHLTDataDeflater.h:36
 AliHLTDataDeflater.h:37
 AliHLTDataDeflater.h:38
 AliHLTDataDeflater.h:39
 AliHLTDataDeflater.h:40
 AliHLTDataDeflater.h:41
 AliHLTDataDeflater.h:42
 AliHLTDataDeflater.h:43
 AliHLTDataDeflater.h:44
 AliHLTDataDeflater.h:45
 AliHLTDataDeflater.h:46
 AliHLTDataDeflater.h:47
 AliHLTDataDeflater.h:48
 AliHLTDataDeflater.h:49
 AliHLTDataDeflater.h:50
 AliHLTDataDeflater.h:51
 AliHLTDataDeflater.h:52
 AliHLTDataDeflater.h:53
 AliHLTDataDeflater.h:54
 AliHLTDataDeflater.h:55
 AliHLTDataDeflater.h:56
 AliHLTDataDeflater.h:57
 AliHLTDataDeflater.h:58
 AliHLTDataDeflater.h:59
 AliHLTDataDeflater.h:60
 AliHLTDataDeflater.h:61
 AliHLTDataDeflater.h:62
 AliHLTDataDeflater.h:63
 AliHLTDataDeflater.h:64
 AliHLTDataDeflater.h:65
 AliHLTDataDeflater.h:66
 AliHLTDataDeflater.h:67
 AliHLTDataDeflater.h:68
 AliHLTDataDeflater.h:69
 AliHLTDataDeflater.h:70
 AliHLTDataDeflater.h:71
 AliHLTDataDeflater.h:72
 AliHLTDataDeflater.h:73
 AliHLTDataDeflater.h:74
 AliHLTDataDeflater.h:75
 AliHLTDataDeflater.h:76
 AliHLTDataDeflater.h:77
 AliHLTDataDeflater.h:78
 AliHLTDataDeflater.h:79
 AliHLTDataDeflater.h:80
 AliHLTDataDeflater.h:81
 AliHLTDataDeflater.h:82
 AliHLTDataDeflater.h:83
 AliHLTDataDeflater.h:84
 AliHLTDataDeflater.h:85
 AliHLTDataDeflater.h:86
 AliHLTDataDeflater.h:87
 AliHLTDataDeflater.h:88
 AliHLTDataDeflater.h:89
 AliHLTDataDeflater.h:90
 AliHLTDataDeflater.h:91
 AliHLTDataDeflater.h:92
 AliHLTDataDeflater.h:93
 AliHLTDataDeflater.h:94
 AliHLTDataDeflater.h:95
 AliHLTDataDeflater.h:96
 AliHLTDataDeflater.h:97
 AliHLTDataDeflater.h:98
 AliHLTDataDeflater.h:99
 AliHLTDataDeflater.h:100
 AliHLTDataDeflater.h:101
 AliHLTDataDeflater.h:102
 AliHLTDataDeflater.h:103
 AliHLTDataDeflater.h:104
 AliHLTDataDeflater.h:105
 AliHLTDataDeflater.h:106
 AliHLTDataDeflater.h:107
 AliHLTDataDeflater.h:108
 AliHLTDataDeflater.h:109
 AliHLTDataDeflater.h:110
 AliHLTDataDeflater.h:111
 AliHLTDataDeflater.h:112
 AliHLTDataDeflater.h:113
 AliHLTDataDeflater.h:114
 AliHLTDataDeflater.h:115
 AliHLTDataDeflater.h:116
 AliHLTDataDeflater.h:117
 AliHLTDataDeflater.h:118
 AliHLTDataDeflater.h:119
 AliHLTDataDeflater.h:120
 AliHLTDataDeflater.h:121
 AliHLTDataDeflater.h:122
 AliHLTDataDeflater.h:123
 AliHLTDataDeflater.h:124
 AliHLTDataDeflater.h:125
 AliHLTDataDeflater.h:126
 AliHLTDataDeflater.h:127
 AliHLTDataDeflater.h:128
 AliHLTDataDeflater.h:129
 AliHLTDataDeflater.h:130
 AliHLTDataDeflater.h:131
 AliHLTDataDeflater.h:132
 AliHLTDataDeflater.h:133
 AliHLTDataDeflater.h:134
 AliHLTDataDeflater.h:135
 AliHLTDataDeflater.h:136
 AliHLTDataDeflater.h:137
 AliHLTDataDeflater.h:138
 AliHLTDataDeflater.h:139
 AliHLTDataDeflater.h:140
 AliHLTDataDeflater.h:141
 AliHLTDataDeflater.h:142
 AliHLTDataDeflater.h:143
 AliHLTDataDeflater.h:144
 AliHLTDataDeflater.h:145
 AliHLTDataDeflater.h:146
 AliHLTDataDeflater.h:147
 AliHLTDataDeflater.h:148
 AliHLTDataDeflater.h:149
 AliHLTDataDeflater.h:150
 AliHLTDataDeflater.h:151
 AliHLTDataDeflater.h:152
 AliHLTDataDeflater.h:153
 AliHLTDataDeflater.h:154
 AliHLTDataDeflater.h:155
 AliHLTDataDeflater.h:156
 AliHLTDataDeflater.h:157
 AliHLTDataDeflater.h:158
 AliHLTDataDeflater.h:159
 AliHLTDataDeflater.h:160
 AliHLTDataDeflater.h:161
 AliHLTDataDeflater.h:162
 AliHLTDataDeflater.h:163
 AliHLTDataDeflater.h:164
 AliHLTDataDeflater.h:165
 AliHLTDataDeflater.h:166
 AliHLTDataDeflater.h:167
 AliHLTDataDeflater.h:168
 AliHLTDataDeflater.h:169
 AliHLTDataDeflater.h:170
 AliHLTDataDeflater.h:171
 AliHLTDataDeflater.h:172
 AliHLTDataDeflater.h:173
 AliHLTDataDeflater.h:174
 AliHLTDataDeflater.h:175
 AliHLTDataDeflater.h:176
 AliHLTDataDeflater.h:177
 AliHLTDataDeflater.h:178
 AliHLTDataDeflater.h:179
 AliHLTDataDeflater.h:180
 AliHLTDataDeflater.h:181
 AliHLTDataDeflater.h:182