ALIROOT-5492 Add field to separate HG and LG digits
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDCaloCells.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 //-------------------------------------------------------------------------
19 //     ESD class to store calorimeter cell data
20 //     Clone of AliAODCaloCells made by Markus Oldenburg, CERN
21 //     Author: Gustavo Conesa Balbastre INFN-LNF
22 //-------------------------------------------------------------------------
23
24 #include "AliESDCaloCells.h"
25
26 ClassImp(AliESDCaloCells)
27
28 //_____________________________________________________
29 AliESDCaloCells::AliESDCaloCells() : 
30   AliVCaloCells(), fNCells(0), fHGLG(0),fCellNumber(0), 
31   fAmplitude(0), fTime(0), fEFraction(0), fMCLabel(0), 
32   fIsSorted(kTRUE), fType(kUndef)
33 {
34   // default constructor
35 }
36 //______________________________________________________________________________________
37  AliESDCaloCells::AliESDCaloCells(const char* name, const char* title, VCells_t ttype) : 
38    AliVCaloCells(name, title), fNCells(0),  fHGLG(0),fCellNumber(0), 
39    fAmplitude(0),  fTime(0), fEFraction(0), fMCLabel(0),
40    fIsSorted(kTRUE), fType(ttype)
41 {
42    // AliVCaloCells constructor
43  }
44
45 //__________________________________________________________
46 AliESDCaloCells::AliESDCaloCells(const AliESDCaloCells& c) : 
47   AliVCaloCells(c), fNCells(c.fNCells),  fHGLG(0), fCellNumber(0), 
48   fAmplitude(0), fTime(0), fEFraction(0), fMCLabel(0),
49   fIsSorted(c.fIsSorted), fType(c.fType)
50 {
51   // copy constructor
52   fHGLG       = new Bool_t[fNCells] ;
53   fCellNumber = new Short_t[fNCells];
54   fAmplitude  = new Double32_t[fNCells];
55   fTime       = new Double32_t[fNCells];
56   fMCLabel    = new Int_t[fNCells];
57   fEFraction  = new Double32_t[fNCells];
58
59   for(Int_t i = 0; i < fNCells; i++)
60   {
61     fHGLG[i]          = c.fHGLG[i];     
62     fCellNumber[i]    = c.fCellNumber[i];
63     fAmplitude[i]     = c.fAmplitude[i];
64     fTime[i]          = c.fTime[i];
65     if(c.fMCLabel)  fMCLabel[i]   = c.fMCLabel[i];
66     if(c.fEFraction)fEFraction[i] = c.fEFraction[i];
67   }
68 }
69
70 //__________________________________________________________________________
71 AliESDCaloCells & AliESDCaloCells::operator =(const AliESDCaloCells& source)  
72 {
73   // assignment operator
74
75   if(this != &source)
76   {
77     AliVCaloCells::operator=(source);
78     
79     if(fNCells != source.fNCells) 
80     {
81       delete [] fHGLG ;
82       delete [] fCellNumber;
83       delete [] fAmplitude;
84       delete [] fTime;
85       delete [] fMCLabel;
86       delete [] fEFraction;
87       
88       fNCells = source.fNCells;
89       
90       fHGLG       = new Bool_t[fNCells] ;
91       fCellNumber = new Short_t[fNCells];
92       fAmplitude  = new Double32_t[fNCells];
93       fTime       = new Double32_t[fNCells];
94       fMCLabel    = new Int_t[fNCells];
95       fEFraction  = new Double32_t[fNCells];
96     }
97     
98     memcpy(fCellNumber,source.fHGLG,fNCells*sizeof(Bool_t));
99     memcpy(fCellNumber,source.fCellNumber,fNCells*sizeof(Short_t));
100     memcpy(fAmplitude, source.fAmplitude, fNCells*sizeof(Double32_t));
101     memcpy(fTime,      source.fTime,      fNCells*sizeof(Double32_t));
102     if(source.fMCLabel   && fMCLabel)   memcpy(fMCLabel,   source.fMCLabel,   fNCells*sizeof(Int_t));
103     if(source.fEFraction && fEFraction) memcpy(fEFraction, source.fEFraction, fNCells*sizeof(Double32_t));
104
105     fIsSorted = source.fIsSorted;
106     fType = source.fType;
107     
108   }
109
110   return *this;
111 }
112
113 //____________________________________________
114 void AliESDCaloCells::Copy(TObject &obj) const 
115 {
116   // this overwrites the virtual TOBject::Copy()
117   // to allow run time copying without casting
118   // in AliESDEvent
119
120   if(this==&obj)return;
121   AliESDCaloCells *robj = dynamic_cast<AliESDCaloCells*>(&obj);
122   if(!robj)return; // not an AliESDCaloCells
123   *robj = *this;
124
125 }
126
127 //______________________________________________________________________
128 AliVCaloCells* AliESDCaloCells::CopyCaloCells(Bool_t all = kTRUE) const
129 {  
130   // copy the calo cells into a new object. If option all=FALSE, just the object type, 
131   // for mixing
132   
133   AliVCaloCells *obj = new AliESDCaloCells();
134   
135   if(all){
136     obj->SetName (GetName()) ; 
137     obj->SetTitle(GetTitle()) ; 
138     obj->SetType (GetType()) ; 
139     
140     obj->SetNumberOfCells(fNCells);
141     for (Short_t i = 0; i < fNCells; i++) 
142     {
143       Int_t mclabel = -1;
144       if(fMCLabel) mclabel = fMCLabel[i];
145       
146       Float_t efrac = 0.;
147       if(fEFraction) efrac = fEFraction[i];
148       
149       obj->SetCell(i,fCellNumber[i],fAmplitude[i],fTime[i],mclabel,efrac);
150     }
151   }
152
153   return obj;
154 }
155
156
157 //_________________________________
158 AliESDCaloCells::~AliESDCaloCells()
159 {
160   // destructor
161
162   DeleteContainer();
163 }
164
165 //__________________________________________
166 void AliESDCaloCells::Clear(const Option_t*)
167 {
168   // clear
169   
170   DeleteContainer();
171 }
172
173
174 //___________________________________________________
175 void AliESDCaloCells::CreateContainer(Short_t nCells)
176 {
177   // function that creates container to store calorimeter cell data
178
179   DeleteContainer();
180   
181   if (nCells <= 0) 
182   {
183     fNCells = 0;
184     return;
185   }
186
187   fNCells = nCells;
188
189   fHGLG       = new Bool_t[fNCells];
190   fCellNumber = new Short_t[fNCells];
191   fAmplitude  = new Double32_t[fNCells];
192   fTime       = new Double32_t[fNCells];
193   fMCLabel    = new Int_t[fNCells];
194   fEFraction  = new Double32_t[fNCells];
195
196   // set to zero
197   for(int i = 0;i<fNCells;++i)
198   {
199     fHGLG[i]=kFALSE ;
200     fAmplitude [i] =  0.; 
201     fCellNumber[i] = -1 ; 
202     fEFraction [i] =  0.;
203     fTime      [i] = -1.;
204     fMCLabel   [i] = -1 ;
205   }
206 }
207
208 //_____________________________________
209 void AliESDCaloCells::DeleteContainer()
210 {
211   // deletes allocated memory
212   if(fHGLG){
213     delete[] fHGLG;
214     fHGLG = 0 ;
215   }
216   
217   if (fCellNumber)
218   {
219     delete[] fCellNumber;
220     fCellNumber = 0;
221   }
222
223   if (fAmplitude)
224   {
225     delete[] fAmplitude;
226     fAmplitude = NULL;
227   }
228
229   if (fTime)
230   {
231     delete[] fTime;
232     fTime = NULL;
233   }
234   
235   if (fMCLabel)
236   {
237     delete[] fMCLabel;
238     fMCLabel = NULL;
239   }
240   
241   if (fEFraction)
242   {
243     delete[] fEFraction;
244     fEFraction = NULL;
245   }
246   
247   fNCells = 0;
248   fIsSorted = kFALSE;
249   
250 }
251
252 //__________________________
253 void AliESDCaloCells::Sort() 
254 {
255   // sort the cell array by cell number
256   
257   Int_t *idxArray = new Int_t[fNCells];
258   TMath::Sort(fNCells,fCellNumber,idxArray,kFALSE);
259   
260   Bool_t     *newHGLG      = new Bool_t[fNCells];
261   Short_t    *newIndex     = new Short_t[fNCells];
262   Double32_t *newAmplitude = new Double32_t[fNCells];
263   Double32_t *newTime      = new Double32_t[fNCells];
264   
265   Int_t    *newMCLabel   = 0 ;
266   Double32_t *newEFraction = 0 ; 
267   if(fMCLabel)   newMCLabel   = new Int_t[fNCells];
268   if(fEFraction) newEFraction = new Double32_t[fNCells];
269     
270   for (Int_t i=0; i < fNCells; i++) 
271   {
272     newHGLG[i]      = fHGLG[idxArray[i]];
273     newIndex[i]     = fCellNumber[idxArray[i]];
274     newAmplitude[i] = fAmplitude [idxArray[i]];
275     newTime[i]      = fTime      [idxArray[i]];
276     if(fMCLabel)   newMCLabel[i]   = fMCLabel  [idxArray[i]];
277     if(fEFraction) newEFraction[i] = fEFraction[idxArray[i]];
278   }
279   
280   delete [] fHGLG;
281   delete [] fCellNumber;
282   delete [] fAmplitude;
283   delete [] fTime;
284   delete [] fMCLabel;
285   delete [] fEFraction;
286
287   fHGLG = newHGLG;
288   fCellNumber = newIndex;
289   fAmplitude  = newAmplitude;
290   fTime       = newTime;
291   if(fMCLabel)   fMCLabel    = newMCLabel;
292   if(fEFraction) fEFraction  = newEFraction;
293
294   delete [] idxArray;
295   
296   fIsSorted = kTRUE;
297
298
299 //________________________________________________________________________________________
300 Bool_t AliESDCaloCells::SetCell(Short_t pos,     Short_t cellNumber, Double32_t amplitude,  
301                                 Double32_t time, Int_t mclabel,    Double32_t efrac, Bool_t isHG)
302 {
303   // Sets a cell at the given position
304
305   if (pos>=0 && pos < fNCells) 
306   {
307     fHGLG[pos]=isHG ;
308     fCellNumber[pos] = cellNumber;
309     fAmplitude[pos]  = amplitude;
310     fTime[pos]       = time;
311     
312     // note: initialize (can't use memset for non-0 values)
313     //       plus sizeof(Double32_t) is 0
314     if(!fMCLabel){
315       fMCLabel   = new Int_t[fNCells];
316
317       for( Int_t i = 0; i < fNCells; i++ )
318         fMCLabel[i] = -1;
319     }
320     if(!fEFraction){
321       fEFraction = new Double32_t[fNCells];
322
323       for( Int_t i = 0; i < fNCells; i++ )
324         fEFraction[i] = 0;
325     }
326
327     fMCLabel[pos]    = mclabel;
328     fEFraction[pos]  = efrac;
329     
330     fIsSorted = kFALSE;
331     
332     return kTRUE;
333     
334   } else {
335     return kFALSE;
336   }
337 }