ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTDATADEFLATERSIMPLE_H
#define ALIHLTDATADEFLATERSIMPLE_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   AliHLTDataDeflaterSimple.h
/// @author Matthias Richter
/// @date   2011-08-10
/// @brief  Data deflater class storing only necessary bits
/// @note   Code original from AliHLTTPCCompModelDeflater

#include "AliHLTDataDeflater.h"
#include <vector>
#include <string>

/**
 * @class AliHLTDataDeflaterSimple
 * Simple deflater implementation storing frequent values below a
 * maximum value with a reduced bit number and others with the full
 * number of bits. The reduced value is indicated by a preceeding '0'
 * and the full bit by '1'. The algorithm can be applied to data with an
 * occurrence distribution peaking close to zero and having less frequent
 * occurrence at higher values.
 *
 * @ingroup alihlt_base
 */
class AliHLTDataDeflaterSimple : public AliHLTDataDeflater
{
public:
  /// standard constructor
  AliHLTDataDeflaterSimple();
  /// destructor
  ~AliHLTDataDeflaterSimple();

  /// @class AliHLTDataDeflaterParameter 
  //  definition of parameters
  class AliHLTDataDeflaterParameter {
  public:
    AliHLTDataDeflaterParameter()
      : fName(), fFullBitLength(0), fReducedBitLength(0)
      , fMax(0), fMaxReduced(0)
      , fMask(0), fMaskReduced(0)
      , fValueCount(0), fBitCount(0) {}

    AliHLTDataDeflaterParameter(const char* name, int length, int reduced)
      : fName(name), fFullBitLength(length), fReducedBitLength(reduced)
      , fMax((((AliHLTUInt64_t)0x1)<<length)-1), fMaxReduced((((AliHLTUInt64_t)0x1)<<reduced)-1)
      , fMask(fMax), fMaskReduced(fMaxReduced) 
      , fValueCount(0), fBitCount(0) {}

    AliHLTDataDeflaterParameter(const AliHLTDataDeflaterParameter& src)
      : fName(src.fName), fFullBitLength(src.fFullBitLength), fReducedBitLength(src.fReducedBitLength)
      , fMax(src.fMax), fMaxReduced(src.fMaxReduced)
      , fMask(src.fMask), fMaskReduced(src.fMaskReduced) 
      , fValueCount(0), fBitCount(0) {}

    AliHLTDataDeflaterParameter& operator=(const AliHLTDataDeflaterParameter& src) {
      if (this==&src) return *this;
      fName=src.fName; fFullBitLength=src.fFullBitLength; fReducedBitLength=src.fReducedBitLength;
      fMax=src.fMax; fMaxReduced=src.fMaxReduced;
      fMask=src.fMask; fMaskReduced=src.fMaskReduced;
      fValueCount=src.fValueCount; fBitCount=src.fBitCount;
      return *this;
    }

    ~AliHLTDataDeflaterParameter() {}

    const char* GetName() const {return fName.c_str();}
    AliHLTUInt64_t Value(const AliHLTUInt64_t& value) const {
      return value>fMax?fMax:value;
    }
    AliHLTUInt32_t ValueLength(const AliHLTUInt64_t& value) const{
      return value>fMaxReduced?fFullBitLength:fReducedBitLength;
    }
    AliHLTUInt32_t SwitchBit(const AliHLTUInt64_t& value) const {
      return value>fMaxReduced;
    }
    const int& GetBitLength() const {return fFullBitLength;}
    const int& GetReducedBitLength() const {return fReducedBitLength;}
    const AliHLTUInt64_t& GetMax() const {return fMax;}
    const AliHLTUInt64_t& GetMaxReduced() const {return fMaxReduced;}
    const AliHLTUInt64_t& GetMask() const {return fMask;}
    const AliHLTUInt64_t& GetReducedMask() const {return fMaskReduced;}

    const AliHLTUInt32_t& GetBitCount() const {return fBitCount;}
    const AliHLTUInt32_t& GetValueCount() const {return fValueCount;}
    void IncrementBitCount(const AliHLTUInt64_t& value) {
      fBitCount+=(value>fMaxReduced?fFullBitLength:fReducedBitLength)+1;
      fValueCount++;
    }
    void ResetBitCount() {fValueCount=0; fBitCount=0;}
    void Print(const char* option="") const;

  private:
    std::string fName; //!
    int fFullBitLength; //!
    int fReducedBitLength; //!
    AliHLTUInt64_t fMax; //!
    AliHLTUInt64_t fMaxReduced; //!
    AliHLTUInt64_t fMask; //!
    AliHLTUInt64_t fMaskReduced; //!
    AliHLTUInt32_t fValueCount; //!
    AliHLTUInt32_t fBitCount; //!
  };

  /// add a parameter definition to the configuration, return reference id
  int AddParameterDefinition(const char* name, int bitLength, int reducedBitLength);

  /// inherited from AliHLTDataDeflater: write bit pattern according to configuration
  virtual bool OutputParameterBits( int parameterId, AliHLTUInt64_t const & value );

  /// 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;

  /// DataDeflaterSimple has deflater version 1
  virtual int GetDeflaterVersion() const {return 1;}

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

  vector<AliHLTDataDeflaterParameter> fParameterDefinitions; //!

  ClassDef(AliHLTDataDeflaterSimple, 0)
};

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

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