ALIROOT-5492 Add field to separate HG and LG digits
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDCaloCells.h
1 #ifndef ALIESDCALOCELLS_H
2 #define ALIESDCALOCELLS_H
3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5 /* $Id$ */
6 /* $Log $ */
7
8 //-------------------------------------------------------------------------
9 //     ESD class to store calorimeter cell data
10 //     Clone of AliAODCaloCells made by Markus Oldenburg, CERN
11 //     Author: Gustavo Conesa Balbastre INFN-LNF
12 //
13 //-------------------------------------------------------------------------
14
15
16 #include <AliVCaloCells.h>
17 #include <TMath.h>
18
19 class AliESDCaloCells : public AliVCaloCells
20 {
21  public:
22
23   AliESDCaloCells();
24   AliESDCaloCells(const char* name, const char* title, VCells_t ttype=kUndef);
25   AliESDCaloCells(const AliESDCaloCells & cells);
26   AliESDCaloCells & operator=(const AliESDCaloCells& source);
27   virtual ~AliESDCaloCells();
28   
29   virtual AliVCaloCells * CopyCaloCells(Bool_t all) const;
30   virtual void    Copy(TObject &obj) const;
31   void            Clear(const Option_t*);
32   void            CreateContainer(Short_t nCells);
33   void            DeleteContainer();
34   void            Sort();
35   
36   Bool_t          IsEMCAL()  const { return (fType == kEMCALCell); }
37   Bool_t          IsPHOS()   const { return (fType == kPHOSCell) ; }
38   Char_t          GetType()  const { return  fType               ; }
39   void            SetType(Char_t t){ fType = t                   ; }
40   
41   inline Bool_t   GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude, Double_t &time, Int_t &mclabel,      Double_t &efrac) const;
42   Bool_t          SetCell(Short_t pos, Short_t  cellNumber, Double_t  amplitude, Double_t  time, Int_t  mclabel = -1, Double_t  efrac = 0., Bool_t isHG=kFALSE);
43   
44   Short_t         GetNumberOfCells() const  { return fNCells ; }
45   void            SetNumberOfCells(Int_t n) { fNCells = n    ; }
46   
47   
48   inline Double_t GetCellAmplitude(Short_t cellNumber);
49   inline Bool_t   GetCellHighGain(Short_t cellNumber);  //is this cell High Gain
50   inline Short_t  GetCellPosition(Short_t cellNumber);
51   inline Double_t GetCellTime(Short_t cellNumber);
52   
53   inline Double_t GetAmplitude(Short_t pos) const;
54   inline Bool_t   GetHighGain(Short_t pos) const;
55   inline Double_t GetTime(Short_t pos) const;
56   inline Short_t  GetCellNumber(Short_t pos) const;
57
58   // MC & embedding
59   inline Int_t    GetCellMCLabel(Short_t cellNumber) ;
60   inline Int_t    GetMCLabel(Short_t pos) const ;
61   
62   inline Double_t GetCellEFraction(Short_t cellNumber) ;
63   inline Double_t GetEFraction(Short_t pos) const ;
64   
65   inline void     SetEFraction    (Short_t pos,         Double32_t efrac) ;
66   inline void     SetCellEFraction(Short_t cellNumber,  Double32_t efrac) ;
67   
68  protected:
69   
70   Int_t       fNCells;       // Number of cells
71   Bool_t     *fHGLG;         //[fNCells] if sell HG or LG
72   Short_t    *fCellNumber;   //[fNCells] array of cell numbers
73   Double32_t *fAmplitude;    //[fNCells][0.,0.,16] array with cell amplitudes (= energy!)
74   Double32_t *fTime;         //[fNCells][0.,0.,16] array with cell times
75   Double32_t *fEFraction;    //[fNCells][0.,0.,16] array with fraction of MC energy and data - for embedding
76   Int_t      *fMCLabel;      //[fNCells] array of MC labels
77   Bool_t      fIsSorted;     //! true if cell arrays are sorted by index
78   Char_t      fType;         // Cell type
79
80   ClassDef(AliESDCaloCells, 4);
81 };
82
83
84 Bool_t AliESDCaloCells::GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude, 
85                                 Double_t & time, Int_t & mclabel, Double_t & efrac) const 
86
87   if (pos>=0 && pos<fNCells) 
88   {
89     cellNumber = fCellNumber[pos];
90     amplitude  = fAmplitude[pos];
91     time       = fTime[pos];
92     
93     if(fMCLabel)   mclabel = fMCLabel[pos];
94     else           mclabel =-1 ; 
95     if(fEFraction) efrac   = fEFraction[pos];
96     else           efrac   = 0 ;
97     
98     return kTRUE;
99     
100   } else 
101   {
102     return kFALSE;
103   }
104 }
105
106 Double_t AliESDCaloCells::GetCellAmplitude(Short_t cellNumber)
107
108   if (!fIsSorted) {
109     Sort();
110     fIsSorted=kTRUE;
111   }
112
113   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
114   if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber ) {
115     return fAmplitude[pos];
116   } else {
117     return 0.;
118   }
119 }
120
121 Bool_t AliESDCaloCells::GetCellHighGain(Short_t cellNumber)
122
123   if (!fIsSorted) {
124     Sort();
125     fIsSorted=kTRUE;
126   }
127
128   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
129   if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber ) {
130     return fHGLG[pos];
131   } else {
132     return 0.;
133   }
134 }
135
136 Double_t AliESDCaloCells::GetCellTime(Short_t cellNumber)
137
138   if (!fIsSorted) {
139     Sort();
140     fIsSorted=kTRUE;
141   }
142
143   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
144   if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber) {
145     return fTime[pos];
146   } else {
147     return -1.;
148   }
149 }
150
151 Double_t AliESDCaloCells::GetAmplitude(Short_t pos) const 
152
153   if (pos>=0 && pos<fNCells) {
154     return fAmplitude[pos];
155   } else {
156     return 0.;
157   }
158 }
159 Bool_t AliESDCaloCells::GetHighGain(Short_t pos) const 
160
161   if (pos>=0 && pos<fNCells) {
162     return fHGLG[pos];
163   } else {
164     return 0.;
165   }
166 }
167
168 Double_t AliESDCaloCells::GetTime(Short_t pos) const 
169
170   if (pos>=0 && pos<fNCells) {
171     return fTime[pos];
172   } else {
173     return -1.;
174   }
175 }
176
177 Short_t AliESDCaloCells::GetCellNumber(Short_t pos) const 
178
179   if (pos>=0 && pos<fNCells) {
180     return fCellNumber[pos];
181   } else {
182     return fNCells;
183   }
184 }
185
186 Short_t AliESDCaloCells::GetCellPosition(Short_t cellNumber)
187
188   if (!fIsSorted) {
189     Sort();
190     fIsSorted=kTRUE;
191   }
192   
193   Int_t nabove, nbelow, middle;
194   Short_t pos = -1;
195   
196   nabove = fNCells + 1;
197   nbelow = 0;
198   while (nabove - nbelow > 1) {
199     middle = (nabove + nbelow) / 2;
200     if (cellNumber == fCellNumber[middle-1]) {
201       pos =   middle - 1;
202       break;
203     }
204     if (cellNumber  < fCellNumber[middle-1]) nabove = middle;
205     else                                     nbelow = middle;
206   }
207   
208   return pos;
209 }
210
211 Int_t AliESDCaloCells::GetMCLabel(Short_t pos) const 
212
213   if (pos>=0 && pos<fNCells && fMCLabel) {
214     return fMCLabel[pos];
215   } else {
216     return -1 ;
217   }
218 }
219
220 Double_t AliESDCaloCells::GetEFraction(Short_t pos) const 
221
222   if (pos>=0 && pos<fNCells && fEFraction) {
223     return fEFraction[pos];
224   } else {
225     return 0.;
226   }
227 }
228
229 Int_t AliESDCaloCells::GetCellMCLabel(Short_t cellNumber)
230
231   if (!fIsSorted) {
232     Sort();
233     fIsSorted=kTRUE;
234   }
235   
236   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
237   if (pos>=0 && fCellNumber[pos] == cellNumber && fMCLabel) {
238     return fMCLabel[pos];
239   } else {
240     return -1;
241   }
242 }
243
244 Double_t AliESDCaloCells::GetCellEFraction(Short_t cellNumber)
245
246   if (!fIsSorted) {
247     Sort();
248     fIsSorted=kTRUE;
249   }
250   
251   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
252   if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber && fEFraction) {
253     return fEFraction[pos];
254   } else {
255     return 0.;
256   }
257 }
258
259 void AliESDCaloCells::SetEFraction(Short_t pos,  Double32_t efrac)
260 {
261   // Sets the fraction of energy from MC with respect to data at the given position
262   
263   if (pos>=0 && pos < fNCells) 
264   {
265     if(!fEFraction) fEFraction = new Double32_t[fNCells];
266     fEFraction[pos]  = efrac;
267   } 
268 }
269
270 void AliESDCaloCells::SetCellEFraction(Short_t cellNumber, Double32_t efrac)
271
272   if (!fIsSorted) {
273     Sort();
274     fIsSorted=kTRUE;
275   }
276   
277   Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
278   if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber) 
279   {
280     if(!fEFraction) fEFraction = new Double32_t[fNCells];
281     fEFraction[pos] = efrac;
282   } 
283 }
284
285
286 #endif