Method GetCellPosition added.
[u/mrichter/AliRoot.git] / STEER / AliAODCaloCells.h
1 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
2  * See cxx source for full Copyright notice                               */
3
4 /* $Id$ */
5
6 //-------------------------------------------------------------------------
7 //     AOD class to store calorimeter cell data
8 //     Author: Markus Oldenburg, CERN
9 //-------------------------------------------------------------------------
10
11 #ifndef ALIAODCELLS_H
12 #define ALIAODCELLS_H
13
14 #include <TNamed.h>
15 #include <TMath.h>
16
17 class AliAODCaloCells : public TNamed 
18 {
19  public:
20   enum AODCells_t {kUndef = -1, 
21                   kEMCAL, 
22                   kPHOS};
23
24   AliAODCaloCells();
25   AliAODCaloCells(const char* name, const char* title, AODCells_t ttype=kUndef);
26   AliAODCaloCells(const AliAODCaloCells& cells); 
27   AliAODCaloCells& operator=(const AliAODCaloCells& cells);
28   
29   virtual ~AliAODCaloCells();
30   
31   void CreateContainer(Short_t nCells);
32   void DeleteContainer();
33   void Sort();
34   
35   Bool_t SetCell(Short_t pos, Short_t cellNumber, Double_t amplitude);
36   
37   Short_t GetNumberOfCells() const { return fNCells; }
38   inline Bool_t   GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude) const;
39   inline Double_t GetCellAmplitude(Short_t cellNumber);
40   inline Short_t  GetCellPosition(Short_t cellNumber);
41   inline Double_t GetAmplitude(Short_t pos) const;
42   inline Short_t  GetCellNumber(Short_t pos) const;
43
44   Char_t  GetType() const { return fType;}
45   void    SetType(AODCells_t ttype) { fType=ttype; }
46
47  protected:
48   Int_t       fNCells;       // Number of cells
49   Short_t    *fCellNumber;   //[fNCells] array of cell numbers
50   Double32_t *fAmplitude;    //[fNCells][0.,0.,16] array with cell amplitudes (= energy!)
51   Bool_t      fIsSorted;     //! true if cell arrays are sorted by index
52   Char_t      fType;         // Cell type
53   
54   
55   ClassDef(AliAODCaloCells, 1);
56 };
57
58
59 Bool_t AliAODCaloCells::GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude) const 
60
61   if (pos>=0 && pos<fNCells) {
62     cellNumber = fCellNumber[pos];
63     amplitude = fAmplitude[pos];
64     return kTRUE;
65   } else {
66     Warning("GetCell","Invalid cell array index %d", pos);
67     return kFALSE;
68   }
69 }
70
71
72 Double_t AliAODCaloCells::GetCellAmplitude(Short_t cellNumber)
73
74   if (!fIsSorted) {
75     Sort();
76     fIsSorted=kTRUE;
77   }
78
79   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
80   if (pos>=0 && fCellNumber[pos] == cellNumber) {
81     return fAmplitude[pos];
82   } else {
83     Warning("GetCellAmplitude","Wrong cell array index %d", pos);
84     return 0.;
85   }
86 }
87
88
89 Double_t AliAODCaloCells::GetAmplitude(Short_t pos) const 
90
91   if (pos>=0 && pos<fNCells) {
92     return fAmplitude[pos];
93   } else {
94     Warning("GetAmplitude","Invalid cell array index %d", pos);
95     return 0.;
96   }
97 }
98
99
100 Short_t AliAODCaloCells::GetCellNumber(Short_t pos) const 
101
102   if (pos>=0 && pos<fNCells) {
103     return fCellNumber[pos];
104   } else {
105     Warning("GetCellNumber","Invalid cell array index %d", pos);
106     return fNCells;
107   }
108 }
109
110 Short_t AliAODCaloCells::GetCellPosition(Short_t cellNumber)
111
112   if (!fIsSorted) {
113     Sort();
114     fIsSorted=kTRUE;
115   }
116
117    Int_t nabove, nbelow, middle;
118    Short_t pos = -1;
119
120    nabove = fNCells + 1;
121    nbelow = 0;
122    while (nabove - nbelow > 1) {
123       middle = (nabove + nbelow) / 2;
124       if (cellNumber == fCellNumber[middle-1]) {
125           pos =   middle - 1;
126           break;
127       }
128       if (cellNumber  < fCellNumber[middle-1]) nabove = middle;
129       else                                     nbelow = middle;
130    }
131
132   return pos;
133 }
134
135
136 #endif