f2f2edf71cc02b170adee3eaff79a8a044302630
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUSDigit.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2004, 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 #include <Riostream.h>
16 #include <TMath.h>
17 #include "AliLog.h"
18 #include "AliITSUSDigit.h"
19 ClassImp(AliITSUSDigit)
20
21 // Addapted from ITS/AliITSpListItem, ruben.shahoyan@cern.ch
22
23 //______________________________________________________________________
24 AliITSUSDigit::AliITSUSDigit() 
25 : fModule(0)
26   ,fNTracks(0)
27   ,fTsignal(0.0)
28   ,fNoise(0.0)
29   ,fSignalAfterElect(0.0)
30 {
31   // Default constructor
32 }
33
34 //______________________________________________________________________
35 AliITSUSDigit::AliITSUSDigit(UInt_t module,UInt_t index,Double_t noise) 
36   :fModule(module)
37   ,fNTracks(0)
38   ,fTsignal(0.0)
39   ,fNoise(noise)
40   ,fSignalAfterElect(0.0)
41 {
42   // Standard noise constructor
43   SetUniqueID(index);
44   for (int i=kBuffSize;i--;) {
45     fTrack[i] = -2;
46     fHits[i] = -1;
47     fSignal[i] = 0;
48   }
49 }
50
51 //______________________________________________________________________
52 AliITSUSDigit::AliITSUSDigit(Int_t track,Int_t hit,UInt_t module,UInt_t index,Double_t signal)
53   :fModule(module)
54   ,fNTracks(1)
55   ,fTsignal(signal)
56   ,fNoise(0.0)
57   ,fSignalAfterElect(0.0)
58 {
59   // Standard signal constructor
60   // Inputs:
61   //    Int_t track     The track number which produced this signal
62   //    Int_t hit       The hit number which produced this signal
63   //    Int_t module    The module where this signal occurred
64   //    Int_t index     The cell index where this signal occurred
65   //    Double_t signal The value of the signal (ionization)
66   SetUniqueID(index);
67   fTrack[0]  = track;
68   fHits[0]   = hit;
69   fSignal[0] = signal;
70   for (int i=1;i<kBuffSize;i++) {
71     fTrack[i] = -2;
72     fHits[i] = -1;
73     fSignal[i] = 0;
74   }
75 }
76
77 //______________________________________________________________________
78 AliITSUSDigit& AliITSUSDigit::operator=(const AliITSUSDigit &source)
79 {
80   // = operator
81   if (&source!=this) {
82     this->~AliITSUSDigit();
83     new(this) AliITSUSDigit(source);
84   }
85   return *this;
86   //
87 }
88
89 //______________________________________________________________________
90 AliITSUSDigit::AliITSUSDigit(const AliITSUSDigit &source) 
91   :TObject(source)
92   ,fModule(source.fModule)
93   ,fNTracks(source.fNTracks)
94   ,fTsignal(source.fTsignal)
95   ,fNoise(source.fNoise)
96   ,fSignalAfterElect(source.fSignalAfterElect)
97 {
98   // Copy operator
99   for(Int_t i=kBuffSize;i--;) {
100     fTrack[i]  = source.fTrack[i];
101     fSignal[i] = source.fSignal[i];
102     fHits[i]   = source.fHits[i];
103   } // end if i
104   //
105 }
106
107 //______________________________________________________________________
108 void AliITSUSDigit::AddSignal(Int_t track,Int_t hit,Double_t signal)
109 {
110   // Adds this track number and signal to the pList and orders them
111   // Inputs:
112   //    Int_t track     The track number which produced this signal
113   //    Int_t hit       The hit number which produced this signal
114   //    Int_t module    The module where this signal occurred
115   //    Int_t index     The cell index where this signal occurred
116   //    Double_t signal The value of the signal (ionization)
117   Int_t    i,j;
118   Bool_t   flg=kFALSE;
119   //
120   if (TMath::Abs(signal)>2147483647.0) {
121     //PH 2147483647 is the max. integer
122     //PH This apparently is a problem which needs investigation
123     AliWarning(Form("Too big or too small signal value %f",signal));
124     signal = TMath::Sign((Double_t)2147483647,signal);
125   }
126   //
127   fTsignal += signal; // Keep track of sum signal.
128   for (i=fNTracks;i--;) {
129     if ( track==fTrack[i]  ) {
130       fSignal[i] += signal;
131       flg = kTRUE;
132       break;
133     } // end for i & if.
134   }
135   //
136   if (flg) {
137     if (fNTracks>1) { // resort arrays.  
138       for (i=1;i<fNTracks;i++) {
139         j = i;
140         while(j>0 && fSignal[j]>fSignal[j-1]) {
141           swap(fTrack[j-1],fTrack[j]);
142           swap(fHits[j-1] ,fHits[j]);
143           swap(fSignal[j-1],fSignal[j]);
144           j--;
145         } // end while
146       } // end if i
147     } // end if added to existing and resorted array
148     return;
149   }
150   //
151   // new entry add it in order.
152   // if this signal is <= smallest then don't add it.
153   if (fNTracks==(kBuffSize-1) && signal <= fSignal[kBuffSize-1]) return;
154   //
155   for (i=fNTracks;i--;) {
156     if (signal > fSignal[i]) {
157       fSignal[i+1] = fSignal[i];
158       fTrack[i+1]  = fTrack[i];
159       fHits[i+1]   = fHits[i];
160     } else {
161       fSignal[i+1] = signal;
162       fTrack[i+1]  = track;
163       fHits[i+1]   = hit;
164       fNTracks++;
165       return; // put it in the right place, now exit.
166     } //  end if
167   } // end if; end for i
168   //
169   // Still haven't found the right place. Must be at top of list.
170   fSignal[0] = signal;
171   fTrack[0]  = track;
172   fHits[0]   = hit;
173   fNTracks++;
174   return;
175 }
176
177 //______________________________________________________________________
178 void AliITSUSDigit::Add(const AliITSUSDigit *pl)
179 {
180   // Adds the contents of pl to this
181   // pl could come from different module and index 
182   Double_t sigT = 0.0;
183   for(int i=pl->GetNTracks();i--;) {
184     double sig = pl->GetSignal(i); 
185     AddSignal(pl->GetTrack(i),pl->GetHit(i),sig);
186     sigT += sig;
187   } // end for i
188   fTsignal += (pl->fTsignal - sigT);
189   fNoise   += pl->fNoise;
190   return;
191   //
192 }
193
194 //______________________________________________________________________
195 void AliITSUSDigit::AddTo(Int_t fileIndex,const AliITSUSDigit *pl) 
196 {
197   // Adds the contents of pl to this with track number off set given by
198   // fileIndex.
199   // Inputs:
200   //    Int_t fileIndex      track number offset value
201   //    AliITSUSDigit *pl  an AliITSUSDigit to be added to this class.
202   //
203   for (int i=pl->GetNTracks();i--;) AddSignal(pl->GetTrack(i)+fileIndex,pl->GetHit(i),pl->GetSignal(i));
204   fSignalAfterElect += (pl->fSignalAfterElect + pl->fNoise - fNoise);
205   fNoise = pl->fNoise;
206 }
207
208 //______________________________________________________________________
209 void AliITSUSDigit::ShiftIndices(Int_t fileIndex)
210 {
211   // Shift track numbers
212   //
213   for (int i=GetNTracks();i--;) fTrack[i] += fileIndex;
214 }
215
216 //______________________________________________________________________
217 void AliITSUSDigit::Print(ostream *os) const 
218 {
219   //Standard output format for this class
220   Int_t i;
221   //
222   *os << fModule <<","<<GetUniqueID()<<","<<fNTracks<<",";
223   for (i=0;i<fNTracks;i++) *os << fTrack[i] <<",";
224   for (i=0;i<fNTracks;i++) *os << fHits[i] <<",";
225   for (i=0;i<fNTracks;i++) *os << fSignal[i] <<",";
226   *os << fTsignal <<","<< fNoise << "," << fSignalAfterElect;
227 }
228
229 //______________________________________________________________________
230 void AliITSUSDigit::Read(istream *is) 
231 {
232   // Standard output streaming function.
233   Int_t i,iss;
234   UInt_t ind;
235   //
236   *is >> fModule >> ind >> fNTracks;
237   SetUniqueID(ind);
238   *is >> iss; // read in fNTracks
239   for(i=0;i<fNTracks&&i<iss;i++) *is >> fTrack[i];
240   for(i=0;i<fNTracks&&i<iss;i++) *is >> fHits[i];
241   for(i=0;i<fNTracks&&i<iss;i++) *is >> fSignal[i];
242   *is >> fTsignal >> fNoise >> fSignalAfterElect;
243 }
244
245 //______________________________________________________________________
246 ostream &operator<<(ostream &os,AliITSUSDigit &source)
247 {
248   // Standard output streaming function.
249   source.Print(&os);
250   return os;
251 }
252
253 //______________________________________________________________________
254 istream &operator>>(istream &os,AliITSUSDigit &source)
255 {
256   // Standard output streaming function.
257   source.Read(&os);
258   return os;
259 }
260
261 //______________________________________________________________________
262 Int_t AliITSUSDigit::Compare(const TObject* obj) const
263 {
264   // compare objects
265   if (GetUniqueID()<obj->GetUniqueID()) return -1;
266   if (GetUniqueID()>obj->GetUniqueID()) return  1;
267   return 0;
268 }
269
270 //______________________________________________________________________
271 void AliITSUSDigit::Print(Option_t*) const 
272 {
273   // print itself
274   printf("Mod: %4d Index:%7d Ntr:%2d | TotSignal:%.2e Noise:%.2e |",
275          fModule,GetUniqueID(),fNTracks,fTsignal,fNoise);
276   for (int i=0;i<fNTracks;i++) printf("%d(%.2e) |",fTrack[i],fSignal[i]); printf("\n");
277 }