]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSDigit.cxx
Names changed in order to avoid clash with FLUKA
[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 //_________________________________________________________________________
19 //  PHOS digit: Id
20 //              energy
21 //              3 identifiers for the primary particle(s) at the origine of the digit
22 //  The digits are made in FinishEvent() by summing all the hits in a single PHOS crystal or PPSD gas cell
23 //
24 //*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
25
26
27 // --- ROOT system ---
28
29 #include "TMath.h"
30
31 // --- Standard library ---
32
33 // --- AliRoot header files ---
34
35 #include "AliPHOSDigit.h"
36
37
38
39
40 ClassImp(AliPHOSDigit)
41
42 //____________________________________________________________________________
43   AliPHOSDigit::AliPHOSDigit() 
44 {
45   // default ctor 
46
47   fIndexInList = -1 ; 
48   fNprimary    = 0 ;  
49   fNMaxPrimary = 5 ;
50   fPrimary = 0;
51 }
52
53 //____________________________________________________________________________
54 AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Int_t digEnergy, Float_t time, Int_t index) 
55 {  
56   // ctor with all data 
57
58   fNMaxPrimary = 5 ; 
59   fAmp         = digEnergy ;
60   fTime        = time ;
61   fId          = id ;
62   fIndexInList = index ; 
63   fPrimary = new Int_t[fNMaxPrimary] ;
64   if( primary != -1){
65     fNprimary    = 1 ; 
66     fPrimary[0]  = primary ;
67   }
68   else{  //If the contribution of this primary smaller than fDigitThreshold (AliPHOSv1)
69     fNprimary    = 0 ; 
70     fPrimary[0]  = -1 ;
71   }
72   Int_t i ;
73   for ( i = 1; i < fNMaxPrimary ; i++)
74     fPrimary[i]  = -1 ; 
75 }
76
77 //____________________________________________________________________________
78 AliPHOSDigit::AliPHOSDigit(const AliPHOSDigit & digit) 
79 {
80   // copy ctor
81   
82
83   fNMaxPrimary = digit.fNMaxPrimary ;  
84   fPrimary = new Int_t[fNMaxPrimary] ;
85   Int_t i ;
86   for ( i = 0; i < fNMaxPrimary ; i++)
87     fPrimary[i]  = digit.fPrimary[i] ;
88   fAmp         = digit.fAmp ;
89   fTime        = digit.fTime ;
90   fId          = digit.fId;
91   fIndexInList = digit.fIndexInList ; 
92   fNprimary    = digit.fNprimary ;
93 }
94
95 //____________________________________________________________________________
96 AliPHOSDigit::~AliPHOSDigit() 
97 {
98   // Delete array of primiries if any
99   delete [] fPrimary ;
100 }
101
102 //____________________________________________________________________________
103 Int_t AliPHOSDigit::Compare(const TObject * obj) const
104 {
105   // Compares two digits with respect to its Id
106   // to sort according increasing Id
107
108   Int_t rv ;
109
110   AliPHOSDigit * digit = (AliPHOSDigit *)obj ; 
111
112   Int_t iddiff = fId - digit->GetId() ; 
113
114   if ( iddiff > 0 ) 
115     rv = 1 ;
116   else if ( iddiff < 0 )
117     rv = -1 ; 
118   else
119     rv = 0 ;
120   
121   return rv ; 
122
123 }
124
125 //____________________________________________________________________________
126 Int_t AliPHOSDigit::GetPrimary(Int_t index) const
127 {
128   // retrieves the primary particle number given its index in the list 
129   Int_t rv = -1 ;
130   if ( index <= fNprimary && index > 0){
131     rv = fPrimary[index-1] ;
132   } 
133
134   return rv ; 
135   
136 }
137 //____________________________________________________________________________
138 void AliPHOSDigit::Print(Option_t *option) const
139 {
140   printf("PHOS digit: Amp=%d, Id=%d\n",fAmp,fId);
141 }
142 //____________________________________________________________________________
143 void AliPHOSDigit::ShiftPrimary(Int_t shift)
144 {
145   //shifts primary number to BIG offset, to separate primary in different TreeK
146   Int_t index  ;
147   for(index = 0; index <fNprimary; index ++ ){
148     fPrimary[index] = fPrimary[index]+ shift ;
149   } 
150 }
151 //____________________________________________________________________________
152 Bool_t AliPHOSDigit::operator==(AliPHOSDigit const & digit) const 
153 {
154   // Two digits are equal if they have the same Id
155   
156   if ( fId == digit.fId ) 
157     return kTRUE ;
158   else 
159     return kFALSE ;
160 }
161  
162 //____________________________________________________________________________
163 AliPHOSDigit& AliPHOSDigit::operator+(AliPHOSDigit const & digit) 
164 {
165   // Adds the amplitude of digits and completes the list of primary particles
166   // if amplitude is larger than 
167   
168   fAmp += digit.fAmp ;
169   if(fTime > digit.fTime)
170     fTime = digit.fTime ;
171   
172   Int_t max1 = fNprimary ; 
173   
174   Int_t index ; 
175   for (index = 0 ; index < digit.fNprimary ; index++){
176     Bool_t deja = kTRUE ;
177     Int_t old ;
178     for ( old = 0 ; (old < max1) && deja; old++) { //already have this primary?
179       if(fPrimary[old] == (digit.fPrimary)[index])
180         deja = kFALSE;
181     }
182     if(deja){
183       fPrimary[fNprimary] = (digit.fPrimary)[index] ; 
184       fNprimary++ ;
185       if(fNprimary>fNMaxPrimary) {
186         Error("Operator +", "Increase NMaxPrimary") ;
187         return *this ;
188       }
189     }
190   }
191   
192   return *this ;
193 }
194
195 //____________________________________________________________________________
196 AliPHOSDigit& AliPHOSDigit::operator*(Float_t factor) 
197 {
198   // Multiplies the amplitude by a factor
199   
200   Float_t tempo = static_cast<Float_t>(fAmp) ; 
201   tempo *= factor ; 
202   fAmp = static_cast<Int_t>(TMath::Ceil(tempo)) ; 
203   return *this ;
204 }
205
206 //____________________________________________________________________________
207 ostream& operator << ( ostream& out , const AliPHOSDigit & digit)
208 {
209   // Prints the data of the digit
210   
211 //   out << "ID " << digit.fId << " Energy = " << digit.fAmp << " Time = " << digit.fTime << endl ; 
212 //   Int_t i ;
213 //   for(i=0;i<digit.fNprimary;i++)
214 //     out << "Primary " << i+1 << " = " << digit.fPrimary[i] << endl ;
215 //   out << "Position in list = " << digit.fIndexInList << endl ; 
216   digit.Warning("operator <<", "Implement differently") ; 
217   return out ;
218 }
219
220