Deleting Objects in a proper way. Minor improvements added.
[u/mrichter/AliRoot.git] / TOF / AliTOFRawStream.cxx
CommitLineData
571dda3d 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/*
d0eb8f39 17$Log$
96f01799 18Revision 1.19 2007/05/18 13:07:53 decaro
19Error messages stored in the global raw-reader error log (Cvetan, Chiara)
20
019f6101 21Revision 1.18 2007/05/08 11:53:29 arcelli
22Improved class flexibility for further use (R.Preghenella)
23
2fd622fa 24Revision 1.17 2007/05/03 08:53:50 decaro
25Coding convention: RS3 violation -> suppression
26
19eefa2b 27Revision 1.16 2007/05/03 08:22:22 decaro
28Coding convention: RN17 violation -> suppression
29
dfcee998 30Revision 1.15 2007/04/30 15:22:06 arcelli
31Change TOF digit Time, Tot etc to int type
32
bf33f8f0 33Revision 1.14 2007/04/27 11:11:53 arcelli
34updates for the new decoder
35
dfcee998 36Revision 1.13 2007/03/16 11:46:35 decaro
37Coding convention: RN17 rule violation -> suppression
38
8994284f 39Revision 1.12 2007/02/22 09:43:45 decaro
40Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
41
740f0695 42Revision 1.11 2007/02/20 15:57:00 decaro
43Raw data update: to read the TOF raw data defined in UNPACKED mode
44
15ec34b9 45Revision 1.10 2006/12/15 14:01:38 cvetan
46Memory leak fixed
47
f1aa96cc 48Revision 1.9 2006/10/13 11:22:27 arcelli
49remove warnings due to uninitialized AliTOFtdcDigit data members
50
36f66fad 51Revision 1.8 2006/08/22 13:30:17 arcelli
52removal of effective c++ warnings (C.Zampolli)
53
655e379f 54Revision 1.7 2006/08/10 14:46:54 decaro
55TOF raw data format: updated version
56
d0eb8f39 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
571dda3d 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
0e46b9ae 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////////////////////////////////////////////////////////////////////////
571dda3d 90
15ec34b9 91
13d6bff9 92#include "Riostream.h"
93
15ec34b9 94#include "TClonesArray.h"
95
96#include "AliDAQ.h"
d0eb8f39 97#include "AliLog.h"
571dda3d 98#include "AliRawReader.h"
99
100#include "AliTOFGeometry.h"
15ec34b9 101#include "AliTOFrawData.h"
102#include "AliTOFRawMap.h"
571dda3d 103#include "AliTOFRawStream.h"
104
5c7c93fa 105#include "AliTOFHitData.h"
d0eb8f39 106
571dda3d 107ClassImp(AliTOFRawStream)
108
109
110//_____________________________________________________________________________
655e379f 111AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
15ec34b9 112 fRawReader(rawReader),
7813bb1a 113 fTOFrawData(0x0),
114 fDecoder(new AliTOFDecoder()),
655e379f 115 fDDL(-1),
116 fTRM(-1),
655e379f 117 fTRMchain(-1),
15ec34b9 118 fTDC(-1),
655e379f 119 fTDCchannel(-1),
15ec34b9 120 fTime(-1),
655e379f 121 fToT(-1),
15ec34b9 122 fLeadingEdge(-1),
123 fTrailingEdge(-1),
655e379f 124 fErrorFlag(-1),
655e379f 125 fSector(-1),
126 fPlate(-1),
127 fStrip(-1),
128 fPadX(-1),
129 fPadZ(-1),
15ec34b9 130 fPackedDigits(0),
655e379f 131 fWordType(-1),
132 fSlotID(-1),
133 fACQ(-1),
134 fPSbit(-1),
655e379f 135 fTDCerrorFlag(-1),
136 fInsideDRM(kFALSE),
137 fInsideTRM(kFALSE),
138 fInsideLTM(kFALSE),
139 fInsideTRMchain0(kFALSE),
38f24f3f 140 fInsideTRMchain1(kFALSE),
141 fLocalEventCounterDRM(-1),
142 fLocalEventCounterLTM(-1),
143 fLocalEventCounterTRM(0x0),
144 fLocalEventCounterChain(0x0)
571dda3d 145{
146 //
147 // create an object to read TOF raw digits
148 //
149
7813bb1a 150 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
2fd622fa 151 fDataBuffer[i]=new AliTOFHitDataBuffer();
152 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
7813bb1a 153 }
154
155 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
156 fTOFrawData->SetOwner();
157
15ec34b9 158 fRawReader->Reset();
362c9d61 159 fRawReader->Select("TOF");
38f24f3f 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
571dda3d 171}
172
173//_____________________________________________________________________________
655e379f 174AliTOFRawStream::AliTOFRawStream():
7813bb1a 175 fRawReader(0x0),
7813bb1a 176 fTOFrawData(0x0),
177 fDecoder(new AliTOFDecoder()),
655e379f 178 fDDL(-1),
179 fTRM(-1),
655e379f 180 fTRMchain(-1),
15ec34b9 181 fTDC(-1),
655e379f 182 fTDCchannel(-1),
15ec34b9 183 fTime(-1),
655e379f 184 fToT(-1),
15ec34b9 185 fLeadingEdge(-1),
186 fTrailingEdge(-1),
655e379f 187 fErrorFlag(-1),
655e379f 188 fSector(-1),
189 fPlate(-1),
190 fStrip(-1),
191 fPadX(-1),
192 fPadZ(-1),
15ec34b9 193 fPackedDigits(0),
655e379f 194 fWordType(-1),
195 fSlotID(-1),
196 fACQ(-1),
197 fPSbit(-1),
655e379f 198 fTDCerrorFlag(-1),
199 fInsideDRM(kFALSE),
200 fInsideTRM(kFALSE),
201 fInsideLTM(kFALSE),
202 fInsideTRMchain0(kFALSE),
38f24f3f 203 fInsideTRMchain1(kFALSE),
204 fLocalEventCounterDRM(-1),
205 fLocalEventCounterLTM(-1),
206 fLocalEventCounterTRM(0x0),
207 fLocalEventCounterChain(0x0)
571dda3d 208{
209 //
d0eb8f39 210 // default ctr
571dda3d 211 //
7813bb1a 212 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
2fd622fa 213 fDataBuffer[i]=new AliTOFHitDataBuffer();
214 fPackedDataBuffer[i]=new AliTOFHitDataBuffer();
7813bb1a 215 }
15ec34b9 216
7813bb1a 217 fTOFrawData = new TClonesArray("AliTOFrawData",1000);
218 fTOFrawData->SetOwner();
38f24f3f 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
d0eb8f39 230}
231
232//_____________________________________________________________________________
233AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
655e379f 234 TObject(stream),
235 fRawReader(0x0),
7813bb1a 236 fTOFrawData(0x0),
237 fDecoder(new AliTOFDecoder()),
655e379f 238 fDDL(-1),
239 fTRM(-1),
655e379f 240 fTRMchain(-1),
15ec34b9 241 fTDC(-1),
655e379f 242 fTDCchannel(-1),
15ec34b9 243 fTime(-1),
655e379f 244 fToT(-1),
15ec34b9 245 fLeadingEdge(-1),
246 fTrailingEdge(-1),
655e379f 247 fErrorFlag(-1),
655e379f 248 fSector(-1),
249 fPlate(-1),
250 fStrip(-1),
251 fPadX(-1),
252 fPadZ(-1),
15ec34b9 253 fPackedDigits(0),
655e379f 254 fWordType(-1),
255 fSlotID(-1),
256 fACQ(-1),
257 fPSbit(-1),
655e379f 258 fTDCerrorFlag(-1),
259 fInsideDRM(kFALSE),
260 fInsideTRM(kFALSE),
261 fInsideLTM(kFALSE),
262 fInsideTRMchain0(kFALSE),
38f24f3f 263 fInsideTRMchain1(kFALSE),
264 fLocalEventCounterDRM(-1),
265 fLocalEventCounterLTM(-1),
266 fLocalEventCounterTRM(0x0),
267 fLocalEventCounterChain(0x0)
d0eb8f39 268{
269 //
270 // copy constructor
271 //
272
273 fRawReader = stream.fRawReader;
15ec34b9 274
275 fTOFrawData = stream.fTOFrawData;
276
d0eb8f39 277 fDDL = stream.fDDL;
278 fTRM = stream.fTRM;
d0eb8f39 279 fTRMchain = stream.fTRMchain;
15ec34b9 280 fTDC = stream.fTDC;
d0eb8f39 281 fTDCchannel = stream.fTDCchannel;
15ec34b9 282 fTime = stream.fTime;
d0eb8f39 283 fToT = stream.fToT;
15ec34b9 284 fLeadingEdge = stream.fLeadingEdge;
285 fTrailingEdge = stream.fTrailingEdge;
286
d0eb8f39 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
15ec34b9 295 fPackedDigits = stream.fPackedDigits;
296
d0eb8f39 297 fWordType = stream.fWordType;
298 fSlotID = stream.fSlotID;
299 fACQ = stream.fACQ;
300 fPSbit = stream.fPSbit;
d0eb8f39 301 fTDCerrorFlag = stream.fTDCerrorFlag;
302 fInsideDRM = stream.fInsideDRM;
303 fInsideTRM = stream.fInsideTRM;
304 fInsideLTM = stream.fInsideLTM;
305 fInsideTRMchain0 = stream.fInsideTRMchain0;
306 fInsideTRMchain1 = stream.fInsideTRMchain1;
d0eb8f39 307
7813bb1a 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);
38f24f3f 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
571dda3d 324}
325
326//_____________________________________________________________________________
327AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
328{
329 //
330 // assignment operator
331 //
332
333 fRawReader = stream.fRawReader;
15ec34b9 334
335 fTOFrawData = stream.fTOFrawData;
336
571dda3d 337 fDDL = stream.fDDL;
338 fTRM = stream.fTRM;
d0eb8f39 339 fTRMchain = stream.fTRMchain;
15ec34b9 340 fTDC = stream.fTDC;
d0eb8f39 341 fTDCchannel = stream.fTDCchannel;
15ec34b9 342 fTime = stream.fTime;
d0eb8f39 343 fToT = stream.fToT;
15ec34b9 344 fLeadingEdge = stream.fLeadingEdge;
345 fTrailingEdge = stream.fTrailingEdge;
571dda3d 346 fErrorFlag = stream.fErrorFlag;
d0eb8f39 347
348 fSector = stream.fSector;
349 fPlate = stream.fPlate;
350 fStrip = stream.fStrip;
351 fPadX = stream.fPadX;
352 fPadZ = stream.fPadZ;
571dda3d 353
15ec34b9 354 fPackedDigits = stream.fPackedDigits;
355
d0eb8f39 356 fWordType = stream.fWordType;
357 fSlotID = stream.fSlotID;
358 fACQ = stream.fACQ;
359 fPSbit = stream.fPSbit;
d0eb8f39 360 fTDCerrorFlag = stream.fTDCerrorFlag;
361 fInsideDRM = stream.fInsideDRM;
362 fInsideTRM = stream.fInsideTRM;
363 fInsideLTM = stream.fInsideLTM;
364 fInsideTRMchain0 = stream.fInsideTRMchain0;
365 fInsideTRMchain1 = stream.fInsideTRMchain1;
7813bb1a 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;
38f24f3f 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
571dda3d 383 return *this;
384
385}
386
387//_____________________________________________________________________________
388AliTOFRawStream::~AliTOFRawStream()
389{
390// destructor
391
15ec34b9 392 fPackedDigits = 0;
393
7813bb1a 394 for (Int_t i=0;i<72;i++){
395 delete fDataBuffer[i];
396 delete fPackedDataBuffer[i];
397 }
d3c7bfac 398
7813bb1a 399 delete fDecoder;
15ec34b9 400
7813bb1a 401 fTOFrawData->Clear();
402 delete fTOFrawData;
38f24f3f 403
415c84fa 404 delete [] fLocalEventCounterTRM;
e88f3330 405 for (Int_t ii=0; ii<13; ii++)
406 delete [] fLocalEventCounterChain[ii];
407 delete [] fLocalEventCounterChain;
38f24f3f 408
571dda3d 409}
410
411
412//_____________________________________________________________________________
15ec34b9 413
414void AliTOFRawStream::LoadRawData(Int_t indexDDL)
415{
0192b95f 416 //
417 // To load raw data
418 //
15ec34b9 419
74cd22f8 420 fTOFrawData->Clear();
0192b95f 421
74cd22f8 422 TClonesArray &arrayTofRawData = *fTOFrawData;
423
15ec34b9 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
415c84fa 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
15ec34b9 440 fRawReader->Reset();
441 fRawReader->Select("TOF", indexDDL, indexDDL);
442
443 Bool_t signal = kFALSE;
444
74cd22f8 445 AliTOFrawData *rawDigit = NULL;
7813bb1a 446
15ec34b9 447 while(Next()) {
448
449 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
450 if (signal) {
38f24f3f 451 AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
15ec34b9 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
74cd22f8 460 rawDigit = static_cast<AliTOFrawData*>(rawMap->GetHit(slot));
15ec34b9 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
0192b95f 470 )
15ec34b9 471 {
472
74cd22f8 473 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
15ec34b9 474
74cd22f8 475 rawMap->SetHit(slot);
15ec34b9 476
74cd22f8 477 }
15ec34b9 478
479
480 }
481 else {
482
15ec34b9 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
74cd22f8 493 rawMap->Delete();
7813bb1a 494
15ec34b9 495}
496
497//_____________________________________________________________________________
571dda3d 498Bool_t AliTOFRawStream::Next()
499{
d0eb8f39 500 //
501 // Read next 32-bit word in TOF raw data files
502 // returns kFALSE if there is no word left
503 //
571dda3d 504
505 UInt_t data;
506
38f24f3f 507 Int_t dummy = 0;
508
571dda3d 509 if (!fRawReader->ReadNextInt(data)) return kFALSE;
510
d0eb8f39 511 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
512 fSector = -1;
15ec34b9 513 fPlate = -1;
514 fStrip = -1;
515 fPadZ = -1;
516 fPadX = -1;
517 fTime = -1;
518 fToT = -1;
519 fLeadingEdge = -1;
520 fTrailingEdge = -1;
d0eb8f39 521 }
571dda3d 522
571dda3d 523 fDDL = fRawReader->GetDDLID();
524
d0eb8f39 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);
d0eb8f39 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 }
38f24f3f 584 dummy = 0x0000fff0;
585 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
586 fLocalEventCounterDRM = GetField(data,dummy,4);//adc
d0eb8f39 587 fInsideDRM = kFALSE; // DRM global trailer accepted
588 fInsideTRM = kFALSE;
589 fInsideLTM = kFALSE;
590 fInsideTRMchain0 = kFALSE;
591 fInsideTRMchain1 = kFALSE;
d0eb8f39 592 fSector = -1;
15ec34b9 593 fPlate = -1;
594 fStrip = -1;
595 fPadZ = -1;
596 fPadX = -1;
597 fDDL = -1;
598 fTRM = -1;
599 fTDC = -1;
600 fTRMchain = -1;
d0eb8f39 601 fTDCchannel = -1;
15ec34b9 602 fTime = -1;
603 fToT = -1;
604 fLeadingEdge = -1;
605 fTrailingEdge = -1;
d0eb8f39 606 fErrorFlag = -1;
15ec34b9 607 fACQ = -1;
d0eb8f39 608 fPSbit = -1;
d0eb8f39 609 fTDCerrorFlag = -1;
610 break;
611 case LTM_ID_NUMBER: // LTM global trailer
612 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
613 break;
614 }
38f24f3f 615 dummy = 0x0fff0000;
616 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
617 fLocalEventCounterLTM = GetField(data,dummy,16);//adc
d0eb8f39 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 }
38f24f3f 624 dummy = 0x0fff0000;
625 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
626 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);//adc
d0eb8f39 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
15ec34b9 638 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
d0eb8f39 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 }
38f24f3f 663 dummy = 0x0fff0000;
664 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
665 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
d0eb8f39 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 }
38f24f3f 680 dummy = 0x0fff0000;
681 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
682 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);//adc
d0eb8f39 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
15ec34b9 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);
d0eb8f39 699 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
15ec34b9 700 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
701
702 SetSector();
703 SetPlate();
704 SetStrip();
705 SetPadZ();
706 SetPadX();
707
d0eb8f39 708
709 switch (fPSbit) { // switch fPSbit bits inside TRM chains
15ec34b9 710
711 case 0: // packing ok, digit time and TOT
712 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
d0eb8f39 713 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
d0eb8f39 714 break;
715
716 case 1: // leading edge digit, long digit time, no TOT
15ec34b9 717 //fToT = -1;
718 //fTime = -1;
719 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
d0eb8f39 720 break;
721
722 case 2: // trailing edge digit, long digit time, no TOT
15ec34b9 723 //fToT = -1;
724 //fTime = -1;
725 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION);
d0eb8f39 726 break;
15ec34b9 727
d0eb8f39 728 case 3: // TOT overflow
15ec34b9 729 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
d0eb8f39 730 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION);
d0eb8f39 731 break;
d0eb8f39 732
15ec34b9 733 } // end switch PS bits inside TRM chains
d0eb8f39 734
735 } // end if is inside TRM chains
736
737 } // end switch on fWordType
571dda3d 738
15ec34b9 739
571dda3d 740 return kTRUE;
7813bb1a 741
571dda3d 742}
743//_____________________________________________________________________________
744
d0eb8f39 745void AliTOFRawStream::SetSector()
571dda3d 746{
747 //
d0eb8f39 748 // Evaluate the TOF sector number -> [ 0;17]
749 // corresponding to the TOF equipment IDs:
750 // fDDL -> [ 0;71]
751 // fTRM -> [ 3;12]
15ec34b9 752 // fTRMchain -> [ 0; 1]
d0eb8f39 753 // fTDC -> [ 0;14]
754 // fTDCchannel -> [ 0; 7]
571dda3d 755 //
756
757 Int_t iSector = -1;
571dda3d 758
d0eb8f39 759 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
760
761 fSector = iSector;
571dda3d 762
763}
764//_____________________________________________________________________________
765
d0eb8f39 766
767void AliTOFRawStream::SetPlate()
571dda3d 768{
769 //
d0eb8f39 770 // Evaluate the TOF plate number ->[ 0; 4]
771 // corresponding to the TOF equipment IDs:
772 // fDDL -> [ 0;71]
773 // fTRM -> [ 3;12]
15ec34b9 774 // fTRMchain -> [ 0; 1]
d0eb8f39 775 // fTDC -> [ 0;14]
776 // fTDCchannel -> [ 0; 7]
571dda3d 777 //
778
779 Int_t iPlate = -1;
d0eb8f39 780 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
781 || fSector==-1))
782 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
571dda3d 783
d0eb8f39 784 fPlate = iPlate;
571dda3d 785
786}
787//_____________________________________________________________________________
788
d0eb8f39 789void AliTOFRawStream::SetStrip()
571dda3d 790{
791 //
d0eb8f39 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]
15ec34b9 796 // fTRMchain -> [ 0; 1]
d0eb8f39 797 // fTDC -> [ 0;14]
798 // fTDCchannel -> [ 0; 7]
571dda3d 799 //
800
801 Int_t iStrip = -1;
802
d0eb8f39 803 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
804 || fSector==-1 || fPlate==-1))
805 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
571dda3d 806
d0eb8f39 807 fStrip = iStrip;
571dda3d 808
809}
810//_____________________________________________________________________________
811
d0eb8f39 812void AliTOFRawStream::SetPadZ()
571dda3d 813{
814 //
d0eb8f39 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]
15ec34b9 819 // fTRMchain -> [ 0; 1]
d0eb8f39 820 // fTDC -> [ 0;14]
821 // fTDCchannel -> [ 0; 7]
571dda3d 822 //
823
824 Int_t iPadZ = -1;
825
d0eb8f39 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 }
571dda3d 833
38f24f3f 834 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
835 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
836
d0eb8f39 837 fPadZ = iPadZ;
571dda3d 838
d0eb8f39 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]
15ec34b9 849 // fTRMchain -> [ 0; 1]
d0eb8f39 850 // fTDC -> [ 0;14]
851 // fTDCchannel -> [ 0; 7]
852 //
571dda3d 853
d0eb8f39 854 Int_t iPadX = -1;
571dda3d 855
d0eb8f39 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
38f24f3f 864 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
865 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
866
d0eb8f39 867 fPadX = iPadX;
571dda3d 868
869}
571dda3d 870
d0eb8f39 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//----------------------------------------------------------------------------
13d6bff9 882Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
571dda3d 883{
884 //
d0eb8f39 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]
571dda3d 890 //
891
d0eb8f39 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 }
571dda3d 960
d0eb8f39 961 }
571dda3d 962
d0eb8f39 963 return iPlate;
571dda3d 964
d0eb8f39 965}
571dda3d 966
d0eb8f39 967//----------------------------------------------------------------------------
13d6bff9 968Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
d0eb8f39 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 //
571dda3d 979
d0eb8f39 980 Int_t iStrip = -1;
571dda3d 981
d0eb8f39 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,
13d6bff9 1064 Int_t iCH)
d0eb8f39 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
38f24f3f 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);
d0eb8f39 1081
38f24f3f 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);
d0eb8f39 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()) ||
019f6101 1095 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
13d6bff9 1096 std::cerr << "Problems with the padX number!" << endl;
1097 //AliWarning("Problems with the padX number!");
019f6101 1098 }
d0eb8f39 1099 return iPadAlongTheStrip;
1100
1101}
1102
1103//----------------------------------------------------------------------------
38f24f3f 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//----------------------------------------------------------------------------
d0eb8f39 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//----------------------------------------------------------------------------
7813bb1a 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//----------------------------------------------------------------------------
d0eb8f39 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);
019f6101 1200 if (iPlate==-1) {
13d6bff9 1201 if (fRawReader)
1202 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");
019f6101 1203 AliWarning("Problems with the plate number!");
1204 }
d0eb8f39 1205
1206 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
019f6101 1207 if (iStrip==-1) {
13d6bff9 1208 if (fRawReader)
1209 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");
019f6101 1210 AliWarning("Problems with the strip number!");
1211 }
d0eb8f39 1212
1213 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
019f6101 1214 if (iPadAlongTheStrip==-1){
13d6bff9 1215 if (fRawReader)
1216 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");
019f6101 1217 AliWarning("Problems with the pad number along the strip!");
1218 }
13d6bff9 1219
d0eb8f39 1220 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1221 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
38f24f3f 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
d0eb8f39 1229 volume[0] = iSector;
1230 volume[1] = iPlate;
1231 volume[2] = iStrip;
1232 volume[3] = iPadX;
1233 volume[4] = iPadZ;
571dda3d 1234
1235}
7813bb1a 1236//-----------------------------------------------------------------------------
019f6101 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
7813bb1a 1242 //check and fix valid DDL range
019f6101 1243 if (nDDLMin < 0){
1244 nDDLMin = 0;
1245 fRawReader->AddMinorErrorLog(kDDLMinError);
1246 AliWarning("Wrong DDL range: setting first DDL ID to 0");
7813bb1a 1247 }
019f6101 1248 if (nDDLMax > 71){
1249 nDDLMax = 71;
1250 fRawReader->AddMinorErrorLog(kDDLMaxError);
1251 AliWarning("Wrong DDL range: setting last DDL ID to 71");
7813bb1a 1252 }
1253
1254 //select required DDLs
019f6101 1255 fRawReader->Select("TOF", nDDLMin, nDDLMax);
7813bb1a 1256
1257 if (verbose)
019f6101 1258 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
7813bb1a 1259
2fd622fa 1260 return(Decode(verbose));
1261}
1262//-----------------------------------------------------------------------------
019f6101 1263Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1264 //
1265 // New decoder method
1266 //
1267
2fd622fa 1268 Int_t currentEquipment;
1269 Int_t currentDDL;
1270
1271 //pointers
1272 UChar_t *data = 0x0;
1273
7813bb1a 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 {
019f6101 1297 fRawReader->AddMajorErrorLog(kDDLdataReading);
7813bb1a 1298 if (verbose)
019f6101 1299 AliWarning("Error while reading DDL data. Go to next equipment");
7813bb1a 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
019f6101 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 }
7813bb1a 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{
19eefa2b 1337 //
1338 // To reset the buffers
1339 //
1340
7813bb1a 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{
19eefa2b 1351 //
1352 // To load the buffers
1353 //
1354
7813bb1a 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
019f6101 1362 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1363 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
7813bb1a 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();
7813bb1a 1384 Int_t hitTimeBin = hitData->GetTimeBin();
7813bb1a 1385 Int_t hitTOTBin = hitData->GetTOTBin();
1386
0192b95f 1387 Int_t hitLeading = hitData->GetTimeBin();//-1; // adc
bf33f8f0 1388 Int_t hitTrailing = -1;
1389 Int_t hitError = -1;
7813bb1a 1390
1391 TClonesArray &arrayTofRawData = *fTOFrawData;
bf33f8f0 1392 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError);
7813bb1a 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