Line data Source code
1 : ///////////////////////////////////////////////////////////////////////
2 : // Author: Henrik Tydesjo //
3 : // For easier handling of error messages from AliITSRawStreamSPD. //
4 : // The purpose of this class is to make possible the switch to the //
5 : // AliRoot raw data parsing routines in the onlinte monitoring //
6 : // programs, like SPD-MOOD, and still keep all the old functionality.//
7 : ///////////////////////////////////////////////////////////////////////
8 :
9 : #include "AliITSRawStreamSPDErrorLog.h"
10 : #include "AliLog.h"
11 :
12 : /* $Id$ */
13 :
14 118 : ClassImp(AliITSRawStreamSPDErrorLog)
15 : //________________________________________________________________________________________________
16 0 : AliITSRawStreamSPDErrorLog::AliITSRawStreamSPDErrorLog() :
17 0 : fText(NULL), fTextTmpGeneral(NULL)
18 0 : {
19 : // default constructor
20 0 : fText=new TGText();
21 0 : fTextTmpGeneral=new TGText();
22 0 : for (UInt_t eq=0; eq<20; eq++) {
23 0 : fTextTmp[eq] = new TGText();
24 0 : fNEvents[eq] = 0;
25 0 : fByteOffset[eq] = 0;
26 0 : fSuppressEq[eq] = kFALSE;
27 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
28 0 : fNErrors[err][eq] = 0;
29 0 : fNErrorsTotal[err][eq] = 0;
30 : }
31 : }
32 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
33 0 : fSuppressMess[err] = kFALSE;
34 : }
35 0 : InitHistograms();
36 0 : }
37 : //________________________________________________________________________________________________
38 : AliITSRawStreamSPDErrorLog::AliITSRawStreamSPDErrorLog(const AliITSRawStreamSPDErrorLog& logger) :
39 0 : TObject(logger), fText(NULL), fTextTmpGeneral(NULL)
40 0 : {
41 : // copy constructor
42 0 : for (UInt_t eq=0; eq<20; eq++) {
43 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
44 0 : fNErrors[err][eq] = logger.fNErrors[err][eq];
45 0 : fNErrorsTotal[err][eq] = logger.fNErrorsTotal[err][eq];
46 0 : fErrEventCounter[err][eq] = logger.fErrEventCounter[err][eq];
47 : }
48 0 : fNEvents[eq] = logger.fNEvents[eq];
49 0 : fByteOffset[eq] = logger.fByteOffset[eq];
50 0 : fSuppressEq[eq] = logger.fSuppressEq[eq];
51 : }
52 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
53 0 : fSuppressMess[err] = logger.fSuppressMess[err];
54 : }
55 :
56 0 : fText = new TGText(logger.fText);
57 0 : fTextTmpGeneral = new TGText(logger.fTextTmpGeneral);
58 0 : for (UInt_t eq=0; eq<20; eq++) {
59 0 : fTextTmp[eq] = new TGText(logger.fTextTmp[eq]);
60 : }
61 :
62 0 : for (UInt_t eq=0; eq<20; eq++) {
63 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
64 0 : fConsErrEvent[err][eq] = new TGraph(*logger.fConsErrEvent[err][eq]);
65 0 : fConsErrPos[err][eq] = new TGraph(*logger.fConsErrPos[err][eq]);
66 : }
67 0 : fConsErrType[eq] = new TH1F(*logger.fConsErrType[eq]);
68 0 : fConsErrType[eq]->SetDirectory(0);
69 0 : fConsErrFraction[eq] = new TH1F(*logger.fConsErrFraction[eq]);
70 0 : fConsErrFraction[eq]->SetDirectory(0);
71 : }
72 :
73 0 : }
74 : //________________________________________________________________________________________________
75 : AliITSRawStreamSPDErrorLog& AliITSRawStreamSPDErrorLog::operator=(const AliITSRawStreamSPDErrorLog& logger) {
76 : // assignment operator
77 0 : if (this!=&logger) {
78 0 : delete fText;
79 0 : delete fTextTmpGeneral;
80 0 : for(Int_t eq=0; eq<20;eq++){
81 0 : delete fTextTmp[eq];
82 : }
83 0 : this->DeleteHistograms();
84 :
85 0 : for (UInt_t eq=0; eq<20; eq++) {
86 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
87 0 : fNErrors[err][eq] = logger.fNErrors[err][eq];
88 0 : fNErrorsTotal[err][eq] = logger.fNErrorsTotal[err][eq];
89 0 : fErrEventCounter[err][eq] = logger.fErrEventCounter[err][eq];
90 : }
91 0 : fNEvents[eq] = logger.fNEvents[eq];
92 0 : fByteOffset[eq] = logger.fByteOffset[eq];
93 0 : fSuppressEq[eq] = logger.fSuppressEq[eq];
94 : }
95 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
96 0 : fSuppressMess[err] = logger.fSuppressMess[err];
97 : }
98 :
99 0 : fText = new TGText(logger.fText);
100 0 : fTextTmpGeneral = new TGText(logger.fTextTmpGeneral);
101 0 : for (UInt_t eq=0; eq<20; eq++) {
102 0 : fTextTmp[eq] = new TGText(logger.fTextTmp[eq]);
103 : }
104 :
105 0 : for (UInt_t eq=0; eq<20; eq++) {
106 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
107 0 : fConsErrEvent[err][eq] = new TGraph(*logger.fConsErrEvent[err][eq]);
108 0 : fConsErrPos[err][eq] = new TGraph(*logger.fConsErrPos[err][eq]);
109 : }
110 0 : fConsErrType[eq] = new TH1F(*logger.fConsErrType[eq]);
111 0 : fConsErrType[eq]->SetDirectory(0);
112 0 : fConsErrFraction[eq] = new TH1F(*logger.fConsErrFraction[eq]);
113 0 : fConsErrFraction[eq]->SetDirectory(0);
114 : }
115 :
116 0 : }
117 0 : return *this;
118 :
119 0 : }
120 : //________________________________________________________________________________________________
121 0 : AliITSRawStreamSPDErrorLog::~AliITSRawStreamSPDErrorLog() {
122 : // destructor
123 0 : DeleteHistograms();
124 0 : delete fText;
125 0 : delete fTextTmpGeneral;
126 0 : for(Int_t eq=0; eq<20; eq++){
127 0 : delete fTextTmp[eq];
128 : }
129 0 : }
130 : //________________________________________________________________________________________________
131 : void AliITSRawStreamSPDErrorLog::InitHistograms() {
132 : // initialize histograms
133 0 : for (UInt_t eq=0; eq<20; eq++) {
134 0 : TString histName, histTitle;
135 0 : histName = Form("ConsErrType %d",eq);
136 0 : histTitle = Form("Distribution of errors, eq %d",eq);
137 0 : fConsErrType[eq]=new TH1F(histName.Data(),histTitle.Data(),kNrErrorCodes,-0.5,kNrErrorCodes-0.5);
138 0 : fConsErrType[eq]->SetDirectory(0);
139 0 : fConsErrType[eq]->SetXTitle("Error Code");
140 0 : fConsErrType[eq]->SetYTitle("Nr Errors");
141 :
142 0 : histName = Form("ConsErrFraction %d",eq);
143 0 : histTitle = Form("Fraction of events with errors, eq %d",eq);
144 0 : fConsErrFraction[eq]=new TH1F(histName.Data(),histTitle.Data(),kNrErrorCodes,-0.5,kNrErrorCodes-0.5);
145 0 : fConsErrFraction[eq]->SetDirectory(0);
146 0 : fConsErrFraction[eq]->SetXTitle("Error Code");
147 0 : fConsErrFraction[eq]->SetYTitle("Fraction");
148 :
149 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
150 0 : fConsErrEvent[err][eq]=new TGraph();
151 0 : fConsErrPos[err][eq]=new TGraph();
152 0 : fConsErrPosTMP[err][eq]=new TGraph();
153 0 : fErrEventCounter[err][eq] = 0;
154 0 : fErrPosCounter[err][eq] = 0;
155 0 : fErrPosTMPCounter[err][eq] = 0;
156 : }
157 0 : }
158 0 : }
159 : //________________________________________________________________________________________________
160 : void AliITSRawStreamSPDErrorLog::DeleteHistograms() {
161 : // delete histograms
162 0 : for (UInt_t eq=0; eq<20; eq++) {
163 0 : delete fConsErrType[eq];
164 0 : delete fConsErrFraction[eq];
165 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
166 0 : delete fConsErrEvent[err][eq];
167 0 : delete fConsErrPos[err][eq];
168 0 : delete fConsErrPosTMP[err][eq];
169 : }
170 : }
171 0 : }
172 : //________________________________________________________________________________________________
173 : void AliITSRawStreamSPDErrorLog::Reset() {
174 : // Reset
175 0 : fText->Clear();
176 0 : fTextTmpGeneral->Clear();
177 0 : for (UInt_t eq=0; eq<20; eq++) {
178 0 : fTextTmp[eq]->Clear();
179 0 : fConsErrType[eq]->Reset();
180 0 : fConsErrFraction[eq]->Reset();
181 0 : fNEvents[eq] = 0;
182 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
183 0 : fNErrors[err][eq] = 0;
184 0 : fNErrorsTotal[err][eq] = 0;
185 0 : delete fConsErrEvent[err][eq];
186 0 : delete fConsErrPos[err][eq];
187 0 : delete fConsErrPosTMP[err][eq];
188 0 : fErrEventCounter[err][eq] = 0;
189 0 : fErrPosCounter[err][eq] = 0;
190 0 : fErrPosTMPCounter[err][eq] = 0;
191 0 : fConsErrEvent[err][eq] = new TGraph();
192 0 : fConsErrPos[err][eq] = new TGraph();
193 0 : fConsErrPosTMP[err][eq] = new TGraph();
194 : }
195 : }
196 0 : }
197 : //________________________________________________________________________________________________
198 : void AliITSRawStreamSPDErrorLog::ProcessError(UInt_t errorCode, UInt_t eq, Int_t bytesRead, Int_t headersRead, const Char_t *errMess) {
199 : // Process an error
200 0 : if (eq>=20) {
201 0 : AliWarning(Form("Equipment number (%d) out of bounds",eq));
202 0 : return;
203 : }
204 : // check if we want to exclude the error...
205 0 : if (!(fSuppressMess[errorCode] || fSuppressEq[eq])) {
206 0 : fNErrors[errorCode][eq]++;
207 0 : fNErrorsTotal[errorCode][eq]++;
208 0 : if (errorCode!=kTotal) {
209 0 : fNErrors[kTotal][eq]++;
210 0 : fNErrorsTotal[kTotal][eq]++;
211 0 : }
212 :
213 0 : if (bytesRead>=0) {
214 0 : fConsErrPosTMP[errorCode][eq]->SetPoint(fErrPosTMPCounter[errorCode][eq],0,bytesRead+fByteOffset[eq]);
215 0 : fErrPosTMPCounter[errorCode][eq]++;
216 0 : if (errorCode!=kTotal) {
217 0 : fConsErrPosTMP[kTotal][eq]->SetPoint(fErrPosTMPCounter[kTotal][eq],0,bytesRead+fByteOffset[eq]);
218 0 : fErrPosTMPCounter[kTotal][eq]++;
219 0 : }
220 : }
221 :
222 0 : TString msg;
223 0 : if (bytesRead<0) {
224 0 : msg = Form("%s",errMess);
225 : }
226 : else {
227 0 : msg = Form("%s (%d bytes read, %d chip headers read)",errMess,bytesRead+fByteOffset[eq],headersRead);
228 : }
229 0 : fTextTmp[eq]->InsLine(fTextTmp[eq]->RowCount(),msg.Data());
230 0 : }
231 0 : }
232 : //________________________________________________________________________________________________
233 : void AliITSRawStreamSPDErrorLog::AddMessage(const Char_t *errMess) {
234 : // add a general message to the buffer
235 0 : fTextTmpGeneral->InsLine(fTextTmpGeneral->RowCount(),errMess);
236 0 : }
237 : //________________________________________________________________________________________________
238 : void AliITSRawStreamSPDErrorLog::ResetEvent() {
239 : // reset error counters for current event
240 0 : for (UInt_t eq=0; eq<20; eq++) {
241 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
242 0 : fNErrors[err][eq]=0;
243 : }
244 0 : fByteOffset[eq]=0;
245 0 : fTextTmpGeneral->Clear();
246 0 : fTextTmp[eq]->Clear();
247 : }
248 :
249 0 : for (UInt_t eq=0; eq<20; eq++) {
250 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
251 0 : delete fConsErrPosTMP[err][eq];
252 0 : fErrPosTMPCounter[err][eq] = 0;
253 0 : fConsErrPosTMP[err][eq] = new TGraph();
254 : }
255 : }
256 0 : }
257 : //________________________________________________________________________________________________
258 : void AliITSRawStreamSPDErrorLog::AddErrorMessagesFromCurrentEvent(UInt_t eventNum) {
259 0 : TString msg;
260 0 : if (fText->RowCount()>5000) {
261 0 : fText->Clear();
262 0 : msg = "*** previous errors cleared ***";
263 0 : fText->InsLine(fText->RowCount(),msg.Data());
264 : }
265 0 : if (fTextTmpGeneral->RowCount()>1) {
266 0 : msg = Form("*** Event %d , General Errors: ***",eventNum);
267 0 : fText->InsLine(fText->RowCount(),msg.Data());
268 0 : fText->AddText(fTextTmpGeneral);
269 : // fTextTmpGeneral->Clear();
270 : }
271 :
272 0 : for (UInt_t eq=0; eq<20; eq++) {
273 0 : if (fNErrors[kTotal][eq]>0) {
274 0 : msg = Form("*** Event %d , Eq %d: ***",eventNum,eq);
275 0 : fText->InsLine(fText->RowCount(),msg.Data());
276 0 : fText->AddText(fTextTmp[eq]);
277 0 : fText->InsLine(fText->RowCount()," ");
278 : }
279 : // fTextTmp[eq]->Clear();
280 : }
281 0 : }
282 : //________________________________________________________________________________________________
283 : void AliITSRawStreamSPDErrorLog::ProcessEvent(UInt_t eventNum) {
284 : // summarize the information for the current event
285 : // TString msg;
286 : // if (fText->RowCount()>5000) {
287 : // fText->Clear();
288 : // msg = "*** previous errors cleared ***";
289 : // fText->InsLine(fText->RowCount(),msg.Data());
290 : // }
291 : // if (fTextTmpGeneral->RowCount()>1) {
292 : // msg = Form("*** Event %d , General Errors: ***",eventNum);
293 : // fText->InsLine(fText->RowCount(),msg.Data());
294 : // fText->AddText(fTextTmpGeneral);
295 : // fTextTmpGeneral->Clear();
296 : // }
297 :
298 0 : AddErrorMessagesFromCurrentEvent(eventNum);
299 :
300 0 : for (UInt_t eq=0; eq<20; eq++) {
301 0 : for (UInt_t err=0; err<kNrErrorCodes; err++) {
302 0 : fConsErrType[eq]->Fill(err,fNErrors[err][eq]);
303 0 : if (fNErrors[err][eq]>0) {
304 0 : fConsErrEvent[err][eq]->SetPoint(fErrEventCounter[err][eq],eventNum,fNErrors[err][eq]);
305 0 : fErrEventCounter[err][eq]++;
306 0 : fConsErrFraction[eq]->Fill(err);
307 0 : }
308 0 : for (UInt_t pind=0; pind<fErrPosTMPCounter[err][eq]; pind++) {
309 0 : Double_t x,y;
310 0 : fConsErrPosTMP[err][eq]->GetPoint(pind,x,y);
311 0 : fConsErrPos[err][eq]->SetPoint(fErrPosCounter[err][eq],eventNum,y);
312 0 : fErrPosCounter[err][eq]++;
313 0 : }
314 : }
315 :
316 0 : fNEvents[eq]++;
317 : // if (fNErrors[kTotal][eq]>0) {
318 : // msg = Form("*** Event %d , Eq %d: ***",eventNum,eq);
319 : // fText->InsLine(fText->RowCount(),msg.Data());
320 : // fText->AddText(fTextTmp[eq]);
321 : // fText->InsLine(fText->RowCount()," ");
322 : // }
323 : // fByteOffset[eq]=0;
324 : // fTextTmp[eq]->Clear();
325 : }
326 :
327 0 : }
328 : //________________________________________________________________________________________________
329 : void AliITSRawStreamSPDErrorLog::SummarizeEvent(UInt_t eventNum) {
330 : // summarize the information for the current event
331 0 : ProcessEvent(eventNum);
332 0 : ResetEvent();
333 0 : }
334 : //________________________________________________________________________________________________
335 : void AliITSRawStreamSPDErrorLog::SetByteOffset(UInt_t eq, Int_t size) {
336 : // set byte offset (equipment header size)
337 0 : if (eq<20) {
338 0 : fByteOffset[eq]=size;
339 0 : }
340 : else {
341 0 : AliWarning(Form("Equipment number (%d) out of range",eq));
342 : }
343 0 : }
344 : //________________________________________________________________________________________________
345 : void AliITSRawStreamSPDErrorLog::SuppressErrorMessages(UInt_t errorCode, Bool_t suppr) {
346 : // suppress error messages for specific error code
347 0 : if (errorCode<kNrErrorCodes) {
348 0 : fSuppressMess[errorCode] = suppr;
349 0 : }
350 : else {
351 0 : AliWarning(Form("Error code (%d) out of range",errorCode));
352 : }
353 0 : }
354 : //________________________________________________________________________________________________
355 : void AliITSRawStreamSPDErrorLog::SuppressErrorEq(UInt_t eq, Bool_t suppr) {
356 : // suppress error messages for specific equipment
357 0 : if (eq<20) {
358 0 : fSuppressEq[eq] = suppr;
359 0 : }
360 : else {
361 0 : AliWarning(Form("Eq id (%d) out of range",eq));
362 : }
363 0 : }
364 : //________________________________________________________________________________________________
365 : UInt_t AliITSRawStreamSPDErrorLog::GetNrErrors(UInt_t errorCode, UInt_t eq) {
366 : // returns the number of errors for this event for a specific error code and equipment
367 0 : if (errorCode<kNrErrorCodes && eq<20) return fNErrors[errorCode][eq];
368 : else {
369 0 : AliWarning(Form("Error code (%d) or equipment (%d) out of range, returning 0",errorCode,eq));
370 0 : return 0;
371 : }
372 0 : }
373 : //________________________________________________________________________________________________
374 : UInt_t AliITSRawStreamSPDErrorLog::GetNrErrorsAllEq(UInt_t errorCode) {
375 : // returns the number of errors for this event for a specific error code and all equipments
376 0 : if (errorCode<kNrErrorCodes) {
377 : UInt_t returnval=0;
378 0 : for (UInt_t eq=0; eq<20; eq++) {
379 0 : returnval += fNErrors[errorCode][eq];
380 : }
381 : return returnval;
382 : }
383 : else {
384 0 : AliWarning(Form("Error code (%d) out of range, returning 0",errorCode));
385 0 : return 0;
386 : }
387 0 : }
388 : //________________________________________________________________________________________________
389 : UInt_t AliITSRawStreamSPDErrorLog::GetNrErrorsTotal(UInt_t errorCode, UInt_t eq) {
390 : // returns the total number of errors for a specific error code and equipment
391 0 : if (errorCode<kNrErrorCodes && eq<20) {
392 0 : return fNErrorsTotal[errorCode][eq];
393 : // return (UInt_t) fConsErrType[eq]->GetBinContent(errorCode+1);
394 : }
395 : else {
396 0 : AliWarning(Form("Error code (%d) or equipment (%d) out of range, returning 0",errorCode,eq));
397 0 : return 0;
398 : }
399 0 : }
400 : //________________________________________________________________________________________________
401 : UInt_t AliITSRawStreamSPDErrorLog::GetNrErrorsTotalAllEq(UInt_t errorCode) {
402 : // returns the total number of errors for a specific error code and for all equipments
403 0 : if (errorCode<kNrErrorCodes) {
404 : UInt_t returnval=0;
405 0 : for (UInt_t eq=0; eq<20; eq++) {
406 0 : returnval += fNErrorsTotal[errorCode][eq];
407 : // returnval += (UInt_t) fConsErrType[eq]->GetBinContent(errorCode+1);
408 : }
409 : return returnval;
410 : }
411 : else {
412 0 : AliWarning(Form("Error code (%d) out of range, returning 0",errorCode));
413 0 : return 0;
414 : }
415 0 : }
416 : //________________________________________________________________________________________________
417 : TGraph* AliITSRawStreamSPDErrorLog::GetConsErrEvent(UInt_t errorCode, UInt_t eq) {
418 : // returns a pointer to the graph
419 0 : if (errorCode<kNrErrorCodes && eq<20) return fConsErrEvent[errorCode][eq];
420 : else {
421 0 : AliWarning(Form("Error code (%d) or equipment (%d) out of range, returning NULL",errorCode,eq));
422 0 : return NULL;
423 : }
424 0 : }
425 : //________________________________________________________________________________________________
426 : TH1F* AliITSRawStreamSPDErrorLog::GetConsErrType(UInt_t eq) {
427 : // returns a pointer to the histogram
428 0 : if (eq<20) return fConsErrType[eq];
429 : else {
430 0 : AliWarning(Form("Eq nr (%d) out of bounds",eq));
431 0 : return NULL;
432 : }
433 0 : }
434 : //________________________________________________________________________________________________
435 : TH1F* AliITSRawStreamSPDErrorLog::GetConsErrFraction(UInt_t eq) {
436 : // creates a new histogram and returns a pointer to it.
437 : // NB!!! Take care of deleting this object later
438 0 : if (eq<20) {
439 0 : TH1F* returnhisto = (TH1F*)(fConsErrFraction[eq]->Clone());
440 0 : if (fNEvents[eq]!=0) returnhisto->Scale(1./fNEvents[eq]);
441 : // returnhisto->SetMaximum(1.);
442 : return returnhisto;
443 : }
444 : else {
445 0 : AliWarning(Form("Eq nr (%d) out of bounds",eq));
446 0 : return NULL;
447 : }
448 0 : }
449 : //________________________________________________________________________________________________
450 : TH1F* AliITSRawStreamSPDErrorLog::GetConsErrFractionUnScaled(UInt_t eq) {
451 : // returns a pointer to the histogram
452 0 : if (eq<20) return fConsErrFraction[eq];
453 : else {
454 0 : AliWarning(Form("Eq nr (%d) out of bounds",eq));
455 0 : return NULL;
456 : }
457 0 : }
458 : //________________________________________________________________________________________________
459 : TGraph* AliITSRawStreamSPDErrorLog::GetConsErrPos(UInt_t errorCode, UInt_t eq) {
460 : // returns a pointer to the histogram
461 0 : if (errorCode<kNrErrorCodes && eq<20) return fConsErrPos[errorCode][eq];
462 : else {
463 0 : AliWarning(Form("Error code (%d) or equipment (%d) out of range, returning NULL",errorCode,eq));
464 0 : return NULL;
465 : }
466 0 : }
467 : //________________________________________________________________________________________________
468 : UInt_t AliITSRawStreamSPDErrorLog::GetEventErrPosCounter(UInt_t errorCode, UInt_t eq) {
469 : // returns the number of errors with bytes information for current event
470 0 : if (errorCode<kNrErrorCodes && eq<20) return fErrPosTMPCounter[errorCode][eq];
471 : else {
472 0 : AliError(Form("Error code (%d) or equipment (%d) out of range, returning 0",errorCode,eq));
473 0 : return 0;
474 : }
475 0 : }
476 : //________________________________________________________________________________________________
477 : UInt_t AliITSRawStreamSPDErrorLog::GetEventErrPos(UInt_t index, UInt_t errorCode, UInt_t eq) {
478 : // returns the bytes read for the index'th error of current event
479 0 : if (errorCode<kNrErrorCodes && eq<20) {
480 0 : if (index<fErrPosTMPCounter[errorCode][eq]) {
481 0 : Double_t x,y;
482 0 : fConsErrPosTMP[errorCode][eq]->GetPoint(index,x,y);
483 0 : return (UInt_t) y;
484 0 : }
485 : else {
486 0 : AliError(Form("Index %d out of range, returning 0",index));
487 0 : return 0;
488 : }
489 : }
490 : else {
491 0 : AliError(Form("Error code (%d) or equipment (%d) out of range, returning 0",errorCode,eq));
492 0 : return 0;
493 : }
494 :
495 0 : }
496 :
|