]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/BASE/AliHLTDataDeflaterSimple.h
- Reshuffling of the particle codes in AliPID. Now the light nuclei are between the
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTDataDeflaterSimple.h
1 //-*- Mode: C++ -*-
2 // $Id$
3 #ifndef ALIHLTDATADEFLATERSIMPLE_H
4 #define ALIHLTDATADEFLATERSIMPLE_H
5 //* This file is property of and copyright by the ALICE HLT Project        * 
6 //* ALICE Experiment at CERN, All rights reserved.                         *
7 //* See cxx source for full Copyright notice                               *
8
9 /// @file   AliHLTDataDeflaterSimple.h
10 /// @author Matthias Richter
11 /// @date   2011-08-10
12 /// @brief  Data deflater class storing only necessary bits
13 /// @note   Code original from AliHLTTPCCompModelDeflater
14
15 #include "AliHLTDataDeflater.h"
16 #include <vector>
17 #include <string>
18
19 /**
20  * @class AliHLTDataDeflaterSimple
21  * Simple deflater implementation storing frequent values below a
22  * maximum value with a reduced bit number and others with the full
23  * number of bits. The reduced value is indicated by a preceeding '0'
24  * and the full bit by '1'. The algorithm can be applied to data with an
25  * occurrence distribution peaking close to zero and having less frequent
26  * occurrence at higher values.
27  *
28  * @ingroup alihlt_base
29  */
30 class AliHLTDataDeflaterSimple : public AliHLTDataDeflater
31 {
32 public:
33   /// standard constructor
34   AliHLTDataDeflaterSimple();
35   /// destructor
36   ~AliHLTDataDeflaterSimple();
37
38   /// @class AliHLTDataDeflaterParameter definition of parameters
39   class AliHLTDataDeflaterParameter {
40   public:
41     AliHLTDataDeflaterParameter()
42       : fName(), fFullBitLength(0), fReducedBitLength(0)
43       , fMax(0), fMaxReduced(0)
44       , fMask(0), fMaskReduced(0)
45       , fValueCount(0), fBitCount(0) {}
46
47     AliHLTDataDeflaterParameter(const char* name, int length, int reduced)
48       : fName(name), fFullBitLength(length), fReducedBitLength(reduced)
49       , fMax((((AliHLTUInt64_t)0x1)<<length)-1), fMaxReduced((((AliHLTUInt64_t)0x1)<<reduced)-1)
50       , fMask(fMax), fMaskReduced(fMaxReduced) 
51       , fValueCount(0), fBitCount(0) {}
52
53     AliHLTDataDeflaterParameter(const AliHLTDataDeflaterParameter& src)
54       : fName(src.fName), fFullBitLength(src.fFullBitLength), fReducedBitLength(src.fReducedBitLength)
55       , fMax(src.fMax), fMaxReduced(src.fMaxReduced)
56       , fMask(src.fMask), fMaskReduced(src.fMaskReduced) 
57       , fValueCount(0), fBitCount(0) {}
58
59     AliHLTDataDeflaterParameter& operator=(const AliHLTDataDeflaterParameter& src) {
60       if (this==&src) return *this;
61       fName=src.fName; fFullBitLength=src.fFullBitLength; fReducedBitLength=src.fReducedBitLength;
62       fMax=src.fMax; fMaxReduced=src.fMaxReduced;
63       fMask=src.fMask; fMaskReduced=src.fMaskReduced;
64       fValueCount=src.fValueCount; fBitCount=src.fBitCount;
65       return *this;
66     }
67
68     ~AliHLTDataDeflaterParameter() {}
69
70     const char* GetName() const {return fName.c_str();}
71     AliHLTUInt64_t Value(const AliHLTUInt64_t& value) const {
72       return value>fMax?fMax:value;
73     }
74     AliHLTUInt32_t ValueLength(const AliHLTUInt64_t& value) const{
75       return value>fMaxReduced?fFullBitLength:fReducedBitLength;
76     }
77     AliHLTUInt32_t SwitchBit(const AliHLTUInt64_t& value) const {
78       return value>fMaxReduced;
79     }
80     const int& GetBitLength() const {return fFullBitLength;}
81     const int& GetReducedBitLength() const {return fReducedBitLength;}
82     const AliHLTUInt64_t& GetMax() const {return fMax;}
83     const AliHLTUInt64_t& GetMaxReduced() const {return fMaxReduced;}
84     const AliHLTUInt64_t& GetMask() const {return fMask;}
85     const AliHLTUInt64_t& GetReducedMask() const {return fMaskReduced;}
86
87     const AliHLTUInt32_t& GetBitCount() const {return fBitCount;}
88     const AliHLTUInt32_t& GetValueCount() const {return fValueCount;}
89     void IncrementBitCount(const AliHLTUInt64_t& value) {
90       fBitCount+=(value>fMaxReduced?fFullBitLength:fReducedBitLength)+1;
91       fValueCount++;
92     }
93     void ResetBitCount() {fValueCount=0; fBitCount=0;}
94     void Print(const char* option="") const;
95
96   private:
97     std::string fName; //!
98     int fFullBitLength; //!
99     int fReducedBitLength; //!
100     AliHLTUInt64_t fMax; //!
101     AliHLTUInt64_t fMaxReduced; //!
102     AliHLTUInt64_t fMask; //!
103     AliHLTUInt64_t fMaskReduced; //!
104     AliHLTUInt32_t fValueCount; //!
105     AliHLTUInt32_t fBitCount; //!
106   };
107
108   /// add a parameter definition to the configuration, return reference id
109   int AddParameterDefinition(const char* name, int bitLength, int reducedBitLength);
110
111   /// inherited from AliHLTDataDeflater: write bit pattern according to configuration
112   virtual bool OutputParameterBits( int parameterId, AliHLTUInt64_t const & value );
113
114   /// clear the object and reset pointer references
115   virtual void Clear(Option_t * /*option*/ ="");
116
117   /// print info
118   virtual void Print(Option_t *option="") const;
119
120   /// print info
121   virtual void Print(ostream& out, Option_t *option="") const;
122
123   /// DataDeflaterSimple has deflater version 1
124   virtual int GetDeflaterVersion() const {return 1;}
125
126  protected:
127  private:
128   /// copy constructor prohibited
129   AliHLTDataDeflaterSimple(const AliHLTDataDeflaterSimple&);
130   /// assignment operator prohibited
131   AliHLTDataDeflaterSimple& operator=(const AliHLTDataDeflaterSimple&);
132
133   vector<AliHLTDataDeflaterParameter> fParameterDefinitions; //!
134
135   ClassDef(AliHLTDataDeflaterSimple, 0)
136 };
137
138 ostream& operator<<(ostream &out, const AliHLTDataDeflaterSimple& me);
139
140 #endif