ALIROOT-5492 Add field to separate HG and LG digits
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDCaloCells.h
CommitLineData
e649177a 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
c8fe2783 16#include <AliVCaloCells.h>
e649177a 17#include <TMath.h>
18
c8fe2783 19class AliESDCaloCells : public AliVCaloCells
e649177a 20{
21 public:
22
e649177a 23 AliESDCaloCells();
c8fe2783 24 AliESDCaloCells(const char* name, const char* title, VCells_t ttype=kUndef);
e649177a 25 AliESDCaloCells(const AliESDCaloCells & cells);
26 AliESDCaloCells & operator=(const AliESDCaloCells& source);
27 virtual ~AliESDCaloCells();
77e93dc2 28
ecff8f07 29 virtual AliVCaloCells * CopyCaloCells(Bool_t all) const;
77e93dc2 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();
e649177a 35
77e93dc2 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
60d77596 41 inline Bool_t GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude, Double_t &time, Int_t &mclabel, Double_t &efrac) const;
dcd7321d 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);
77e93dc2 43
44 Short_t GetNumberOfCells() const { return fNCells ; }
45 void SetNumberOfCells(Int_t n) { fNCells = n ; }
e649177a 46
e649177a 47
e649177a 48 inline Double_t GetCellAmplitude(Short_t cellNumber);
dcd7321d 49 inline Bool_t GetCellHighGain(Short_t cellNumber); //is this cell High Gain
77e93dc2 50 inline Short_t GetCellPosition(Short_t cellNumber);
e649177a 51 inline Double_t GetCellTime(Short_t cellNumber);
77e93dc2 52
e649177a 53 inline Double_t GetAmplitude(Short_t pos) const;
dcd7321d 54 inline Bool_t GetHighGain(Short_t pos) const;
e649177a 55 inline Double_t GetTime(Short_t pos) const;
56 inline Short_t GetCellNumber(Short_t pos) const;
57
77e93dc2 58 // MC & embedding
60d77596 59 inline Int_t GetCellMCLabel(Short_t cellNumber) ;
60 inline Int_t GetMCLabel(Short_t pos) const ;
77e93dc2 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
e649177a 68 protected:
77e93dc2 69
e649177a 70 Int_t fNCells; // Number of cells
dcd7321d 71 Bool_t *fHGLG; //[fNCells] if sell HG or LG
e649177a 72 Short_t *fCellNumber; //[fNCells] array of cell numbers
5a578907 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
60d77596 76 Int_t *fMCLabel; //[fNCells] array of MC labels
e649177a 77 Bool_t fIsSorted; //! true if cell arrays are sorted by index
78 Char_t fType; // Cell type
79
60d77596 80 ClassDef(AliESDCaloCells, 4);
e649177a 81};
82
83
77e93dc2 84Bool_t AliESDCaloCells::GetCell(Short_t pos, Short_t &cellNumber, Double_t &amplitude,
60d77596 85 Double_t & time, Int_t & mclabel, Double_t & efrac) const
e649177a 86{
77e93dc2 87 if (pos>=0 && pos<fNCells)
88 {
e649177a 89 cellNumber = fCellNumber[pos];
77e93dc2 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
e649177a 98 return kTRUE;
77e93dc2 99
100 } else
101 {
e649177a 102 return kFALSE;
103 }
104}
105
e649177a 106Double_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 {
e649177a 117 return 0.;
118 }
119}
120
dcd7321d 121Bool_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
e649177a 136Double_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 {
09037126 147 return -1.;
e649177a 148 }
149}
150
151Double_t AliESDCaloCells::GetAmplitude(Short_t pos) const
152{
153 if (pos>=0 && pos<fNCells) {
154 return fAmplitude[pos];
155 } else {
e649177a 156 return 0.;
157 }
158}
dcd7321d 159Bool_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}
e649177a 167
168Double_t AliESDCaloCells::GetTime(Short_t pos) const
169{
170 if (pos>=0 && pos<fNCells) {
171 return fTime[pos];
172 } else {
77e93dc2 173 return -1.;
e649177a 174 }
175}
176
177Short_t AliESDCaloCells::GetCellNumber(Short_t pos) const
178{
179 if (pos>=0 && pos<fNCells) {
180 return fCellNumber[pos];
181 } else {
e649177a 182 return fNCells;
183 }
184}
185
77e93dc2 186Short_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
60d77596 211Int_t AliESDCaloCells::GetMCLabel(Short_t pos) const
77e93dc2 212{
213 if (pos>=0 && pos<fNCells && fMCLabel) {
214 return fMCLabel[pos];
215 } else {
216 return -1 ;
217 }
218}
219
220Double_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
60d77596 229Int_t AliESDCaloCells::GetCellMCLabel(Short_t cellNumber)
77e93dc2 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
244Double_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
259void 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
270void 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
e649177a 286#endif