Line data Source code
1 : #ifndef ALIDIGITS_H
2 : #define ALIDIGITS_H
3 : /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 : * See cxx source for full Copyright notice */
5 :
6 : /* $Id$ */
7 :
8 : /// \class AliDigits
9 : ///
10 : /// Manager class generaol Alice segment digits
11 : /// segment is for example one pad row in TPC
12 :
13 : #include <TArrayI.h>
14 : #include <TArrayS.h>
15 : #include "AliSegmentID.h"
16 : class AliH2F;
17 :
18 : class AliDigits: public AliSegmentID{
19 : public:
20 : AliDigits();
21 : AliDigits(const AliDigits &digits); //copy constructor
22 : AliDigits &operator = (const AliDigits & digits); //assignment operator
23 : virtual ~AliDigits();
24 0 : Short_t * GetDigits(){return fElements->GetArray();} //return row pointer to the array digits
25 : Short_t GetDigitFast(Int_t row, Int_t column); //return value at given row and collumn
26 : Short_t GetDigitUnchecked(Int_t row, Int_t column); //return value at given row and collumn
27 : void SetDigitFast(Short_t value,Int_t row, Int_t column); //set value at given row and collumn
28 : Bool_t BoundsOK(const char *where, Int_t row, Int_t col) ; //Check If Bound Ok
29 : Bool_t OutOfBoundsError(const char *where, Int_t row, Int_t column);
30 : virtual void Allocate(Int_t rows, Int_t columns); //construct empty buffer fDigits with size rows x columns
31 : virtual Short_t GetDigit(Int_t row, Int_t column);
32 : virtual void ExpandBuffer(); //expand buffer to twodimensional array
33 : virtual void CompresBuffer(Int_t bufferType,Int_t threshold); //compres buffer according buffertype algorithm
34 : virtual Bool_t First(); //adjust first valid current digit
35 : virtual Bool_t Next(); //addjust next valid current digit
36 0 : void SetThreshold(Int_t th) {fThreshold = th;} //set threshold
37 0 : Int_t GetThreshold() {return fThreshold;} //return threshold
38 0 : Int_t GetNRows(){return fNrows;}
39 0 : Int_t GetNCols(){return fNcols;}
40 1787466 : Int_t CurrentRow(){ return fCurrentRow;} //return current row
41 2636038 : Int_t CurrentColumn(){ return fCurrentCol;} //return current column
42 2636038 : Int_t CurrentDigit() {return fElements->At(fCurrentIndex);} //return degit for current row and column
43 : void AcceptHisto(AliH2F * his); //update buffer for - it will content histogram values
44 : AliH2F * GenerHisto(); //generate 2 dimensional histogram with digits
45 : AliH2F *DrawDigits( const char *option=0,Float_t x1=-1, Float_t x2=-1, Float_t y1=-1, Float_t y2=-1); //draw digits
46 :
47 : Int_t GetSize();//return total size of object in bytes
48 : Int_t GetDigitSize(); //return total size of pure digits
49 : 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
50 :
51 : inline Short_t * GetDigitsColumn(Int_t row); //return row pointer to the array digits
52 :
53 : protected:
54 : virtual void Invalidate();
55 : void ExpandBuffer1(); //expand buffer of type to twodimensional array
56 : void CompresBuffer1(); //compres buffer according algorithm 1
57 : Bool_t First0(); //first for the buffer type 0
58 : Bool_t Next0(); //next for the buffer type 0
59 : Bool_t First1(); //first for the buffer type 1
60 : Bool_t Next1();//next for the buffer type 1
61 : Short_t GetDigit1(Int_t row, Int_t column); //return digit for given row and column
62 :
63 : Int_t fNrows; ///< number of rows in Segment
64 : Int_t fNcols; ///< number of collumns in Segment
65 : private:
66 : TArrayS *fElements; ///< buffer of 2 bytes integers for digits
67 : TArrayI *fIndex; ///< index position of column
68 : Int_t fBufType; ///< type of the buffer - define compression algorithm
69 : Int_t fThreshold; ///< treshold for zero suppresion
70 : Int_t fNelems; ///< total number of elements
71 : Int_t fCurrentRow; //!<! current row iteration
72 : Int_t fCurrentCol; //!<! current column iteration
73 : Int_t fCurrentIndex; //!<! current index in field
74 :
75 : /// \cond CLASSIMP
76 34 : ClassDef(AliDigits,2)
77 : /// \endcond
78 : };
79 :
80 :
81 :
82 : inline Bool_t AliDigits::BoundsOK(const char *where, Int_t row, Int_t col)
83 : {
84 : /// Check If Bound Ok
85 :
86 0 : if ( (col>=fNcols) || (col<0) ) return OutOfBoundsError(where,row,col);
87 0 : Int_t index =(*fIndex).At(col)+row;
88 0 : if ( (index<0) || (index>fNelems)) return OutOfBoundsError(where,row,col);
89 0 : return kTRUE;
90 0 : }
91 :
92 : inline Short_t AliDigits::GetDigitFast(Int_t row, Int_t column)
93 : {
94 : /// return digit from fDigits array
95 : /// if out of range return dummy value ( value at row = 0, collumn = 0)
96 :
97 4468505642 : return fElements->At(fIndex->At(column)+row);
98 : }
99 :
100 : inline Short_t AliDigits::GetDigitUnchecked(Int_t row, Int_t column)
101 : {
102 : /// return digit from fDigits array
103 : /// if out of range return dummy value ( value at row = 0, collumn = 0)
104 :
105 0 : return fElements->fArray[fIndex->fArray[column]+row];
106 : }
107 :
108 : inline Short_t * AliDigits::GetDigitsColumn(Int_t column){
109 : /// return row pointer to the array digits
110 :
111 0 : return &(fElements->fArray[fIndex->fArray[column]]);
112 : }
113 :
114 :
115 : inline void AliDigits::SetDigitFast(Short_t value, Int_t row, Int_t column)
116 : {
117 : /// set digit
118 :
119 15440552 : if ( (row<0) || (row>=fNrows) || (column<0) || (column>=fNcols) )
120 0 : Error("AliDigits::SetDigitFast", "row %d col %d out of bounds (size: %d x %d, this: 0x%08lx)",
121 0 : row, column, fNrows, fNcols, (ULong_t)this);
122 3860138 : (*fElements)[fIndex->At(column)+row]=value;
123 3860138 : }
124 :
125 : #endif
126 :
|