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