]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - TOF/AliTOFRawStream.cxx
Deleting Objects in a proper way. Minor improvements added.
[u/mrichter/AliRoot.git] / TOF / AliTOFRawStream.cxx
... / ...
CommitLineData
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/*
17$Log$
18Revision 1.19 2007/05/18 13:07:53 decaro
19Error messages stored in the global raw-reader error log (Cvetan, Chiara)
20
21Revision 1.18 2007/05/08 11:53:29 arcelli
22Improved class flexibility for further use (R.Preghenella)
23
24Revision 1.17 2007/05/03 08:53:50 decaro
25Coding convention: RS3 violation -> suppression
26
27Revision 1.16 2007/05/03 08:22:22 decaro
28Coding convention: RN17 violation -> suppression
29
30Revision 1.15 2007/04/30 15:22:06 arcelli
31Change TOF digit Time, Tot etc to int type
32
33Revision 1.14 2007/04/27 11:11:53 arcelli
34updates for the new decoder
35
36Revision 1.13 2007/03/16 11:46:35 decaro
37Coding convention: RN17 rule violation -> suppression
38
39Revision 1.12 2007/02/22 09:43:45 decaro
40Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
41
42Revision 1.11 2007/02/20 15:57:00 decaro
43Raw data update: to read the TOF raw data defined in UNPACKED mode
44
45Revision 1.10 2006/12/15 14:01:38 cvetan
46Memory leak fixed
47
48Revision 1.9 2006/10/13 11:22:27 arcelli
49remove warnings due to uninitialized AliTOFtdcDigit data members
50
51Revision 1.8 2006/08/22 13:30:17 arcelli
52removal of effective c++ warnings (C.Zampolli)
53
54Revision 1.7 2006/08/10 14:46:54 decaro
55TOF raw data format: updated version
56
57Revision 1.6.1 2006/06/28 A. De Caro, R. Preghenella:
58 Update TOF raw data format
59 according to the final version
60 (see the ALICE internal note in preparation
61 'ALICE TOF raw data format')
62 Added the methods for the correspoonding numbering
63 between the equipment IDs and the volume IDs:
64 Equip2VolNPlate(...)
65 Equip2VolNStrip(...)
66 Equip2VolNPad(...)
67
68Revision 0.02 2005/07/28 A. De Caro:
69 Update format TOF raw data
70 (temporary solution)
71 Correction of few wrong corrispondences
72 between 'software' and 'hardware' numberings
73
74Revision 0.01 2005/07/22 A. De Caro
75 Implement methods Next()
76 GetSector(),
77 GetPlate(),
78 GetStrip(),
79 GetPadZ(),
80 GetPadX()
81*/
82
83////////////////////////////////////////////////////////////////////////
84// //
85// This class provides access to TOF raw data in DDL files. //
86// //
87// It loops over all TOF raw data given by the AliRawReader. //
88// //
89////////////////////////////////////////////////////////////////////////
90
91
92#include "Riostream.h"
93
94#include "TClonesArray.h"
95
96#include "AliDAQ.h"
97#include "AliLog.h"
98#include "AliRawReader.h"
99
100#include "AliTOFGeometry.h"
101#include "AliTOFrawData.h"
102#include "AliTOFRawMap.h"
103#include "AliTOFRawStream.h"
104
105#include "AliTOFHitData.h"
106
107ClassImp(AliTOFRawStream)
108
109
110//_____________________________________________________________________________
111AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
112 fRawReader(rawReader),
113 fTOFrawData(0x0),
114 fDecoder(new AliTOFDecoder()),
115 fDDL(-1),
116 fTRM(-1),
117 fTRMchain(-1),
118 fTDC(-1),
119 fTDCchannel(-1),
120 fTime(-1),
121 fToT(-1),
122 fLeadingEdge(-1),
123 fTrailingEdge(-1),
124 fErrorFlag(-1),
125 fSector(-1),
126 fPlate(-1),
127 fStrip(-1),
128 fPadX(-1),
129 fPadZ(-1),
130 fPackedDigits(0),
131 fWordType(-1),
132 fSlotID(-1),
133 fACQ(-1),
134 fPSbit(-1),
135 fTDCerrorFlag(-1),
136 fInsideDRM(kFALSE),
137 fInsideTRM(kFALSE),
138 fInsideLTM(kFALSE),
139 fInsideTRMchain0(kFALSE),
140 fInsideTRMchain1(kFALSE),
141 fLocalEventCounterDRM(-1),
142 fLocalEventCounterLTM(-1),
143 fLocalEventCounterTRM(0x0),
144 fLocalEventCounterChain(0x0)
145{
146 //
147 // create an object to read TOF raw digits
148 //
149
150 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
151 fDataBuffer[i]=new AliTOFHitDataBuffer();
152 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
153 }
154
155 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
156 fTOFrawData->SetOwner();
157
158 fRawReader->Reset();
159 fRawReader->Select("TOF");
160
161 fLocalEventCounterTRM = new Int_t[13];//adc
162 fLocalEventCounterChain = new Int_t*[13];//adc
163 for (Int_t j=0;j<13;j++){//adc
164 fLocalEventCounterTRM[j] = -1;//adc
165 fLocalEventCounterChain[j] = new Int_t[2];//adc
166 for (Int_t k=0;k<2;k++){//adc
167 fLocalEventCounterChain[j][k] = -1;//adc
168 }//adc
169 }//adc
170
171}
172
173//_____________________________________________________________________________
174AliTOFRawStream::AliTOFRawStream():
175 fRawReader(0x0),
176 fTOFrawData(0x0),
177 fDecoder(new AliTOFDecoder()),
178 fDDL(-1),
179 fTRM(-1),
180 fTRMchain(-1),
181 fTDC(-1),
182 fTDCchannel(-1),
183 fTime(-1),
184 fToT(-1),
185 fLeadingEdge(-1),
186 fTrailingEdge(-1),
187 fErrorFlag(-1),
188 fSector(-1),
189 fPlate(-1),
190 fStrip(-1),
191 fPadX(-1),
192 fPadZ(-1),
193 fPackedDigits(0),
194 fWordType(-1),
195 fSlotID(-1),
196 fACQ(-1),
197 fPSbit(-1),
198 fTDCerrorFlag(-1),
199 fInsideDRM(kFALSE),
200 fInsideTRM(kFALSE),
201 fInsideLTM(kFALSE),
202 fInsideTRMchain0(kFALSE),
203 fInsideTRMchain1(kFALSE),
204 fLocalEventCounterDRM(-1),
205 fLocalEventCounterLTM(-1),
206 fLocalEventCounterTRM(0x0),
207 fLocalEventCounterChain(0x0)
208{
209 //
210 // default ctr
211 //
212 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
213 fDataBuffer[i]=new AliTOFHitDataBuffer();
214 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
215 }
216
217 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
218 fTOFrawData->SetOwner();
219
220 fLocalEventCounterTRM = new Int_t[13];//adc
221 fLocalEventCounterChain = new Int_t*[13];//adc
222 for (Int_t j=0;j<13;j++){//adc
223 fLocalEventCounterTRM[j] = -1;//adc
224 fLocalEventCounterChain[j] = new Int_t[2];//adc
225 for (Int_t k=0;k<2;k++){//adc
226 fLocalEventCounterChain[j][k] = -1;//adc
227 }//adc
228 }//adc
229
230}
231
232//_____________________________________________________________________________
233AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
234 TObject(stream),
235 fRawReader(0x0),
236 fTOFrawData(0x0),
237 fDecoder(new AliTOFDecoder()),
238 fDDL(-1),
239 fTRM(-1),
240 fTRMchain(-1),
241 fTDC(-1),
242 fTDCchannel(-1),
243 fTime(-1),
244 fToT(-1),
245 fLeadingEdge(-1),
246 fTrailingEdge(-1),
247 fErrorFlag(-1),
248 fSector(-1),
249 fPlate(-1),
250 fStrip(-1),
251 fPadX(-1),
252 fPadZ(-1),
253 fPackedDigits(0),
254 fWordType(-1),
255 fSlotID(-1),
256 fACQ(-1),
257 fPSbit(-1),
258 fTDCerrorFlag(-1),
259 fInsideDRM(kFALSE),
260 fInsideTRM(kFALSE),
261 fInsideLTM(kFALSE),
262 fInsideTRMchain0(kFALSE),
263 fInsideTRMchain1(kFALSE),
264 fLocalEventCounterDRM(-1),
265 fLocalEventCounterLTM(-1),
266 fLocalEventCounterTRM(0x0),
267 fLocalEventCounterChain(0x0)
268{
269 //
270 // copy constructor
271 //
272
273 fRawReader = stream.fRawReader;
274
275 fTOFrawData = stream.fTOFrawData;
276
277 fDDL = stream.fDDL;
278 fTRM = stream.fTRM;
279 fTRMchain = stream.fTRMchain;
280 fTDC = stream.fTDC;
281 fTDCchannel = stream.fTDCchannel;
282 fTime = stream.fTime;
283 fToT = stream.fToT;
284 fLeadingEdge = stream.fLeadingEdge;
285 fTrailingEdge = stream.fTrailingEdge;
286
287 fErrorFlag = stream.fErrorFlag;
288
289 fSector = stream.fSector;
290 fPlate = stream.fPlate;
291 fStrip = stream.fStrip;
292 fPadX = stream.fPadX;
293 fPadZ = stream.fPadZ;
294
295 fPackedDigits = stream.fPackedDigits;
296
297 fWordType = stream.fWordType;
298 fSlotID = stream.fSlotID;
299 fACQ = stream.fACQ;
300 fPSbit = stream.fPSbit;
301 fTDCerrorFlag = stream.fTDCerrorFlag;
302 fInsideDRM = stream.fInsideDRM;
303 fInsideTRM = stream.fInsideTRM;
304 fInsideLTM = stream.fInsideLTM;
305 fInsideTRMchain0 = stream.fInsideTRMchain0;
306 fInsideTRMchain1 = stream.fInsideTRMchain1;
307
308 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
309 fDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fDataBuffer[i]);
310 fPackedDataBuffer[i]= new AliTOFHitDataBuffer(*stream.fPackedDataBuffer[i]);
311 }
312
313 fTOFrawData = new TClonesArray(*stream.fTOFrawData);
314
315 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
316 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
317 for (Int_t j=0;j<13;j++){//adc
318 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
319 for (Int_t k=0;k<2;k++){//adc
320 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
321 }//adc
322 }//adc
323
324}
325
326//_____________________________________________________________________________
327AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
328{
329 //
330 // assignment operator
331 //
332
333 fRawReader = stream.fRawReader;
334
335 fTOFrawData = stream.fTOFrawData;
336
337 fDDL = stream.fDDL;
338 fTRM = stream.fTRM;
339 fTRMchain = stream.fTRMchain;
340 fTDC = stream.fTDC;
341 fTDCchannel = stream.fTDCchannel;
342 fTime = stream.fTime;
343 fToT = stream.fToT;
344 fLeadingEdge = stream.fLeadingEdge;
345 fTrailingEdge = stream.fTrailingEdge;
346 fErrorFlag = stream.fErrorFlag;
347
348 fSector = stream.fSector;
349 fPlate = stream.fPlate;
350 fStrip = stream.fStrip;
351 fPadX = stream.fPadX;
352 fPadZ = stream.fPadZ;
353
354 fPackedDigits = stream.fPackedDigits;
355
356 fWordType = stream.fWordType;
357 fSlotID = stream.fSlotID;
358 fACQ = stream.fACQ;
359 fPSbit = stream.fPSbit;
360 fTDCerrorFlag = stream.fTDCerrorFlag;
361 fInsideDRM = stream.fInsideDRM;
362 fInsideTRM = stream.fInsideTRM;
363 fInsideLTM = stream.fInsideLTM;
364 fInsideTRMchain0 = stream.fInsideTRMchain0;
365 fInsideTRMchain1 = stream.fInsideTRMchain1;
366
367 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
368 fDataBuffer[i] = stream.fDataBuffer[i];
369 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
370 }
371
372 fTOFrawData = stream.fTOFrawData;
373
374 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;//adc
375 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;//adc
376 for (Int_t j=0;j<13;j++){//adc
377 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];//adc
378 for (Int_t k=0;k<2;k++){//adc
379 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];//adc
380 }//adc
381 }//adc
382
383 return *this;
384
385}
386
387//_____________________________________________________________________________
388AliTOFRawStream::~AliTOFRawStream()
389{
390// destructor
391
392 fPackedDigits = 0;
393
394 for (Int_t i=0;i<72;i++){
395 delete fDataBuffer[i];
396 delete fPackedDataBuffer[i];
397 }
398
399 delete fDecoder;
400
401 fTOFrawData->Clear();
402 delete fTOFrawData;
403
404 delete [] fLocalEventCounterTRM;
405 for (Int_t ii=0; ii<13; ii++)
406 delete [] fLocalEventCounterChain[ii];
407 delete [] fLocalEventCounterChain;
408
409}
410
411
412//_____________________________________________________________________________
413
414void AliTOFRawStream::LoadRawData(Int_t indexDDL)
415{
416 //
417 // To load raw data
418 //
419
420 fTOFrawData->Clear();
421
422 TClonesArray &arrayTofRawData = *fTOFrawData;
423
424 fPackedDigits = 0;
425
426 // create raw data map
427 AliTOFRawMap *rawMap = new AliTOFRawMap(fTOFrawData);
428 rawMap->Clear();
429
430 Int_t slot[4] = {-1, -1, -1, -1};
431
432 fLocalEventCounterDRM = -1;
433 fLocalEventCounterLTM = -1;
434 for (Int_t ii=0; ii<13; ii++)
435 fLocalEventCounterTRM[ii] = -1;
436 for (Int_t ii=0; ii<13; ii++)
437 for (Int_t jj=0; jj<2; jj++)
438 fLocalEventCounterChain[ii][jj] = -1;
439
440 fRawReader->Reset();
441 fRawReader->Select("TOF", indexDDL, indexDDL);
442
443 Bool_t signal = kFALSE;
444
445 AliTOFrawData *rawDigit = NULL;
446
447 while(Next()) {
448
449 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
450 if (signal) {
451 AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
452
453 slot[0] = fTRM;
454 slot[1] = fTRMchain;
455 slot[2] = fTDC;
456 slot[3] = fTDCchannel;
457
458 if (rawMap->TestHit(slot) != kEmpty) {
459
460 rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
461
462 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
463 fLeadingEdge==-1 && fTrailingEdge!=-1) {
464
465 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
466 }
467 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
468 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
469
470 )
471 {
472
473 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
474
475 rawMap->SetHit(slot);
476
477 }
478
479
480 }
481 else {
482
483 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
484
485 rawMap->SetHit(slot);
486
487 } // else if (rawMap->TestHit(slot) == kEmpty)
488
489 } // if (signal)
490
491 } // closed -> while (Next())
492
493 rawMap->Delete();
494
495}
496
497//_____________________________________________________________________________
498Bool_t AliTOFRawStream::Next()
499{
500 //
501 // Read next 32-bit word in TOF raw data files
502 // returns kFALSE if there is no word left
503 //
504
505 UInt_t data;
506
507 Int_t dummy = 0;
508
509 if (!fRawReader->ReadNextInt(data)) return kFALSE;
510
511 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
512 fSector = -1;
513 fPlate = -1;
514 fStrip = -1;
515 fPadZ = -1;
516 fPadX = -1;
517 fTime = -1;
518 fToT = -1;
519 fLeadingEdge = -1;
520 fTrailingEdge = -1;
521 }
522
523 fDDL = fRawReader->GetDDLID();
524
525 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
526
527 switch (fWordType) { // switch word type
528
529 case GLOBAL_HEADER_TYPE: // global header
530 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
531 fTRM = fSlotID;
532
533
534 switch (fSlotID) { // switch global header slot ID
535
536 case DRM_ID_NUMBER: //DRM global header
537 if (fInsideDRM) { // unexpected DRM global headers -> exit
538 break;
539 }
540 fInsideDRM = kTRUE; // DRM global header accepted
541 break;
542
543 case LTM_ID_NUMBER: // LTM global header
544 if (fInsideLTM) { // unexpected LTM global headers -> exit
545 break;
546 }
547 fInsideLTM = kTRUE; // LTM global header accepted
548 break;
549
550 case 3: //TRM header
551 case 4: //TRM header
552 case 5: //TRM header
553 case 6: //TRM header
554 case 7: //TRM header
555 case 8: //TRM header
556 case 9: //TRM header
557 case 10: //TRM header
558 case 11: //TRM header
559 case 12: //TRM header
560 if (fInsideTRM) { // unexpected TRM global headers -> exit
561 break;
562 }
563 fInsideTRM = kTRUE; // TRM global header accepted
564 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
565 break;
566
567 default: // unexpected global header slot ID
568 break;
569
570 } //end switch global header slot id
571
572 break;
573
574
575 case GLOBAL_TRAILER_TYPE: // global trailer
576 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
577
578 switch (fSlotID) { // switch global trailer slot ID
579
580 case DRM_ID_NUMBER: // DRM global trailer
581 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
582 break;
583 }
584 dummy = 0x0000fff0;
585 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
586 fLocalEventCounterDRM = GetField(data,dummy,4);//adc
587 fInsideDRM = kFALSE; // DRM global trailer accepted
588 fInsideTRM = kFALSE;
589 fInsideLTM = kFALSE;
590 fInsideTRMchain0 = kFALSE;
591 fInsideTRMchain1 = kFALSE;
592 fSector = -1;
593 fPlate = -1;
594 fStrip = -1;
595 fPadZ = -1;
596 fPadX = -1;
597 fDDL = -1;
598 fTRM = -1;
599 fTDC = -1;
600 fTRMchain = -1;
601 fTDCchannel = -1;
602 fTime = -1;
603 fToT = -1;
604 fLeadingEdge = -1;
605 fTrailingEdge = -1;
606 fErrorFlag = -1;
607 fACQ = -1;
608 fPSbit = -1;
609 fTDCerrorFlag = -1;
610 break;
611 case LTM_ID_NUMBER: // LTM global trailer
612 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
613 break;
614 }
615 dummy = 0x0fff0000;
616 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
617 fLocalEventCounterLTM = GetField(data,dummy,16);//adc
618 fInsideLTM = kFALSE; // LTM global trailer accepted
619 break;
620 case 15: //TRM global trailer
621 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
622 break;
623 }
624 dummy = 0x0fff0000;
625 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
626 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);//adc
627 fInsideTRM = kFALSE; // TRM global trailer accepted
628 break;
629 default: // unexpected global trailer slot ID
630 break;
631 } //end switch global trailer slot id
632
633
634 break;
635
636
637 case ERROR_TYPE: // TDC error
638 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
639 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
640 break;
641
642
643 case FILLER_TYPE: // filler
644 break;
645
646
647 default: // other word types
648
649 if (fInsideTRM) { // inside TRM
650
651 switch (fWordType) { // switch word type inside TRM
652 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
653 if (fInsideTRMchain0) { // unexpected TRM chain0 header
654 break;
655 }
656 fInsideTRMchain0 = kTRUE;
657 fTRMchain = 0;
658 break;
659 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
660 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
661 break;
662 }
663 dummy = 0x0fff0000;
664 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
665 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
666 fInsideTRMchain0 = kFALSE;
667 fTRMchain = -1;
668 break;
669 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
670 if (fInsideTRMchain1) { // unexpected TRM chain1 header
671 break;
672 }
673 fInsideTRMchain1 = kTRUE;
674 fTRMchain = 1;
675 break;
676 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
677 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
678 break;
679 }
680 dummy = 0x0fff0000;
681 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
682 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
683 fInsideTRMchain1 = kFALSE;
684 fTRMchain = -1;
685 break;
686 } // end switch word type inside TRM
687
688 } // end if (fInsideTRM)
689
690
691 if (
692 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
693 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
694 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
695 ){ // inside TRM chains
696
697 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
698 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
699 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
700 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
701
702 SetSector();
703 SetPlate();
704 SetStrip();
705 SetPadZ();
706 SetPadX();
707
708
709 switch (fPSbit) { // switch fPSbit bits inside TRM chains
710
711 case 0: // packing ok, digit time and TOT
712 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
713 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
714 break;
715
716 case 1: // leading edge digit, long digit time, no TOT
717 //fToT = -1;
718 //fTime = -1;
719 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
720 break;
721
722 case 2: // trailing edge digit, long digit time, no TOT
723 //fToT = -1;
724 //fTime = -1;
725 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
726 break;
727
728 case 3: // TOT overflow
729 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
730 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
731 break;
732
733 } // end switch PS bits inside TRM chains
734
735 } // end if is inside TRM chains
736
737 } // end switch on fWordType
738
739
740 return kTRUE;
741
742}
743//_____________________________________________________________________________
744
745void AliTOFRawStream::SetSector()
746{
747 //
748 // Evaluate the TOF sector number -> [ 0;17]
749 // corresponding to the TOF equipment IDs:
750 // fDDL -> [ 0;71]
751 // fTRM -> [ 3;12]
752 // fTRMchain -> [ 0; 1]
753 // fTDC -> [ 0;14]
754 // fTDCchannel -> [ 0; 7]
755 //
756
757 Int_t iSector = -1;
758
759 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
760
761 fSector = iSector;
762
763}
764//_____________________________________________________________________________
765
766
767void AliTOFRawStream::SetPlate()
768{
769 //
770 // Evaluate the TOF plate number ->[ 0; 4]
771 // corresponding to the TOF equipment IDs:
772 // fDDL -> [ 0;71]
773 // fTRM -> [ 3;12]
774 // fTRMchain -> [ 0; 1]
775 // fTDC -> [ 0;14]
776 // fTDCchannel -> [ 0; 7]
777 //
778
779 Int_t iPlate = -1;
780 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
781 || fSector==-1))
782 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
783
784 fPlate = iPlate;
785
786}
787//_____________________________________________________________________________
788
789void AliTOFRawStream::SetStrip()
790{
791 //
792 // Evaluate the TOF strip number per module -> [ 0; 14/18]
793 // corresponding to the TOF equipment IDs:
794 // fDDL -> [ 0;71]
795 // fTRM -> [ 3;12]
796 // fTRMchain -> [ 0; 1]
797 // fTDC -> [ 0;14]
798 // fTDCchannel -> [ 0; 7]
799 //
800
801 Int_t iStrip = -1;
802
803 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
804 || fSector==-1 || fPlate==-1))
805 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
806
807 fStrip = iStrip;
808
809}
810//_____________________________________________________________________________
811
812void AliTOFRawStream::SetPadZ()
813{
814 //
815 // Evaluate the TOF padRow number per strip -> [ 0; 1]
816 // corresponding to the TOF equipment IDs:
817 // fDDL -> [ 0;71]
818 // fTRM -> [ 3;12]
819 // fTRMchain -> [ 0; 1]
820 // fTDC -> [ 0;14]
821 // fTDCchannel -> [ 0; 7]
822 //
823
824 Int_t iPadZ = -1;
825
826 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
827 || fSector==-1 || fPlate==-1 || fStrip==-1))
828 {
829 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
830 if (iPadAlongTheStrip!=-1)
831 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
832 }
833
834 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
835 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
836
837 fPadZ = iPadZ;
838
839}
840//_____________________________________________________________________________
841
842void AliTOFRawStream::SetPadX()
843{
844 //
845 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
846 // corresponding to the TOF equipment IDs:
847 // fDDL -> [ 0;71]
848 // fTRM -> [ 3;12]
849 // fTRMchain -> [ 0; 1]
850 // fTDC -> [ 0;14]
851 // fTDCchannel -> [ 0; 7]
852 //
853
854 Int_t iPadX = -1;
855
856 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
857 || fSector==-1 || fPlate==-1 || fStrip==-1))
858 {
859 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
860 if (iPadAlongTheStrip!=-1)
861 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
862 }
863
864 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
865 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
866
867 fPadX = iPadX;
868
869}
870
871//----------------------------------------------------------------------------
872Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
873{
874 //
875 //
876 //
877
878 return ((word & fieldMask) >> fieldPosition);
879}
880
881//----------------------------------------------------------------------------
882Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
883{
884 //
885 // Returns the TOF plate number [0;4]
886 // corresponding to the TOF equipment ID numbers:
887 // iDDL -> DDL number per sector [0;3]
888 // nTRM -> TRM number [3;12]
889 // nTDC -> TDC number [0;14]
890 //
891
892 Int_t iPlate = -1;
893 if (iDDL==0) {
894
895 if (nTRM>=4 && nTRM<7) {
896 iPlate = 0;
897 } else if (nTRM==7) {
898 if (nTDC<12) iPlate = 0;
899 else iPlate = 1;
900 } else if (nTRM>=8 && nTRM<11) {
901 iPlate = 1;
902 } else if (nTRM==11) {
903 if (nTDC<9) iPlate = 1;
904 else iPlate = 2;
905 }else if (nTRM==12) {
906 iPlate = 2;
907 }
908
909 } else if (iDDL==1) {
910
911 if (nTRM==3) {
912 if (nTDC<3) iPlate = 0;
913 } else if (nTRM>=4 && nTRM<7) {
914 iPlate = 0;
915 } else if (nTRM==7) {
916 if (nTDC<6) iPlate = 1;
917 else iPlate = 0;
918 } else if (nTRM>=8 && nTRM<11) {
919 iPlate = 1;
920 } else if (nTRM==11) {
921 if (nTDC<9) iPlate = 2;
922 else iPlate = 1;
923 } else if (nTRM==12) {
924 iPlate = 2;
925 }
926
927 } else if (iDDL==2) {
928
929 if (nTRM>=4 && nTRM<7) {
930 iPlate = 4;
931 } else if (nTRM==7) {
932 if (nTDC<12) iPlate = 4;
933 else iPlate = 3;
934 } else if (nTRM>=8 && nTRM<11) {
935 iPlate = 3;
936 } else if (nTRM==11) {
937 if (nTDC<9) iPlate = 3;
938 else iPlate = 2;
939 }else if (nTRM==12) {
940 iPlate = 2;
941 }
942
943 } else if (iDDL==3) {
944
945 if (nTRM==3) {
946 if (nTDC<3) iPlate = 4;
947 } else if (nTRM>=4 && nTRM<7) {
948 iPlate = 4;
949 } else if (nTRM==7) {
950 if (nTDC<6) iPlate = 3;
951 else iPlate = 4;
952 } else if (nTRM>=8 && nTRM<11) {
953 iPlate = 3;
954 } else if (nTRM==11) {
955 if (nTDC<9) iPlate = 2;
956 else iPlate = 3;
957 } else if (nTRM==12) {
958 iPlate = 2;
959 }
960
961 }
962
963 return iPlate;
964
965}
966
967//----------------------------------------------------------------------------
968Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
969{
970 //
971 // Returns the TOF strip number per module:
972 // [0;14], in the central plates,
973 // [0;18], in the intermediate and external plates
974 // corresponding to the TOF equipment ID numbers:
975 // iDDL -> DDL number per sector [0;3]
976 // nTRM -> TRM number [3;12]
977 // nTDC -> TDC number [0;14]
978 //
979
980 Int_t iStrip = -1;
981
982 if (iDDL==0) {
983
984 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
985 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
986 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
987 else if (nTRM== 7) {
988 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
989 else iStrip = (Int_t)(nTDC/3.) - 4;
990 }
991 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
992 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
993 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
994 else if (nTRM==11) {
995 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
996 else iStrip = (Int_t)(nTDC/3.) - 3;
997 }
998 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
999
1000 } else if (iDDL==1) {
1001
1002 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1003 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
1004 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1005 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1006 else if (nTRM== 7) {
1007 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
1008 else iStrip = 20 - (Int_t)(nTDC/3.);
1009 }
1010 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
1011 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1012 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1013 else if (nTRM==11) {
1014 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
1015 else iStrip = 21 - (Int_t)(nTDC/3.);
1016 }
1017 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
1018
1019 } else if (iDDL==2) {
1020
1021 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
1022 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1023 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1024 else if (nTRM== 7) {
1025 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
1026 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
1027 }
1028 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1029 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1030 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1031 else if (nTRM==11) {
1032 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1033 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
1034 }
1035 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1036
1037 } else if (iDDL==3) {
1038
1039 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1040 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1041 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1042 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1043 else if (nTRM== 7) {
1044 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
1045 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1046 }
1047 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1048 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1049 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1050 else if (nTRM==11) {
1051 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1052 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1053 }
1054 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1055
1056 }
1057
1058 return iStrip;
1059
1060}
1061
1062//----------------------------------------------------------------------------
1063Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
1064 Int_t iCH)
1065{
1066 //
1067 // Returns the TOF pad number per strip [0;95]
1068 // corresponding to the TOF equipment ID numbers:
1069 // iDDL -> DDL number per sector [0;3]
1070 // iChain -> TRM chain number [0;1]
1071 // nTDC -> TDC number [0;14]
1072 // iCH -> TDC channel number [0;7]
1073 //
1074
1075 Int_t iPadAlongTheStrip = -1;
1076
1077 // wrong
1078 //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1079 //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1080 //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
1081
1082 // right
1083 Int_t iTDClocal = -1;
1084 Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1085 Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1086 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1087 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
1088
1089 Int_t iCHlocal = iCH;
1090 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1091
1092 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1093
1094 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
1095 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
1096 std::cerr << "Problems with the padX number!" << endl;
1097 //AliWarning("Problems with the padX number!");
1098 }
1099 return iPadAlongTheStrip;
1100
1101}
1102
1103//----------------------------------------------------------------------------
1104Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1105 Int_t iCH)
1106{
1107 //
1108 // Returns the TOF padX number [0;47]
1109 // corresponding to the TOF equipment ID numbers:
1110 // iDDL -> DDL number per sector [0;3]
1111 // iChain -> TRM chain number [0;1]
1112 // nTDC -> TDC number [0;14]
1113 // iCH -> TDC channel number [0;7]
1114 //
1115
1116 Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1117 (Float_t(AliTOFGeometry::NpadZ())));
1118
1119 return iPadX;
1120
1121}
1122
1123//----------------------------------------------------------------------------
1124Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1125 Int_t iCH)
1126{
1127 //
1128 // Returns the TOF padZ number [0;1]
1129 // corresponding to the TOF equipment ID numbers:
1130 // iDDL -> DDL number per sector [0;3]
1131 // iChain -> TRM chain number [0;1]
1132 // nTDC -> TDC number [0;14]
1133 // iCH -> TDC channel number [0;7]
1134 //
1135
1136 Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1137
1138 return iPadZ;
1139
1140}
1141
1142//----------------------------------------------------------------------------
1143Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL) const
1144{
1145 //
1146 // Returns the sector number [0;17]
1147 // corresponing to the assigned DRM/DDL number [0;71]
1148 //
1149
1150 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1151
1152 return iSector;
1153
1154}
1155//----------------------------------------------------------------------------
1156Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL) const
1157{
1158 //
1159 // Return the DRM/DDL number per sector [0;3]
1160 // corresponing to the assigned DRM/DDL number [0;71]
1161 //
1162
1163 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1164
1165 return iDDL;
1166
1167}
1168
1169//----------------------------------------------------------------------------
1170void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1171{
1172 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1173}
1174//----------------------------------------------------------------------------
1175void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
1176 Int_t nTDC, Int_t iCH,
1177 Int_t *volume) const
1178{
1179 //
1180 // To convert:
1181 // nDDL (variable in [0;71]) -> number of the DDL file
1182 // nTRM (variable in [3;12]) -> number of the TRM slot
1183 // iChain (variable in [0; 1]) -> number of the TRM chain
1184 // nTDC (variable in [0;14]) -> number of the TDC
1185 // iCH (variable in [0; 7]) -> number of the TDC channel
1186 //
1187 // in:
1188 // sector number, i.e. volume[0] (variable in [0,17])
1189 // plate number, i.e. volume[1] (variable in [0, 5])
1190 // strip number, i.e. volume[2] (variable in [0,14/18])
1191 // padX number, i.e. volume[3] (variable in [0,47])
1192 // padZ number, i.e. volume[4] (variable in [0, 1])
1193 //
1194
1195 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1196
1197 Int_t iSector = GetSectorNumber(nDDL);
1198
1199 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
1200 if (iPlate==-1) {
1201 if (fRawReader)
1202 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
1203 AliWarning("Problems with the plate number!");
1204 }
1205
1206 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
1207 if (iStrip==-1) {
1208 if (fRawReader)
1209 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
1210 AliWarning("Problems with the strip number!");
1211 }
1212
1213 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
1214 if (iPadAlongTheStrip==-1){
1215 if (fRawReader)
1216 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
1217 AliWarning("Problems with the pad number along the strip!");
1218 }
1219
1220 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1221 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
1222
1223 //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1224 //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1225
1226 //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1227 //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1228
1229 volume[0] = iSector;
1230 volume[1] = iPlate;
1231 volume[2] = iStrip;
1232 volume[3] = iPadX;
1233 volume[4] = iPadZ;
1234
1235}
1236//-----------------------------------------------------------------------------
1237Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1238 //
1239 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1240 //
1241
1242 //check and fix valid DDL range
1243 if (nDDLMin < 0){
1244 nDDLMin = 0;
1245 fRawReader->AddMinorErrorLog(kDDLMinError);
1246 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1247 }
1248 if (nDDLMax > 71){
1249 nDDLMax = 71;
1250 fRawReader->AddMinorErrorLog(kDDLMaxError);
1251 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1252 }
1253
1254 //select required DDLs
1255 fRawReader->Select("TOF", nDDLMin, nDDLMax);
1256
1257 if (verbose)
1258 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
1259
1260 return(Decode(verbose));
1261}
1262//-----------------------------------------------------------------------------
1263Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1264 //
1265 // New decoder method
1266 //
1267
1268 Int_t currentEquipment;
1269 Int_t currentDDL;
1270
1271 //pointers
1272 UChar_t *data = 0x0;
1273
1274 //loop and read DDL headers
1275 while(fRawReader->ReadHeader()){
1276
1277 //memory leak prevention (actually data should be always 0x0 here)
1278 if (data != 0x0)
1279 delete [] data;
1280
1281 //get equipment infos
1282 currentEquipment = fRawReader->GetEquipmentId();
1283 currentDDL = fRawReader->GetDDLID();
1284 const Int_t kDataSize = fRawReader->GetDataSize();
1285 const Int_t kDataWords = kDataSize / 4;
1286 data = new UChar_t[kDataSize];
1287
1288 if (verbose)
1289 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1290
1291 if (verbose)
1292 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1293
1294 //read equipment payload
1295 if (!fRawReader->ReadNext(data, kDataSize))
1296 {
1297 fRawReader->AddMajorErrorLog(kDDLdataReading);
1298 if (verbose)
1299 AliWarning("Error while reading DDL data. Go to next equipment");
1300 delete [] data;
1301 data = 0x0;
1302 continue;
1303 }
1304
1305 if (verbose)
1306 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1307
1308
1309 //set up the decoder
1310 fDecoder->SetVerbose(verbose);
1311 fDecoder->SetDataBuffer(fDataBuffer[currentDDL]);
1312 fDecoder->SetPackedDataBuffer(fPackedDataBuffer[currentDDL]);
1313
1314 //start decoding
1315 if (fDecoder->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1316 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1317 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1318 }
1319
1320 delete [] data;
1321 data = 0x0;
1322 }
1323
1324 //reset reader
1325 fRawReader->Reset();
1326
1327 if (verbose)
1328 AliInfo("All done");
1329
1330 return kFALSE;
1331
1332}
1333//---------------------------------------------------------------------------
1334void
1335AliTOFRawStream::ResetBuffers()
1336{
1337 //
1338 // To reset the buffers
1339 //
1340
1341 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1342 ResetDataBuffer(iDDL);
1343 ResetPackedDataBuffer(iDDL);
1344 }
1345}
1346
1347//---------------------------------------------------------------------------
1348Bool_t
1349AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1350{
1351 //
1352 // To load the buffers
1353 //
1354
1355 fTOFrawData->Clear();
1356 fPackedDigits = 0;
1357
1358 if (verbose > 0)
1359 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1360
1361 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
1362 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1363 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
1364 return kTRUE;
1365 }
1366
1367 if (verbose > 0)
1368 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL]->GetEntries(), fPackedDataBuffer[indexDDL]->GetEntries() > 1 ? "hits have" : "hit has"));
1369
1370 AliTOFHitData *hitData; //hit data pointer
1371
1372 if (verbose > 0)
1373 AliInfo("Filling TClonesArray ...");
1374
1375 //loop over DDL packed hits
1376 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL]->GetEntries(); iHit++){
1377 hitData = fPackedDataBuffer[indexDDL]->GetHit(iHit); //get hit data
1378 Int_t hitACQ = hitData->GetACQ();
1379 Int_t hitPS = hitData->GetPS();
1380 Int_t hitSlotID = hitData->GetSlotID();
1381 Int_t hitChain = hitData->GetChain();
1382 Int_t hitTDC = hitData->GetTDC();
1383 Int_t hitChan = hitData->GetChan();
1384 Int_t hitTimeBin = hitData->GetTimeBin();
1385 Int_t hitTOTBin = hitData->GetTOTBin();
1386
1387 Int_t hitLeading = hitData->GetTimeBin();//-1; // adc
1388 Int_t hitTrailing = -1;
1389 Int_t hitError = -1;
1390
1391 TClonesArray &arrayTofRawData = *fTOFrawData;
1392 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
1393 }
1394
1395 if (verbose > 0)
1396 AliInfo("Done.");
1397
1398 if (verbose > 0)
1399 AliInfo("Resetting buffers ...");
1400
1401 fDataBuffer[indexDDL]->Reset();
1402 fPackedDataBuffer[indexDDL]->Reset();
1403
1404 if (verbose > 0)
1405 AliInfo("Done.");
1406
1407 return kFALSE;
1408}
1409