ROOT logo
#ifndef ALIDIGITS_H
#define ALIDIGITS_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

////////////////////////////////////////////////
//  Manager class generaol Alice segment digits
//  segment is for example one pad row in TPC //
////////////////////////////////////////////////

#include   <TArrayI.h>
#include   <TArrayS.h>
#include   "AliSegmentID.h"
class AliH2F;

class AliDigits: public AliSegmentID{ 
public:
  AliDigits();
  AliDigits(const AliDigits &digits); //copy constructor
  AliDigits &operator = (const AliDigits & digits); //assignment operator
  virtual ~AliDigits();
  Short_t * GetDigits(){return fElements->GetArray();}   //return row  pointer to the array digits
  Short_t GetDigitFast(Int_t row, Int_t column);  //return value at given row and collumn
  Short_t GetDigitUnchecked(Int_t row, Int_t column);  //return value at given row and collumn
  void  SetDigitFast(Short_t value,Int_t row, Int_t column);  //set value at given row and collumn
  Bool_t BoundsOK(const char *where, Int_t row, Int_t col) ;  //Check If Bound Ok
  Bool_t OutOfBoundsError(const char *where, Int_t row, Int_t column);
  virtual void Allocate(Int_t rows, Int_t columns);  //construct empty buffer fDigits with size rows x columns
  virtual Short_t GetDigit(Int_t row, Int_t column);
  virtual void ExpandBuffer();  //expand buffer to twodimensional array
  virtual void CompresBuffer(Int_t bufferType,Int_t threshold); //compres buffer according buffertype algorithm   
  virtual Bool_t First(); //adjust  first valid current digit
  virtual Bool_t Next();  //addjust next valid current digit
  void SetThreshold(Int_t th) {fThreshold = th;} //set threshold
  Int_t  GetThreshold() {return fThreshold;}  //return threshold    
  Int_t GetNRows(){return fNrows;}
  Int_t GetNCols(){return fNcols;}
  Int_t CurrentRow(){ return fCurrentRow;}  //return current row
  Int_t CurrentColumn(){ return fCurrentCol;} //return current column
  Int_t CurrentDigit() {return fElements->At(fCurrentIndex);} //return degit for current row and column
  void AcceptHisto(AliH2F * his);  //update buffer for - it will content histogram values
  AliH2F * GenerHisto();           //generate 2 dimensional histogram with digits
  AliH2F *DrawDigits( const char *option=0,Float_t x1=-1, Float_t x2=-1, Float_t y1=-1, Float_t y2=-1); //draw digits
  
  Int_t GetSize();//return total size of object in bytes
  Int_t GetDigitSize(); //return total size of pure digits 
  Int_t GetOverTh(Float_t threshold,Float_t x1=-1, Float_t x2=-1, Float_t y1=-1, Float_t y2=-1); //return number of digits over threshold 

  inline Short_t * GetDigitsColumn(Int_t row);                              //return row  pointer to the array digits

protected:
  virtual  void Invalidate();  
  void ExpandBuffer1(); //expand buffer of type to twodimensional array
  void CompresBuffer1(); //compres buffer according  algorithm 1
  Bool_t First0();  //first for the buffer type 0
  Bool_t Next0();  //next for the buffer type 0
  Bool_t First1(); //first for the buffer type 1
  Bool_t Next1();//next for the buffer type 1
  Short_t  GetDigit1(Int_t row, Int_t column); //return digit for given row and column
 
  Int_t     fNrows;   //number of rows in Segment
  Int_t     fNcols; //number of collumns in Segment 
private:
  TArrayS *fElements;  //buffer of 2 bytes integers for digits
  TArrayI *fIndex;  //index position of column
  Int_t     fBufType; //type of the buffer - define compression algorithm  
  Int_t     fThreshold; //treshold for zero suppresion
  Int_t     fNelems;  //total number of elements 
  Int_t fCurrentRow;   //!current row  iteration
  Int_t fCurrentCol;   //!current column iteration
  Int_t fCurrentIndex; //!current index in field
 
  ClassDef(AliDigits,2) 
};
 


inline Bool_t AliDigits::BoundsOK(const char *where, Int_t row, Int_t col) 
{
  //Check If Bound Ok
  if ( (col>=fNcols) || (col<0) ) return OutOfBoundsError(where,row,col);
  Int_t index =(*fIndex).At(col)+row;
  if ( (index<0) || (index>fNelems)) return OutOfBoundsError(where,row,col);
  return kTRUE;  
}

inline Short_t AliDigits::GetDigitFast(Int_t row, Int_t column)
{
  //
  //return digit from  fDigits array
  //if out of range return dummy value  ( value at row = 0, collumn = 0)
  //
  return fElements->At(fIndex->At(column)+row); 
}

inline Short_t AliDigits::GetDigitUnchecked(Int_t row, Int_t column)
{
  //
  //return digit from  fDigits array
  //if out of range return dummy value  ( value at row = 0, collumn = 0)
  //
  return fElements->fArray[fIndex->fArray[column]+row]; 
}

inline Short_t * AliDigits::GetDigitsColumn(Int_t column){
  //
  //return row  pointer to the array digits
  //
  return &(fElements->fArray[fIndex->fArray[column]]);
}


inline void  AliDigits::SetDigitFast(Short_t value, Int_t row, Int_t column)
{
  //
  //set  digit 
  //
  if ( (row<0) || (row>=fNrows)  || (column<0) || (column>=fNcols) ) 
       Error("AliDigits::SetDigitFast", "row %d  col %d out of bounds (size: %d x %d, this: 0x%08lx)", 
	     row, column, fNrows, fNcols, (ULong_t)this);
  (*fElements)[fIndex->At(column)+row]=value; 
}

#endif

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