]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDarrayADC.cxx
Bug fix in multiplicity limits.
[u/mrichter/AliRoot.git] / TRD / AliTRDarrayADC.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: AliTRDarrayADC.cxx 25392 2008-04-23 19:40:29Z cblume $ */
17
18 ////////////////////////////////////////////////////////
19 //                                                    //
20 // Container class for ADC values                     //
21 //                                                    //
22 // Author:                                            //
23 // Hermes Leon Vargas  (hleon@ikf.uni-frankfurt.de)   //
24 //                                                    // 
25 ////////////////////////////////////////////////////////
26
27 #include "AliTRDarrayADC.h"
28 #include "Cal/AliTRDCalPadStatus.h" 
29
30 ClassImp(AliTRDarrayADC)
31
32 //____________________________________________________________________________________
33 AliTRDarrayADC::AliTRDarrayADC()
34                :TObject()
35                ,fNdet(0)
36                ,fNrow(0)
37                ,fNcol(0)
38                ,fNtime(0) 
39                ,fNAdim(0)
40                ,fADC(0)
41 {
42   //
43   // AliTRDarrayADC default constructor
44   //
45
46 }
47
48 //____________________________________________________________________________________
49 AliTRDarrayADC::AliTRDarrayADC(Int_t nrow, Int_t ncol, Int_t ntime)
50                :TObject()
51                ,fNdet(0)               
52                ,fNrow(0)
53                ,fNcol(0)
54                ,fNtime(0) 
55                ,fNAdim(0)
56                ,fADC(0)
57 {
58   //
59   // AliTRDarrayADC constructor
60   //
61
62   Allocate(nrow,ncol,ntime);
63
64 }
65
66 //____________________________________________________________________________________
67 AliTRDarrayADC::AliTRDarrayADC(const AliTRDarrayADC &b)
68                :TObject()
69                ,fNdet(b.fNdet)
70                ,fNrow(b.fNrow)
71                ,fNcol(b.fNcol)
72                ,fNtime(b.fNtime) 
73                ,fNAdim(b.fNAdim)
74                ,fADC(0)
75 {
76   //
77   // AliTRDarrayADC copy constructor
78   //
79
80   fADC =  new Short_t[fNAdim];
81   for(Int_t i=0; i<fNAdim; i++)
82     {
83       fADC[i]=b.fADC[i];
84     }
85
86 }
87
88 //____________________________________________________________________________________
89 AliTRDarrayADC::~AliTRDarrayADC()
90 {
91   //
92   // AliTRDarrayADC destructor
93   //
94
95   if(fADC)
96     {
97       delete [] fADC;
98       fADC=0;
99     }
100
101 }
102
103 //____________________________________________________________________________________
104 AliTRDarrayADC &AliTRDarrayADC::operator=(const AliTRDarrayADC &b)
105 {
106   //
107   // Assignment operator
108   //
109
110   if(this==&b)
111     {
112       return *this;
113     }
114
115   if(fADC)
116     {
117       delete [] fADC;
118     }
119   fNdet=b.fNdet;
120   fNrow=b.fNrow;
121   fNcol=b.fNcol;
122   fNtime=b.fNtime;
123   fNAdim=b.fNAdim;
124   fADC = new Short_t[fNAdim];
125   for(Int_t i=0;i<fNAdim;i++)
126     {
127       fADC[i]=b.fADC[i];
128     }
129   return *this;
130
131 }
132
133 //____________________________________________________________________________________
134 void AliTRDarrayADC::Allocate(Int_t nrow, Int_t ncol, Int_t ntime)
135 {
136   //
137   // Allocate memory for an AliTRDarrayADC array with dimensions
138   // Row*Col*Time
139   //
140   
141   fNrow=nrow;
142   fNcol=ncol;
143   fNtime=ntime;
144   fNAdim=nrow*ncol*ntime;  
145
146   if(fADC)
147     {
148       delete [] fADC;
149     }
150   
151   fADC = new Short_t[fNAdim];
152   for(Int_t a=0; a<fNAdim; a++)
153     {
154       fADC[a]=0;
155     }
156
157 }
158
159 //____________________________________________________________________________________
160 Short_t AliTRDarrayADC::GetDataB(Int_t row, Int_t col, Int_t time) const
161 {
162   //
163   // Get the ADC value for a given position: row, col, time
164   // Taking bit masking into account
165   //
166   // Adapted from code of the class AliTRDdataArrayDigits 
167   //
168
169   Short_t tempval = fADC[(row*fNcol+col)*fNtime+time];
170   // Be aware of manipulations introduced by pad masking in the RawReader
171   // Only output the manipulated Value
172   CLRBIT(tempval, 10);
173   CLRBIT(tempval, 11);
174   CLRBIT(tempval, 12);
175   return tempval;
176
177 }
178
179 //____________________________________________________________________________________
180 UChar_t AliTRDarrayADC::GetPadStatus(Int_t row, Int_t col, Int_t time) const
181 {
182   // 
183   // Returns the pad status stored in the pad signal
184   //
185   // Output is a UChar_t value
186   // Status Codes:
187   //               Noisy Masking:           2
188   //               Bridged Left Masking     8
189   //               Bridged Right Masking    8
190   //               Not Connected Masking Digits
191   //
192   // Adapted from code of the class AliTRDdataArrayDigits
193   //
194
195   UChar_t padstatus = 0;
196   Short_t signal = GetData(row,col,time);
197   if(signal > 0 && TESTBIT(signal, 10)){
198     if(TESTBIT(signal, 11))
199       if(TESTBIT(signal, 12))
200         padstatus = AliTRDCalPadStatus::kPadBridgedRight;
201       else
202         padstatus = AliTRDCalPadStatus::kNotConnected;
203     else
204       if(TESTBIT(signal, 12))
205         padstatus = AliTRDCalPadStatus::kPadBridgedLeft;
206       else
207         padstatus = AliTRDCalPadStatus::kMasked;
208   }
209
210   return padstatus;
211
212 }
213
214 //____________________________________________________________________________________
215 void AliTRDarrayADC::SetPadStatus(Int_t row, Int_t col, Int_t time, UChar_t status)
216 {
217   //
218   // Setting the pad status into the signal using the Bits 10 to 14 
219   // (currently used: 10 to 12)
220   //
221   // Input codes (Unsigned char):
222   //               Noisy Masking:           2
223   //               Bridged Left Masking     8
224   //               Bridged Right Masking    8
225   //               Not Connected Masking    32
226   //
227   // Status codes: Any masking:             Bit 10(1)
228   //               Noisy masking:           Bit 11(0), Bit 12(0)
229   //               No Connection masking:   Bit 11(1), Bit 12(0)
230   //               Bridged Left masking:    Bit 11(0), Bit 12(1)
231   //               Bridged Right masking:   Bit 11(1), Bit 12(1)
232   // 
233   // Adapted from code of the class AliTRDdataArrayDigits
234   //
235
236   Short_t signal = GetData(row,col,time);
237
238   // Only set the Pad Status if the signal is > 0
239   if(signal > 0)
240     {
241       switch(status)
242         {
243         case AliTRDCalPadStatus::kMasked:
244           SETBIT(signal, 10);
245           CLRBIT(signal, 11);
246           CLRBIT(signal, 12);
247           break;
248         case AliTRDCalPadStatus::kNotConnected:
249           SETBIT(signal, 10);
250           SETBIT(signal, 11);
251           CLRBIT(signal, 12);
252           break;
253         case AliTRDCalPadStatus::kPadBridgedLeft:
254           SETBIT(signal, 10);
255           CLRBIT(signal, 11);
256           SETBIT(signal, 12);
257           break;
258         case AliTRDCalPadStatus::kPadBridgedRight:
259           SETBIT(signal, 10);
260           SETBIT(signal, 11);
261           SETBIT(signal, 12);
262         default:
263           CLRBIT(signal, 10);
264           CLRBIT(signal, 11);
265           CLRBIT(signal, 12);
266         }
267       SetData(row, col, time, signal);
268     }
269
270 }
271
272 //____________________________________________________________________________________
273 Bool_t AliTRDarrayADC::IsPadCorrupted(Int_t row, Int_t col, Int_t time)
274 {
275   // 
276   // Checks if the pad has any masking as corrupted (Bit 10 in signal set)
277   // 
278   // Adapted from code of the class AliTRDdataArrayDigits
279   //
280
281   Short_t signal = GetData(row,col,time);
282   return (signal > 0 && TESTBIT(signal, 10)) ? kTRUE : kFALSE;
283
284 }
285
286 //____________________________________________________________________________________
287 void AliTRDarrayADC::Compress()
288 {
289   //
290   // Compress the array
291   //
292
293   Int_t counter=0;
294   Int_t newDim=0;
295   Int_t j;                  
296   Int_t l;                  
297   Int_t r=0;                
298   Int_t s=0;                
299   Int_t *longm;            
300   longm = new Int_t[fNAdim];  
301   Int_t *longz;            
302   longz = new Int_t[fNAdim];
303   Int_t k=0;
304   for(Int_t i=0; i<fNAdim;i++)
305     {
306       longz[i]=0;
307       longm[i]=0;
308     }
309
310   for(Int_t i=0;i<fNAdim; i++)
311     {
312       j=0;
313       if(fADC[i]==-1)
314         {
315           for(k=i;k<fNAdim;k++)
316             {
317               if((fADC[k]==-1)&&(j<16000))   
318                 {
319                   j=j+1;
320                   longm[r]=j;                
321                 }
322               else
323                 {
324                   break;
325                 }
326             }
327           r=r+1;            
328         }
329       l=16001;
330       if(fADC[i]==0)
331         {
332           for(k=i;k<fNAdim;k++)
333             {
334               if((fADC[k]==0)&&(l<32767))     
335                 {                             
336                   l=l+1;
337                   longz[s]=l;                
338                 }
339               else
340                 {
341                   break;
342                 }
343             }
344           s=s+1;         
345         }
346       if(fADC[i]>0)
347         {
348           i=i+1;
349         }
350       i=i+j+(l-16001-1); 
351     }
352
353   //Calculate the size of the compressed array
354   for(Int_t i=0; i<fNAdim;i++)
355     {
356       if(longm[i]!=0)   
357         {
358           counter=counter+longm[i]-1;
359         }
360       if(longz[i]!=0)  
361         {
362           counter=counter+(longz[i]-16001)-1;
363         }
364     }
365   newDim = fNAdim-counter;   //Dimension of the compressed array
366   Short_t* buffer;
367   buffer = new Short_t[newDim];
368   Int_t counterTwo=0;
369
370   //Fill the buffer of the compressed array
371   Int_t g=0;
372   Int_t h=0; 
373   for(Int_t i=0; i<newDim; i++)
374     {
375       if(counterTwo<fNAdim)
376         {
377           if(fADC[counterTwo]>0)
378             {
379               buffer[i]=fADC[counterTwo];
380             }
381           if(fADC[counterTwo]==-1)
382             {
383               buffer[i]=-(longm[g]);
384               counterTwo=counterTwo+longm[g]-1;
385               g++;
386             }  
387           if(fADC[counterTwo]==0)
388             {
389               buffer[i]=-(longz[h]); 
390               counterTwo=counterTwo+(longz[h]-16001)-1;
391               h++;
392             }  
393           counterTwo++;
394         }
395     }
396
397   //Copy the buffer
398   if(fADC)
399     {
400       delete [] fADC;
401       fADC=0;
402     }
403   fADC = new Short_t[newDim];
404   fNAdim = newDim;
405   for(Int_t i=0; i<newDim; i++)
406     {
407       fADC[i] = buffer[i]; 
408     }
409
410   //Delete auxiliary arrays
411   if(buffer)
412     {
413       delete [] buffer;
414       buffer=0;
415     } 
416   if(longz) 
417     {
418       delete [] longz;
419       longz=0;
420     }
421   if(longm) 
422     {
423       delete [] longm;
424       longm=0;
425     }
426
427 }
428
429 //____________________________________________________________________________________
430 void AliTRDarrayADC::Expand()
431 {
432   //
433   // Expand the array
434   //
435
436   //Check if the array has not been already expanded
437   Int_t verif=0;
438   for(Int_t i=0; i<fNAdim; i++)
439     {
440       if(fADC[i]<-1)
441         {
442           verif++;
443         }
444     }
445   
446   if(verif==0)
447     {
448       //       AliDebug(1,"Nothing to expand");
449       return;
450     }
451
452   Int_t *longz;
453   longz = new Int_t[fNAdim];
454   Int_t *longm;
455   longm = new Int_t[fNAdim];
456   Int_t dimexp=0;
457   //Initialize arrays
458   for(Int_t i=0; i<fNAdim;i++)
459     {
460       longz[i]=0;
461       longm[i]=0;
462     }
463   Int_t r2=0; 
464   Int_t r3=0; 
465   for(Int_t i=0; i<fNAdim;i++)
466     {
467       if((fADC[i]<0)&&(fADC[i]>=-16000))      
468         {
469           longm[r2]=-fADC[i];
470           r2++;
471         }
472       if(fADC[i]<-16000)  
473         {
474           longz[r3]=-fADC[i]-16001;  
475           r3++;
476         }
477     }
478   //Calculate the new dimensions of the array
479   for(Int_t i=0; i<fNAdim;i++)
480     {
481       if(longm[i]!=0)       
482         {
483           dimexp=dimexp+longm[i]-1;
484         }
485       if(longz[i]!=0)      
486         {
487           dimexp=dimexp+longz[i]-1;
488         }
489     }
490   dimexp=dimexp+fNAdim;   
491
492   //Write in the buffer the new array
493   Short_t* bufferE;
494   bufferE = new Short_t[dimexp];
495   Int_t contaexp =0;     
496   Int_t h=0;
497   Int_t l=0;  
498   for(Int_t i=0; i<dimexp; i++)
499     {
500       if(fADC[contaexp]>0)  
501         {
502           bufferE[i]=fADC[contaexp];
503         }
504
505       if((fADC[contaexp]<0)&&(fADC[contaexp]>=-16000))  
506         {
507           for(Int_t j=0; j<longm[h];j++)
508             {
509               bufferE[i+j]=-1;
510             }
511           i=i+longm[h]-1;
512           h++;
513         }
514       if(fADC[contaexp]<-16000)  
515         {
516           for(Int_t j=0; j<longz[l];j++)
517             {
518               bufferE[i+j]=0;  
519             }
520           i=i+longz[l]-1;
521           l++;
522         }
523       contaexp++;
524     }
525   //Copy the buffer
526   if(fADC)
527     {
528       delete [] fADC;
529       fADC=0;
530     }
531
532   fADC = new Short_t[dimexp];
533   fNAdim = dimexp;
534   for(Int_t i=0; i<dimexp; i++)
535     {
536       fADC[i] = bufferE[i]; 
537     }
538
539   //Delete auxiliary arrays
540   if(bufferE) delete [] bufferE;
541   if(longm) delete [] longm;
542   if(longz) delete [] longz;
543
544 }
545 //____________________________________________________________________________________
546 void AliTRDarrayADC::DeleteNegatives()
547 {
548
549   //
550   //This method modifies the digits array, changing the negative values (-1)
551   //Produced during digitization into zero.
552   //
553
554   for(Int_t a=0; a<fNAdim; a++)
555     {
556       if(fADC[a]==-1)
557         {
558           fADC[a]=0;
559         }
560     }
561 }