]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDarrayDictionary.cxx
Move back to Int_t and include a protection if arrays are already uncompressed (Hermes)
[u/mrichter/AliRoot.git] / TRD / AliTRDarrayDictionary.cxx
1 /************************************************************************* 
2 * Copyright(c) 1998-2008, 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: AliTRDarrayDictionary.cxx 25392 2008-04-23 19:40:29Z cblume $ */
17
18 /////////////////////////////////////////////////////////
19 //                                                     //
20 // Container Class for Dictionary Info                 //
21 //                                                     //
22 // Author:                                             //
23 //   Hermes Leon Vargas (hleon@ikf.uni-frankfurt.de)   //
24 //                                                     //
25 /////////////////////////////////////////////////////////
26
27 #include <TArray.h>
28
29 #include "AliTRDarrayDictionary.h"
30 #include "AliTRDfeeParam.h"
31
32 ClassImp(AliTRDarrayDictionary)
33
34 Short_t *AliTRDarrayDictionary::fgLutPadNumbering = 0x0;
35
36 //________________________________________________________________________________
37 AliTRDarrayDictionary::AliTRDarrayDictionary()
38                       :TObject()
39                       ,fNdet(0)
40                       ,fNrow(0)
41                       ,fNcol(0)
42                       ,fNumberOfChannels(0)
43                       ,fNtime(0)
44                       ,fNDdim(0)
45                       ,fDictionary(0)
46                       ,fFlag(kFALSE)
47 {
48   //
49   // AliTRDarrayDictionary default contructor
50   //
51
52   CreateLut();
53
54 }
55
56 //________________________________________________________________________________
57 AliTRDarrayDictionary::AliTRDarrayDictionary(Int_t nrow, Int_t ncol, Int_t ntime)
58                       :TObject()
59                       ,fNdet(0)
60                       ,fNrow(0)
61                       ,fNcol(0)
62                       ,fNumberOfChannels(0)
63                       ,fNtime(0)
64                       ,fNDdim(0)
65                       ,fDictionary(0)
66                       ,fFlag(kFALSE)
67
68 {
69   //
70   // AliTRDarrayDictionary contructor
71   //
72
73   CreateLut();
74   Allocate(nrow,ncol,ntime);
75
76 }
77
78 //________________________________________________________________________________
79 AliTRDarrayDictionary::AliTRDarrayDictionary(const AliTRDarrayDictionary &a)
80                       :TObject()
81                       ,fNdet(a.fNdet)
82                       ,fNrow(a.fNrow)
83                       ,fNcol(a.fNcol)
84                       ,fNumberOfChannels(a.fNumberOfChannels)
85                       ,fNtime(a.fNtime)
86                       ,fNDdim(a.fNDdim)
87                       ,fDictionary(0)
88                       ,fFlag(a.fFlag)
89 {
90   //
91   // AliTRDarrayDictionary copy constructor
92   //
93
94   fDictionary = new Int_t[fNDdim];
95   for(Int_t i=0; i<fNDdim; i++)
96     {
97       fDictionary[i]=a.fDictionary[i];
98     }
99
100 }
101
102 //________________________________________________________________________________
103 AliTRDarrayDictionary::~AliTRDarrayDictionary()
104 {
105   //
106   //   AliTRDarrayDictionary destructor
107   //
108
109   if(fDictionary)
110     {
111       delete [] fDictionary;
112       fDictionary=0;
113     }
114
115 }
116
117 //________________________________________________________________________________
118 AliTRDarrayDictionary &AliTRDarrayDictionary::operator=(const AliTRDarrayDictionary &a)
119 {
120   //
121   // Assignment operator
122   //
123
124   if(this==&a)
125     {
126       return *this;
127     }
128
129   if(fDictionary)
130     {
131       delete [] fDictionary;
132     }
133   fNdet=a.fNdet;
134   fNDdim=a.fNDdim;
135   fNrow=a.fNrow;
136   fNcol=a.fNcol;
137   fNumberOfChannels = a.fNumberOfChannels;
138   fNtime=a.fNtime;
139   fDictionary = new Int_t[fNDdim];
140   for(Int_t i=0; i<fNDdim; i++)
141     {
142       fDictionary[i]=a.fDictionary[i];
143     }
144   fFlag=a.fFlag;
145   return *this;
146
147 }
148
149 //________________________________________________________________________________
150 void AliTRDarrayDictionary::Allocate(Int_t nrow, Int_t ncol, Int_t ntime)
151 {
152   //
153   // Allocates memory for the dictionary array with dimensions
154   // Row*NumberOfNecessaryMCMs*ADCchannelsInMCM*Time
155   // To be consistent with AliTRDarrayADC
156   // Object initialized to -1
157   //
158
159   fNrow=nrow;
160   fNcol=ncol;
161   fNtime=ntime;
162   Int_t adcchannelspermcm = AliTRDfeeParam::GetNadcMcm(); 
163   Int_t padspermcm = AliTRDfeeParam::GetNcolMcm(); 
164   Int_t numberofmcms = fNcol/padspermcm;
165   fNumberOfChannels = numberofmcms*adcchannelspermcm;
166   fNDdim=nrow*fNumberOfChannels*ntime;
167   if(fDictionary)
168     {
169       delete [] fDictionary;
170       fDictionary=0;
171     }
172   fDictionary = new Int_t[fNDdim];
173   memset(fDictionary,-1,sizeof(Int_t)*fNDdim);
174
175 }
176
177 //________________________________________________________________________________
178 void AliTRDarrayDictionary::Compress()
179 {
180   //
181   // Compress the array
182   //
183
184
185   //  AliDebug(1,"Compressing");
186   Int_t counter=0;
187   Int_t newDim=0;
188   Int_t j;                 
189   Int_t r=0;
190   Int_t k=0;
191
192   Int_t *longArr = new Int_t[fNDdim];  
193
194   if(longArr) 
195     {
196
197       memset(longArr,0,sizeof(Int_t)*fNDdim);
198
199       for(Int_t i=0;i<fNDdim; i++)
200         {
201           j=0;
202           if(fDictionary[i]==-1)
203             {
204               for(k=i;k<fNDdim;k++)
205                 {
206                   if(fDictionary[k]==-1)
207                     {
208                       j=j+1;
209                       longArr[r]=j;
210                     }
211                   else
212                     {
213                       break;
214                     }
215                 } 
216               r=r+1;    
217             }
218           i=i+j;
219         }
220
221       //Calculate the size of the compressed array
222       for(Int_t i=0; i<fNDdim;i++)
223         {
224           if(longArr[i]!=0)  
225             {
226               counter=counter+longArr[i]-1;
227             }
228         }
229       newDim=fNDdim-counter;   //Size of the compressed array
230
231       //Fill the buffer of the compressed array
232       Int_t* buffer = new Int_t[newDim];
233       Int_t counterTwo=0;
234       Int_t g=0;
235       if(buffer)
236         {
237           for(Int_t i=0; i<newDim; i++)
238             {
239               if(counterTwo<fNDdim)
240                 {
241                   if(fDictionary[counterTwo]!=-1)
242                     {
243                       buffer[i]=fDictionary[counterTwo];
244                     }
245                   if(fDictionary[counterTwo]==-1)
246                     {
247                       buffer[i]=-(longArr[g]);
248                       counterTwo=counterTwo+longArr[g]-1;
249                       g++;
250                     }  
251                   counterTwo++;
252                 }
253             }
254
255           //Copy the buffer
256           if(fDictionary)
257             {
258               delete [] fDictionary;
259               fDictionary=0;
260             }
261           fDictionary = buffer;
262           fNDdim = newDim;
263         }
264     
265       delete [] longArr;
266       longArr=0;
267     }
268   fFlag=kTRUE; // flag to signal compression
269
270 }
271
272 //________________________________________________________________________________
273 void AliTRDarrayDictionary::Expand()
274 {
275   //  
276   //  Expand the array
277   //  
278
279   Int_t dimexp=0;
280   if(!IsCompressed())
281     return;
282
283   if(fDictionary&&fNDdim==1)
284     { 
285       dimexp = -fDictionary[0]; 
286       delete [] fDictionary;
287       fDictionary=0;
288       fDictionary = new Int_t[dimexp];
289       fNDdim = dimexp;
290       // Re-initialize the array
291       memset(fDictionary,-1,sizeof(Int_t)*dimexp);
292       return;
293     }
294
295   Int_t *longArr = new Int_t[fNDdim];
296   if(longArr && fDictionary)
297     {
298       //Initialize the array
299       memset(longArr,0,sizeof(Int_t)*fNDdim);
300
301       Int_t r2=0;
302       for(Int_t i=0; i<fNDdim;i++)
303         {
304           if((fDictionary[i]<0)&&(fDictionary[i]!=-1))  
305             {
306               longArr[r2]=-fDictionary[i]; 
307               r2++;
308             }
309         }
310
311       //Calculate new dimensions
312       for(Int_t i=0; i<fNDdim;i++)
313         {
314           if(longArr[i]!=0)      
315             dimexp=dimexp+longArr[i]-1;
316           if(longArr[i]==0)
317             break;
318         }
319       dimexp=dimexp+fNDdim;  
320
321       //Write in the buffer the new array
322       Int_t contaexp =0;    
323       Int_t h=0;
324       Int_t* bufferE = new Int_t[dimexp];
325       memset(bufferE,-1,sizeof(Int_t)*dimexp);
326
327       if(bufferE)
328         {
329
330           for(Int_t i=0; i<dimexp; i++)
331             {
332               if(fDictionary[contaexp]>=-1)  
333                 {
334                   bufferE[i]=fDictionary[contaexp];
335                 }
336               if(fDictionary[contaexp]<-1)  
337                 {
338                   i=i+longArr[h]-1;
339                   h++;
340                 }
341               contaexp++;
342             }
343
344           //Copy the buffer
345           delete [] fDictionary;
346           fDictionary=bufferE;
347           fNDdim = dimexp;
348         }
349     }
350   if (longArr)
351     {
352       delete [] longArr; 
353     }
354
355   fFlag=kFALSE; // flag to signal that is not compressed anymore
356
357 }
358 //________________________________________________________________________________
359 void AliTRDarrayDictionary::Reset()
360 {
361   //
362   // Reset the array, the old contents are deleted
363   // and the data array elements are set to zero.
364   //
365
366   memset(fDictionary,0,sizeof(Int_t)*fNDdim);
367
368 }
369 //________________________________________________________________________________
370 Int_t AliTRDarrayDictionary::GetData(Int_t nrow, Int_t ncol, Int_t ntime) const
371 {
372   //
373   // Get the data using the pad numbering.
374   // To access data using the mcm scheme use instead
375   // the method GetDataByAdcCol
376   //
377
378   Int_t corrcolumn = fgLutPadNumbering[ncol];
379
380   return fDictionary[(nrow*fNumberOfChannels+corrcolumn)*fNtime+ntime];
381
382 }
383 //________________________________________________________________________________
384 void AliTRDarrayDictionary::SetData(Int_t nrow, Int_t ncol, Int_t ntime, Int_t value)
385 {
386   //
387   // Set the data using the pad numbering.
388   // To write data using the mcm scheme use instead
389   // the method SetDataByAdcCol
390   //
391
392   Int_t colnumb = fgLutPadNumbering[ncol];
393
394   fDictionary[(nrow*fNumberOfChannels+colnumb)*fNtime+ntime]=value;
395
396 }
397
398 //________________________________________________________________________________
399 void AliTRDarrayDictionary::CreateLut()
400 {
401   //
402   // Initializes the Look Up Table to relate
403   // pad numbering and mcm channel numbering
404   //
405
406   if(fgLutPadNumbering)  return;
407   
408    fgLutPadNumbering = new Short_t[AliTRDfeeParam::GetNcol()];
409    memset(fgLutPadNumbering,0,sizeof(Short_t)*AliTRDfeeParam::GetNcol());
410
411   for(Int_t mcm=0; mcm<8; mcm++)
412     {
413       Int_t lowerlimit=0+mcm*18;
414       Int_t upperlimit=18+mcm*18;
415       Int_t shiftposition = 1+3*mcm;
416       for(Int_t index=lowerlimit;index<upperlimit;index++)
417         {
418           fgLutPadNumbering[index]= index+shiftposition;
419         }
420     }
421 }