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 */
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
13 //-------------------------------------------------------------------------
16 #include <AliVCaloCells.h>
19 class AliESDCaloCells : public AliVCaloCells
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();
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();
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 ; }
41 inline Bool_t GetCell(Short_t pos, Short_t &cellNumber, Double_t &litude, 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);
44 Short_t GetNumberOfCells() const { return fNCells ; }
45 void SetNumberOfCells(Int_t n) { fNCells = n ; }
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);
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;
59 inline Int_t GetCellMCLabel(Short_t cellNumber) ;
60 inline Int_t GetMCLabel(Short_t pos) const ;
62 inline Double_t GetCellEFraction(Short_t cellNumber) ;
63 inline Double_t GetEFraction(Short_t pos) const ;
65 inline void SetEFraction (Short_t pos, Double32_t efrac) ;
66 inline void SetCellEFraction(Short_t cellNumber, Double32_t efrac) ;
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
80 ClassDef(AliESDCaloCells, 5);
84 Bool_t AliESDCaloCells::GetCell(Short_t pos, Short_t &cellNumber, Double_t &litude,
85 Double_t & time, Int_t & mclabel, Double_t & efrac) const
87 if (pos>=0 && pos<fNCells)
89 cellNumber = fCellNumber[pos];
90 amplitude = fAmplitude[pos];
93 if(fMCLabel) mclabel = fMCLabel[pos];
95 if(fEFraction) efrac = fEFraction[pos];
106 Double_t AliESDCaloCells::GetCellAmplitude(Short_t cellNumber)
113 Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
114 if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber ) {
115 return fAmplitude[pos];
121 Bool_t AliESDCaloCells::GetCellHighGain(Short_t cellNumber)
128 Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
129 if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber ) {
132 else //old version of ESD, for data HG flag stored in MCLabel
133 return !(fMCLabel[pos]==-2) ;
139 Double_t AliESDCaloCells::GetCellTime(Short_t cellNumber)
146 Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
147 if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber) {
154 Double_t AliESDCaloCells::GetAmplitude(Short_t pos) const
156 if (pos>=0 && pos<fNCells) {
157 return fAmplitude[pos];
162 Bool_t AliESDCaloCells::GetHighGain(Short_t pos) const
164 if (pos>=0 && pos<fNCells) {
167 else //old version of ESD, for data HG flag stored in MCLabel
168 return !(fMCLabel[pos]==-2) ;
174 Double_t AliESDCaloCells::GetTime(Short_t pos) const
176 if (pos>=0 && pos<fNCells) {
183 Short_t AliESDCaloCells::GetCellNumber(Short_t pos) const
185 if (pos>=0 && pos<fNCells) {
186 return fCellNumber[pos];
192 Short_t AliESDCaloCells::GetCellPosition(Short_t cellNumber)
199 Int_t nabove, nbelow, middle;
202 nabove = fNCells + 1;
204 while (nabove - nbelow > 1) {
205 middle = (nabove + nbelow) / 2;
206 if (cellNumber == fCellNumber[middle-1]) {
210 if (cellNumber < fCellNumber[middle-1]) nabove = middle;
211 else nbelow = middle;
217 Int_t AliESDCaloCells::GetMCLabel(Short_t pos) const
219 if (pos>=0 && pos<fNCells && fMCLabel) {
220 return fMCLabel[pos];
226 Double_t AliESDCaloCells::GetEFraction(Short_t pos) const
228 if (pos>=0 && pos<fNCells && fEFraction) {
229 return fEFraction[pos];
235 Int_t AliESDCaloCells::GetCellMCLabel(Short_t cellNumber)
242 Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
243 if (pos>=0 && fCellNumber[pos] == cellNumber && fMCLabel) {
244 return fMCLabel[pos];
250 Double_t AliESDCaloCells::GetCellEFraction(Short_t cellNumber)
257 Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
258 if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber && fEFraction) {
259 return fEFraction[pos];
265 void AliESDCaloCells::SetEFraction(Short_t pos, Double32_t efrac)
267 // Sets the fraction of energy from MC with respect to data at the given position
269 if (pos>=0 && pos < fNCells)
271 if(!fEFraction) fEFraction = new Double32_t[fNCells];
272 fEFraction[pos] = efrac;
276 void AliESDCaloCells::SetCellEFraction(Short_t cellNumber, Double32_t efrac)
283 Short_t pos = TMath::BinarySearch(fNCells, fCellNumber, cellNumber);
284 if (pos>=0 && pos < fNCells && fCellNumber[pos] == cellNumber)
286 if(!fEFraction) fEFraction = new Double32_t[fNCells];
287 fEFraction[pos] = efrac;