]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDSignalIndex.h
Added new static method AliAnalysisManager::GetRunFromAlienPath() that extracts the...
[u/mrichter/AliRoot.git] / TRD / AliTRDSignalIndex.h
1 #ifndef ALITRDSIGNALINDEX_H
2 #define ALITRDSIGNALINDEX_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6
7 /* $Id$ */
8  
9 #include "TObject.h"
10
11 ////////////////////////////////////////////////////////////////////////////
12 //                                                                        //
13 //  General container for data from TRD detector segments                 //
14 //  Adapted from AliDigits, origin M.Ivanov                               //
15 //                                                                        //
16 //  Author:                                                               //
17 //    Mateusz Ploskon (ploskon@ikf.uni-frankfurt.de)                      //
18 //                                                                        //
19 ////////////////////////////////////////////////////////////////////////////
20
21 class AliTRDSignalIndex : public TObject
22 {
23 protected:
24
25   union RowCol{
26     Short_t rc;
27     struct{
28       UChar_t col;
29       Char_t row;
30     }s;
31   };
32
33 public:
34
35   AliTRDSignalIndex(); 
36   AliTRDSignalIndex(Int_t nrow, Int_t ncol,Int_t ntime);
37   AliTRDSignalIndex(const AliTRDSignalIndex &d);
38   virtual ~AliTRDSignalIndex();
39   AliTRDSignalIndex &operator=(const AliTRDSignalIndex &d); 
40
41   void     Copy(TObject &d) const;
42   void     Allocate(const Int_t nrow, const Int_t ncol, const Int_t ntime);
43
44   void     Reset();
45   void     ResetContentConditional(const Int_t nrow, const Int_t ncol, const Int_t ntime);
46   void     ResetContent();
47   void     ResetCounters();
48   void     ResetTbinCounter() const { };
49
50   void     ResetArrays();
51
52   // Store the index row-column as an interesting one
53   inline void AddIndexRC(const Int_t row, const Int_t col);
54   // Get the next pad (row and column) and return kTRUE on success
55   inline Bool_t NextRCIndex(Int_t &row, Int_t &col); 
56   // Get the next timebin of a pad (row and column) and return kTRUE on success
57   Bool_t   NextRCTbinIndex(Int_t &row, Int_t &col, Int_t &tbin); 
58   // Get the next active timebin and return kTRUE on success
59   Bool_t   NextTbinIndex(Int_t &tbin); 
60
61   Bool_t CheckSorting(Int_t &row, Int_t &col);
62
63   Int_t    GetCurrentRow() const  { return fCurrRow; }
64   Int_t    GetCurrentCol() const  { return fCurrCol; }
65   Int_t    GetCurrentTbin() const { return fCurrTbin; }
66
67   Bool_t   IsBoolIndex(Int_t row, Int_t col) const {return fBoolIndex[row*fNcols+col];};
68   void     InitSortedIndex();
69
70   // Clear the array, actually destroy and recreate w/o allocating
71   void     ClearAll(); 
72   // Return kTRUE if array allocated and there is no need to call allocate
73   Bool_t   IsAllocated() const    { if (!fBoolIndex)    return kFALSE; 
74                                     if (fMaxLimit <= 0) return kFALSE; 
75                                     else                return kTRUE;}
76
77   void     SetSM(const Int_t ix)        { fSM      =    ix; }
78   void     SetStack(const Int_t ix)     { fStack   =    ix; }
79   void     SetLayer(const Int_t ix)     { fLayer   =    ix; }
80   void     SetDetNumber(const Int_t ix) { fDet     =    ix; }
81   
82   Int_t    GetDetNumber() const   { return fDet;      } // Get Det number
83   Int_t    GetLayer() const       { return fLayer;    } // Layer position of the chamber in TRD
84   Int_t    GetStack() const       { return fStack;    } // Stack position of the chamber in TRD
85   Int_t    GetSM() const          { return fSM;       } // Super module of the TRD
86   Short_t *GetArray() const       { return (Short_t*)fSortedIndex; } // Get the array pointer for god knows what reason
87   Int_t    GetNoOfIndexes() const { return fCountRC-1;  }
88
89   Bool_t   HasEntry() const       { return fCountRC > 1 ? kTRUE : kFALSE; } // Return status if has an entry
90
91   Int_t    GetNrow() const        { return fNrows;    } // Get Nrows
92   Int_t    GetNcol() const        { return fNcols;    } // Get Ncols
93   Int_t    GetNtime() const       { return fNtbins;   } // Get Ntbins
94
95  private:
96
97   Int_t     fDet;                //  Detector number
98   Int_t     fLayer;              //  Layer position in the full TRD
99   Int_t     fStack;              //  Stack position in the full TRD
100   Int_t     fSM;                 //  Super module - position in the full TRD
101
102   Bool_t   *fBoolIndex;          //  Indices
103   RowCol   *fSortedIndex;        //  Sorted indices
104   Int_t     fMaxLimit;           //  Max number of things in the array
105   Int_t     fPositionRC;         //  Position in the SortedIndex
106   Int_t     fCountRC;            //  the number of added rc combinations
107   Bool_t    fSortedWasInit;      //  Was SortedIndex initialized?
108
109   Int_t     fCurrRow;            //  Last Row read out of SortedIndex
110   Int_t     fCurrCol;            //  Last Col read out of SortedIndex
111   Int_t     fCurrTbin;           //  Last outgiven Tbin
112   
113   Int_t     fNrows;              //  Number of rows in the chamber
114   Int_t     fNcols;              //  Number of cols in the chamber
115   Int_t     fNtbins;             //  Number of tbins in the chamber 
116
117   ClassDef(AliTRDSignalIndex,2)  //  Data container for one TRD detector segment
118
119 };
120
121 void AliTRDSignalIndex::AddIndexRC(const Int_t row, const Int_t col)
122 {
123   //
124   // Adds RC combination to array
125   //
126
127   const Int_t num=row*fNcols+col;
128   if(fBoolIndex[num])return;
129   fBoolIndex[num]=kTRUE;
130   fSortedIndex[fCountRC].s.col=col;
131   fSortedIndex[fCountRC].s.row=row;
132   fCountRC++;
133 }
134
135 Bool_t AliTRDSignalIndex::NextRCIndex(Int_t &row, Int_t &col)
136 {
137   //
138   // Returns next used RC combination
139   //
140
141   if(fSortedIndex[fPositionRC].rc>-1){
142     row = fCurrRow = fSortedIndex[fPositionRC].s.row;
143     col = fCurrCol = fSortedIndex[fPositionRC].s.col;
144     fPositionRC++;
145     return kTRUE;
146   }
147   else
148     return CheckSorting(row, col);
149 }
150
151 #endif
152
153 /*
154 Comment from 22 Dec 2008
155
156 The structure of the Index was changed. Now no Tbin is saved anymore,
157 only RC combination are saved! (reasons see below)
158
159 For the readout, all tbins for a RC combination must be read out to find 
160 the time bin of signal > 0.
161
162 THE WRITING PROCEDURE:
163 AddIndexTBin is now obsolate, use AddIndexRC instead as AddIndexTBin will
164 be deleted in future.
165
166 example that gives exactely the same output as before:
167 as it was: 
168            AliTRDSignalIndexes *indexes;
169            AliTRDarrayADC *Signal; //or AliTRDarraySignal *Signal;
170            if(Signal->GetDataB(row, col, time)>0)
171                indexes->AddIndexTBin(row, col, time);
172
173 as it should be from no on: 
174            AliTRDSignalIndexes *indexes;
175            AliTRDarrayADC *Signal; //or AliTRDarraySignal *Signal;
176            if(Signal->GetDataB(row, col, time)>0)
177                indexes->AddIndexRC(row, col);
178
179
180
181 THE READING PROCEDURE:
182 In most cases you can leave anything as it is.
183 See more in the example.
184
185 example:
186 as it was: 
187            AliTRDSignalIndexes *indexes;
188            AliTRDarraySignal *Signal;
189            while(indexes->NextRCTbinIndex(row, col, time)) 
190            {...}
191
192 as it should be from no on to get the exactely the same output as before: 
193            AliTRDSignalIndexes *indexes;
194            AliTRDarraySignal *Signal;
195            while(indexes->NextRCTbinIndex(row, col, time)) 
196               if(Signal->GetData(row, col, time)>0)
197                  {...}
198
199 as it should be idealy:
200            AliTRDSignalIndexes *indexes;
201            AliTRDarraySignal *Signal;
202            for(time = 0; time < Ntime; time++)
203               while(indexes->NextRCIndex(row, col, time)) 
204                  if(Signal->GetData(row, col, time)>0)
205                     {...}
206
207
208 REASON OF THE CHANGES:
209
210 The array saved the information nicely, but it turned out that sorting 
211 the array by column would have many benefits.
212 I.e. it is crucial for fivePadClusters and it if much faster to allocate.
213 But the sorting is not fast if the tbin is also saved.
214 Moreover the tbin information was alsmost useless because, 
215 whenever an RC index existed, many of the possible tbins where used.
216
217 Theodor Rascanu
218
219 */