Coverity fix
[u/mrichter/AliRoot.git] / PHOS / AliPHOSDigit.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 /* History of cvs commits:
19  *
20  * $Log$
21  * Revision 1.39  2006/04/22 15:04:24  hristov
22  * Effective C++ initialization of data members in the default constructor
23  *
24  * Revision 1.38  2006/04/22 10:30:17  hristov
25  * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
26  *
27  * Revision 1.37  2005/05/28 14:19:04  schutz
28  * Compilation warnings fixed by T.P.
29  *
30  */
31
32 //_________________________________________________________________________
33 //  PHOS digit: Id
34 //              energy
35 //              3 identifiers for the primary particle(s) at the origine of the digit
36 //  The digits are made in FinishEvent() by summing all the hits in a single PHOS crystal or PPSD gas cell
37 //
38 //*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
39
40
41 // --- ROOT system ---
42
43 #include "TMath.h"
44
45 // --- Standard library ---
46
47 // --- AliRoot header files ---
48
49 #include "AliPHOSDigit.h"
50 #include "AliLog.h"
51
52
53
54 ClassImp(AliPHOSDigit)
55
56 //____________________________________________________________________________
57 AliPHOSDigit::AliPHOSDigit() :
58   AliDigitNew(),
59   fNprimary(0),  
60   fPrimary(0x0),
61   fEnergy(0.),
62   fTime(0.),
63   fTimeR(0.),
64   fNSamplesHG(0),
65   fNSamplesLG(0),
66   fSamplesHG(0),
67   fSamplesLG(0)
68 {
69   // default ctor 
70 }
71
72 //____________________________________________________________________________
73 AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Int_t digEnergy, Float_t time, Int_t index) :
74   fNprimary(0),
75   fPrimary(0),
76   fEnergy(0.f),
77   fTime(0.f),
78   fTimeR(0.f),
79   fNSamplesHG(0),
80   fNSamplesLG(0),
81   fSamplesHG(0),
82   fSamplesLG(0)
83 {  
84   // ctor with all data 
85
86   fAmp         = digEnergy ;
87   fEnergy      = 0 ;
88   fTime        = time ;
89   fTimeR       = fTime ;
90   fId          = id ;
91   fIndexInList = index ; 
92   if( primary != -1){
93     fNprimary    = 1 ; 
94     fPrimary = new Int_t[fNprimary] ;
95     fPrimary[0]  = primary ;
96   }
97   else{  //If the contribution of this primary smaller than fDigitThreshold (AliPHOSv1)
98     fNprimary = 0 ; 
99     fPrimary  = 0 ;
100   }
101 }
102
103 //____________________________________________________________________________
104 AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Float_t energy, Float_t time, Int_t index) :
105   fNprimary(0),
106   fPrimary(0),
107   fEnergy(0.f),
108   fTime(0.f),
109   fTimeR(0.f),
110   fNSamplesHG(0),
111   fNSamplesLG(0),
112   fSamplesHG(0),
113   fSamplesLG(0)
114 {  
115   // ctor with all data 
116
117   fAmp         = 0 ;
118   fEnergy      = energy ;
119   fTime        = time ;
120   fTimeR       = fTime ;
121   fId          = id ;
122   fIndexInList = index ; 
123   if( primary != -1){
124     fNprimary    = 1 ; 
125     fPrimary = new Int_t[fNprimary] ;
126     fPrimary[0]  = primary ;
127   }
128   else{  //If the contribution of this primary smaller than fDigitThreshold (AliPHOSv1)
129     fNprimary = 0 ; 
130     fPrimary  = 0 ;
131   }
132 }
133
134 //____________________________________________________________________________
135 AliPHOSDigit::AliPHOSDigit(const AliPHOSDigit & digit) : 
136   AliDigitNew(digit),
137   fNprimary(digit.fNprimary),
138   fPrimary(0),
139   fEnergy(digit.fEnergy),
140   fTime(digit.fTime),
141   fTimeR(digit.fTimeR),
142   fNSamplesHG(0),
143   fNSamplesLG(0),
144   fSamplesHG(0),
145   fSamplesLG(0)
146 {
147   // copy ctor
148   if(fNprimary){
149     fPrimary = new Int_t[fNprimary] ;
150     for (Int_t i = 0; i < fNprimary ; i++)
151        fPrimary[i]  = digit.fPrimary[i] ;
152   }
153   else
154     fPrimary = 0 ;
155   fAmp         = digit.fAmp ;
156   fId          = digit.fId;
157   fIndexInList = digit.fIndexInList ; 
158 }
159
160 //____________________________________________________________________________
161 AliPHOSDigit::~AliPHOSDigit() 
162 {
163   // Delete array of primaries if any
164   if (fPrimary)   delete [] fPrimary  ;
165   // Delete arrays of ALTRO samples if any
166   if (fSamplesHG) delete [] fSamplesHG;
167   if (fSamplesLG) delete [] fSamplesLG;
168 }
169
170 //____________________________________________________________________________
171 Int_t AliPHOSDigit::Compare(const TObject * obj) const
172 {
173   // Compares two digits with respect to its Id
174   // to sort according increasing Id
175
176   Int_t rv ;
177
178   AliPHOSDigit * digit = (AliPHOSDigit *)obj ; 
179
180   Int_t iddiff = fId - digit->GetId() ; 
181
182   if ( iddiff > 0 ) 
183     rv = 1 ;
184   else if ( iddiff < 0 )
185     rv = -1 ; 
186   else
187     rv = 0 ;
188   
189   return rv ; 
190
191 }
192
193 //____________________________________________________________________________
194 Int_t AliPHOSDigit::GetPrimary(Int_t index) const
195 {
196   // retrieves the primary particle number given its index in the list 
197   Int_t rv = -1 ;
198   if ( index <= fNprimary && index > 0){
199     rv = fPrimary[index-1] ;
200   } 
201
202   return rv ; 
203   
204 }
205
206 //____________________________________________________________________________
207 void AliPHOSDigit::SetALTROSamplesHG(Int_t nSamplesHG, Int_t *samplesHG)
208 {
209   fNSamplesHG = nSamplesHG;
210   if (fSamplesHG) delete [] fSamplesHG;
211   fSamplesHG = new UShort_t[fNSamplesHG];
212   UShort_t i;
213   for (i=0; i<fNSamplesHG; i++) {
214     fSamplesHG[i] = samplesHG[i];
215   }
216 }
217 //____________________________________________________________________________
218 void AliPHOSDigit::SetALTROSamplesLG(Int_t nSamplesLG, Int_t *samplesLG)
219 {
220   fNSamplesLG = nSamplesLG;
221   if (fSamplesLG) delete [] fSamplesLG;
222   fSamplesLG = new UShort_t[fNSamplesLG];
223   UShort_t i;
224   for (i=0; i<fNSamplesLG; i++) {
225     fSamplesLG[i] = samplesLG[i];
226   }
227 }
228 //____________________________________________________________________________
229 void AliPHOSDigit::Print(const Option_t *) const
230 {
231   // Print the digit together with list of primaries
232   TString line = Form("PHOS digit: E=%.3f, Id=%d, Time=%.3e, TimeR=%.3e, NPrim=%d, nHG=%d, nLG=%d \n",
233                       fEnergy,fId,fTime,fTimeR,fNprimary,fNSamplesHG,fNSamplesLG);
234   line += "\tList of primaries: ";
235   for (Int_t index = 0; index <fNprimary; index ++ )
236     line += Form(" %d ",fPrimary[index]); 
237   line += "\n";
238   line += "\tSamples HG: ";
239   for (Int_t i = 0; i <fNSamplesHG; i++)
240     line += Form(" %d ",fSamplesHG[i]); 
241   line += "\n";
242   line += "\tSamples LG: ";
243   for (Int_t i = 0; i <fNSamplesLG; i++)
244     line += Form(" %d ",fSamplesLG[i]); 
245   line += "\n";
246   AliDebug(2,line);
247 }
248 //____________________________________________________________________________
249 void AliPHOSDigit::ShiftPrimary(Int_t shift)
250 {
251   //shifts primary number to BIG offset, to separate primary in different TreeK
252   for(Int_t index = 0; index <fNprimary; index ++ ){
253     fPrimary[index]+= shift ;
254   } 
255 }
256 //____________________________________________________________________________
257 Bool_t AliPHOSDigit::operator==(AliPHOSDigit const & digit) const 
258 {
259   // Two digits are equal if they have the same Id
260   
261   if ( fId == digit.fId ) 
262     return kTRUE ;
263   else 
264     return kFALSE ;
265 }
266  
267 //____________________________________________________________________________
268 AliPHOSDigit& AliPHOSDigit::operator+=(AliPHOSDigit const & digit) 
269 {
270
271   // Adds the amplitude of digits and completes the list of primary particles
272   if(digit.fNprimary>0){
273      Int_t *tmp = new Int_t[fNprimary+digit.fNprimary] ;
274      if(fAmp < digit.fAmp || fEnergy < digit.fEnergy){//most energetic primary in second digit => first primaries in list from second digit
275         for (Int_t index = 0 ; index < digit.fNprimary ; index++)
276            tmp[index]=(digit.fPrimary)[index] ;
277         for (Int_t index = 0 ; index < fNprimary ; index++)
278            tmp[index+digit.fNprimary]=fPrimary[index] ;
279      }
280      else{ //add new primaries to the end
281         for (Int_t index = 0 ; index < fNprimary ; index++)
282            tmp[index]=fPrimary[index] ;
283         for (Int_t index = 0 ; index < digit.fNprimary ; index++)
284            tmp[index+fNprimary]=(digit.fPrimary)[index] ;
285      }
286      if(fPrimary)
287        delete []fPrimary ;
288      fPrimary = tmp ;
289    }
290    fNprimary+=digit.fNprimary ;
291    fAmp     += digit.fAmp ;
292    fEnergy  += digit.fEnergy ;
293    if(fTime > digit.fTime)
294       fTime = digit.fTime ;
295    fTimeR = fTime ; 
296
297    // Add high-gain ALTRO samples
298    UShort_t i;
299    if (digit.fNSamplesHG > fNSamplesHG) {
300      UShort_t newNSamplesHG = digit.fNSamplesHG;
301      UShort_t *newSamplesHG = new UShort_t[newNSamplesHG];
302      for (i=0; i<newNSamplesHG; i++) {
303        if (i<fNSamplesHG)
304          newSamplesHG[i] = TMath::Max(1023,fSamplesHG[i] + (digit.fSamplesHG)[i]);
305        else
306          newSamplesHG[i] = (digit.fSamplesHG)[i];
307      }
308      delete [] fSamplesHG;
309      fSamplesHG = new UShort_t[newNSamplesHG];
310      for (i=0; i<newNSamplesHG; i++) {
311        fSamplesHG[i] = newSamplesHG[i];
312      }
313      delete [] newSamplesHG;
314    }
315    else {
316      for (i=0; i<fNSamplesHG; i++)
317        fSamplesHG[i] = TMath::Max(1023,fSamplesHG[i] + (digit.fSamplesHG)[i]);
318    }
319
320    // Add low-gain ALTRO samples
321    if (digit.fNSamplesLG > fNSamplesLG) {
322      UShort_t newNSamplesLG = digit.fNSamplesLG;
323      UShort_t *newSamplesLG = new UShort_t[newNSamplesLG];
324      for (i=0; i<newNSamplesLG; i++) {
325        if (i<fNSamplesLG)
326          newSamplesLG[i] = TMath::Max(1023,fSamplesLG[i] + (digit.fSamplesLG)[i]);
327        else
328          newSamplesLG[i] = (digit.fSamplesLG)[i];
329      }
330      delete [] fSamplesLG;
331      fSamplesLG = new UShort_t[newNSamplesLG];
332      for (i=0; i<newNSamplesLG; i++) {
333        fSamplesLG[i] = newSamplesLG[i];
334      }
335      delete [] newSamplesLG;
336    }
337    else {
338      for (i=0; i<fNSamplesLG; i++)
339        fSamplesLG[i] = TMath::Max(1023,fSamplesLG[i] + (digit.fSamplesLG)[i]);
340    }
341
342    return *this ;
343 }
344 //____________________________________________________________________________
345 AliPHOSDigit& AliPHOSDigit::operator *= (Float_t factor) 
346 {
347   // Multiplies the amplitude by a factor
348   
349   Float_t tempo = static_cast<Float_t>(fAmp) ; 
350   tempo *= factor ; 
351   fAmp = static_cast<Int_t>(TMath::Ceil(tempo)) ; 
352   return *this ;
353 }
354
355 //____________________________________________________________________________
356 ostream& operator << ( ostream& out , const AliPHOSDigit & digit)
357 {
358   // Prints the data of the digit
359   
360 //   out << "ID " << digit.fId << " Energy = " << digit.fAmp << " Time = " << digit.fTime << endl ; 
361 //   Int_t i ;
362 //   for(i=0;i<digit.fNprimary;i++)
363 //     out << "Primary " << i+1 << " = " << digit.fPrimary[i] << endl ;
364 //   out << "Position in list = " << digit.fIndexInList << endl ; 
365   digit.Warning("operator <<", "Implement differently") ; 
366   return out ;
367 }
368
369