Line data Source code
1 : #ifndef ALIITSONLINECALIBRATIONSPDHANDLER_H
2 : #define ALIITSONLINECALIBRATIONSPDHANDLER_H
3 :
4 : //////////////////////////////////////////////////////////////////////////////
5 : // Author: Henrik Tydesjo //
6 : // Class that simplifies the managing of dead, noisy, and inactive pixels. //
7 : // Has interface to the AliITSOnlineCalibrationSPD container objects //
8 : // through reading and writing to TFile. //
9 : //////////////////////////////////////////////////////////////////////////////
10 :
11 : /* $Id$ */
12 :
13 : #include "AliITSRawStreamSPD.h"
14 : #include <TString.h>
15 :
16 : class TArrayI;
17 : class TArrayS;
18 : class AliITSIntMap;
19 : class AliITSTriggerConditions;
20 : class AliITSCalibrationSPD;
21 :
22 : class AliITSOnlineCalibrationSPDhandler {
23 :
24 : public:
25 : AliITSOnlineCalibrationSPDhandler();
26 : AliITSOnlineCalibrationSPDhandler(const AliITSOnlineCalibrationSPDhandler& handle);
27 : virtual ~AliITSOnlineCalibrationSPDhandler();
28 : AliITSOnlineCalibrationSPDhandler& operator=(const AliITSOnlineCalibrationSPDhandler& handle);
29 :
30 0 : void SetFileLocation(const Char_t* loc) {fFileLocation = loc;}
31 0 : TString GetFileLocation() const {return fFileLocation;}
32 :
33 : void ClearMaps();
34 : void ResetDead();
35 : void ResetNoisy();
36 : void ResetDeadForChip(UInt_t eq, UInt_t hs, UInt_t chip);
37 : void ResetNoisyForChip(UInt_t eq, UInt_t hs, UInt_t chip);
38 : void ResetDeadForEq(UInt_t eq);
39 : void ResetNoisyForEq(UInt_t eq);
40 :
41 : Bool_t ReadFromFiles();
42 : Bool_t ReadSilentFromFiles();
43 : Bool_t ReadDeadFromFiles();
44 : Bool_t ReadNoisyFromFiles();
45 : Bool_t ReadSilentFromFile(UInt_t eq);
46 : Bool_t ReadDeadFromFile(UInt_t eq);
47 : Bool_t ReadNoisyFromFile(UInt_t eq);
48 : Bool_t ReadSilentFromFileName(const char *fileName);
49 : Bool_t ReadDeadFromFileName(const char *fileName, Bool_t inactive=kFALSE);
50 : Bool_t ReadNoisyFromFileName(const char *fileName);
51 :
52 : UInt_t ReadDeadFromText(const char *fileName, UInt_t module);
53 : UInt_t ReadNoisyFromText(const char *fileName, UInt_t module);
54 : void ReadPITConditionsFromText(const char *fileName);
55 :
56 : void WriteToFilesAlways();
57 : UInt_t WriteToFiles();
58 : void WriteSilentToFilesAlways();
59 : void WriteDeadToFilesAlways();
60 : void WriteNoisyToFilesAlways();
61 : UInt_t WriteSilentToFiles();
62 : UInt_t WriteDeadToFiles();
63 : UInt_t WriteNoisyToFiles();
64 : void WriteSilentToFile(UInt_t eq);
65 : void WriteDeadToFile(UInt_t eq, Bool_t inactive=kFALSE);
66 : void WriteNoisyToFile(UInt_t eq);
67 :
68 : Bool_t ReadPITConditionsFromDB(Int_t runNr, const Char_t *storage="default");
69 : #ifndef SPD_DA_OFF
70 : Bool_t ReadDeadModuleFromDB(UInt_t module, Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
71 : Bool_t ReadNoisyModuleFromDB(UInt_t module, Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
72 : Bool_t ReadFromDB(Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
73 : Bool_t ReadDeadFromDB(Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
74 : Bool_t ReadSparseDeadFromDB(Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
75 : Bool_t ReadNoisyFromDB(Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
76 : Bool_t ReadDeadFromDBasNoisy(Int_t runNr, const Char_t *storage="default", Bool_t treeSerial=kFALSE);
77 : Bool_t ReadDeadFromCalibObj(const TObjArray* calObj);
78 : Bool_t ReadNoisyFromCalibObj(const TObjArray* calObj);
79 : Bool_t WriteToDB(Int_t runNrStart, Int_t runNrEnd, const Char_t *storage="default");
80 : Bool_t WriteDeadToDB(Int_t runNrStart, Int_t runNrEnd, const Char_t *storage="default");
81 : Bool_t WriteSparseDeadToDB(Int_t runNrStart, Int_t runNrEnd, const Char_t *storage="default");
82 : Bool_t WriteDeadToDBasNoisy(Int_t runNrStart, Int_t runNrEnd, const Char_t *storage="default");
83 : Bool_t WriteNoisyToDB(Int_t runNrStart, Int_t runNrEnd, const Char_t *storage="default");
84 : Bool_t WritePITConditionsToDB(Int_t runNrStart, Int_t runNrEnd, const Char_t *storage="default");
85 : #endif
86 :
87 : void GenerateDCSConfigFile(const Char_t* fileName);
88 :
89 : TArrayS GetSilentArray(UInt_t module, Bool_t treeSerial=kFALSE); // temporarily needed
90 : TArrayS GetDeadArray(UInt_t module, Bool_t treeSerial=kFALSE);
91 : TArrayS GetSparseDeadArray(UInt_t module, Bool_t treeSerial=kFALSE);
92 : TArrayS GetNoisyArray(UInt_t module, Bool_t treeSerial=kFALSE);
93 :
94 : TArrayI GetDeadArrayOnline(UInt_t eq);
95 : TArrayI GetNoisyArrayOnline(UInt_t eq);
96 :
97 : void PrintEqSummary();
98 : void PrintSilent() const; // silent = dead or inactive
99 : void PrintDead() const;
100 : void PrintSparseDead() const;
101 : void PrintNoisy() const;
102 :
103 : Bool_t SetDeadPixel(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row);
104 : Bool_t SetSparseDeadPixel(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row);
105 : Bool_t SetNoisyPixel(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row);
106 : Bool_t SetDeadPixelM(UInt_t module, UInt_t colM, UInt_t row);
107 : Bool_t SetSparseDeadPixelM(UInt_t module, UInt_t colM, UInt_t row);
108 : Bool_t SetNoisyPixelM(UInt_t module, UInt_t colM, UInt_t row);
109 : Bool_t UnSetDeadPixel(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row);
110 : Bool_t UnSetSparseDeadPixel(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row);
111 : Bool_t UnSetNoisyPixel(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row);
112 : Bool_t UnSetDeadPixelM(UInt_t module, UInt_t colM, UInt_t row);
113 : Bool_t UnSetSparseDeadPixelM(UInt_t module, UInt_t colM, UInt_t row);
114 : Bool_t UnSetNoisyPixelM(UInt_t module, UInt_t colM, UInt_t row);
115 :
116 : Bool_t SetInactiveChipInPITmask(UInt_t eq, UInt_t hs, UInt_t chip);
117 : Bool_t UnSetInactiveChipInPITmask(UInt_t eq, UInt_t hs, UInt_t chip);
118 :
119 : Bool_t IsPixelBad(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row) const;
120 : Bool_t IsPixelSilent(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row) const; // silent = dead or inactive
121 : Bool_t IsPixelDead(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row) const;
122 : Bool_t IsPixelNoisy(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row) const;
123 : Bool_t IsPixelBadM(UInt_t module, UInt_t colM, UInt_t row) const;
124 : Bool_t IsPixelSilentM(UInt_t module, UInt_t colM, UInt_t row) const;
125 : Bool_t IsPixelDeadM(UInt_t module, UInt_t colM, UInt_t row) const;
126 : Bool_t IsPixelNoisyM(UInt_t module, UInt_t colM, UInt_t row) const;
127 : Bool_t IsPixelBadKey(Int_t key) const;
128 : Bool_t IsPixelSilentKey(Int_t key) const;
129 : Bool_t IsPixelDeadKey(Int_t key) const;
130 : Bool_t IsPixelNoisyKey(Int_t key) const;
131 :
132 : UInt_t GetNrBad() const; // bad = silent or noisy
133 : UInt_t GetNrSilent() const; // silent = dead or inactive
134 : UInt_t GetNrDead() const;
135 : UInt_t GetNrSparseDead() const;
136 : UInt_t GetDeadEqIdAt(UInt_t index) const;
137 : UInt_t GetDeadHSAt(UInt_t index) const;
138 : UInt_t GetDeadChipAt(UInt_t index) const;
139 : UInt_t GetDeadColAt(UInt_t index) const;
140 : UInt_t GetDeadRowAt(UInt_t index) const;
141 : UInt_t GetNrNoisy() const;
142 : UInt_t GetNoisyEqIdAt(UInt_t index) const;
143 : UInt_t GetNoisyHSAt(UInt_t index) const;
144 : UInt_t GetNoisyChipAt(UInt_t index) const;
145 : UInt_t GetNoisyColAt(UInt_t index) const;
146 : UInt_t GetNoisyRowAt(UInt_t index) const;
147 :
148 :
149 : UInt_t GetNrBad(UInt_t module) const; // bad = silent or noisy
150 : UInt_t GetNrSilent(UInt_t module) const; // silent = dead or inactive
151 : UInt_t GetNrDead(UInt_t module) const;
152 : UInt_t GetNrSparseDead(UInt_t module) const;
153 : UInt_t GetNrDeadSingle(UInt_t module) const;
154 : UInt_t GetDeadEqIdAt(UInt_t module,UInt_t index) const;
155 : UInt_t GetDeadHSAt(UInt_t module,UInt_t index) const;
156 : UInt_t GetDeadChipAt(UInt_t module,UInt_t index) const;
157 : UInt_t GetDeadColAt(UInt_t module,UInt_t index) const;
158 : UInt_t GetDeadRowAt(UInt_t module,UInt_t index) const;
159 : UInt_t GetNrNoisy(UInt_t module) const;
160 : UInt_t GetNrNoisySingle(UInt_t module) const;
161 : UInt_t GetNoisyEqIdAt(UInt_t module, UInt_t index) const;
162 : UInt_t GetNoisyHSAt(UInt_t module, UInt_t index) const;
163 : UInt_t GetNoisyChipAt(UInt_t module, UInt_t index) const;
164 : UInt_t GetNoisyColAt(UInt_t module, UInt_t index) const;
165 : UInt_t GetNoisyRowAt(UInt_t module, UInt_t index) const;
166 :
167 : UInt_t GetNrBadEq(UInt_t eq) const; // bad = silent or noisy
168 : UInt_t GetNrSilentEq(UInt_t eq) const; // silent = dead or inactive
169 : UInt_t GetNrDeadEq(UInt_t eq) const;
170 : UInt_t GetNrSparseDeadEq(UInt_t eq) const;
171 : UInt_t GetDeadEqIdAtEq(UInt_t eq, UInt_t index) const;
172 : UInt_t GetDeadHSAtEq(UInt_t eq, UInt_t index) const;
173 : UInt_t GetDeadChipAtEq(UInt_t eq, UInt_t index) const;
174 : UInt_t GetDeadColAtEq(UInt_t eq, UInt_t index) const;
175 : UInt_t GetDeadRowAtEq(UInt_t eq, UInt_t index) const;
176 : UInt_t GetNrNoisyEq(UInt_t eq) const;
177 : UInt_t GetNoisyEqIdAtEq(UInt_t eq, UInt_t index) const;
178 : UInt_t GetNoisyHSAtEq(UInt_t eq, UInt_t index) const;
179 : UInt_t GetNoisyChipAtEq(UInt_t eq, UInt_t index) const;
180 : UInt_t GetNoisyColAtEq(UInt_t eq, UInt_t index) const;
181 : UInt_t GetNoisyRowAtEq(UInt_t eq, UInt_t index) const;
182 :
183 : UInt_t GetNrBadC(UInt_t eq, UInt_t hs, UInt_t chip) const; // bad = silent or noisy
184 : UInt_t GetNrSilentC(UInt_t eq, UInt_t hs, UInt_t chip) const; // silent = dead or inactive
185 : UInt_t GetNrDeadC(UInt_t eq, UInt_t hs, UInt_t chip) const;
186 : UInt_t GetNrSparseDeadC(UInt_t eq, UInt_t hs, UInt_t chip) const;
187 : UInt_t GetDeadEqIdAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
188 : UInt_t GetDeadHSAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
189 : UInt_t GetDeadChipAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
190 : UInt_t GetDeadColAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
191 : UInt_t GetDeadRowAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
192 : UInt_t GetNrNoisyC(UInt_t eq, UInt_t hs, UInt_t chip) const;
193 : UInt_t GetNoisyEqIdAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
194 : UInt_t GetNoisyHSAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
195 : UInt_t GetNoisyChipAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
196 : UInt_t GetNoisyColAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
197 : UInt_t GetNoisyRowAtC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
198 :
199 : const Char_t* GetDeadPixelAsTextC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
200 : const Char_t* GetNoisyPixelAsTextC(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t index) const;
201 :
202 : void ActivateALL();
203 : void ActivateEq(UInt_t eq, Bool_t setval = kTRUE);
204 : void ActivateHS(UInt_t eq, UInt_t hs, Bool_t setval = kTRUE);
205 : void ActivateChip(UInt_t eq, UInt_t hs, UInt_t chip, Bool_t setval = kTRUE);
206 :
207 : void UnSetDeadALL();
208 : void SetDeadEq(UInt_t eq, Bool_t setval = kTRUE);
209 : void SetDeadHS(UInt_t eq, UInt_t hs, Bool_t setval = kTRUE);
210 : void SetDeadChip(UInt_t eq, UInt_t hs, UInt_t chip, Bool_t setval = kTRUE);
211 :
212 : Bool_t IsActiveEq(UInt_t eq) const;
213 : Bool_t IsActiveHS(UInt_t eq, UInt_t hs) const;
214 : Bool_t IsActiveChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
215 :
216 : Bool_t IsDeadEq(UInt_t eq) const;
217 : Bool_t IsDeadHS(UInt_t eq, UInt_t hs) const;
218 : Bool_t IsDeadChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
219 :
220 : Bool_t IsSilentEq(UInt_t eq) const;
221 : Bool_t IsSilentHS(UInt_t eq, UInt_t hs) const;
222 : Bool_t IsSilentChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
223 :
224 : Bool_t IsNoisyChip(UInt_t eq, UInt_t hs, UInt_t chip) const;
225 :
226 : UInt_t AddSilentFrom(AliITSOnlineCalibrationSPDhandler* other);
227 : UInt_t AddDeadFrom(const AliITSOnlineCalibrationSPDhandler* other);
228 : UInt_t AddNoisyFrom(const AliITSOnlineCalibrationSPDhandler* other);
229 :
230 : UInt_t GetNrDiff(AliITSOnlineCalibrationSPDhandler* other) const;
231 : UInt_t GetNrSilentDiff(AliITSOnlineCalibrationSPDhandler* other) const;
232 : UInt_t GetNrDeadDiff(const AliITSOnlineCalibrationSPDhandler* other) const;
233 : UInt_t GetNrNoisyDiff(const AliITSOnlineCalibrationSPDhandler* other) const;
234 : AliITSOnlineCalibrationSPDhandler* GetDiff(const AliITSOnlineCalibrationSPDhandler* other) const;
235 : AliITSOnlineCalibrationSPDhandler* GetSilentDiff(const AliITSOnlineCalibrationSPDhandler* other) const;
236 : AliITSOnlineCalibrationSPDhandler* GetDeadDiff(const AliITSOnlineCalibrationSPDhandler* other) const;
237 : AliITSOnlineCalibrationSPDhandler* GetNoisyDiff(const AliITSOnlineCalibrationSPDhandler* other) const;
238 0 : AliITSTriggerConditions * GetTriggerConditions() const {return fTriggerConditions;}
239 :
240 : void PrintDiffInDead(AliITSOnlineCalibrationSPDhandler *other) const;
241 : void PrintDiffInPITmask(AliITSOnlineCalibrationSPDhandler *other) const;
242 :
243 : private:
244 : TString fFileLocation; // location (dir) of files to read and write from
245 : AliITSIntMap* fDeadPixelMap[1200]; // lists of dead pixels for each chip
246 : AliITSIntMap* fSparseDeadPixelMap[1200]; // lists of dead pixels for each chip (used to define sparse dead pixel on LHC period basis)
247 : AliITSIntMap* fNoisyPixelMap[1200]; // lists of noisy pixels for each chip
248 : UInt_t fNrDead[1200]; // nr of dead pixels for each chip
249 : UInt_t fNrSparseDead[1200]; // nr of sparse dead pixels for each chip
250 : UInt_t fNrNoisy[1200]; // nr of noisy pixels for each chip
251 : Bool_t fActiveEq[20]; // active bit for each equipment
252 : Bool_t fActiveHS[20][6]; // active bit for each half-stave
253 : Bool_t fActiveChip[20][6][10]; // active bit for each chip
254 : Bool_t fDeadEq[20]; // dead bit for each equipment
255 : Bool_t fDeadHS[20][6]; // dead bit for each half-stave
256 : Bool_t fDeadChip[20][6][10]; // dead bit for each chip
257 : AliITSTriggerConditions *fTriggerConditions; // PIT conditions (mask, parameters name, parameters values)
258 :
259 :
260 : Int_t GetKey(UInt_t eq, UInt_t hs, UInt_t chip, UInt_t col, UInt_t row) const
261 0 : {return eq*6*10*32*256 + hs*10*32*256 + chip*32*256 + col*256 + row;}
262 : UInt_t GetEqIdFromKey(Int_t key) const
263 0 : {return key/(6*10*32*256);}
264 : UInt_t GetHSFromKey(Int_t key) const
265 0 : {return (key%(6*10*32*256))/(10*32*256);}
266 : UInt_t GetChipFromKey(Int_t key) const
267 0 : {return ((key%(6*10*32*256))%(10*32*256))/(32*256);}
268 : UInt_t GetColFromKey(Int_t key) const
269 0 : {return (((key%(6*10*32*256))%(10*32*256))%(32*256))/256;}
270 : UInt_t GetRowFromKey(Int_t key) const
271 0 : {return (((key%(6*10*32*256))%(10*32*256))%(32*256))%256;}
272 : UInt_t GetModuleFromKey(Int_t key) const
273 : {return AliITSRawStreamSPD::GetOfflineModuleFromOnline(GetEqIdFromKey(key),GetHSFromKey(key),GetChipFromKey(key));}
274 : UInt_t GetColMFromKey(Int_t key) const
275 0 : {return AliITSRawStreamSPD::GetOfflineColFromOnline(GetEqIdFromKey(key),GetHSFromKey(key),GetChipFromKey(key),GetColFromKey(key));}
276 : UInt_t GetRowMFromKey(Int_t key) const
277 0 : {return AliITSRawStreamSPD::GetOfflineRowFromOnline(GetEqIdFromKey(key),GetHSFromKey(key),GetChipFromKey(key),GetRowFromKey(key));}
278 :
279 0 : UInt_t GetGloChip(UInt_t eq, UInt_t hs, UInt_t chip) const {return eq*60 + hs*10 + chip;}
280 : UInt_t GetEqGlo(UInt_t gloChip) const {return gloChip/60;}
281 : UInt_t GetHSGlo(UInt_t gloChip) const {return (gloChip%60)/10;}
282 : UInt_t GetChipGlo(UInt_t gloChip) const {return (gloChip%60)%10;}
283 :
284 : void GetChipAndIndexDead(UInt_t module, UInt_t index, UInt_t& gloChip, UInt_t& chipIndex) const;
285 : void GetChipAndIndexNoisy(UInt_t module, UInt_t index, UInt_t& gloChip, UInt_t& chipIndex) const;
286 : void GetChipAndIndexEqDead(UInt_t eq, UInt_t index, UInt_t& gloChip, UInt_t& chipIndex) const;
287 : void GetChipAndIndexEqNoisy(UInt_t eq, UInt_t index, UInt_t& gloChip, UInt_t& chipIndex) const;
288 : void GetChipAndIndexTotDead(UInt_t index, UInt_t& gloChip, UInt_t& chipIndex) const;
289 : void GetChipAndIndexTotNoisy(UInt_t index, UInt_t& gloChip, UInt_t& chipIndex) const;
290 :
291 : UInt_t GetEqIdFromOffline(UInt_t module) const;
292 : UInt_t GetHSFromOffline(UInt_t module) const;
293 : UInt_t GetChipFromOffline(UInt_t module, UInt_t colM) const;
294 : UInt_t GetColFromOffline(UInt_t module, UInt_t colM) const;
295 : UInt_t GetRowFromOffline(UInt_t module, UInt_t rowM) const;
296 :
297 : void RecursiveInsertDead(AliITSCalibrationSPD* calibSPD, UInt_t module, Int_t lowInd, Int_t highInd);
298 : void RecursiveInsertSparseDead(AliITSCalibrationSPD* calibSPD, UInt_t module, Int_t lowInd, Int_t highInd);
299 : void RecursiveInsertNoisy(AliITSCalibrationSPD* calibSPD, UInt_t module, Int_t lowInd, Int_t highInd);
300 :
301 : UInt_t GetNrDeadC2(UInt_t gloChip) const;
302 : UInt_t GetNrSparseDeadC2(UInt_t gloChip) const;
303 : UInt_t GetDeadEqIdAtC2(UInt_t gloChip, UInt_t index) const;
304 : UInt_t GetDeadHSAtC2(UInt_t gloChip, UInt_t index) const;
305 : UInt_t GetDeadChipAtC2(UInt_t gloChip, UInt_t index) const;
306 : UInt_t GetDeadColAtC2(UInt_t gloChip, UInt_t index) const;
307 : UInt_t GetDeadRowAtC2(UInt_t gloChip, UInt_t index) const;
308 : UInt_t GetNrNoisyC2(UInt_t gloChip) const;
309 : UInt_t GetNoisyEqIdAtC2(UInt_t gloChip, UInt_t index) const;
310 : UInt_t GetNoisyHSAtC2(UInt_t gloChip, UInt_t index) const;
311 : UInt_t GetNoisyChipAtC2(UInt_t gloChip, UInt_t index) const;
312 : UInt_t GetNoisyColAtC2(UInt_t gloChip, UInt_t index) const;
313 : UInt_t GetNoisyRowAtC2(UInt_t gloChip, UInt_t index) const;
314 :
315 : };
316 :
317 : #endif
|