]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliTPCCompression.cxx
Automatic calculation of the paramters of the hough space. Optimization of the hough...
[u/mrichter/AliRoot.git] / RAW / AliTPCCompression.cxx
index c4080c4bdf459c761d2f2967b8ce9cb5f5bbf9ec..d127128391194b18c4a2e9a96358083d2963bd71 100644 (file)
@@ -27,8 +27,9 @@
 #include <Riostream.h>
 #include <TMath.h>
 #include <TSystem.h>
-#include "AliTPCBuffer160.h"
-#include "AliTPCHuffman.h"
+#include "AliAltroBuffer.h"
+#include "AliTPCHNode.h"
+#include "AliTPCHTable.h"
 #include "AliTPCCompression.h"
 
 ClassImp(AliTPCCompression)
@@ -128,7 +129,7 @@ void AliTPCCompression::NextTable(Int_t Val,Int_t &NextTableType,Int_t &BunchLen
 
 Int_t AliTPCCompression::FillTables(const char* fSource,AliTPCHTable* table[],Int_t /*NumTables*/){
   //This method is used to compute the frequencies of the symbols in the source file
-  AliTPCBuffer160 buff(fSource,0);
+  AliAltroBuffer buff(fSource,0);
   UInt_t countWords=0;
   UInt_t countTrailer=0;
   Int_t numWords,padNum,rowNum,secNum=0;
@@ -136,7 +137,7 @@ Int_t AliTPCCompression::FillTables(const char* fSource,AliTPCHTable* table[],In
   UInt_t stat[5]={0,0,0,0,0};
   Int_t endFill=0;
   Int_t end=1;
-  while(buff.ReadTrailerBackward(numWords,padNum,rowNum,secNum) !=-1 ){
+  while(buff.ReadTrailerBackward(numWords,padNum,rowNum,secNum)){
     if(end){
       endFill=buff.GetFillWordsNum();
       end=0;
@@ -269,40 +270,40 @@ Int_t AliTPCCompression::CreateTableFormula(Double_t beta,UInt_t M,Int_t dim,Int
   Double_t sum=0;
   Double_t min=10;
   Double_t alpha=0;
-  Double_t A=0;
-  AliTPCHTable *Table=new AliTPCHTable(dim);
+  Double_t a=0;
+  AliTPCHTable *table=new AliTPCHTable(dim);
   
   freq=1;
-  Double_t FreqArray[1024];
+  Double_t freqArray[1024];
   for(Int_t i=0;i<1024;i++){
-    FreqArray[i]=0;
+    freqArray[i]=0;
   }
   alpha=M*0.000000602+0.0104;
   if (fVerbose)
     cout<<"alpha "<<alpha<<endl;
   for(Int_t x=0;x<dim;x++){
     if (Type==1)
-      FreqArray[x]=TMath::Power((x+1),-beta)*TMath::Exp(-alpha*(x+1));
+      freqArray[x]=TMath::Power((x+1),-beta)*TMath::Exp(-alpha*(x+1));
     else
-      FreqArray[x]=TMath::Power((x+1),-beta);
-    sum+=FreqArray[x];
-    if (FreqArray[x]<min)min=FreqArray[x];
+      freqArray[x]=TMath::Power((x+1),-beta);
+    sum+=freqArray[x];
+    if (freqArray[x]<min)min=freqArray[x];
   }//end for
   if (fVerbose)
     cout<<"Minimun Value "<<min<<endl;
-  A=1/sum;
+  a=1/sum;
   if (fVerbose)
-    cout<<"A Value: "<<A<<endl;
+    cout<<"a Value: "<<a<<endl;
   for(Int_t x=0;x<dim;x++){
     if (Type==0)//Bunch length
       if (x>=3)//minimum bunch length
-       Table->SetValFrequency(x,A*FreqArray[x]*1000);
+       table->SetValFrequency(x,a*freqArray[x]*1000);
       else
-       Table->SetValFrequency(x,0);
+       table->SetValFrequency(x,0);
     else //Time table
-      Table->SetValFrequency(x,A*FreqArray[x]);
+      table->SetValFrequency(x,a*freqArray[x]);
   }
-  Table->BuildHTable();
+  table->BuildHTable();
   ofstream fTable;
   char filename[15];
   sprintf(filename,"Table%d.dat",Type); 
@@ -311,18 +312,18 @@ Int_t AliTPCCompression::CreateTableFormula(Double_t beta,UInt_t M,Int_t dim,Int
 #else
   fTable.open(filename);
 #endif
-  Int_t dimTable=Table->Size();
+  Int_t dimTable=table->Size();
   //Table dimension is written into a file
   fTable.write((char*)(&dimTable),sizeof(Int_t));
   //One table is written into a file
   for(Int_t i=0;i<dimTable;i++){
-    UChar_t CodeLen=Table->CodeLen()[i];
-    Double_t Code=Table->Code()[i];
-    fTable.write((char*)(&CodeLen),sizeof(UChar_t));
-    fTable.write((char*)(&Code),sizeof(Double_t));
+    UChar_t codeLen=table->CodeLen()[i];
+    Double_t code=table->Code()[i];
+    fTable.write((char*)(&codeLen),sizeof(UChar_t));
+    fTable.write((char*)(&code),sizeof(Double_t));
   } //end for
   fTable.close();
-  delete Table;
+  delete table;
   return 0;
 }
 ////////////////////////////////////////////////////////////////////////////////////////
@@ -614,7 +615,7 @@ Int_t AliTPCCompression::CompressDataOptTables(Int_t NumTable,const char* fSourc
   f.open(fDest,ios::out);
 #endif
   // Source file is open
-  AliTPCBuffer160 buff(fSource,0);
+  AliAltroBuffer buff(fSource,0);
   //coded words are written into a file
   Int_t numWords,padNum,rowNum,secNum=0;
   UInt_t  storedWords=0;
@@ -629,7 +630,7 @@ Int_t AliTPCCompression::CompressDataOptTables(Int_t NumTable,const char* fSourc
   fStat<<endl;
   fStat<<"-------------------COMPRESSION STATISTICS----------"<<endl;
   Int_t end=1;
-  while(buff.ReadTrailerBackward(numWords,padNum,rowNum,secNum) !=-1 ){
+  while(buff.ReadTrailerBackward(numWords,padNum,rowNum,secNum)){
     if(end){
       fillWords=buff.GetFillWordsNum();
       end=0;
@@ -891,8 +892,9 @@ UInt_t AliTPCCompression::ReadWord(Int_t NumberOfBit){
       f.read((char*)(&fBuffer),sizeof(UInt_t));
       fReadBits=0;
     }//end if
-    UInt_t mask=0;
-    mask=(UInt_t)TMath::Power(2,fReadBits);
+    //    UInt_t mask=0;
+    //    mask=(UInt_t)TMath::Power(2,fReadBits);
+    UInt_t mask=(UInt_t)(1<<fReadBits);
     bit=fBuffer&mask;
     bit=bit>>fReadBits;
     fReadBits++;
@@ -908,34 +910,40 @@ UInt_t AliTPCCompression::ReadWordBuffer(Int_t NumberOfBit){
   UInt_t bit=0;
   for (Int_t i=0;i<NumberOfBit;i++){
     if (fReadBits==32){
-      fPointBuffer-=8;
-      fBuffer=0;
-      for(Int_t i=0;i<4;i++){
-       UInt_t val=0;
-       val=*fPointBuffer;
-       val&=0xFF;
-       fPointBuffer++;
-       val<<=8*i;
-       fBuffer=fBuffer|val;
-      }//end for
+      fPointBuffer--;
+      fBuffer=*fPointBuffer;
       fReadBits=0;
     }//end if
-    UInt_t mask=0;
-    mask=(UInt_t)TMath::Power(2,fReadBits);
-    bit=fBuffer&mask;
-    bit=bit>>fReadBits;
-    fReadBits++;
+    bit=fBuffer&0x1;
     bit=bit<<i;
     result=result|bit;
+    fReadBits++;
+    fBuffer=fBuffer>>1;
   }//end for
   return result;
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////////////
+inline UInt_t AliTPCCompression::ReadBitFromWordBuffer(){
+  //This method retrieves a word of a specific number of bits from the file through the buffer 
+  UInt_t result=0;
+
+  if (fReadBits==32){
+    fPointBuffer--;
+    fBuffer=*fPointBuffer;
+    fReadBits=0;
+  }//end if
+  result=fBuffer&0x1;
+  fReadBits++;
+  fBuffer=fBuffer>>1;
+  return result;
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////////////
 void AliTPCCompression::ReadTrailer(Int_t &WordsNumber,Int_t &PadNumber,Int_t &RowNumber,Int_t &SecNumber,Bool_t Memory){
   //It retrieves a trailer 
   if(Memory){
-    ReadWordBuffer(1);
+    ReadBitFromWordBuffer();
     SecNumber=ReadWordBuffer(9);
     RowNumber=ReadWordBuffer(10);
     PadNumber=ReadWordBuffer(10);
@@ -951,17 +959,34 @@ void AliTPCCompression::ReadTrailer(Int_t &WordsNumber,Int_t &PadNumber,Int_t &R
   return;
 }
 //////////////////////////////////////////////////////////////////////////////////////////////////
-UInt_t AliTPCCompression::GetDecodedWord(AliTPCHNode* root,Bool_t Memory){
+inline UInt_t AliTPCCompression::GetDecodedWordBuffer(AliTPCHNode* root){
   //This method retrieves a decoded word.
   AliTPCHNode *node=root;
   UInt_t symbol=0;
   Bool_t decoded=0;
+
   while(!decoded){
-    UInt_t bit=0;
-    if(Memory)
-      bit=ReadWordBuffer(1);
+    UInt_t bit=ReadBitFromWordBuffer();
+    if(bit)
+      node=node->GetRight();
     else
-      bit=ReadWord(1);
+      node=node->GetLeft();
+    if (!(node->GetLeft())){
+      symbol=node->GetSymbol();
+      decoded=1;
+    }
+  }//end while
+  return symbol;
+}
+
+inline UInt_t AliTPCCompression::GetDecodedWord(AliTPCHNode* root){
+  //This method retrieves a decoded word.
+  AliTPCHNode *node=root;
+  UInt_t symbol=0;
+  Bool_t decoded=0;
+
+  while(!decoded){
+    UInt_t bit=ReadWord(1);
     if(bit)
       node=node->GetRight();
     else
@@ -971,6 +996,7 @@ UInt_t AliTPCCompression::GetDecodedWord(AliTPCHNode* root,Bool_t Memory){
       decoded=1;
     }
   }//end while
+
   return symbol;
 }
 //////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1021,7 +1047,7 @@ Int_t AliTPCCompression::DecompressDataOptTables(Int_t NumTables,const char* fna
   if(fVerbose){
     cout<<"Number of Packect: "<<packetNumber<<endl;
   }
-  AliTPCBuffer160 bufferFile(fDest,1);
+  AliAltroBuffer bufferFile(fDest,1);
   UInt_t k=0;
   UInt_t wordsRead=0; //number of read coded words 
   while(k<packetNumber){
@@ -1035,7 +1061,7 @@ Int_t AliTPCCompression::DecompressDataOptTables(Int_t NumTables,const char* fna
     Int_t bunchLen=0;
     Int_t count=0;
     for(Int_t i=0;i<numWords;i++){
-      UInt_t symbol=GetDecodedWord(rootNode[nextTableType],kFALSE);
+      UInt_t symbol=GetDecodedWord(rootNode[nextTableType]);
       wordsRead++;
       //Time reconstruction
       if (nextTableType==1){
@@ -1072,23 +1098,16 @@ Int_t AliTPCCompression::DecompressDataOptTables(Int_t NumTables,const char* fna
 Int_t AliTPCCompression::Decompress(AliTPCHNode *RootNode[],Int_t /*NumTables*/,char* PointBuffer,UInt_t BufferSize,UShort_t out[],UInt_t &dim){
   //This method decompress a file using separate Huffman tables
 
-  fPointBuffer=PointBuffer+BufferSize-4;
+  //  fPointBuffer=((UInt_t *)PointBuffer)+(UInt_t)(BufferSize/4)-1;
+  fPointBuffer=(UInt_t *)(PointBuffer+BufferSize-4);
   fReadBits=0;
   fBuffer=0;
   
-  for(Int_t i=0;i<4;i++){
-    UInt_t val=0;
-    val=*fPointBuffer;
-    val&=0xFF;
-    fPointBuffer++;
-    val<<=8*i;
-    fBuffer=fBuffer|val;
-  }//end for
+  fBuffer=*fPointBuffer;
   Int_t bit=0;
-  UInt_t mask=0x1;
   while(!bit){
-    bit=fBuffer&mask;
-    mask=mask<<1;
+    bit=fBuffer&0x1;
+    fBuffer=fBuffer>>1;
     fReadBits++;
   }//end while
   UInt_t packetNumber=ReadWordBuffer(sizeof(UInt_t)*8); //32 bits
@@ -1120,7 +1139,7 @@ Int_t AliTPCCompression::Decompress(AliTPCHNode *RootNode[],Int_t /*NumTables*/,
     Int_t count=0;
     Int_t timeDigit=0;
     for(Int_t i=0;i<numWords;i++){
-      UInt_t symbol=GetDecodedWord(RootNode[nextTableType],kTRUE);
+      UInt_t symbol=GetDecodedWordBuffer(RootNode[nextTableType]);
       wordsRead++;
       //Time reconstruction
       if (nextTableType==1){
@@ -1174,11 +1193,11 @@ void AliTPCCompression::ReadAltroFormat(char* fileOut,char* fileIn)const{
   //Time bin of the last amplitude sample in the bunch, amplitude values)
   //It is used mainly for debugging
   ofstream ftxt(fileOut);
-  AliTPCBuffer160 buff(fileIn,0);
+  AliAltroBuffer buff(fileIn,0);
   Int_t numWords,padNum,rowNum,secNum=0;
   Int_t value=0;
   if (fVerbose) cout<<"Creating a txt file from an Altro Format file"<<endl;
-  while(buff.ReadTrailerBackward(numWords,padNum,rowNum,secNum) !=-1 ){
+  while(buff.ReadTrailerBackward(numWords,padNum,rowNum,secNum)){
     ftxt<<"S:"<<secNum<<" R:"<<rowNum<<" P:"<<padNum<<" W:"<<numWords<<endl;
     if (numWords%4){
       for(Int_t j=0;j<(4-numWords%4);j++){