]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSHuffman.cxx
Adding some further mother volumes to speed-up the overlap checking and particle...
[u/mrichter/AliRoot.git] / ITS / AliITSHuffman.cxx
index 2c3cdaac64ef59b57fdbbe0b33a15a99f20571a0..769312b22fa2863724aff658520d25cc9a3ec31e 100644 (file)
@@ -1,55 +1,72 @@
+/**************************************************************************
+ * Copyright(c) 2006-2008, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
 ////////////////////////////////////////////////
+//                                            //
 //  RawData classes for set:ITS               //
+//                                            //
 ////////////////////////////////////////////////
 
 #include <TMath.h>
-
-#include <iostream.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
+#include <TObjArray.h>
+#include <Riostream.h>
 
 #include "AliITSHuffman.h"
-#include "AliITSRawData.h"
 
-ClassImp(AliITSHNode)
+ClassImp(AliITSHuffman)
 
 //_____________________________________________________________________________
 
-AliITSHNode::AliITSHNode()
-{
-  // constructor
-    fLeft=0;
-    fRight=0;
-    fFather=0;
+  AliITSHuffman::AliITSHNode::AliITSHNode(): 
+TObject(),
+fSymbol(),
+fFrequency(0),
+fLeft(),
+fRight(),
+fFather() {
+  // default constructor
 }
 //_____________________________________________________________________________
 
-AliITSHNode::AliITSHNode(UChar_t sym, ULong_t freq)
-{
-  // constructor
-    fSymbol=sym;
-    fFrequency=freq;
-    fLeft=0;
-    fRight=0;
-    fFather=0;
+AliITSHuffman::AliITSHNode::AliITSHNode(UChar_t sym, ULong_t freq):
+TObject(),
+fSymbol(sym),
+fFrequency(freq),
+fLeft(),
+fRight(),
+fFather() {
+  // standard constructor
 }
 
 //__________________________________________________________________________
-AliITSHNode::AliITSHNode(const AliITSHNode &source){
+AliITSHuffman::AliITSHNode::AliITSHNode(const AliITSHNode &source): 
+TObject(source),
+fSymbol(source.fSymbol),
+fFrequency(source.fFrequency),
+fLeft(source.fLeft),
+fRight(source.fRight),
+fFather(source.fFather) {
   //     Copy Constructor 
-  if(&source == this) return;
-  this->fSymbol = source.fSymbol;
-  this->fFrequency = source.fFrequency;
-  this->fLeft = source.fLeft;
-  this->fRight = source.fRight;
-  this->fFather = source.fFather;
   return;
 }
 
 //_________________________________________________________________________
-AliITSHNode& 
-  AliITSHNode::operator=(const AliITSHNode &source) {
+AliITSHuffman::AliITSHNode& 
+  AliITSHuffman::AliITSHNode::operator=(const AliITSHuffman::AliITSHNode &source) {
   //    Assignment operator
   if(&source == this) return *this;
   this->fSymbol = source.fSymbol;
@@ -61,7 +78,7 @@ AliITSHNode&
 }
 
 //____________________________________________
-Int_t AliITSHNode::Compare(TObject *obj)
+Int_t AliITSHuffman::AliITSHNode::Compare(const TObject *obj) const
 {
   // function called by Sort method of TObjArray
 
@@ -72,25 +89,32 @@ Int_t AliITSHNode::Compare(TObject *obj)
          else if (f<fo) return -1;
          else return 0;
 }
-//_____________________________________________________________________________
-
 
-ClassImp(AliITSHTable)
 
 //_____________________________________________________________________________
 
-AliITSHTable::AliITSHTable()
+AliITSHuffman::AliITSHuffman():
+TObject(),
+fSize(0),
+fCodeLen(),
+fCode(),
+fSym(),
+fHNodes(),
+fNnodes(0)
 {
-  // constructor
-    fCodeLen=0;
-    fCode=0;
-    fHNodes=0;
-    fNnodes=0;
+  // default constructor
    
 }
 //_____________________________________________________________________________
 
-AliITSHTable::AliITSHTable(Int_t size)
+AliITSHuffman::AliITSHuffman(Int_t size):
+TObject(),
+fSize(size),
+fCodeLen(),
+fCode(),
+fSym(),
+fHNodes(),
+fNnodes(0)
 {
   //
   // Creates the look-up table for the 1D compression
@@ -98,35 +122,34 @@ AliITSHTable::AliITSHTable(Int_t size)
 
   //initialise
 
-  fSize=size;
   fCodeLen = new UChar_t[fSize]; 
   fCode = new ULong_t[fSize]; 
   fHNodes = new TObjArray;
   fNnodes=0;
   fSym= new Short_t[fSize];
-  for(Short_t i=0;i<fSize;i++) {
+  for (Short_t i=0;i<fSize;i++) {
        fSym[i]=i;
   }
-  Clear(); 
+  ClearTable(); 
 
 }
 
 //__________________________________________________________________________
-AliITSHTable::AliITSHTable(const AliITSHTable &source){
+AliITSHuffman::AliITSHuffman(const AliITSHuffman &source) : 
+TObject(source),
+fSize(source.fSize),
+fCodeLen(source.fCodeLen),
+fCode(source.fCode),
+fSym(source.fSym),
+fHNodes(source.fHNodes),
+fNnodes(source.fNnodes)
+{
   //     Copy Constructor 
-  if(&source == this) return;
-  this->fSize = source.fSize;
-  this->fCodeLen = source.fCodeLen;
-  this->fCode = source.fCode;
-  this->fSym = source.fSym;
-  this->fHNodes = source.fHNodes;
-  this->fNnodes = source.fNnodes;
-  return;
 }
 
 //_________________________________________________________________________
-AliITSHTable
-  AliITSHTable::operator=(const AliITSHTable &source) {
+AliITSHuffman
+  AliITSHuffman::operator=(const AliITSHuffman &source) {
   //    Assignment operator
   if(&source == this) return *this;
   this->fSize = source.fSize;
@@ -139,14 +162,13 @@ AliITSHTable&
 }
 
 //_____________________________________________________________________________
-void AliITSHTable::GetFrequencies(Int_t len, UChar_t *stream)
+void AliITSHuffman::GetFrequencies(Int_t len, UChar_t *stream)
 {
   // get frequencies
-  printf("Get Frequencies: sym %p \n",fSym);
+  printf("Get Frequencies: sym %p \n",(void*)fSym);
 
   // use temporarily the fCode array to store the frequencies
-  Int_t i;
-  for(i=0; i< len; i++) {
+  for (Int_t i=0; i< len; i++) {
       Int_t idx=TMath::BinarySearch(fSize,fSym,(Short_t)stream[i]);
       if (idx == (Int_t)stream[i]) fCode[idx]++;
       // test
@@ -159,18 +181,17 @@ void AliITSHTable::GetFrequencies(Int_t len, UChar_t *stream)
 
 
 //_____________________________________________________________________________
-void AliITSHTable::BuildHTable()
+void AliITSHuffman::BuildHTable()
 {
   // build Htable
 
-  Int_t i;
-  for(i=0; i< fSize; i++) {
+  for (Int_t i=0; i< fSize; i++) {
     //printf("i,fCode[i] %d %d\n",i,(Int_t)fCode[i]);
      if (fCode[i] > 0) {
         fNnodes++;
         cout<< "i fCode[i] fNnodes "<<i<<" "<<fCode[i]<<" "<<fNnodes<<endl;
        //printf("i, fCode[i] fNnodes %d %d %d\n",i,fCode[i],fNnodes);
-        fHNodes->Add(new AliITSHNode((UChar_t)i,fCode[i]));
+        fHNodes->Add(new AliITSHuffman::AliITSHNode((UChar_t)i,fCode[i]));
      }
   }
 
@@ -185,19 +206,19 @@ void AliITSHTable::BuildHTable()
      AliITSHNode *aux = new AliITSHNode(0,0);
      AliITSHNode *node= (AliITSHNode*)fHNodes->UncheckedAt(nindex-1);
      AliITSHNode *node1= (AliITSHNode*)fHNodes->UncheckedAt(nindex);
-     aux->fLeft = node;
-     aux->fRight = node1;
-     aux->fFrequency = node->fFrequency + node1->fFrequency;
-     printf("symbol symbol1 freq freq1 %d %d %d %d\n",(int)node->fSymbol,(int)node1->fSymbol,(int)node->fFrequency,(int)node1->fFrequency);
-     cout << "aux - frequency "<< (Int_t)(aux->fFrequency) <<endl;
+     aux->SetLeft(node);
+     aux->SetRight(node1);
+     aux->SetFrequency(node->GetFrequency() + node1->GetFrequency());
+     printf("symbol symbol1 freq freq1 %d %d %d %d\n",(int)node->GetSymbol(),(int)node1->GetSymbol(),(int)node->GetFrequency(),(int)node1->GetFrequency());
+     cout << "aux - frequency "<< (Int_t)(aux->GetFrequency()) <<endl;
      fHNodes->RemoveAt(nindex-1);
      fHNodes->AddAt(aux,nindex-1);
      nindex--;
-     printf("nindex, obj at nindex %d %p \n",nindex,(AliITSHNode*)fHNodes->UncheckedAt(nindex));
+     printf("nindex, obj at nindex %d %p \n",nindex,(void*)fHNodes->UncheckedAt(nindex));
 
     }
 
-    Clear();
+    ClearTable();
 
     AliITSHNode *start= (AliITSHNode*)fHNodes->UncheckedAt(0);
     SpanTree(start,0,0);
@@ -205,26 +226,28 @@ void AliITSHTable::BuildHTable()
     // check the Huffman table
 
     cout << "...Done, Huffman Table is: \n";
-    Int_t c;
-    for(c=0; c <= 255; c++) {
+    for (int c=0; c <= 255; c++) {
       if (fCodeLen[c] > 0) cout << "Symbol " << c << " Coded as " << fCode[c] << " and long " << (int) fCodeLen[c] << " bits.\n"; 
     }
 
 }
 
 //_____________________________________________________________________________
-AliITSHTable::~AliITSHTable()
+AliITSHuffman::~AliITSHuffman()
 {
   // HTable
     printf("HTable destructor !\n");
     if (fCodeLen) delete[] fCodeLen;
     if (fCode) delete [] fCode;
-    delete fHNodes;
+    if (fHNodes) {
+      fHNodes->Delete();
+      delete fHNodes;
+    }
 }
 
 
 //____________________________________________
-Bool_t AliITSHTable::SpanTree(AliITSHNode *start, ULong_t code, UChar_t len)
+Bool_t AliITSHuffman::SpanTree(AliITSHNode *start, ULong_t code, UChar_t len)
 {
   // span tree
   AliITSHNode * visited;
@@ -232,8 +255,8 @@ Bool_t AliITSHTable::SpanTree(AliITSHNode *start, ULong_t code, UChar_t len)
 
   printf("outside: code, len %d %d\n",(int)code,(int)len);
 
-  Int_t idx=(Int_t)visited->fSymbol;
-  if (!visited->fLeft) {
+  Int_t idx=(Int_t)visited->GetSymbol();
+  if (!visited->GetLeft()) {
        fCode[idx] = code; 
        fCodeLen[idx] = len;
         printf("idx, fCode[idx], fCodeLen[idx] %d %d %d\n",idx,(int)fCode[idx],
@@ -243,16 +266,16 @@ Bool_t AliITSHTable::SpanTree(AliITSHNode *start, ULong_t code, UChar_t len)
 
 // reccursive stuff
 
-  if (SpanTree(visited->fLeft, code << 1, len + 1)) {
+  if (SpanTree(visited->GetLeft(), code << 1, len + 1)) {
           printf("code, len %d %d\n",(int)code,(int)len);
-         if (visited->fRight
-                  SpanTree(visited->fRight, code << 1 | 0x01, len + 1);
+         if (visited->GetRight()
+                  SpanTree(visited->GetRight(), code << 1 | 0x01, len + 1);
   }
   return kTRUE;
 }
 
 //____________________________________________
-void AliITSHTable::ResetHNodes()
+void AliITSHuffman::ResetHNodes()
 {
     //
     // Reset number of HNodes and the HNodes array 
@@ -263,36 +286,10 @@ void AliITSHTable::ResetHNodes()
 }
 
 //_____________________________________________________________________________
-void AliITSHTable::Clear()
+void AliITSHuffman::ClearTable()
 {
   // clear
     memset(fCodeLen,0,sizeof(UChar_t)*fSize);
     memset(fCode,0,sizeof(ULong_t)*fSize);
 }
 
-//___________________________________________________________________________
-void AliITSHTable::Streamer(TBuffer &R__b)
-{
-   // Stream an object of class AliITSHTable.
-
-   if (R__b.IsReading()) {
-      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
-      TObject::Streamer(R__b);
-      R__b >> fSize;
-      R__b.ReadArray(fCodeLen);
-      R__b.ReadArray(fCode);
-      R__b.ReadArray(fSym);
-      R__b >> fHNodes;
-      R__b >> fNnodes;
-   } else {
-      R__b.WriteVersion(AliITSHTable::IsA());
-      TObject::Streamer(R__b);
-      R__b << fSize;
-      R__b.WriteArray(fCodeLen, fSize);
-      R__b.WriteArray(fCode, fSize);
-      R__b.WriteArray(fSym, fSize);
-      R__b << fHNodes;
-      R__b << fNnodes;
-   }
-}
-