]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TOF/AliTOFRawStream.cxx
Bug fix in the bin0 loop
[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$
08d6922f 18
19Added lookup tables for
20 TRM number 3 in the left crates (TOF OR signals)
21 and detector elements (A.Silenzi)
22
dd824655 23Revision 1.19.1 2008/09/19 preghenella
24 Decode method updated:
25 it reads the CDH from the rawReader and sends it to the decoder;
26 LoadRawDataBuffers modified:
27 it corrects tof hit infos per ddlBC and deltaBC offsets
28 (in case of the static member fgApplyBCCorrections
29 has been setted to kTRUE);
30 Added static member fgApplyBCCorrections (kTRUE by default)
31 and the related static method ApplyBCCorrections;
32
96f01799 33Revision 1.19 2007/05/18 13:07:53 decaro
34Error messages stored in the global raw-reader error log (Cvetan, Chiara)
35
019f6101 36Revision 1.18 2007/05/08 11:53:29 arcelli
37Improved class flexibility for further use (R.Preghenella)
38
2fd622fa 39Revision 1.17 2007/05/03 08:53:50 decaro
40Coding convention: RS3 violation -> suppression
41
19eefa2b 42Revision 1.16 2007/05/03 08:22:22 decaro
43Coding convention: RN17 violation -> suppression
44
dfcee998 45Revision 1.15 2007/04/30 15:22:06 arcelli
46Change TOF digit Time, Tot etc to int type
47
bf33f8f0 48Revision 1.14 2007/04/27 11:11:53 arcelli
49updates for the new decoder
50
dfcee998 51Revision 1.13 2007/03/16 11:46:35 decaro
52Coding convention: RN17 rule violation -> suppression
53
8994284f 54Revision 1.12 2007/02/22 09:43:45 decaro
55Added AliTOFRawStream::GetIndex method for online calibration (C.Zampolli)
56
740f0695 57Revision 1.11 2007/02/20 15:57:00 decaro
58Raw data update: to read the TOF raw data defined in UNPACKED mode
59
15ec34b9 60Revision 1.10 2006/12/15 14:01:38 cvetan
61Memory leak fixed
62
f1aa96cc 63Revision 1.9 2006/10/13 11:22:27 arcelli
64remove warnings due to uninitialized AliTOFtdcDigit data members
65
36f66fad 66Revision 1.8 2006/08/22 13:30:17 arcelli
67removal of effective c++ warnings (C.Zampolli)
68
655e379f 69Revision 1.7 2006/08/10 14:46:54 decaro
70TOF raw data format: updated version
71
d0eb8f39 72Revision 1.6.1 2006/06/28 A. De Caro, R. Preghenella:
73 Update TOF raw data format
74 according to the final version
75 (see the ALICE internal note in preparation
76 'ALICE TOF raw data format')
77 Added the methods for the correspoonding numbering
78 between the equipment IDs and the volume IDs:
79 Equip2VolNPlate(...)
80 Equip2VolNStrip(...)
81 Equip2VolNPad(...)
82
571dda3d 83Revision 0.02 2005/07/28 A. De Caro:
84 Update format TOF raw data
85 (temporary solution)
86 Correction of few wrong corrispondences
87 between 'software' and 'hardware' numberings
88
89Revision 0.01 2005/07/22 A. De Caro
90 Implement methods Next()
91 GetSector(),
92 GetPlate(),
93 GetStrip(),
94 GetPadZ(),
95 GetPadX()
96*/
97
0e46b9ae 98////////////////////////////////////////////////////////////////////////
99// //
100// This class provides access to TOF raw data in DDL files. //
101// //
102// It loops over all TOF raw data given by the AliRawReader. //
103// //
104////////////////////////////////////////////////////////////////////////
571dda3d 105
15ec34b9 106
13d6bff9 107#include "Riostream.h"
108
15ec34b9 109#include "TClonesArray.h"
f472295e 110#include "TStopwatch.h"
15ec34b9 111
112#include "AliDAQ.h"
d0eb8f39 113#include "AliLog.h"
571dda3d 114#include "AliRawReader.h"
115
116#include "AliTOFGeometry.h"
15ec34b9 117#include "AliTOFrawData.h"
118#include "AliTOFRawMap.h"
571dda3d 119#include "AliTOFRawStream.h"
f472295e 120#include "AliTOFdigit.h"
121#include "AliTOFSDigit.h"
32ead898 122//#include "AliTOFCableLengthMap.h"
571dda3d 123
5c7c93fa 124#include "AliTOFHitData.h"
d0eb8f39 125
32ead898 126#include "AliRawEventHeaderBase.h"
143cfc81 127#include "AliRawDataHeader.h"
32ead898 128
5b4ed716 129#include "AliTOFDecoderV2.h"
46b17363 130#include "AliTOFTDCHit.h"
131#include "AliTOFDecoderSummaryData.h"
132#include "AliTOFDRMSummaryData.h"
133#include "AliTOFLTMSummaryData.h"
134#include "AliTOFTRMSummaryData.h"
135#include "AliTOFChainSummaryData.h"
136#include "AliTOFTDCHitBuffer.h"
137#include "AliTOFTDCErrorBuffer.h"
5b4ed716 138
571dda3d 139ClassImp(AliTOFRawStream)
140
32ead898 141const Int_t AliTOFRawStream::fgkddlBCshift[72] =
142{
e7f49164 143 0, 0, 0, 0,
144 0, 0, 0, 0,
145 0, 0, 0, 0,
146 0, 0, 0, 0,
147 0, 0, 0, 0,
148 0, 0, 0, 0,
149 0, 0, 0, 0,
150 0, 0, 0, 0,
151 0, 0, 0, 0,
152 0, 0, 0, 0,
153 0, 0, 0, 0,
154 0, 0, 0, 0,
155 0, 0, 0, 0,
156 0, 0, 0, 0,
157 0, 0, 0, 0,
158 0, 0, 0, 0,
159 0, 0, 0, 0,
160 0, 0, 0, 0
32ead898 161};
162
08d6922f 163const Int_t AliTOFRawStream::fgkStrip0MapCrate0[]=
4306fa22 164 {1,3,5,7,9,11,13,15,17,0,2,4,6,8,10,12,14,16,18,1,3,5,7,-1};
08d6922f 165const Int_t AliTOFRawStream::fgkStrip1MapCrate0[]=
4306fa22 166 {0,2,4,6,8,10,12,14,16,18,1,3,5,7,9,11,13,15,17,0,2,4,6,-1};
08d6922f 167const Int_t AliTOFRawStream::fgkStrip0MapCrate1[]=
4306fa22 168 {1,3,5,7,9,11,13,15,17,0,2,4,6,8,10,12,14,16,18,1,3,5,7,-1};
08d6922f 169const Int_t AliTOFRawStream::fgkStrip1MapCrate1[]=
4306fa22 170 {0,2,4,6,8,10,12,14,16,18,1,3,5,7,9,11,13,15,17,0,2,4,6,-1};
08d6922f 171const Int_t AliTOFRawStream::fgkStrip0MapCrate2[]=
4306fa22 172 {17,15,13,11, 9,7,5,3,1,18,16,14,12,10,8,6,4,2, 0,13,11, 9,7,-1};
08d6922f 173const Int_t AliTOFRawStream::fgkStrip1MapCrate2[]=
4306fa22 174 {18,16,14,12,10,8,6,4,2, 0,17,15,13,11,9,7,5,3, 1,14,12,10,8,-1};
08d6922f 175const Int_t AliTOFRawStream::fgkStrip0MapCrate3[]=
4306fa22 176 {17,15,13,11, 9,7,5,3,1,18,16,14,12,10,8,6,4,2, 0,13,11, 9,7,-1};
08d6922f 177const Int_t AliTOFRawStream::fgkStrip1MapCrate3[]=
4306fa22 178 {18,16,14,12,10,8,6,4,2, 0,17,15,13,11,9,7,5,3, 1,14,12,10,8,-1};
08d6922f 179
180
181const Int_t AliTOFRawStream::fgkModule0MapCrate0[]=
4306fa22 182 {0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
08d6922f 183const Int_t AliTOFRawStream::fgkModule1MapCrate0[]=
4306fa22 184 {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
08d6922f 185const Int_t AliTOFRawStream::fgkModule0MapCrate1[]=
4306fa22 186 {0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
08d6922f 187const Int_t AliTOFRawStream::fgkModule1MapCrate1[]=
4306fa22 188 {0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,-1};
189
08d6922f 190const Int_t AliTOFRawStream::fgkModule0MapCrate2[]=
4306fa22 191 {4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
08d6922f 192const Int_t AliTOFRawStream::fgkModule1MapCrate2[]=
4306fa22 193 {4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
08d6922f 194const Int_t AliTOFRawStream::fgkModule0MapCrate3[]=
4306fa22 195 {4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
08d6922f 196const Int_t AliTOFRawStream::fgkModule1MapCrate3[]=
4306fa22 197 {4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,2,2,2,2,-1};
08d6922f 198
199const Int_t AliTOFRawStream::fgkChannelMap0[5][19]=
4306fa22 200 {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9},
201 {9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18},
202 {19,19,20,20,21,21,22,22,22,21,21,20,20,19,19,-1,-1,-1,-1},
203 {18,18,17,17,16,16,15,15,14,14,13,13,12,12,11,11,10,10,9},
08d6922f 204 {9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0}
205 };
206
207const Int_t AliTOFRawStream::fgkChainMap0[5][19]=
4306fa22 208 {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
209 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
210 {0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,-1,-1,-1,-1},
211 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
212 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
213 };
08d6922f 214
215const Int_t AliTOFRawStream::fgkChannelMap24[5][19]=
4306fa22 216 {{0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9},
217 {9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18},
218 {19,19,20,20,21,21,22,22,22,21,21,20,20,19,19,-1,-1,-1,-1},
219 {18,18,17,17,16,16,15,15,14,14,13,13,12,12,11,11,10,10,9},
220 {9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0}
221 };
08d6922f 222
223const Int_t AliTOFRawStream::fgkChainMap24[5][19]=
4306fa22 224 {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
225 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
226 {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,-1,-1,-1,-1},
227 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
228 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
229 };
08d6922f 230
dd824655 231Bool_t AliTOFRawStream::fgApplyBCCorrections = kTRUE;
571dda3d 232//_____________________________________________________________________________
655e379f 233AliTOFRawStream::AliTOFRawStream(AliRawReader* rawReader):
15ec34b9 234 fRawReader(rawReader),
2bf66a2d 235 fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
7813bb1a 236 fDecoder(new AliTOFDecoder()),
5b4ed716 237 fDecoderV2(new AliTOFDecoderV2()),
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),
5042b04a 264 //fDataBuffer(),
265 //fPackedDataBuffer(),
38f24f3f 266 fLocalEventCounterDRM(-1),
267 fLocalEventCounterLTM(-1),
5042b04a 268 //fLocalEventCounterTRM(),
269 //fLocalEventCounterChain(),
270 //fChainBunchID(),
04bacbd9 271 //fCableLengthMap(new AliTOFCableLengthMap()),
f472295e 272 fEventID(0),
273 fNewDecoderVersion(0)
571dda3d 274{
275 //
276 // create an object to read TOF raw digits
277 //
278
7813bb1a 279 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
d35d0ea0 280 ResetDataBuffer(i);
281 ResetPackedDataBuffer(i);
7813bb1a 282 }
283
2bf66a2d 284 //fTOFrawData = new TClonesArray("AliTOFrawData",1000);
7813bb1a 285 fTOFrawData->SetOwner();
286
15ec34b9 287 fRawReader->Reset();
362c9d61 288 fRawReader->Select("TOF");
38f24f3f 289
e1d95075 290 for (Int_t jj=0;jj<13;jj++) {
291 fLocalEventCounterTRM[jj] = -1;
292 for (Int_t ii=0;ii<2;ii++) {
293 fLocalEventCounterChain[jj][ii] = -1;
294 fChainBunchID[jj][ii] = -1;
ca6d7f17 295 }
296 }
38f24f3f 297
571dda3d 298}
299
300//_____________________________________________________________________________
655e379f 301AliTOFRawStream::AliTOFRawStream():
2bf66a2d 302 fRawReader(0x0),
303 fTOFrawData(new TClonesArray("AliTOFrawData",1000)),
7813bb1a 304 fDecoder(new AliTOFDecoder()),
5b4ed716 305 fDecoderV2(new AliTOFDecoderV2()),
655e379f 306 fDDL(-1),
307 fTRM(-1),
655e379f 308 fTRMchain(-1),
15ec34b9 309 fTDC(-1),
655e379f 310 fTDCchannel(-1),
15ec34b9 311 fTime(-1),
655e379f 312 fToT(-1),
15ec34b9 313 fLeadingEdge(-1),
314 fTrailingEdge(-1),
655e379f 315 fErrorFlag(-1),
655e379f 316 fSector(-1),
317 fPlate(-1),
318 fStrip(-1),
319 fPadX(-1),
320 fPadZ(-1),
15ec34b9 321 fPackedDigits(0),
655e379f 322 fWordType(-1),
323 fSlotID(-1),
324 fACQ(-1),
325 fPSbit(-1),
655e379f 326 fTDCerrorFlag(-1),
327 fInsideDRM(kFALSE),
328 fInsideTRM(kFALSE),
329 fInsideLTM(kFALSE),
330 fInsideTRMchain0(kFALSE),
38f24f3f 331 fInsideTRMchain1(kFALSE),
5042b04a 332 //fDataBuffer(),
333 //fPackedDataBuffer(),
38f24f3f 334 fLocalEventCounterDRM(-1),
335 fLocalEventCounterLTM(-1),
5042b04a 336 //fLocalEventCounterTRM(),
337 //fLocalEventCounterChain(),
338 //fChainBunchID(),
04bacbd9 339 //fCableLengthMap(new AliTOFCableLengthMap()),
f472295e 340 fEventID(0),
341 fNewDecoderVersion(0)
571dda3d 342{
343 //
d0eb8f39 344 // default ctr
571dda3d 345 //
7813bb1a 346 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
d35d0ea0 347 ResetDataBuffer(i);
348 ResetPackedDataBuffer(i);
7813bb1a 349 }
15ec34b9 350
2bf66a2d 351 //fTOFrawData = new TClonesArray("AliTOFrawData",1000);
7813bb1a 352 fTOFrawData->SetOwner();
38f24f3f 353
ca6d7f17 354 for (Int_t j=0;j<13;j++){
355 fLocalEventCounterTRM[j] = -1;
ca6d7f17 356 for (Int_t k=0;k<2;k++){
357 fLocalEventCounterChain[j][k] = -1;
358 fChainBunchID[j][k] = -1;
359 }
360 }
38f24f3f 361
d0eb8f39 362}
363
364//_____________________________________________________________________________
365AliTOFRawStream::AliTOFRawStream(const AliTOFRawStream& stream) :
655e379f 366 TObject(stream),
8a190ba2 367 fRawReader(stream.fRawReader),
368 fTOFrawData(stream.fTOFrawData),
7813bb1a 369 fDecoder(new AliTOFDecoder()),
5b4ed716 370 fDecoderV2(new AliTOFDecoderV2()),
8a190ba2 371 fDDL(stream.fDDL),
372 fTRM(stream.fTRM),
373 fTRMchain(stream.fTRMchain),
374 fTDC(stream.fTDC),
375 fTDCchannel(stream.fTDCchannel),
376 fTime(stream.fTime),
377 fToT(-stream.fToT),
378 fLeadingEdge(stream.fLeadingEdge),
379 fTrailingEdge(stream.fTrailingEdge),
380 fErrorFlag(stream.fErrorFlag),
381 fSector(stream.fSector),
382 fPlate(stream.fPlate),
383 fStrip(stream.fStrip),
384 fPadX(stream.fPadX),
385 fPadZ(stream.fPadZ),
386 fPackedDigits(stream.fPackedDigits),
387 fWordType(stream.fWordType),
388 fSlotID(stream.fSlotID),
389 fACQ(stream.fACQ),
390 fPSbit(stream.fPSbit),
391 fTDCerrorFlag(stream.fTDCerrorFlag),
392 fInsideDRM(stream.fInsideDRM),
393 fInsideTRM(stream.fInsideTRM),
394 fInsideLTM(stream.fInsideLTM),
395 fInsideTRMchain0(stream.fInsideTRMchain0),
396 fInsideTRMchain1(stream.fInsideTRMchain1),
5042b04a 397 //fDataBuffer(),
398 //fPackedDataBuffer(),
8a190ba2 399 fLocalEventCounterDRM(stream.fLocalEventCounterDRM),
400 fLocalEventCounterLTM(stream.fLocalEventCounterLTM),
5042b04a 401 //fLocalEventCounterTRM(),
402 //fLocalEventCounterChain(),
403 //fChainBunchID(),
04bacbd9 404 //fCableLengthMap(stream.fCableLengthMap),
f472295e 405 fEventID(stream.fEventID),
406 fNewDecoderVersion(stream.fNewDecoderVersion)
d0eb8f39 407{
408 //
409 // copy constructor
410 //
411
7813bb1a 412 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
d35d0ea0 413 fDataBuffer[i] = stream.fDataBuffer[i];
414 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
7813bb1a 415 }
416
417 fTOFrawData = new TClonesArray(*stream.fTOFrawData);
38f24f3f 418
ca6d7f17 419 for (Int_t j=0;j<13;j++){
420 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
421 for (Int_t k=0;k<2;k++){
422 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
423 fChainBunchID[j][k] = stream.fChainBunchID[j][k];
424 }
425 }
38f24f3f 426
571dda3d 427}
428
429//_____________________________________________________________________________
430AliTOFRawStream& AliTOFRawStream::operator = (const AliTOFRawStream& stream)
431{
432 //
433 // assignment operator
434 //
435
8a190ba2 436 if (this == &stream)
437 return *this;
438
439 TObject::operator=(stream);
440
571dda3d 441 fRawReader = stream.fRawReader;
15ec34b9 442
443 fTOFrawData = stream.fTOFrawData;
444
571dda3d 445 fDDL = stream.fDDL;
446 fTRM = stream.fTRM;
d0eb8f39 447 fTRMchain = stream.fTRMchain;
15ec34b9 448 fTDC = stream.fTDC;
d0eb8f39 449 fTDCchannel = stream.fTDCchannel;
15ec34b9 450 fTime = stream.fTime;
d0eb8f39 451 fToT = stream.fToT;
15ec34b9 452 fLeadingEdge = stream.fLeadingEdge;
453 fTrailingEdge = stream.fTrailingEdge;
571dda3d 454 fErrorFlag = stream.fErrorFlag;
d0eb8f39 455
456 fSector = stream.fSector;
457 fPlate = stream.fPlate;
458 fStrip = stream.fStrip;
459 fPadX = stream.fPadX;
460 fPadZ = stream.fPadZ;
571dda3d 461
15ec34b9 462 fPackedDigits = stream.fPackedDigits;
463
d0eb8f39 464 fWordType = stream.fWordType;
465 fSlotID = stream.fSlotID;
466 fACQ = stream.fACQ;
467 fPSbit = stream.fPSbit;
d0eb8f39 468 fTDCerrorFlag = stream.fTDCerrorFlag;
469 fInsideDRM = stream.fInsideDRM;
470 fInsideTRM = stream.fInsideTRM;
471 fInsideLTM = stream.fInsideLTM;
472 fInsideTRMchain0 = stream.fInsideTRMchain0;
473 fInsideTRMchain1 = stream.fInsideTRMchain1;
4306fa22 474
7813bb1a 475 for (Int_t i=0;i<AliDAQ::NumberOfDdls("TOF");i++){
476 fDataBuffer[i] = stream.fDataBuffer[i];
477 fPackedDataBuffer[i] = stream.fPackedDataBuffer[i];
478 }
479
480 fTOFrawData = stream.fTOFrawData;
38f24f3f 481
ca6d7f17 482 fLocalEventCounterDRM = stream.fLocalEventCounterDRM;
483 fLocalEventCounterLTM = stream.fLocalEventCounterLTM;
484 for (Int_t j=0;j<13;j++){
485 fLocalEventCounterTRM[j] = stream.fLocalEventCounterTRM[j];
486 for (Int_t k=0;k<2;k++){
487 fLocalEventCounterChain[j][k] = stream.fLocalEventCounterChain[j][k];
488 fChainBunchID[j][k] = stream.fChainBunchID[j][k];
489 }
490 }
38f24f3f 491
04bacbd9 492 //fCableLengthMap = stream.fCableLengthMap;
32ead898 493
494 fEventID = stream.fEventID;
f472295e 495 fNewDecoderVersion = stream.fNewDecoderVersion;
32ead898 496
571dda3d 497 return *this;
498
499}
500
501//_____________________________________________________________________________
502AliTOFRawStream::~AliTOFRawStream()
503{
4306fa22 504 // destructor
571dda3d 505
15ec34b9 506 fPackedDigits = 0;
507
7813bb1a 508 delete fDecoder;
5b4ed716 509 delete fDecoderV2;
510
23afbd81 511 if (fTOFrawData) {
512 fTOFrawData->Clear("C");
513 delete fTOFrawData;
514 }
38f24f3f 515
04bacbd9 516 //delete fCableLengthMap;
38f24f3f 517
571dda3d 518}
519
520
15ec34b9 521//_____________________________________________________________________________
522
523void AliTOFRawStream::LoadRawData(Int_t indexDDL)
524{
0192b95f 525 //
526 // To load raw data
527 //
15ec34b9 528
e7f49164 529 fEventID = (Int_t)fRawReader->GetBCID(); //bunch crossing
530
74cd22f8 531 fTOFrawData->Clear();
0192b95f 532
74cd22f8 533 TClonesArray &arrayTofRawData = *fTOFrawData;
534
15ec34b9 535 fPackedDigits = 0;
536
537 // create raw data map
66eae3f0 538 AliTOFRawMap rawMap(fTOFrawData);
539 rawMap.Clear();
15ec34b9 540
541 Int_t slot[4] = {-1, -1, -1, -1};
542
415c84fa 543 fLocalEventCounterDRM = -1;
544 fLocalEventCounterLTM = -1;
545 for (Int_t ii=0; ii<13; ii++)
546 fLocalEventCounterTRM[ii] = -1;
547 for (Int_t ii=0; ii<13; ii++)
5042b04a 548 for (Int_t jj=0; jj<2; jj++) {
415c84fa 549 fLocalEventCounterChain[ii][jj] = -1;
5042b04a 550 fChainBunchID[ii][jj] = -1;
551 }
415c84fa 552
15ec34b9 553 fRawReader->Reset();
554 fRawReader->Select("TOF", indexDDL, indexDDL);
555
556 Bool_t signal = kFALSE;
557
74cd22f8 558 AliTOFrawData *rawDigit = NULL;
7813bb1a 559
15ec34b9 560 while(Next()) {
561
562 signal = (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1);
563 if (signal) {
38f24f3f 564 AliDebug(2,Form(" %2i %1i %2i %1i %2i", fSector, fPlate, fStrip, fPadZ, fPadX));
15ec34b9 565
566 slot[0] = fTRM;
567 slot[1] = fTRMchain;
568 slot[2] = fTDC;
569 slot[3] = fTDCchannel;
570
66eae3f0 571 if (rawMap.TestHit(slot) != kEmpty) {
15ec34b9 572
66eae3f0 573 rawDigit = static_cast<AliTOFrawData*>(rawMap.GetHit(slot));
15ec34b9 574
575 if (rawDigit->GetLeading()!=-1 && rawDigit->GetTrailing()==-1 &&
576 fLeadingEdge==-1 && fTrailingEdge!=-1) {
577
578 rawDigit->Update(fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
579 }
580 else if ( ((rawDigit->GetTOF()!=-1 || rawDigit->GetLeading()!=-1 || rawDigit->GetTrailing()!=-1) &&
581 (fLeadingEdge!=-1 || fTrailingEdge!=-1 || fTime!=-1) )
582
0192b95f 583 )
15ec34b9 584 {
585
74cd22f8 586 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
15ec34b9 587
66eae3f0 588 rawMap.SetHit(slot);
15ec34b9 589
74cd22f8 590 }
15ec34b9 591
592
593 }
594 else {
595
15ec34b9 596 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(fTRM, fTRMchain, fTDC, fTDCchannel, fTime, fToT, fLeadingEdge, fTrailingEdge, fPSbit, fACQ, fErrorFlag);
597
66eae3f0 598 rawMap.SetHit(slot);
15ec34b9 599
66eae3f0 600 } // else if (rawMap.TestHit(slot) == kEmpty)
15ec34b9 601
602 } // if (signal)
603
604 } // closed -> while (Next())
605
15ec34b9 606}
607
571dda3d 608//_____________________________________________________________________________
609Bool_t AliTOFRawStream::Next()
610{
d0eb8f39 611 //
612 // Read next 32-bit word in TOF raw data files
613 // returns kFALSE if there is no word left
614 //
571dda3d 615
616 UInt_t data;
617
38f24f3f 618 Int_t dummy = 0;
619
571dda3d 620 if (!fRawReader->ReadNextInt(data)) return kFALSE;
621
d0eb8f39 622 if (fSector!=-1 && fPlate!=-1 && fStrip!=-1 && fPadZ!=-1 && fPadX!=-1) {
623 fSector = -1;
15ec34b9 624 fPlate = -1;
625 fStrip = -1;
626 fPadZ = -1;
627 fPadX = -1;
628 fTime = -1;
629 fToT = -1;
630 fLeadingEdge = -1;
631 fTrailingEdge = -1;
d0eb8f39 632 }
571dda3d 633
571dda3d 634 fDDL = fRawReader->GetDDLID();
635
d0eb8f39 636 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
637
638 switch (fWordType) { // switch word type
639
640 case GLOBAL_HEADER_TYPE: // global header
641 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
642 fTRM = fSlotID;
643
644
645 switch (fSlotID) { // switch global header slot ID
646
647 case DRM_ID_NUMBER: //DRM global header
648 if (fInsideDRM) { // unexpected DRM global headers -> exit
649 break;
650 }
651 fInsideDRM = kTRUE; // DRM global header accepted
652 break;
653
654 case LTM_ID_NUMBER: // LTM global header
655 if (fInsideLTM) { // unexpected LTM global headers -> exit
656 break;
657 }
658 fInsideLTM = kTRUE; // LTM global header accepted
659 break;
660
661 case 3: //TRM header
662 case 4: //TRM header
663 case 5: //TRM header
664 case 6: //TRM header
665 case 7: //TRM header
666 case 8: //TRM header
667 case 9: //TRM header
668 case 10: //TRM header
669 case 11: //TRM header
670 case 12: //TRM header
671 if (fInsideTRM) { // unexpected TRM global headers -> exit
672 break;
673 }
674 fInsideTRM = kTRUE; // TRM global header accepted
675 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
676 break;
677
678 default: // unexpected global header slot ID
679 break;
680
681 } //end switch global header slot id
682
683 break;
684
685
686 case GLOBAL_TRAILER_TYPE: // global trailer
687 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
d0eb8f39 688
689 switch (fSlotID) { // switch global trailer slot ID
690
691 case DRM_ID_NUMBER: // DRM global trailer
692 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
693 break;
694 }
38f24f3f 695 dummy = 0x0000fff0;
696 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
ca6d7f17 697 fLocalEventCounterDRM = GetField(data,dummy,4);
d0eb8f39 698 fInsideDRM = kFALSE; // DRM global trailer accepted
699 fInsideTRM = kFALSE;
700 fInsideLTM = kFALSE;
701 fInsideTRMchain0 = kFALSE;
702 fInsideTRMchain1 = kFALSE;
d0eb8f39 703 fSector = -1;
15ec34b9 704 fPlate = -1;
705 fStrip = -1;
706 fPadZ = -1;
707 fPadX = -1;
708 fDDL = -1;
709 fTRM = -1;
710 fTDC = -1;
711 fTRMchain = -1;
d0eb8f39 712 fTDCchannel = -1;
15ec34b9 713 fTime = -1;
714 fToT = -1;
715 fLeadingEdge = -1;
716 fTrailingEdge = -1;
d0eb8f39 717 fErrorFlag = -1;
15ec34b9 718 fACQ = -1;
d0eb8f39 719 fPSbit = -1;
d0eb8f39 720 fTDCerrorFlag = -1;
721 break;
722 case LTM_ID_NUMBER: // LTM global trailer
723 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
724 break;
725 }
38f24f3f 726 dummy = 0x0fff0000;
727 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 728 fLocalEventCounterLTM = GetField(data,dummy,16);
d0eb8f39 729 fInsideLTM = kFALSE; // LTM global trailer accepted
730 break;
731 case 15: //TRM global trailer
732 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
733 break;
734 }
38f24f3f 735 dummy = 0x0fff0000;
736 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 737 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);
d0eb8f39 738 fInsideTRM = kFALSE; // TRM global trailer accepted
739 break;
740 default: // unexpected global trailer slot ID
741 break;
742 } //end switch global trailer slot id
743
744
745 break;
746
747
748 case ERROR_TYPE: // TDC error
15ec34b9 749 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
d0eb8f39 750 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
751 break;
752
753
754 case FILLER_TYPE: // filler
755 break;
756
757
758 default: // other word types
759
760 if (fInsideTRM) { // inside TRM
761
762 switch (fWordType) { // switch word type inside TRM
763 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
764 if (fInsideTRMchain0) { // unexpected TRM chain0 header
765 break;
766 }
767 fInsideTRMchain0 = kTRUE;
768 fTRMchain = 0;
ca6d7f17 769 dummy = 0x0000fff0;
770 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
771 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
d0eb8f39 772 break;
773 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
774 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
775 break;
776 }
38f24f3f 777 dummy = 0x0fff0000;
778 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 779 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
d0eb8f39 780 fInsideTRMchain0 = kFALSE;
781 fTRMchain = -1;
782 break;
783 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
784 if (fInsideTRMchain1) { // unexpected TRM chain1 header
785 break;
786 }
787 fInsideTRMchain1 = kTRUE;
788 fTRMchain = 1;
ca6d7f17 789 dummy = 0x0000fff0;
790 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
791 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
d0eb8f39 792 break;
793 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
794 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
795 break;
796 }
38f24f3f 797 dummy = 0x0fff0000;
798 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 799 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
d0eb8f39 800 fInsideTRMchain1 = kFALSE;
801 fTRMchain = -1;
802 break;
803 } // end switch word type inside TRM
804
805 } // end if (fInsideTRM)
806
807
808 if (
809 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
810 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
811 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
812 ){ // inside TRM chains
15ec34b9 813
814 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
815 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
d0eb8f39 816 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
15ec34b9 817 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
818
819 SetSector();
820 SetPlate();
821 SetStrip();
822 SetPadZ();
823 SetPadX();
824
d0eb8f39 825
826 switch (fPSbit) { // switch fPSbit bits inside TRM chains
15ec34b9 827
828 case 0: // packing ok, digit time and TOT
829 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
32ead898 830 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
cfceaf15 831 /*-
832 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 833 ;
143cfc81 834 if (fgApplyBCCorrections) {
ca6d7f17 835 AliDebug(2,"Apply nominal DDL BC time-shift correction");
836 AliDebug(2,"Apply deltaBC time-shift correction");
837 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 838 fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 839 }
d0eb8f39 840 break;
841
842 case 1: // leading edge digit, long digit time, no TOT
15ec34b9 843 //fToT = -1;
844 //fTime = -1;
32ead898 845 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
cfceaf15 846 /*-
847 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 848 ;
143cfc81 849 if (fgApplyBCCorrections) {
ca6d7f17 850 AliDebug(2,"Apply nominal DDL BC time-shift correction");
851 AliDebug(2,"Apply deltaBC time-shift correction");
852 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 853 fLeadingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 854 }
d0eb8f39 855 break;
856
857 case 2: // trailing edge digit, long digit time, no TOT
15ec34b9 858 //fToT = -1;
859 //fTime = -1;
32ead898 860 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
cfceaf15 861 /*-
862 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 863 ;
143cfc81 864 if (fgApplyBCCorrections) {
ca6d7f17 865 AliDebug(2,"Apply nominal DDL BC time-shift correction");
866 AliDebug(2,"Apply deltaBC time-shift correction");
867 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 868 fTrailingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 869 }
d0eb8f39 870 break;
15ec34b9 871
d0eb8f39 872 case 3: // TOT overflow
15ec34b9 873 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
32ead898 874 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
cfceaf15 875 /*-
876 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 877 ;
143cfc81 878 if (fgApplyBCCorrections) {
ca6d7f17 879 AliDebug(2,"Apply nominal DDL BC time-shift correction");
880 AliDebug(2,"Apply deltaBC time-shift correction");
881 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 882 fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 883 }
d0eb8f39 884 break;
d0eb8f39 885
15ec34b9 886 } // end switch PS bits inside TRM chains
d0eb8f39 887
888 } // end if is inside TRM chains
889
890 } // end switch on fWordType
571dda3d 891
15ec34b9 892
571dda3d 893 return kTRUE;
7813bb1a 894
571dda3d 895}
896//_____________________________________________________________________________
897
d0eb8f39 898void AliTOFRawStream::SetSector()
571dda3d 899{
900 //
d0eb8f39 901 // Evaluate the TOF sector number -> [ 0;17]
902 // corresponding to the TOF equipment IDs:
903 // fDDL -> [ 0;71]
904 // fTRM -> [ 3;12]
15ec34b9 905 // fTRMchain -> [ 0; 1]
d0eb8f39 906 // fTDC -> [ 0;14]
907 // fTDCchannel -> [ 0; 7]
571dda3d 908 //
909
910 Int_t iSector = -1;
571dda3d 911
d0eb8f39 912 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
913
914 fSector = iSector;
571dda3d 915
916}
917//_____________________________________________________________________________
918
d0eb8f39 919
920void AliTOFRawStream::SetPlate()
571dda3d 921{
922 //
d0eb8f39 923 // Evaluate the TOF plate number ->[ 0; 4]
924 // corresponding to the TOF equipment IDs:
925 // fDDL -> [ 0;71]
926 // fTRM -> [ 3;12]
15ec34b9 927 // fTRMchain -> [ 0; 1]
d0eb8f39 928 // fTDC -> [ 0;14]
929 // fTDCchannel -> [ 0; 7]
571dda3d 930 //
931
932 Int_t iPlate = -1;
d0eb8f39 933 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
934 || fSector==-1))
935 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
571dda3d 936
d0eb8f39 937 fPlate = iPlate;
571dda3d 938
939}
940//_____________________________________________________________________________
941
d0eb8f39 942void AliTOFRawStream::SetStrip()
571dda3d 943{
944 //
d0eb8f39 945 // Evaluate the TOF strip number per module -> [ 0; 14/18]
946 // corresponding to the TOF equipment IDs:
947 // fDDL -> [ 0;71]
948 // fTRM -> [ 3;12]
15ec34b9 949 // fTRMchain -> [ 0; 1]
d0eb8f39 950 // fTDC -> [ 0;14]
951 // fTDCchannel -> [ 0; 7]
571dda3d 952 //
953
954 Int_t iStrip = -1;
955
d0eb8f39 956 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
957 || fSector==-1 || fPlate==-1))
958 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
571dda3d 959
d0eb8f39 960 fStrip = iStrip;
571dda3d 961
962}
963//_____________________________________________________________________________
964
d0eb8f39 965void AliTOFRawStream::SetPadZ()
571dda3d 966{
967 //
d0eb8f39 968 // Evaluate the TOF padRow number per strip -> [ 0; 1]
969 // corresponding to the TOF equipment IDs:
970 // fDDL -> [ 0;71]
971 // fTRM -> [ 3;12]
15ec34b9 972 // fTRMchain -> [ 0; 1]
d0eb8f39 973 // fTDC -> [ 0;14]
974 // fTDCchannel -> [ 0; 7]
571dda3d 975 //
976
977 Int_t iPadZ = -1;
978
d0eb8f39 979 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
980 || fSector==-1 || fPlate==-1 || fStrip==-1))
981 {
982 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
983 if (iPadAlongTheStrip!=-1)
984 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
985 }
571dda3d 986
38f24f3f 987 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
988 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
989
d0eb8f39 990 fPadZ = iPadZ;
571dda3d 991
d0eb8f39 992}
993//_____________________________________________________________________________
994
995void AliTOFRawStream::SetPadX()
996{
997 //
998 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
999 // corresponding to the TOF equipment IDs:
1000 // fDDL -> [ 0;71]
1001 // fTRM -> [ 3;12]
15ec34b9 1002 // fTRMchain -> [ 0; 1]
d0eb8f39 1003 // fTDC -> [ 0;14]
1004 // fTDCchannel -> [ 0; 7]
1005 //
571dda3d 1006
d0eb8f39 1007 Int_t iPadX = -1;
571dda3d 1008
d0eb8f39 1009 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
1010 || fSector==-1 || fPlate==-1 || fStrip==-1))
1011 {
1012 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
1013 if (iPadAlongTheStrip!=-1)
1014 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1015 }
1016
38f24f3f 1017 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
1018 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
1019
d0eb8f39 1020 fPadX = iPadX;
571dda3d 1021
1022}
571dda3d 1023
d0eb8f39 1024//----------------------------------------------------------------------------
1025Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
1026{
1027 //
a3ed3947 1028 // Returns 'word' masked by 'fieldMask' and shifted by 'fieldPosition'
d0eb8f39 1029 //
1030
1031 return ((word & fieldMask) >> fieldPosition);
1032}
1033
1034//----------------------------------------------------------------------------
13d6bff9 1035Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
571dda3d 1036{
1037 //
d0eb8f39 1038 // Returns the TOF plate number [0;4]
1039 // corresponding to the TOF equipment ID numbers:
1040 // iDDL -> DDL number per sector [0;3]
1041 // nTRM -> TRM number [3;12]
1042 // nTDC -> TDC number [0;14]
571dda3d 1043 //
1044
d0eb8f39 1045 Int_t iPlate = -1;
5f72a2bf 1046
d0eb8f39 1047 if (iDDL==0) {
1048
1049 if (nTRM>=4 && nTRM<7) {
1050 iPlate = 0;
1051 } else if (nTRM==7) {
1052 if (nTDC<12) iPlate = 0;
1053 else iPlate = 1;
1054 } else if (nTRM>=8 && nTRM<11) {
1055 iPlate = 1;
1056 } else if (nTRM==11) {
1057 if (nTDC<9) iPlate = 1;
1058 else iPlate = 2;
1059 }else if (nTRM==12) {
1060 iPlate = 2;
1061 }
1062
1063 } else if (iDDL==1) {
1064
1065 if (nTRM==3) {
1066 if (nTDC<3) iPlate = 0;
1067 } else if (nTRM>=4 && nTRM<7) {
1068 iPlate = 0;
1069 } else if (nTRM==7) {
1070 if (nTDC<6) iPlate = 1;
1071 else iPlate = 0;
1072 } else if (nTRM>=8 && nTRM<11) {
1073 iPlate = 1;
1074 } else if (nTRM==11) {
1075 if (nTDC<9) iPlate = 2;
1076 else iPlate = 1;
1077 } else if (nTRM==12) {
1078 iPlate = 2;
1079 }
1080
1081 } else if (iDDL==2) {
1082
1083 if (nTRM>=4 && nTRM<7) {
1084 iPlate = 4;
1085 } else if (nTRM==7) {
1086 if (nTDC<12) iPlate = 4;
1087 else iPlate = 3;
1088 } else if (nTRM>=8 && nTRM<11) {
1089 iPlate = 3;
1090 } else if (nTRM==11) {
1091 if (nTDC<9) iPlate = 3;
1092 else iPlate = 2;
1093 }else if (nTRM==12) {
1094 iPlate = 2;
1095 }
1096
1097 } else if (iDDL==3) {
1098
1099 if (nTRM==3) {
1100 if (nTDC<3) iPlate = 4;
1101 } else if (nTRM>=4 && nTRM<7) {
1102 iPlate = 4;
1103 } else if (nTRM==7) {
1104 if (nTDC<6) iPlate = 3;
1105 else iPlate = 4;
1106 } else if (nTRM>=8 && nTRM<11) {
1107 iPlate = 3;
1108 } else if (nTRM==11) {
1109 if (nTDC<9) iPlate = 2;
1110 else iPlate = 3;
1111 } else if (nTRM==12) {
1112 iPlate = 2;
1113 }
571dda3d 1114
d0eb8f39 1115 }
571dda3d 1116
d0eb8f39 1117 return iPlate;
571dda3d 1118
d0eb8f39 1119}
571dda3d 1120
d0eb8f39 1121//----------------------------------------------------------------------------
13d6bff9 1122Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
d0eb8f39 1123{
1124 //
1125 // Returns the TOF strip number per module:
1126 // [0;14], in the central plates,
1127 // [0;18], in the intermediate and external plates
1128 // corresponding to the TOF equipment ID numbers:
1129 // iDDL -> DDL number per sector [0;3]
1130 // nTRM -> TRM number [3;12]
1131 // nTDC -> TDC number [0;14]
1132 //
571dda3d 1133
d0eb8f39 1134 Int_t iStrip = -1;
571dda3d 1135
d0eb8f39 1136 if (iDDL==0) {
1137
1138 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
1139 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
1140 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
1141 else if (nTRM== 7) {
1142 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
1143 else iStrip = (Int_t)(nTDC/3.) - 4;
1144 }
1145 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
1146 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
1147 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
1148 else if (nTRM==11) {
1149 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
1150 else iStrip = (Int_t)(nTDC/3.) - 3;
1151 }
1152 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
1153
1154 } else if (iDDL==1) {
1155
1156 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1157 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
1158 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1159 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1160 else if (nTRM== 7) {
1161 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
1162 else iStrip = 20 - (Int_t)(nTDC/3.);
1163 }
1164 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
1165 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1166 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1167 else if (nTRM==11) {
1168 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
1169 else iStrip = 21 - (Int_t)(nTDC/3.);
1170 }
1171 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
1172
1173 } else if (iDDL==2) {
1174
1175 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
1176 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1177 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1178 else if (nTRM== 7) {
1179 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
1180 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
1181 }
1182 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1183 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1184 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1185 else if (nTRM==11) {
1186 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1187 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
1188 }
1189 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1190
1191 } else if (iDDL==3) {
1192
1193 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1194 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1195 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1196 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1197 else if (nTRM== 7) {
1198 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
1199 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1200 }
1201 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1202 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1203 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1204 else if (nTRM==11) {
1205 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1206 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1207 }
1208 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1209
1210 }
1211
1212 return iStrip;
1213
1214}
1215
1216//----------------------------------------------------------------------------
1217Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
13d6bff9 1218 Int_t iCH)
d0eb8f39 1219{
1220 //
1221 // Returns the TOF pad number per strip [0;95]
1222 // corresponding to the TOF equipment ID numbers:
1223 // iDDL -> DDL number per sector [0;3]
1224 // iChain -> TRM chain number [0;1]
1225 // nTDC -> TDC number [0;14]
1226 // iCH -> TDC channel number [0;7]
1227 //
1228
1229 Int_t iPadAlongTheStrip = -1;
1230
38f24f3f 1231 // wrong
1232 //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1233 //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1234 //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
d0eb8f39 1235
38f24f3f 1236 // right
1237 Int_t iTDClocal = -1;
1238 Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1239 Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1240 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1241 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
d0eb8f39 1242
1243 Int_t iCHlocal = iCH;
1244 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1245
1246 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1247
1248 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
019f6101 1249 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
a3ed3947 1250 std::cerr << "Warning -> AliTOFRawStream::Equip2VolNpad: Problems with the padX number!\n";
13d6bff9 1251 //AliWarning("Problems with the padX number!");
019f6101 1252 }
d0eb8f39 1253 return iPadAlongTheStrip;
1254
1255}
1256
38f24f3f 1257//----------------------------------------------------------------------------
1258Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1259 Int_t iCH)
1260{
1261 //
1262 // Returns the TOF padX number [0;47]
1263 // corresponding to the TOF equipment ID numbers:
1264 // iDDL -> DDL number per sector [0;3]
1265 // iChain -> TRM chain number [0;1]
1266 // nTDC -> TDC number [0;14]
1267 // iCH -> TDC channel number [0;7]
1268 //
1269
1270 Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1271 (Float_t(AliTOFGeometry::NpadZ())));
1272
1273 return iPadX;
1274
1275}
1276
1277//----------------------------------------------------------------------------
1278Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1279 Int_t iCH)
1280{
1281 //
1282 // Returns the TOF padZ number [0;1]
1283 // corresponding to the TOF equipment ID numbers:
1284 // iDDL -> DDL number per sector [0;3]
1285 // iChain -> TRM chain number [0;1]
1286 // nTDC -> TDC number [0;14]
1287 // iCH -> TDC channel number [0;7]
1288 //
1289
1290 Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1291
1292 return iPadZ;
1293
1294}
1295
d0eb8f39 1296//----------------------------------------------------------------------------
5f72a2bf 1297Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL)
d0eb8f39 1298{
1299 //
1300 // Returns the sector number [0;17]
1301 // corresponing to the assigned DRM/DDL number [0;71]
1302 //
1303
1304 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1305
1306 return iSector;
1307
1308}
1309//----------------------------------------------------------------------------
5f72a2bf 1310Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL)
d0eb8f39 1311{
1312 //
1313 // Return the DRM/DDL number per sector [0;3]
1314 // corresponing to the assigned DRM/DDL number [0;71]
1315 //
1316
1317 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1318
1319 return iDDL;
1320
1321}
1322
7813bb1a 1323//----------------------------------------------------------------------------
1324void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1325{
1326 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1327}
d0eb8f39 1328//----------------------------------------------------------------------------
1329void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
a3ed3947 1330 Int_t nTDC, Int_t iCH,
1331 Int_t *volume)
d0eb8f39 1332{
1333 //
1334 // To convert:
1335 // nDDL (variable in [0;71]) -> number of the DDL file
1336 // nTRM (variable in [3;12]) -> number of the TRM slot
1337 // iChain (variable in [0; 1]) -> number of the TRM chain
1338 // nTDC (variable in [0;14]) -> number of the TDC
1339 // iCH (variable in [0; 7]) -> number of the TDC channel
1340 //
1341 // in:
1342 // sector number, i.e. volume[0] (variable in [0,17])
1343 // plate number, i.e. volume[1] (variable in [0, 5])
1344 // strip number, i.e. volume[2] (variable in [0,14/18])
1345 // padX number, i.e. volume[3] (variable in [0,47])
1346 // padZ number, i.e. volume[4] (variable in [0, 1])
1347 //
1348
125f7e0b 1349 for (Int_t ii=0; ii<5; ii++) volume[ii] = -1;
1350
d0eb8f39 1351 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1352
125f7e0b 1353 if (iDDL%2==1 && nTRM==3 && nTDC/3>0) { // Signal not coming from a TOF pad but -probably- from a TOF OR signal
1354 //printf("Info -> AliTOFRawStream::EquipmentId2VolumeId: Signal not coming from a TOF pad but -probably- from a TOF OR signal (%2d %2d %2d)\n", nDDL, nTRM, nTDC);
1355 return;
1356 }
1357
d0eb8f39 1358 Int_t iSector = GetSectorNumber(nDDL);
1359
1360 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
019f6101 1361 if (iPlate==-1) {
a9137e31 1362 /*if (fRawReader)
1363 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");*/
5b4ed716 1364 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the plate number (%2d %2d %2d)!\n",
1365 nDDL, nTRM, nTDC));
019f6101 1366 }
d0eb8f39 1367
1368 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
019f6101 1369 if (iStrip==-1) {
a9137e31 1370 /*if (fRawReader)
1371 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");*/
5b4ed716 1372 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the strip number (%2d %2d %2d)!\n",
1373 nDDL, nTRM, nTDC));
019f6101 1374 }
d0eb8f39 1375
1376 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
a9137e31 1377 if (iPadAlongTheStrip==-1) {
1378 /*if (fRawReader)
1379 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");*/
5b4ed716 1380 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the pad number along the strip (%2d %1d %2d %1d)!\n",
1381 nDDL, iChain, nTDC, iCH));
019f6101 1382 }
13d6bff9 1383
d0eb8f39 1384 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1385 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
38f24f3f 1386
1387 //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1388 //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1389
1390 //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1391 //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1392
d0eb8f39 1393 volume[0] = iSector;
1394 volume[1] = iPlate;
1395 volume[2] = iStrip;
1396 volume[3] = iPadX;
1397 volume[4] = iPadZ;
571dda3d 1398
1399}
7813bb1a 1400//-----------------------------------------------------------------------------
019f6101 1401Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1402 //
1403 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1404 //
1405
7813bb1a 1406 //check and fix valid DDL range
019f6101 1407 if (nDDLMin < 0){
1408 nDDLMin = 0;
1409 fRawReader->AddMinorErrorLog(kDDLMinError);
1410 AliWarning("Wrong DDL range: setting first DDL ID to 0");
7813bb1a 1411 }
019f6101 1412 if (nDDLMax > 71){
1413 nDDLMax = 71;
1414 fRawReader->AddMinorErrorLog(kDDLMaxError);
1415 AliWarning("Wrong DDL range: setting last DDL ID to 71");
7813bb1a 1416 }
1417
1418 //select required DDLs
5b4ed716 1419 fRawReader->Reset();
019f6101 1420 fRawReader->Select("TOF", nDDLMin, nDDLMax);
7813bb1a 1421
1422 if (verbose)
019f6101 1423 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
7813bb1a 1424
2fd622fa 1425 return(Decode(verbose));
1426}
1427//-----------------------------------------------------------------------------
019f6101 1428Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1429 //
1430 // New decoder method
1431 //
1432
2fd622fa 1433 Int_t currentEquipment;
1434 Int_t currentDDL;
dd824655 1435 const AliRawDataHeader *currentCDH;
2fd622fa 1436
1437 //pointers
1438 UChar_t *data = 0x0;
1439
7813bb1a 1440 //loop and read DDL headers
1441 while(fRawReader->ReadHeader()){
1442
1443 //memory leak prevention (actually data should be always 0x0 here)
1444 if (data != 0x0)
1445 delete [] data;
1446
1447 //get equipment infos
1448 currentEquipment = fRawReader->GetEquipmentId();
61c4c50d 1449
7813bb1a 1450 currentDDL = fRawReader->GetDDLID();
61c4c50d 1451 if (currentDDL==-1) {
1452 fRawReader->AddMajorErrorLog(kDDLdataReading);
1453 if (verbose)
1454 AliWarning("Error when load DDL. Go to next DDL");
1455 continue;
1456 }
1457
dd824655 1458 currentCDH = fRawReader->GetDataHeader();
7813bb1a 1459 const Int_t kDataSize = fRawReader->GetDataSize();
1460 const Int_t kDataWords = kDataSize / 4;
1461 data = new UChar_t[kDataSize];
1462
1463 if (verbose)
1464 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1465
1466 if (verbose)
1467 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1468
1469 //read equipment payload
1470 if (!fRawReader->ReadNext(data, kDataSize))
1471 {
019f6101 1472 fRawReader->AddMajorErrorLog(kDDLdataReading);
7813bb1a 1473 if (verbose)
019f6101 1474 AliWarning("Error while reading DDL data. Go to next equipment");
7813bb1a 1475 delete [] data;
1476 data = 0x0;
1477 continue;
1478 }
1479
1480 if (verbose)
1481 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1482
1483
1484 //set up the decoder
1485 fDecoder->SetVerbose(verbose);
d35d0ea0 1486 fDecoder->SetDataBuffer(&fDataBuffer[currentDDL]);
1487 fDecoder->SetPackedDataBuffer(&fPackedDataBuffer[currentDDL]);
7813bb1a 1488
1489 //start decoding
dd824655 1490 if (fDecoder->Decode((UInt_t *)data, kDataWords, currentCDH) == kTRUE) {
019f6101 1491 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1492 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
f02e90a6 1493 ResetDataBuffer(currentDDL);
1494 ResetPackedDataBuffer(currentDDL);
019f6101 1495 }
7813bb1a 1496
1497 delete [] data;
1498 data = 0x0;
1499 }
1500
1501 //reset reader
1502 fRawReader->Reset();
1503
1504 if (verbose)
1505 AliInfo("All done");
1506
1507 return kFALSE;
1508
5b4ed716 1509}
1510//-----------------------------------------------------------------------------
1511Bool_t AliTOFRawStream::DecodeV2(Int_t verbose = 0) {
1512 //
1513 // Enhanced decoder method
1514 //
1515
1516 Int_t currentEquipment;
1517 Int_t currentDDL;
61c4c50d 1518 //const AliRawDataHeader *currentCDH;
5b4ed716 1519
1520 //pointers
1521 UChar_t *data = 0x0;
1522
1523 // read header
1524 if (!fRawReader->ReadHeader()) return kTRUE;
1525
1526 //get equipment infos
1527 currentEquipment = fRawReader->GetEquipmentId();
1528 currentDDL = fRawReader->GetDDLID();
61c4c50d 1529 //currentCDH = fRawReader->GetDataHeader();
5b4ed716 1530 const Int_t kDataSize = fRawReader->GetDataSize();
1531 const Int_t kDataWords = kDataSize / 4;
1532 data = new UChar_t[kDataSize];
1533
1534 if (verbose)
1535 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1536
1537 if (verbose)
1538 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1539
1540 //read equipment payload
1541 if (!fRawReader->ReadNext(data, kDataSize))
1542 {
1543 fRawReader->AddMajorErrorLog(kDDLdataReading);
1544 if (verbose)
1545 AliWarning("Error while reading DDL data. Go to next equipment");
1546 delete [] data;
1547 data = 0x0;
1548 return kTRUE;
1549 }
1550
1551 if (verbose)
1552 AliInfo(Form("Equipment # %d (DDL # %d) data has been read", currentEquipment, currentDDL));
1553
1554
1555 //set up the decoder
1556 fDecoderV2->SetVerbose(verbose);
1557
1558 //start decoding
1559 if (fDecoderV2->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1560 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1561 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1562 }
1563
1564 delete [] data;
1565
1566 if (verbose)
1567 AliInfo("All done");
1568
1569 return kFALSE;
1570
7813bb1a 1571}
1572//---------------------------------------------------------------------------
1573void
1574AliTOFRawStream::ResetBuffers()
1575{
19eefa2b 1576 //
1577 // To reset the buffers
1578 //
1579
7813bb1a 1580 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1581 ResetDataBuffer(iDDL);
1582 ResetPackedDataBuffer(iDDL);
1583 }
1584}
1585
1586//---------------------------------------------------------------------------
1587Bool_t
1588AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1589{
19eefa2b 1590 //
1591 // To load the buffers
1592 //
1593
7813bb1a 1594 fTOFrawData->Clear();
1595 fPackedDigits = 0;
1596
1597 if (verbose > 0)
1598 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1599
1600 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
019f6101 1601 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1602 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
7813bb1a 1603 return kTRUE;
1604 }
1605
1606 if (verbose > 0)
d35d0ea0 1607 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL].GetEntries(), fPackedDataBuffer[indexDDL].GetEntries() > 1 ? "hits have" : "hit has"));
7813bb1a 1608
1609 AliTOFHitData *hitData; //hit data pointer
1610
1611 if (verbose > 0)
1612 AliInfo("Filling TClonesArray ...");
1613
dd824655 1614 if (verbose > 0)
1615 if (fgApplyBCCorrections) {
1616 AliInfo("Apply nominal DDL BC time-shift correction");
1617 AliInfo("Apply deltaBC time-shift correction");
1618 }
1619
7813bb1a 1620 //loop over DDL packed hits
d35d0ea0 1621 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL].GetEntries(); iHit++){
1622 hitData = fPackedDataBuffer[indexDDL].GetHit(iHit); //get hit data
7813bb1a 1623 Int_t hitACQ = hitData->GetACQ();
1624 Int_t hitPS = hitData->GetPS();
1625 Int_t hitSlotID = hitData->GetSlotID();
1626 Int_t hitChain = hitData->GetChain();
1627 Int_t hitTDC = hitData->GetTDC();
1628 Int_t hitChan = hitData->GetChan();
7813bb1a 1629 Int_t hitTimeBin = hitData->GetTimeBin();
7813bb1a 1630 Int_t hitTOTBin = hitData->GetTOTBin();
2bf4d9d6 1631 Int_t hitDeltaBC = hitData->GetDeltaBunchID();
1632 Int_t hitL0L1Latency = hitData->GetL0L1Latency();
dd824655 1633
1634 Int_t hitLeading = hitData->GetTimeBin();
bf33f8f0 1635 Int_t hitTrailing = -1;
1636 Int_t hitError = -1;
7813bb1a 1637
1638 TClonesArray &arrayTofRawData = *fTOFrawData;
2bf4d9d6 1639 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency);
7813bb1a 1640 }
1641
1642 if (verbose > 0)
1643 AliInfo("Done.");
1644
1645 if (verbose > 0)
1646 AliInfo("Resetting buffers ...");
1647
d35d0ea0 1648 fDataBuffer[indexDDL].Reset();
1649 fPackedDataBuffer[indexDDL].Reset();
7813bb1a 1650
1651 if (verbose > 0)
1652 AliInfo("Done.");
1653
1654 return kFALSE;
1655}
1656
5f72a2bf 1657//---------------------------------------------------------------------------
5b4ed716 1658Bool_t
1659AliTOFRawStream::LoadRawDataBuffersV2(Int_t indexDDL, Int_t verbose)
1660{
1661 //
1662 // To load the buffers
1663 //
1664
1665 /*
1666 * decode raw data and fill output array with TOF hits.
1667 * decode algorithm may return with errors due to inconsistent
1668 * raw data format detected during decoding process.
1669 * decoder algorithm has internal recover procedure to deal with
1670 * errors in a safe condition.
1671 *
1672 * the following conditions will cause total hit rejection from
1673 * specific boards where the condition is detected:
1674 *
1675 * --- within DRM payload (full DRM skipped) ---
1676 * - no header/trailer detected
1677 *
1678 * --- within TRM payload (full TRM skippped) ---
1679 * - no header/trailer detected
1680 * - empty event inserted
1681 * - bad event counter
1682 * - bad CRC
1683 * - ACQ mode off
1684 *
1685 * --- within chain payload (full chain skipped) ---
1686 * - no header/trailer detected
1687 * - bad status
1688 * - bad event counter
1689 *
1690 * --- HPTDC (ful TDC skipped) ---
1691 * - error detected
1692 *
1693 */
1694
1695 fTOFrawData->Clear();
1696 fPackedDigits = 0;
1697
1698 if (verbose > 0)
1699 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1700
1701 //check and fix valid DDL range
1702 if (indexDDL < 0){
1703 indexDDL = 0;
1704 fRawReader->AddMinorErrorLog(kDDLMinError);
1705 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1706 }
1707 if (indexDDL > 71){
1708 indexDDL = 71;
1709 fRawReader->AddMinorErrorLog(kDDLMaxError);
1710 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1711 }
1712
1713 //select required DDLs
1714 fRawReader->Reset();
1715 fRawReader->Select("TOF", indexDDL, indexDDL);
1716
1717 /* decode */
1718 if (DecodeV2(verbose)) return kTRUE;
1719
1720 /* read and check CDH info */
1721 const AliRawDataHeader *currentCDH = fRawReader->GetDataHeader();
1722 Int_t currentMiniEventID = currentCDH->GetMiniEventID();
1723 Int_t currentEventID1 = currentCDH->GetEventID1();
1724
1725 /* read decoder summary data */
1726 AliTOFDecoderSummaryData *decodersd;
1727 AliTOFDRMSummaryData *drmsd;
1728 // AliTOFLTMSummaryData *ltmsd;
1729 AliTOFTRMSummaryData *trmsd;
1730 AliTOFChainSummaryData *chainsd;
1731 AliTOFTDCHitBuffer *hitBuffer;
1732 AliTOFTDCHit *hit;
1733 AliTOFTDCErrorBuffer *errorBuffer;
1734 AliTOFTDCError *error;
1735 Bool_t tdcErrorFlag[15];
1736 decodersd = fDecoderV2->GetDecoderSummaryData();
1737
1738 /* check error detected/recovered */
1739 if (decodersd->GetErrorDetected()) {
1740 AliWarning(Form("Error detected while decoding DDL %d (errorSlotID mask = %04x)", indexDDL, decodersd->GetErrorSlotID()));
1741 if (decodersd->GetRecoveringError()) {
1742 AliWarning("Couldn't recover from error");
1743 }
1744 else {
1745 AliWarning("Error recovered, anyway something is probably lost");
1746 }
1747 }
1748 /* check DRM header/trailer */
1749 drmsd = decodersd->GetDRMSummaryData();
1750 if (!drmsd->GetHeader() || !drmsd->GetTrailer()) {
1751 AliWarning("DRM header/trailer missing, skip DDL");
1752 return kTRUE;
1753 }
1754 /* check partecipating mask */
1755 if (drmsd->GetPartecipatingSlotID() != drmsd->GetDecoderSlotEnableMask()) {
1756 AliWarning(Form("DRM slot enable mask differs from decoder slot enable mask (%08x != %08x) in DDL %d", drmsd->GetSlotEnableMask(), drmsd->GetDecoderSlotEnableMask(), indexDDL));
1757 for (Int_t ibit = 0; ibit < 11; ibit++)
1758 if ((drmsd->GetPartecipatingSlotID() & (0x1 << ibit)) && !(drmsd->GetDecoderSlotEnableMask() & (0x1 << ibit)))
1759 AliWarning(Form("readout slot %d data is missing in decoder", ibit + 2));
1760 }
1761
1762 /* get DRM data */
1763 Int_t currentL0BCID = drmsd->GetL0BCID();
1764
1765 /* loop over TRM to get hits */
1766 Int_t hitACQ, hitPS, hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitDeltaBC, hitL0L1Latency, hitLeading, hitTrailing, hitError;
1767 Int_t currentBunchID;
1768
1769 /* loop over TRMs */
1770 for (Int_t itrm = 0; itrm < 10; itrm++) {
1771 trmsd = drmsd->GetTRMSummaryData(itrm);
1772 /* check header/trailer */
1773 if (!trmsd->GetHeader() || !trmsd->GetTrailer()) continue;
1774 /* skip if TRM empty event detected */
1775 if (trmsd->GetEBit() != 0) continue;
1776 /* skip if bad TRM event counter detected */
1777 if (trmsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue;
1778 /* skip if bad TRM CRC detected */
1779 if (trmsd->GetEventCRC() != trmsd->GetDecoderCRC()) continue;
1780
1781 /* loop over chains */
1782 for (Int_t ichain = 0; ichain < 2; ichain++) {
1783 chainsd = trmsd->GetChainSummaryData(ichain);
1784 /* check header/trailer */
1785 if (!chainsd->GetHeader() || !chainsd->GetTrailer()) continue;
1786 /* skip if chain bad status detected */
1787 if (chainsd->GetStatus() != 0) continue;
1788 /* skip if bad chain event counter detected */
1789 if (chainsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue;
1790
1791 currentBunchID = chainsd->GetBunchID();
1792 hitBuffer = chainsd->GetTDCPackedHitBuffer();
1793 errorBuffer = chainsd->GetTDCErrorBuffer();
1794
1795 /* check TDC errors and set TDC error flag */
1796 for (Int_t itdc = 0; itdc < 15; itdc++) tdcErrorFlag[itdc] = kFALSE;
1797 for (Int_t ierr = 0; ierr < errorBuffer->GetEntries(); ierr++) {
1798 error = errorBuffer->GetError(ierr);
1799 tdcErrorFlag[error->GetTDCID()] = kTRUE;
1800 }
1801
1802 /* loop over hits */
1803 for (Int_t ihit = 0; ihit < hitBuffer->GetEntries(); ihit++) {
1804
1805 /* get hit */
1806 hit = hitBuffer->GetHit(ihit);
1807 /* skip hit if coming from a TDC with error detected */
1808 if (tdcErrorFlag[hit->GetTDCID()]) continue;
1809
1810 /* set info */
1811 hitACQ = trmsd->GetACQBits();
1812 hitPS = hit->GetPSBits();
1813 hitSlotID = trmsd->GetSlotID();
1814 hitChain = chainsd->GetChain();
1815 hitTDC = hit->GetTDCID();
1816 hitChan = hit->GetChan();
1817 hitTimeBin = hit->GetHitTime();
1818 hitTOTBin = hit->GetTOTWidth();
1819 hitDeltaBC = currentBunchID - currentEventID1;
1820 hitL0L1Latency = currentMiniEventID - currentL0BCID;
1821
1822 hitLeading = hitTimeBin;
1823 hitTrailing = -1;
1824 hitError = -1;
1825
1826 /* add hit */
1827 TClonesArray &arrayTofRawData = *fTOFrawData;
1828 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency);
1829 }
1830 }
1831 }
1832
1833 return kFALSE;
1834}
1835
1836//---------------------------------------------------------------------------
5f72a2bf 1837void AliTOFRawStream::Geant2EquipmentId(Int_t vol[], Int_t eqId[])
1838{
1839 //
1840 // To convert:
1841 // nSector number -vol[0]- (variable in [0,17])
1842 // nPlate number -vol[1]- (variable in [0, 5])
1843 // nStrip number -vol[2]- (variable in [0,14/18])
1844 // nPadZ number -vol[3]- (variable in [0, 1])
1845 // nPadX number -vol[4]- (variable in [0,47])
1846 // in:
e1d95075 1847 // nDDL -eqId[0]- (variable in [0;71]) -> number of the DDL
1848 // nTRM -eqId[1]- (variable in [3;12]) -> number of the TRM
1849 // nTDC -eqId[2]- (variable in [0;14]) -> number of the TDC
1850 // nChain -eqId[3]- (variable in [0; 1]) -> number of the chain
1851 // nChannel -eqId[4]- (variable in [0; 8]) -> number of the channel
5f72a2bf 1852 //
1853
1854 eqId[0] = Geant2DDL(vol);
1855 eqId[1] = Geant2TRM(vol);
1856 eqId[2] = Geant2TDC(vol);
1857 eqId[3] = Geant2Chain(vol);
1858 eqId[4] = Geant2Channel(vol);
1859
1860}
1861
1862//---------------------------------------------------------------------------
1863Int_t AliTOFRawStream::Geant2DDL(Int_t vol[])
1864{
1865 //
1866 // To convert:
1867 // nSector number -vol[0]- (variable in [0,17])
1868 // nPlate number -vol[1]- (variable in [0, 5])
1869 // nStrip number -vol[2]- (variable in [0,14/18])
1870 // nPadZ number -vol[3]- (variable in [0, 1])
1871 // nPadX number -vol[4]- (variable in [0,47])
1872 // in:
e1d95075 1873 // nDDL (variable in [0;71]) -> number of the DDL
5f72a2bf 1874 //
1875
1876
1877 Int_t iDDL = -1;
1878
1879 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1880 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1881 return iDDL;
1882 }
1883 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1884 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1885 return iDDL;
1886 }
1887 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1888 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1889 return iDDL;
1890 }
1891 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1892 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1893 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1894 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1895 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1896 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1897 return iDDL;
1898 }
1899
1900 Int_t nSector = vol[0];
1901 Int_t nPlate = vol[1];
1902 Int_t nStrip = vol[2];
1903 Int_t nPadX = vol[4];
1904
1905 if ( nPadX<24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<7) ) )
1906 iDDL = 0;
1907 else if ( nPadX>=24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<8) ) )
1908 iDDL = 1;
1909 else if ( nPadX>=24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>7) ) )
1910 iDDL = 2;
1911 else if ( nPadX<24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>6) ) )
1912 iDDL = 3;
1913
1914 return 4*nSector+iDDL;
1915
1916}
1917
1918//---------------------------------------------------------------------------
1919Int_t AliTOFRawStream::Geant2TRM(Int_t vol[])
1920{
1921 //
1922 // To convert:
1923 // nSector number -vol[0]- (variable in [0,17])
1924 // nPlate number -vol[1]- (variable in [0, 5])
1925 // nStrip number -vol[2]- (variable in [0,14/18])
1926 // nPadZ number -vol[3]- (variable in [0, 1])
1927 // nPadX number -vol[4]- (variable in [0,47])
1928 // in:
1929 // nTRM (variable in [3;12]) -> number of the TRM slot
1930 //
1931
1932 Int_t nTRM = -1;
1933
1934 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1935 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1936 return nTRM;
1937 }
1938 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1939 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1940 return nTRM;
1941 }
1942 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1943 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1944 return nTRM;
1945 }
1946 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) {
1947 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1948 return nTRM;
1949 }
1950 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) {
1951 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1952 return nTRM;
1953 }
1954
1955 if ( vol[3]>=AliTOFGeometry::NpadZ() )
1956 {
1957 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1958 return nTRM;
1959 }
1960
1961 Int_t nPlate = vol[1];
1962 Int_t nStrip = vol[2];
1963
1964 Int_t iDDL = Geant2DDL(vol)%4;
1965
1966 switch (iDDL) {
1967
1968 case 0:
1969
1970 if (nPlate==0) {
1971 if (nStrip<= 4) nTRM = 4;
1972 else if (nStrip> 4 && nStrip<= 9) nTRM = 5;
1973 else if (nStrip> 9 && nStrip<=14) nTRM = 6;
1974 else if (nStrip>14) nTRM = 7;
1975 }
1976 else if (nPlate==1) {
1977 if (nStrip== 0) nTRM = 7;
1978 else if (nStrip> 0 && nStrip<= 5) nTRM = 8;
1979 else if (nStrip> 5 && nStrip<=10) nTRM = 9;
1980 else if (nStrip>10 && nStrip<=15) nTRM = 10;
1981 else if (nStrip>15) nTRM = 11;
1982 }
1983 else if (nPlate==2) {
1984 if (nStrip<= 1) nTRM = 11;
1985 else if (nStrip> 1 && nStrip< 7) nTRM = 12;
1986 }
1987
1988 break;
1989 case 1:
1990
1991 if (nPlate==0) {
1992 if (nStrip== 0) nTRM = 3;
1993 else if (nStrip> 0 && nStrip<= 5) nTRM = 4;
1994 else if (nStrip> 5 && nStrip<=10) nTRM = 5;
1995 else if (nStrip>10 && nStrip<=15) nTRM = 6;
1996 else if (nStrip>15) nTRM = 7;
1997 }
1998 else if (nPlate==1) {
1999 if (nStrip<=1) nTRM = 7;
2000 else if (nStrip> 1 && nStrip<= 6) nTRM = 8;
2001 else if (nStrip> 6 && nStrip<=11) nTRM = 9;
2002 else if (nStrip>11 && nStrip<=16) nTRM = 10;
2003 else if (nStrip>16) nTRM = 11;
2004 }
2005 else if (nPlate==2) {
2006 if (nStrip<= 2) nTRM = 11;
2007 else if (nStrip> 2 && nStrip<= 7) nTRM = 12;
2008 }
2009
2010 break;
2011 case 2:
2012
2013 if (nPlate==4) {
2014 if (nStrip>=14) nTRM = 4;
2015 else if (nStrip<14 && nStrip>= 9) nTRM = 5;
2016 else if (nStrip< 9 && nStrip>= 4) nTRM = 6;
2017 else if (nStrip< 4) nTRM = 7;
2018 }
2019 else if (nPlate==3) {
2020 if (nStrip==18) nTRM = 7;
2021 else if (nStrip<18 && nStrip>=13) nTRM = 8;
2022 else if (nStrip<13 && nStrip>= 8) nTRM = 9;
2023 else if (nStrip< 8 && nStrip>= 3) nTRM = 10;
2024 else if (nStrip< 3) nTRM = 11;
2025 }
2026 else if (nPlate==2) {
2027 if (nStrip>=13) nTRM = 11;
2028 else if (nStrip<13 && nStrip>= 8) nTRM = 12;
2029 }
2030
2031 break;
2032 case 3:
2033
2034 if (nPlate==4) {
2035 if (nStrip==18) nTRM = 3;
2036 else if (nStrip<18 && nStrip>=13) nTRM = 4;
2037 else if (nStrip<13 && nStrip>= 8) nTRM = 5;
2038 else if (nStrip< 8 && nStrip>= 3) nTRM = 6;
2039 else if (nStrip< 3) nTRM = 7;
2040 }
2041 else if (nPlate==3) {
2042 if (nStrip>=17) nTRM = 7;
2043 else if (nStrip<17 && nStrip>=12) nTRM = 8;
2044 else if (nStrip<12 && nStrip>= 7) nTRM = 9;
2045 else if (nStrip< 7 && nStrip>= 2) nTRM = 10;
2046 else if (nStrip< 2) nTRM = 11;
2047 }
2048 else if (nPlate==2) {
2049 if (nStrip>=12) nTRM = 11;
2050 else if (nStrip <12 && nStrip>= 7) nTRM = 12;
2051 }
2052
2053 break;
2054
2055 }
2056
2057 return nTRM;
2058
2059}
2060
2061//---------------------------------------------------------------------------
2062Int_t AliTOFRawStream::Geant2TDC(Int_t vol[])
2063{
2064 //
2065 // To convert:
2066 // nSector number -vol[0]- (variable in [0,17])
2067 // nPlate number -vol[1]- (variable in [0, 5])
2068 // nStrip number -vol[2]- (variable in [0,14/18])
2069 // nPadZ number -vol[3]- (variable in [0, 1])
2070 // nPadX number -vol[4]- (variable in [0,47])
2071 // in:
2072 // nTDC (variable in [0;14]) -> number of the TDC
2073 //
2074
2075 Int_t nTDC = -1;
2076
2077 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2078 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2079 return nTDC;
2080 }
2081 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2082 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2083 return nTDC;
2084 }
2085 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2086 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2087 return nTDC;
2088 }
2089 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2090 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2091 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2092 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2093 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2094 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2095 return nTDC;
2096 }
2097
2098 Int_t nPlate = vol[1];
2099 Int_t nStrip = vol[2];
2100 Int_t iPadX = vol[4];
2101
2102 Int_t iDDL = Geant2DDL(vol)%4;
2103
2104 switch (iDDL) {
2105
2106 case 0:
2107
2108 if (nPlate==0) {
2109 if (nStrip<= 4) nTDC = (3*(nStrip)+2-(iPadX/4)%3);
2110 else if (nStrip> 4 && nStrip<= 9) nTDC = (3*(nStrip- 5)+2-(iPadX/4)%3);
2111 else if (nStrip> 9 && nStrip<=14) nTDC = (3*(nStrip-10)+2-(iPadX/4)%3);
2112 else if (nStrip>14) nTDC = (3*(nStrip-15)+2-(iPadX/4)%3);
2113 }
2114 else if (nPlate==1) {
2115 if (nStrip== 0) nTDC = (3*(nStrip+ 4)+2-(iPadX/4)%3);
2116 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*(nStrip- 1)+2-(iPadX/4)%3);
2117 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(nStrip- 6)+2-(iPadX/4)%3);
2118 else if (nStrip>10 && nStrip<=15) nTDC = (3*(nStrip-11)+2-(iPadX/4)%3);
2119 else if (nStrip>15) nTDC = (3*(nStrip-16)+2-(iPadX/4)%3);
2120 }
2121 else if (nPlate==2) {
2122 if (nStrip<= 1) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
2123 else if (nStrip> 1 && nStrip< 7) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
2124 }
2125
2126 break;
2127 case 1:
2128
2129 if (nPlate==0) {
2130 if (nStrip== 0) nTDC = (3*(nStrip)+(iPadX/4)%3);
2131 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*( 5-nStrip)+(iPadX/4)%3);
2132 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(10-nStrip)+(iPadX/4)%3);
2133 else if (nStrip>10 && nStrip<=15) nTDC = (3*(15-nStrip)+(iPadX/4)%3);
2134 else if (nStrip>15) nTDC = (3*(20-nStrip)+(iPadX/4)%3);
2135 }
2136 else if (nPlate==1) {
2137 if (nStrip<= 1) nTDC = (3*( 1-nStrip)+(iPadX/4)%3);
2138 else if (nStrip> 1 && nStrip<= 6) nTDC = (3*( 6-nStrip)+(iPadX/4)%3);
2139 else if (nStrip> 6 && nStrip<=11) nTDC = (3*(11-nStrip)+(iPadX/4)%3);
2140 else if (nStrip>11 && nStrip<=16) nTDC = (3*(16-nStrip)+(iPadX/4)%3);
2141 else if (nStrip>16) nTDC = (3*(21-nStrip)+(iPadX/4)%3);
2142 }
2143 else if (nPlate==2) {
2144 if (nStrip<= 2) nTDC = (3*( 2-nStrip)+(iPadX/4)%3);
2145 else if (nStrip> 2 && nStrip<= 7) nTDC = (3*( 7-nStrip)+(iPadX/4)%3);
2146 }
2147
2148 break;
2149 case 2:
2150
2151 if (nPlate==4) {
2152 if (nStrip>=14) nTDC = (3*(18-nStrip)+((iPadX/4)%3));
2153 else if (nStrip<14 && nStrip>= 9) nTDC = (3*(13-nStrip)+((iPadX/4)%3));
2154 else if (nStrip< 9 && nStrip>= 4) nTDC = (3*( 8-nStrip)+((iPadX/4)%3));
2155 else if (nStrip< 4) nTDC = (3*( 3-nStrip)+((iPadX/4)%3));
2156 }
2157 else if (nPlate==3) {
2158 if (nStrip==18) nTDC = (3*(22-nStrip)+((iPadX/4)%3));
2159 else if (nStrip<18 && nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
2160 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
2161 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*( 7-nStrip)+((iPadX/4)%3));
2162 else if (nStrip< 3) nTDC = (3*( 2-nStrip)+((iPadX/4)%3));
2163 }
2164 else if (nPlate==2) {
2165 if (nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
2166 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
2167 }
2168
2169 break;
2170 case 3:
2171
2172 if (nPlate==4) {
2173 if (nStrip==18) nTDC = (3*(nStrip-18)+2-(iPadX/4)%3);
2174 else if (nStrip<18 && nStrip>=13) nTDC = (3*(nStrip-13)+2-(iPadX/4)%3);
2175 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(nStrip- 8)+2-(iPadX/4)%3);
2176 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*(nStrip- 3)+2-(iPadX/4)%3);
2177 else if (nStrip< 3) nTDC = (3*(nStrip+ 2)+2-(iPadX/4)%3);
2178 }
2179 else if (nPlate==3) {
2180 if (nStrip>=17) nTDC = (3*(nStrip-17)+2-(iPadX/4)%3);
2181 else if (nStrip<17 && nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
2182 else if (nStrip<12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
2183 else if (nStrip< 7 && nStrip>= 2) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
2184 else if (nStrip< 2) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
2185 }
2186 else if (nPlate==2) {
2187 if (nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
2188 else if (nStrip <12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
2189 }
2190
2191 break;
2192
2193 }
2194
2195 return nTDC;
2196
2197}
2198
2199//---------------------------------------------------------------------------
2200Int_t AliTOFRawStream::Geant2Chain(Int_t vol[])
2201{
2202 //
2203 // To convert:
2204 // nSector number -vol[0]- (variable in [0,17])
2205 // nPlate number -vol[1]- (variable in [0, 5])
2206 // nStrip number -vol[2]- (variable in [0,14/18])
2207 // nPadZ number -vol[3]- (variable in [0, 1])
2208 // nPadX number -vol[4]- variable in [0,47])
2209 // in:
2210 // nChain (variable in [0; 1]) -> number of the TRM chain
2211 //
2212
2213 Int_t nChain = -1;
2214
2215 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2216 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2217 return nChain;
2218 }
2219 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2220 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2221 return nChain;
2222 }
2223 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2224 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2225 return nChain;
2226 }
2227 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2228 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2229 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2230 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2231 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2232 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2233 return nChain;
2234 }
2235
2236 Int_t iPadX = vol[4];
2237
2238 if (iPadX<12 || iPadX>=36) nChain = 0;
2239 else nChain = 1;
2240
2241 return nChain;
2242
2243}
2244
2245//---------------------------------------------------------------------------
2246Int_t AliTOFRawStream::Geant2Channel(Int_t vol[])
2247{
2248 //
2249 // To convert:
2250 // nSector number -vol[0]- (variable in [0,17])
2251 // nPlate number -vol[1]- (variable in [0, 5])
2252 // nStrip number -vol[2]- (variable in [0,14/18])
2253 // nPadZ number -vol[3]- (variable in [0, 1])
2254 // nPadX number -vol[4]- (variable in [0,47])
2255 // in:
2256 // nChannel (variable in [0; 7]) -> number of the TDC channel
2257 //
2258
2259 Int_t nChannel = -1;
2260
2261 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2262 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2263 return nChannel;
2264 }
2265 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2266 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2267 return nChannel;
2268 }
2269 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2270 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2271 return nChannel;
2272 }
2273 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2274 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2275 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2276 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2277 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2278 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2279 return nChannel;
2280 }
2281
2282 Int_t iPadZ = vol[3];
2283 Int_t iPadX = vol[4];
2284
2285 Int_t iDDL = Geant2DDL(vol)%4;
2286
2287 switch (iDDL) {
2288
2289 case 0:
2290 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2291 break;
2292 case 1:
2293 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2294 break;
2295 case 2:
2296 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2297 break;
2298 case 3:
2299 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2300 break;
2301 }
2302
2303 return nChannel;
2304
2305}
f472295e 2306
2307//____________________________________________________________________________
a3ed3947 2308void AliTOFRawStream::Raw2Digits(AliRawReader* rawReader, TClonesArray * const digitsArray)
f472295e 2309{
2310 //
2311 // Converts raw data to digits for TOF
2312 //
2313
2314 TStopwatch stopwatch;
2315 stopwatch.Start();
2316
2317 //TClonesArray *fDigits = new TClonesArray("AliTOFdigit", 4000);
2318 //digitsTree->Branch("TOF", &fDigits);
2319 TClonesArray &aDigits = *digitsArray;
2320
2321 Int_t inholes = 0;
2322
2323 Clear();
2324 SetRawReader(rawReader);
2325
2326 //ofstream ftxt;
2327 //if (fVerbose==2) ftxt.open("TOFdigitsRead.txt",ios::app);
2328
2329 TClonesArray staticRawData("AliTOFrawData",10000);
2330 staticRawData.Clear();
2331 TClonesArray * clonesRawData = &staticRawData;
2332
2333 Int_t dummy = -1;
2334 Int_t detectorIndex[5] = {-1, -1, -1, -1, -1};
2335 Int_t digit[4];
2336
2337 const Int_t kMaxNumberOfTracksPerDigit = 3;
2338 Int_t tracks[kMaxNumberOfTracksPerDigit];
2339 for (Int_t ii=0; ii<kMaxNumberOfTracksPerDigit; ii++)
2340 tracks[ii] = -1;
2341 Int_t last = -1;
2342
2343 Int_t indexDDL = 0;
2344 Int_t iRawData = 0;
2345 AliTOFrawData *tofRawDatum = 0;
2346 for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
2347
2348 rawReader->Reset();
2349 if (fNewDecoderVersion) {
2350 AliInfo("Using New Decoder \n");
2351 LoadRawDataBuffers(indexDDL, 0);
2352 }
2353 else
2354 LoadRawData(indexDDL);
2355
2356 clonesRawData = GetRawData();
2357 if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
2358 for (iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {
2359
2360 tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);
2361
2362 //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue;
2363 if (tofRawDatum->GetTOF()==-1) continue;
2364
2365 EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
2366 tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
2367
2368 dummy = detectorIndex[3];
2369 detectorIndex[3] = detectorIndex[4];//padz
2370 detectorIndex[4] = dummy;//padx
2371
2372 digit[0] = tofRawDatum->GetTOF();
2373 digit[1] = tofRawDatum->GetTOT();
2374 digit[2] = tofRawDatum->GetTOT();
2375 digit[3] = -1;//tofRawDatum->GetTOF(); //tofND
2376
2377 dummy = detectorIndex[3];
2378 detectorIndex[3] = detectorIndex[4];//padx
2379 detectorIndex[4] = dummy;//padz
2380
2381 // Do not reconstruct anything in the holes
2382 if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
2383 if (detectorIndex[1]==2) { // plate with holes
2384 inholes++;
2385 continue;
2386 }
2387 }
2388
2389 last = digitsArray->GetEntriesFast();
2390 new (aDigits[last]) AliTOFdigit(tracks, detectorIndex, digit);
2391 /*
2392 if (fVerbose==2) {
2393 if (indexDDL<10) ftxt << " " << indexDDL;
2394 else ftxt << " " << indexDDL;
2395 if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM();
2396 else ftxt << " " << tofRawDatum->GetTRM();
2397 ftxt << " " << tofRawDatum->GetTRMchain();
2398 if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC();
2399 else ftxt << " " << tofRawDatum->GetTDC();
2400 ftxt << " " << tofRawDatum->GetTDCchannel();
2401
2402 if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0];
2403 else ftxt << " -> " << detectorIndex[0];
2404 ftxt << " " << detectorIndex[1];
2405 if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2];
2406 else ftxt << " " << detectorIndex[2];
2407 ftxt << " " << detectorIndex[4];
2408 if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3];
2409 else ftxt << " " << detectorIndex[3];
2410
2411 if (digit[1]<10)ftxt << " " << digit[1];
2412 else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1];
2413 else ftxt << " " << digit[1];
2414 if (digit[0]<10) ftxt << " " << digit[0] << endl;
2415 else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl;
2416 else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl;
2417 else ftxt << " " << digit[3] << endl;
2418 }
2419 */
2420 AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d, %d)",
2421 last,
2422 detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3],
2423 digit[0], digit[1], digit[3]));
2424
2425 tofRawDatum = 0;
2426 } // loop on tofRawData array
2427
2428 clonesRawData->Clear();
2429
2430 } // DDL Loop
2431
2432 //if (fVerbose==2) ftxt.close();
2433
2434
2435 if (inholes) AliWarning(Form("Raw data in the TOF holes: %d",inholes));
2436
2437 Int_t nDigits = digitsArray->GetEntries();
2438 AliDebug(1, Form("Got %d TOF digits", nDigits));
2439 AliDebug(1, Form("Execution time to read TOF raw data and fill TOF digit tree : R:%.2fs C:%.2fs",
2440 stopwatch.RealTime(),stopwatch.CpuTime()));
2441
2442}
2443
2444//____________________________________________________________________________
a3ed3947 2445void AliTOFRawStream::Raw2SDigits(AliRawReader* rawReader, TClonesArray * const sdigitsArray)
f472295e 2446{
2447 //
2448 // Converts raw data to sdigits for TOF
2449 //
2450
2451 TStopwatch stopwatch;
2452 stopwatch.Start();
2453
2454 Int_t inholes = 0;
2455
2456 //if(!GetLoader()->TreeS()) {MakeTree("S"); MakeBranch("S");}
2457 TClonesArray &aSDigits = *sdigitsArray;
2458
2459 Clear();
2460 SetRawReader(rawReader);
2461
2462 //ofstream ftxt;
2463 //if (fVerbose==2) ftxt.open("TOFsdigitsRead.txt",ios::app);
2464
2465 TClonesArray staticRawData("AliTOFrawData",10000);
2466 staticRawData.Clear();
2467 TClonesArray * clonesRawData = &staticRawData;
2468
2469 Int_t dummy = -1;
2470 Int_t detectorIndex[5] = {-1, -1, -1, -1, -1};
2471 Int_t digit[2];
2472 Int_t track = -1;
2473 Int_t last = -1;
2474
2475 Int_t indexDDL = 0;
2476 Int_t iRawData = 0;
2477 AliTOFrawData *tofRawDatum = 0;
2478 for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
2479
2480 rawReader->Reset();
2481 if (fNewDecoderVersion) {
2482 AliInfo("Using New Decoder \n");
2483 LoadRawDataBuffers(indexDDL, 0);
2484 }
2485 else
2486 LoadRawData(indexDDL);
2487
2488 clonesRawData = GetRawData();
2489 if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
2490 for (iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {
2491
2492 tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);
2493
2494 //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue;
2495 if (tofRawDatum->GetTOF()==-1) continue;
2496
2497 EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
2498 tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
2499
2500 dummy = detectorIndex[3];
2501 detectorIndex[3] = detectorIndex[4];//padz
2502 detectorIndex[4] = dummy;//padx
2503
2504 digit[0] = tofRawDatum->GetTOF();
2505 digit[1] = tofRawDatum->GetTOT();
2506
2507 dummy = detectorIndex[3];
2508 detectorIndex[3] = detectorIndex[4];//padx
2509 detectorIndex[4] = dummy;//padz
2510
2511 // Do not reconstruct anything in the holes
2512 if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
2513 if (detectorIndex[1]==2) { // plate with holes
2514 inholes++;
2515 continue;
2516 }
2517 }
2518
2519 last = sdigitsArray->GetEntriesFast();
2520 new (aSDigits[last]) AliTOFSDigit(track, detectorIndex, digit);
2521 /*
2522 if (fVerbose==2) {
2523 if (indexDDL<10) ftxt << " " << indexDDL;
2524 else ftxt << " " << indexDDL;
2525 if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM();
2526 else ftxt << " " << tofRawDatum->GetTRM();
2527 ftxt << " " << tofRawDatum->GetTRMchain();
2528 if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC();
2529 else ftxt << " " << tofRawDatum->GetTDC();
2530 ftxt << " " << tofRawDatum->GetTDCchannel();
2531
2532 if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0];
2533 else ftxt << " -> " << detectorIndex[0];
2534 ftxt << " " << detectorIndex[1];
2535 if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2];
2536 else ftxt << " " << detectorIndex[2];
2537 ftxt << " " << detectorIndex[4];
2538 if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3];
2539 else ftxt << " " << detectorIndex[3];
2540
2541 if (digit[1]<10)ftxt << " " << digit[1];
2542 else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1];
2543 else ftxt << " " << digit[1];
2544 if (digit[0]<10) ftxt << " " << digit[0] << endl;
2545 else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl;
2546 else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl;
2547 else ftxt << " " << digit[3] << endl;
2548 }
2549 */
9cef3750 2550 AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d)",
f472295e 2551 last,
2552 detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3],
9cef3750 2553 digit[0], digit[1]));
f472295e 2554
2555 tofRawDatum = 0;
2556 } // while loop
2557
2558 clonesRawData->Clear();
2559
2560 } // DDL Loop
2561
2562 //if (fVerbose==2) ftxt.close();
2563
2564 if (inholes) AliWarning(Form("Clusters in the TOF holes: %d",inholes));
2565
2566 Int_t nSDigits = sdigitsArray->GetEntries();
2567 AliDebug(1, Form("Got %d TOF sdigits", nSDigits));
2568 AliDebug(1, Form("Execution time to read TOF raw data and fill TOF sdigit tree : R:%.2fs C:%.2fs",
2569 stopwatch.RealTime(),stopwatch.CpuTime()));
2570
2571}
08d6922f 2572
a3ed3947 2573void AliTOFRawStream::VolumeID2LTM(Int_t detind[],
61c4c50d 2574 Int_t &iDDL,
2575 Int_t &iTRM,
2576 Int_t &iChain,
2577 Int_t &iTDC,
2578 Int_t &iChannel) const {
08d6922f 2579 //
2580 // To convert the TOF trigger macropad ID (i.e. detind)
2581 // into TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel)
2582 //
2583
a3ed3947 2584 const Int_t kFirstTDCnumber = 12;
08d6922f 2585
a3ed3947 2586 iDDL=-1, iTRM = 3 , iChain=-1, iTDC=-1, iChannel=-1;
08d6922f 2587 if (detind[1]==0 || detind[1]==1 || (detind[1]==2 && detind[2]<=7)) {
a3ed3947 2588 if (detind[4]<24)
2589 iDDL = detind[0]*4;
2590 else
2591 iDDL = detind[0]*4;
08d6922f 2592 }
2593 else {
a3ed3947 2594 if (detind[4]<24)
2595 iDDL = detind[0]*4+2;
2596 else
2597 iDDL = detind[0]*4+2;
08d6922f 2598 }
a3ed3947 2599
2600 iChain=fgkChainMap24[detind[1]][detind[2]];
2601 iTDC=(Int_t)(fgkChannelMap24[detind[1]][detind[2]]/8)+kFirstTDCnumber;
2602 iChannel=fgkChannelMap24[detind[1]][detind[2]]%8;
08d6922f 2603
2604}
2605
a3ed3947 2606void AliTOFRawStream::LTM2VolumeID(Int_t iDDL,
2607 Int_t iTRM,
2608 Int_t iChain,
2609 Int_t iTDC,
08d6922f 2610 Int_t iChannel,
a3ed3947 2611 Int_t detind0[], Int_t detind1[]) const {
08d6922f 2612 //
2613 // To convert the TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel)
2614 // into TOF trigger macropad IDs (i.e. detind0 and detind1).
2615 // In general, a couple of neighbouring TOF semi-strip represents a TOF trigger macropad.
2616 //
2617
a3ed3947 2618 const Int_t kFirstTDCnumber = 12;
2619
08d6922f 2620 Int_t iSector0=-1, iModule0=-1, iStrip0=-1, iPadX0=-1; // Le variabili del Volume ID
2621 Int_t iSector1=-1, iModule1=-1, iStrip1=-1, iPadX1=-1; // Le variabili del Volume ID
2622
a3ed3947 2623 if( iDDL%2==1 && iTRM==3 && iTDC-kFirstTDCnumber>=0 && iTDC-kFirstTDCnumber<3 ) {
08d6922f 2624 iSector0 = (Int_t)(iDDL/4);
2625 iSector1 = (Int_t)(iDDL/4);
a3ed3947 2626 Int_t iChan= iChannel+(iTDC-kFirstTDCnumber)*8;
4306fa22 2627 if( iDDL%4 == 1 ){
08d6922f 2628 if(iChain==0){ //CRATE 0
2629 iPadX0=0;
2630 iPadX1=0;
2631 iStrip0=fgkStrip0MapCrate0[iChan];
2632 iStrip1=fgkStrip1MapCrate0[iChan];
2633 iModule0=fgkModule0MapCrate0[iChan];
2634 iModule1=fgkModule1MapCrate0[iChan];
2635 }
2636 if(iChain==1){// CRATE 1
2637 iPadX0=24;
2638 iPadX1=24;
2639 iStrip0=fgkStrip0MapCrate1[iChan];
2640 iStrip1=fgkStrip1MapCrate1[iChan];
2641 iModule0=fgkModule0MapCrate1[iChan];
2642 iModule1=fgkModule1MapCrate1[iChan];
2643 }
2644
2645 }
4306fa22 2646 if( iDDL%4 == 3 ){
08d6922f 2647 if(iChain==1){// CRATE 3
2648 iPadX0=0;
2649 iPadX1=0;
2650 iStrip0=fgkStrip0MapCrate3[iChan];
2651 iStrip1=fgkStrip1MapCrate3[iChan];
2652 iModule0=fgkModule0MapCrate3[iChan];
2653 iModule1=fgkModule1MapCrate3[iChan];
2654 }
2655 if(iChain==0){// CRATE 2
2656 iPadX0=24;
2657 iPadX1=24;
2658 iStrip0=fgkStrip0MapCrate2[iChan];
2659 iStrip1=fgkStrip1MapCrate2[iChan];
2660 iModule0=fgkModule0MapCrate2[iChan];
2661 iModule1=fgkModule1MapCrate2[iChan];
2662 }
2663 }
2664 }
4306fa22 2665
2666 if(iStrip1==-1 || iModule1==-1){
2667 detind1[0]=-1;
2668 detind1[1]=-1;
2669 detind1[2]=-1;
2670 detind1[3]=-1;
2671 detind1[4]=-1;
2672 }
2673 else{
2674 detind1[0]=iSector1;
2675 detind1[1]=iModule1;
2676 detind1[2]=iStrip1;
2677 detind1[3]=iPadX1;
2678 detind1[4]=0;
2679 }
2680
2681 if(iStrip0==-1 || iModule0==-1){
2682 detind0[0]=-1;
2683 detind0[1]=-1;
2684 detind0[2]=-1;
2685 detind0[3]=-1;
2686 detind0[4]=-1;
2687 }
2688 else{
2689 detind0[0]=iSector0;
2690 detind0[1]=iModule0;
2691 detind0[2]=iStrip0;
2692 detind0[3]=iPadX0;
2693 detind0[4]=0;
2694 }
08d6922f 2695}