]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDSignalIndex.cxx
added method to check the whoole filter mask, not just one bit
[u/mrichter/AliRoot.git] / TRD / AliTRDSignalIndex.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 //                                                                           //
20 //  General container for data from TRD detector segments                    //
21 //  Adapted from AliDigits, origin M.Ivanov                                  //
22 //                                                                           //
23 //  Author:                                                                  //
24 //    Mateusz Ploskon (ploskon@ikf.uni-frankfurt.de)                         //
25 //                                                                           //
26 ///////////////////////////////////////////////////////////////////////////////
27
28 #include <algorithm>
29 #include "TObject.h"
30 #include "AliLog.h"
31 #include "AliTRDSignalIndex.h"
32
33 ClassImp(AliTRDSignalIndex)
34
35 //_____________________________________________________________________________
36 AliTRDSignalIndex::AliTRDSignalIndex()
37   :TObject()
38   ,fDet(-1)
39   ,fLayer(-1)
40   ,fStack(-1)
41   ,fSM(-1)
42   ,fBoolIndex(NULL)
43   ,fSortedIndex(NULL)
44   ,fMaxLimit(0)
45   ,fPositionRC(0)
46   ,fCountRC(1)
47   ,fSortedWasInit(kFALSE)
48   ,fCurrRow(0)
49   ,fCurrCol(0)
50   ,fCurrTbin(0)
51   ,fNrows(0)
52   ,fNcols(0)
53   ,fNtbins(0)
54 {
55   //
56   // Default contructor
57   //
58
59   ResetCounters();
60
61 }
62
63 //_____________________________________________________________________________
64 AliTRDSignalIndex::AliTRDSignalIndex(Int_t nrow, Int_t ncol,Int_t ntime)
65   :TObject()
66   ,fDet(-1)
67   ,fLayer(-1)
68   ,fStack(-1)
69   ,fSM(-1)
70   ,fBoolIndex(NULL)
71   ,fSortedIndex(NULL)
72   ,fMaxLimit(0)
73   ,fPositionRC(0)
74   ,fCountRC(1)
75   ,fSortedWasInit(kFALSE)
76   ,fCurrRow(0)
77   ,fCurrCol(0)
78   ,fCurrTbin(0)
79   ,fNrows(0)
80   ,fNcols(0)
81   ,fNtbins(0)
82 {
83   //
84   // Not the default contructor... hmmm...
85   //
86
87   Allocate(nrow, ncol, ntime);  
88
89 }
90
91 //_____________________________________________________________________________
92 AliTRDSignalIndex::AliTRDSignalIndex(const AliTRDSignalIndex &a)
93   :TObject(a)
94   ,fDet(a.fDet)
95   ,fLayer(a.fLayer)
96   ,fStack(a.fStack)
97   ,fSM(a.fSM)
98   ,fBoolIndex(NULL)
99   ,fSortedIndex(NULL)
100   ,fMaxLimit(a.fMaxLimit)
101   ,fPositionRC(a.fPositionRC)
102   ,fCountRC(a.fCountRC)
103   ,fSortedWasInit(a.fSortedWasInit)
104   ,fCurrRow(a.fCurrRow)
105   ,fCurrCol(a.fCurrCol)
106   ,fCurrTbin(a.fCurrTbin)
107   ,fNrows(a.fNrows)
108   ,fNcols(a.fNcols)
109   ,fNtbins(a.fNtbins)
110 {
111   //
112   // Copy constructor
113   //
114
115   fBoolIndex = new Bool_t[fMaxLimit];
116   memcpy(fBoolIndex, a.fBoolIndex, fMaxLimit*sizeof(Bool_t));
117
118   fSortedIndex = new RowCol[fMaxLimit+1];
119   memcpy(fSortedIndex, a.fSortedIndex, (fMaxLimit+1)*sizeof(RowCol));
120 }
121
122 //_____________________________________________________________________________
123 AliTRDSignalIndex::~AliTRDSignalIndex()
124 {
125   //
126   // Destructor
127   //
128
129   if (fBoolIndex) {
130     delete [] fBoolIndex;
131     fBoolIndex = NULL;
132   }
133
134 if (fSortedIndex) {
135     delete [] fSortedIndex;
136     fSortedIndex = NULL;
137   }
138
139 }
140
141 //_____________________________________________________________________________
142 void AliTRDSignalIndex::Copy(TObject &a) const
143 {
144   //
145   // Copy function
146   //
147
148   ((AliTRDSignalIndex &)a).fDet           = fDet;
149   ((AliTRDSignalIndex &)a).fLayer         = fLayer;
150   ((AliTRDSignalIndex &)a).fStack         = fStack;
151   ((AliTRDSignalIndex &)a).fSM            = fSM;
152   ((AliTRDSignalIndex &)a).fMaxLimit      = fMaxLimit;
153   ((AliTRDSignalIndex &)a).fPositionRC    = fPositionRC;
154   ((AliTRDSignalIndex &)a).fCountRC       = fCountRC;
155   ((AliTRDSignalIndex &)a).fSortedWasInit = fSortedWasInit;
156   ((AliTRDSignalIndex &)a).fCurrRow       = fCurrRow;
157   ((AliTRDSignalIndex &)a).fCurrCol       = fCurrCol;
158   ((AliTRDSignalIndex &)a).fCurrTbin      = fCurrTbin;
159   ((AliTRDSignalIndex &)a).fNrows         = fNrows;
160   ((AliTRDSignalIndex &)a).fNcols         = fNcols;
161   ((AliTRDSignalIndex &)a).fNtbins        = fNtbins;
162
163   if(((AliTRDSignalIndex &)a).fBoolIndex)
164     {
165       delete [] ((AliTRDSignalIndex &)a).fBoolIndex;
166     }
167   ((AliTRDSignalIndex &)a).fBoolIndex = new Bool_t[fMaxLimit];
168   memcpy(((AliTRDSignalIndex &)a).fBoolIndex, fBoolIndex, fMaxLimit*sizeof(Bool_t));
169
170   if(((AliTRDSignalIndex &)a).fSortedIndex)
171     {
172       delete [] ((AliTRDSignalIndex &)a).fSortedIndex;
173     }
174   ((AliTRDSignalIndex &)a).fSortedIndex = new RowCol[fMaxLimit+1];
175   memcpy(((AliTRDSignalIndex &)a).fSortedIndex, fSortedIndex, (fMaxLimit+1)*sizeof(RowCol));
176
177 }
178
179 //_____________________________________________________________________________
180 AliTRDSignalIndex& AliTRDSignalIndex::operator = (const AliTRDSignalIndex& a)
181 {
182   //
183   // Assignment operator
184   //
185
186   if (this != &a) ((AliTRDSignalIndex &) a).Copy(*this);
187   return *this;
188
189 }
190
191 //_____________________________________________________________________________
192 void AliTRDSignalIndex::Allocate(const Int_t nrow, const Int_t ncol, const Int_t ntime)
193 {
194   //
195   // Create the arrays
196   //
197
198   fNrows = nrow;
199   fNcols = ncol;
200   fNtbins = ntime;
201
202   fMaxLimit = nrow * ncol + 1;
203
204   if (fBoolIndex) {
205     delete [] fBoolIndex;
206     fBoolIndex = NULL;
207   }
208   if (fSortedIndex) {
209     delete [] fSortedIndex;
210     fSortedIndex = NULL;
211   }
212
213   fBoolIndex = new Bool_t[fMaxLimit];
214   fSortedIndex = new RowCol[fMaxLimit+1];
215
216   ResetArrays();
217   ResetCounters();
218
219   fCountRC = 1;
220
221 }
222
223 //_____________________________________________________________________________
224 void AliTRDSignalIndex::ResetArrays()
225 {
226   memset(fBoolIndex,0x00,sizeof(Bool_t)*fMaxLimit);
227   memset(fSortedIndex,0xFF,sizeof(RowCol)*(fMaxLimit+1)); 
228   fSortedWasInit = kFALSE;
229 }
230
231 //_____________________________________________________________________________
232 void AliTRDSignalIndex::Reset()
233 {
234   //
235   // Reset the array but keep the size - realloc
236   //
237
238   fDet   = -1;
239   fLayer = -1;
240   fStack = -1;
241   fSM    = -1;
242
243   // All will be lost 
244   Allocate(fNrows, fNcols, fNtbins);
245
246 }
247
248 //_____________________________________________________________________________
249 void AliTRDSignalIndex::ResetContent()
250 {
251   //
252   // Reset the array but keep the size - no realloc
253   //
254
255   fDet   = -1;
256   fLayer = -1;
257   fStack = -1;
258   fSM    = -1;
259
260   ResetArrays();
261   ResetCounters();
262
263   fCountRC = 1;
264
265 }
266
267 //_____________________________________________________________________________
268 void AliTRDSignalIndex::ResetContentConditional(const Int_t nrow, const Int_t ncol, const Int_t ntime)
269 {
270   //
271   // Reset the array but keep the size if no need to enlarge - no realloc
272   //
273
274   fDet   = -1;
275   fLayer = -1;
276   fStack = -1;
277   fSM    = -1;
278
279   if ((nrow  > fNrows) || 
280       (ncol  > fNcols) || 
281       (ntime > fNtbins)) {
282     Allocate(nrow, ncol, ntime);
283   }
284   else {
285     ResetArrays();
286     ResetCounters();
287     fCountRC = 1;
288   }
289
290 }
291
292 //_____________________________________________________________________________
293 void AliTRDSignalIndex::ClearAll()
294 {
295   //
296   // Reset the values - clear all!
297   //
298
299   fDet    = -1;
300   fLayer  = -1;
301   fStack  = -1;
302   fSM     = -1;
303
304   fNrows  = -1;
305   fNcols  = -1;
306   fNtbins = -1;
307
308   if (fBoolIndex) {
309     delete [] fBoolIndex;
310     fBoolIndex = NULL;
311   }
312
313   if (fSortedIndex) {
314     delete [] fSortedIndex;
315     fSortedIndex = NULL;
316   }
317   
318   ResetCounters();
319
320   fCountRC = 1;
321   fSortedWasInit = kFALSE;
322   fMaxLimit = 0;
323
324 }
325
326 //_____________________________________________________________________________
327 Bool_t  AliTRDSignalIndex::NextRCIndex(Int_t &row, Int_t &col)
328 {
329   //
330   // Returns next used RC combination
331   //
332
333   if(fSortedIndex[fPositionRC].rc>-1){
334     row = fCurrRow = fSortedIndex[fPositionRC].s.row;
335     col = fCurrCol = fSortedIndex[fPositionRC].s.col;
336     fPositionRC++;
337     return kTRUE;
338   }
339   else {
340     if(fSortedWasInit)
341       { //we already reached the end of the array
342         ResetCounters();
343         row = fCurrRow;
344         col = fCurrCol;
345         return kFALSE;
346       }
347     else
348       { //we have not created the sorted array up to now, let's do so
349         InitSortedIndex();
350         return NextRCIndex(row, col);
351       }
352   }
353
354 }
355
356 //_____________________________________________________________________________
357 Bool_t AliTRDSignalIndex::NextRCTbinIndex(Int_t &row, Int_t &col, Int_t &tbin)
358 {
359   //
360   // Returns the next tbin, or if there is no next time bin, it returns the
361   // next used RC combination.
362   //  
363
364   if (NextTbinIndex(tbin)) {
365     row = fCurrRow;
366     col = fCurrCol;
367     return kTRUE;
368   }
369   else {
370     if (NextRCIndex(row, col)) {
371       return NextRCTbinIndex(row, col, tbin);
372     }
373   }
374
375   return kFALSE;
376
377 }
378
379 //_____________________________________________________________________________
380 Bool_t AliTRDSignalIndex::NextTbinIndex(Int_t &tbin)
381 {
382   //
383   // Returns the next tbin of the current RC combination
384   //
385   
386   if(fCurrTbin<fNtbins)
387     {
388       tbin = fCurrTbin++;
389       return kTRUE;
390     }
391
392   return kFALSE;
393
394 }
395
396 //_____________________________________________________________________________
397 void AliTRDSignalIndex::InitSortedIndex()
398 {
399   //
400   // Creates the SortedIndex
401   //
402
403   fSortedWasInit = kTRUE;
404   std::sort((UShort_t*)fSortedIndex, ((UShort_t*)fSortedIndex) + fCountRC);
405
406 }
407
408 //_____________________________________________________________________________
409 void AliTRDSignalIndex::ResetCounters()    
410
411   //
412   // Reset the counters/iterators
413   //
414
415   fCurrRow    = -1;
416   fCurrCol    = -1;
417   fCurrTbin   = -1;
418   fPositionRC =  0;
419 }