1 #ifndef ALITRDSIGNALINDEX_H
2 #define ALITRDSIGNALINDEX_H
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * See cxx source for full Copyright notice */
11 ////////////////////////////////////////////////////////////////////////////
13 // General container for data from TRD detector segments //
14 // Adapted from AliDigits, origin M.Ivanov //
17 // Mateusz Ploskon (ploskon@ikf.uni-frankfurt.de) //
19 ////////////////////////////////////////////////////////////////////////////
21 class AliTRDSignalIndex : public TObject
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);
41 void Copy(TObject &d) const;
42 void Allocate(const Int_t nrow, const Int_t ncol, const Int_t ntime);
45 void ResetContentConditional(const Int_t nrow, const Int_t ncol, const Int_t ntime);
48 void ResetTbinCounter() const { };
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);
61 Bool_t CheckSorting(Int_t &row, Int_t &col);
63 Int_t GetCurrentRow() const { return fCurrRow; }
64 Int_t GetCurrentCol() const { return fCurrCol; }
65 Int_t GetCurrentTbin() const { return fCurrTbin; }
67 Bool_t IsBoolIndex(Int_t row, Int_t col) const {return fBoolIndex[row*fNcols+col];};
68 void InitSortedIndex();
70 // Clear the array, actually destroy and recreate w/o allocating
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;
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; }
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; }
89 Bool_t HasEntry() const { return fCountRC > 1 ? kTRUE : kFALSE; } // Return status if has an entry
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
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
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?
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
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
117 ClassDef(AliTRDSignalIndex,2) // Data container for one TRD detector segment
121 void AliTRDSignalIndex::AddIndexRC(const Int_t row, const Int_t col)
124 // Adds RC combination to array
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;
135 Bool_t AliTRDSignalIndex::NextRCIndex(Int_t &row, Int_t &col)
138 // Returns next used RC combination
144 if(fSortedIndex[fPositionRC].rc>-1){
145 row = fCurrRow = fSortedIndex[fPositionRC].s.row;
146 col = fCurrCol = fSortedIndex[fPositionRC].s.col;
151 return CheckSorting(row, col);
157 Comment from 22 Dec 2008
159 The structure of the Index was changed. Now no Tbin is saved anymore,
160 only RC combination are saved! (reasons see below)
162 For the readout, all tbins for a RC combination must be read out to find
163 the time bin of signal > 0.
165 THE WRITING PROCEDURE:
166 AddIndexTBin is now obsolate, use AddIndexRC instead as AddIndexTBin will
167 be deleted in future.
169 example that gives exactely the same output as before:
171 AliTRDSignalIndexes *indexes;
172 AliTRDarrayADC *Signal; //or AliTRDarraySignal *Signal;
173 if(Signal->GetDataB(row, col, time)>0)
174 indexes->AddIndexTBin(row, col, time);
176 as it should be from no on:
177 AliTRDSignalIndexes *indexes;
178 AliTRDarrayADC *Signal; //or AliTRDarraySignal *Signal;
179 if(Signal->GetDataB(row, col, time)>0)
180 indexes->AddIndexRC(row, col);
184 THE READING PROCEDURE:
185 In most cases you can leave anything as it is.
186 See more in the example.
190 AliTRDSignalIndexes *indexes;
191 AliTRDarraySignal *Signal;
192 while(indexes->NextRCTbinIndex(row, col, time))
195 as it should be from no on to get the exactely the same output as before:
196 AliTRDSignalIndexes *indexes;
197 AliTRDarraySignal *Signal;
198 while(indexes->NextRCTbinIndex(row, col, time))
199 if(Signal->GetData(row, col, time)>0)
202 as it should be idealy:
203 AliTRDSignalIndexes *indexes;
204 AliTRDarraySignal *Signal;
205 for(time = 0; time < Ntime; time++)
206 while(indexes->NextRCIndex(row, col, time))
207 if(Signal->GetData(row, col, time)>0)
211 REASON OF THE CHANGES:
213 The array saved the information nicely, but it turned out that sorting
214 the array by column would have many benefits.
215 I.e. it is crucial for fivePadClusters and it if much faster to allocate.
216 But the sorting is not fast if the tbin is also saved.
217 Moreover the tbin information was alsmost useless because,
218 whenever an RC index existed, many of the possible tbins where used.