Moved from AliTransbit to AliL3Transbit.
[u/mrichter/AliRoot.git] / HLT / misc / AliL3TransBit.cxx
1 //$Id$
2
3 // Original author: Marian Ivanov, GSI Darmstadt for AliROOT
4 // migrated to L3 by Anders Vestbo <mailto:vestbo@fi.uib.no>
5 //*-- Copyright & copy ASV
6
7 #include "AliL3StandardIncludes.h"
8
9 #include "AliL3TransBit.h"
10
11 //_____________________________________________________________
12 // AliL3Transbit (taken from the offline AliROOT code)
13 //
14 // Time Projection Chamber ADC bit compresion lookup table
15 //
16 //  Conversion equation:
17 //    For AliTransBit_v1
18 //    dy/dx= Int_t(1+x/fX0)
19 //
20 //    For AliTransBit_v2
21 //    y  =(2**bit0) ln(1+x/fX0) / ln(1+(2**bit1-1)/fX0)
22 //
23 //    where x0 is calculated in function GetOptimumX0()
24 //
25 //  Example session in aliroot:
26 //    Int_t b0=10;  // original number of bits
27 //    Int_t b1=8;   // compressed
28 //
29 //    AliTransBit_v1 trans;
30 //    Int_t x0=TMath::Nint(TMath::Exp(b0*TMath::Log(2)));
31 //    Int_t x1=TMath::Nint(TMath::Exp(b1*TMath::Log(2)));
32 //    trans.SetBits(b0,b1);
33 //    trans.FindOptimumX0();
34 //    trans.Update();
35 //    cout<<trans.Get0to1(x0-2)<<"\n";
36 //    cout<<trans.Get1to0(x1-2)<<"\n";
37 //
38 //    // to produce table
39 //    for( Int_t i=0;i<x1;i++) cout<<i<<"\t"<<trans.Get1to0(i)<<"\n"; > table1to0.txt
40 //    for( Int_t i=0;i<x0;i++) cout<<i<<"\t"<<trans.Get0to1(i)<<"\n"; > table0to1.txt
41 //
42 //    for( Int_t i=0;i<x1-1;i++) cout<<i<<"\t"<<trans.Get1to0(i+1)-trans.Get1to0(i)<<"\n"; > tabled.txt
43 //
44
45 ClassImp(AliL3TransBit)
46 ClassImp(AliL3TransBit_v1)
47 ClassImp(AliL3TransBit_v2)
48
49 AliL3TransBit::AliL3TransBit()
50 {
51   fTable0 = 0;
52   fTable1 = 0;
53   fBit0   = 10;
54   fBit1   = 8;
55   fX0     = 0;
56 }
57
58 AliL3TransBit::~AliL3TransBit() 
59 {
60   //default destructor
61   if (fTable0!=0) delete [] fTable0;
62   if (fTable1!=0) delete [] fTable1;
63 }
64
65 Double_t AliL3TransBit_v1::FindOptimumX0()
66 {
67   //find x0 for which derivation at xder1 is equal 1
68   Int_t x0=(Int_t)rint(exp(fBit0*log(2.)));
69   Int_t x1=(Int_t)rint(exp(fBit1*log(2.)));
70
71   fX0 = ((x1-2)*(x1-2)/2.)/(x0-x1-1);  //starting fX0
72   Int_t digit=0;
73   Int_t j;
74   Double_t weight=1;
75   for(j=0;(j<50)&&(digit!=(x0-1));j++){  
76     Int_t olddigit=digit;
77     digit=0;
78     for (Int_t  i=0; i<x1-1;i++) digit+= Int_t(1+Double_t(i)/fX0);      
79     fX0*= (1.+weight*Double_t(digit)/Double_t(x0-1))/(1.+weight);    
80     if ( ((olddigit-(x0-1)) * (digit-(x0-1))) <0 ) 
81       weight*=0.25;
82     // cout<<j<<"\t"<<fX0<<"\t"<<digit<<"\n";
83   }
84   //  cout<<"End of iteration "<<j<<"\n";
85   //cout<<"digit..."<<digit<<"\n";  
86   return fX0;
87 }
88
89 void AliL3TransBit_v1::Update()
90 {
91   //construct lookup tables for loosy compression from 
92   if (fX0<1) fX0 = FindOptimumX0();  
93   Int_t x0=(Int_t)rint(exp(fBit0*log(2.)));
94   Int_t x1=(Int_t)rint(exp(fBit1*log(2.)));
95   
96   //fTable0 - conversion from bit0 coding to bit1 coding
97   if (fTable0!=0) delete fTable0;
98   fTable0= new Int_t[x0];
99   //fTable1 - conversion table from bit1 to bit0 coding
100   if (fTable1!=0) delete [] fTable1;
101   fTable1= new Int_t[x1];
102
103   Int_t digit=0;
104   for (Int_t  i=0; i<x1-1;i++){    
105     Int_t ddig=Int_t(1+Double_t(i)/fX0);
106     for (Int_t j=0;j<ddig;j++) if ((digit+j)<x0) fTable0[digit+j] = i;    
107     fTable1[i]= digit+ddig/2;
108     digit+= ddig;
109   }
110
111   for (Int_t i=digit;i<x0-1;i++) fTable0[i]=x1-2;
112   fTable1[x1-1]=x0-1; //overflow 
113   fTable0[x0-1]=x1-1; //overflow    
114   return;
115 }
116
117 Double_t AliL3TransBit_v2::FindOptimumX0()
118 {
119   //find x0 for which derivation at xder1 is equal 1
120   const Float_t xder1=1;
121   const Float_t dx=0.1;
122
123   Float_t x0=exp(fBit0*log(2.));
124   Float_t x1=exp(fBit1*log(2.));
125   Float_t deriv = 0;
126   Float_t x;
127   for (x=x1;( (x>1)&&(deriv<1)) ;x-=dx)
128     {
129       deriv = (x1-1)/( log(1.+x0/x) *x *(1+xder1/x));
130     }
131   x+=dx/2.;
132   fX0 = x;
133   return fX0;
134 }
135
136 void AliL3TransBit_v2::Update()
137 {
138   //construct lookup tables for loosy compresion from 
139   if (fX0<1) fX0 = FindOptimumX0();  
140   //Float_t x0=(Int_t)rint(exp(fBit0*log(2.)));
141   //Float_t x1=(Int_t)rint(exp(fBit1*log(2.)));
142   Int_t x0=(Int_t)rint(exp(fBit0*log(2.)));
143   Int_t x1=(Int_t)rint(exp(fBit1*log(2.)));
144   
145   //fTable0 - conversion from bit0 coding to bit1 coding
146   if (fTable0!=0) delete fTable0;
147   fTable0= new Int_t[x0];
148
149   //fTable1 - conversion table from bit1 to bit0 coding
150   if (fTable1!=0) delete [] fTable1;
151   fTable1= new Int_t[x1];
152
153   Int_t i;
154
155   for ( i=0; i<x0;i++)
156       fTable0[i] =(Int_t)rint((x1-0.501)*log(1.+Float_t(i)/fX0)/
157                                  log(1.+(x0-1)/fX0));
158
159   Int_t old0=-1;
160   Int_t old1=-1;
161   Int_t new1;
162   for ( i=0; i<x0;i++){
163       new1 = fTable0[i];
164       if (new1!=old1){
165         if (old1>=0) fTable1[old1] =(old0+i)/2;
166         old0 = i;
167         old1 = new1;
168       }
169   }
170   fTable1[old1]=(Int_t)rint((Float_t)(old0+x0)/2);
171   
172   return;
173 }