]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TOF/AliTOFRawStream.cxx
double for 4-momentum in Generate()
[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();
de40f9c1 635 if (fDDL==-1) {
636 fRawReader->AddMajorErrorLog(kDDLdataReading);
637 AliWarning("Error when load DDL. Go to next DDL");
638 return kFALSE;
639 }
571dda3d 640
d0eb8f39 641 fWordType = GetField(data,WORD_TYPE_MASK,WORD_TYPE_POSITION);
642
643 switch (fWordType) { // switch word type
644
645 case GLOBAL_HEADER_TYPE: // global header
646 fSlotID = GetField(data, HEADER_SLOT_ID_MASK, HEADER_SLOT_ID_POSITION);
647 fTRM = fSlotID;
648
649
650 switch (fSlotID) { // switch global header slot ID
651
652 case DRM_ID_NUMBER: //DRM global header
653 if (fInsideDRM) { // unexpected DRM global headers -> exit
654 break;
655 }
656 fInsideDRM = kTRUE; // DRM global header accepted
657 break;
658
659 case LTM_ID_NUMBER: // LTM global header
660 if (fInsideLTM) { // unexpected LTM global headers -> exit
661 break;
662 }
663 fInsideLTM = kTRUE; // LTM global header accepted
664 break;
665
666 case 3: //TRM header
667 case 4: //TRM header
668 case 5: //TRM header
669 case 6: //TRM header
670 case 7: //TRM header
671 case 8: //TRM header
672 case 9: //TRM header
673 case 10: //TRM header
674 case 11: //TRM header
675 case 12: //TRM header
676 if (fInsideTRM) { // unexpected TRM global headers -> exit
677 break;
678 }
679 fInsideTRM = kTRUE; // TRM global header accepted
680 fACQ = GetField(data,TRM_ACQ_BITS_MASK,TRM_ACQ_BITS_POSITION);
681 break;
682
683 default: // unexpected global header slot ID
684 break;
685
686 } //end switch global header slot id
687
688 break;
689
690
691 case GLOBAL_TRAILER_TYPE: // global trailer
692 fSlotID = GetField(data,HEADER_SLOT_ID_MASK,HEADER_SLOT_ID_POSITION);
d0eb8f39 693
694 switch (fSlotID) { // switch global trailer slot ID
695
696 case DRM_ID_NUMBER: // DRM global trailer
697 if (!fInsideDRM) { // unexpected DRM global trailers -> exit
698 break;
699 }
38f24f3f 700 dummy = 0x0000fff0;
701 //AliInfo(Form(" DRM local event counter = %i", GetField(data,dummy,4)));
ca6d7f17 702 fLocalEventCounterDRM = GetField(data,dummy,4);
d0eb8f39 703 fInsideDRM = kFALSE; // DRM global trailer accepted
704 fInsideTRM = kFALSE;
705 fInsideLTM = kFALSE;
706 fInsideTRMchain0 = kFALSE;
707 fInsideTRMchain1 = kFALSE;
d0eb8f39 708 fSector = -1;
15ec34b9 709 fPlate = -1;
710 fStrip = -1;
711 fPadZ = -1;
712 fPadX = -1;
713 fDDL = -1;
714 fTRM = -1;
715 fTDC = -1;
716 fTRMchain = -1;
d0eb8f39 717 fTDCchannel = -1;
15ec34b9 718 fTime = -1;
719 fToT = -1;
720 fLeadingEdge = -1;
721 fTrailingEdge = -1;
d0eb8f39 722 fErrorFlag = -1;
15ec34b9 723 fACQ = -1;
d0eb8f39 724 fPSbit = -1;
d0eb8f39 725 fTDCerrorFlag = -1;
726 break;
727 case LTM_ID_NUMBER: // LTM global trailer
728 if (!fInsideLTM) { // unexpected LTM global trailer -> exit
729 break;
730 }
38f24f3f 731 dummy = 0x0fff0000;
732 //AliInfo(Form(" LTM local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 733 fLocalEventCounterLTM = GetField(data,dummy,16);
d0eb8f39 734 fInsideLTM = kFALSE; // LTM global trailer accepted
735 break;
736 case 15: //TRM global trailer
737 if (!fInsideTRM) { // unexpected TRM global trailers -> exit
738 break;
739 }
38f24f3f 740 dummy = 0x0fff0000;
741 //AliInfo(Form(" TRM local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 742 fLocalEventCounterTRM[fTRM] = GetField(data,dummy,16);
d0eb8f39 743 fInsideTRM = kFALSE; // TRM global trailer accepted
744 break;
745 default: // unexpected global trailer slot ID
746 break;
747 } //end switch global trailer slot id
748
749
750 break;
751
752
753 case ERROR_TYPE: // TDC error
15ec34b9 754 fTDC = GetField(data,TRM_TDC_ERROR_TDC_ID_MASK,TRM_TDC_ERROR_TDC_ID_POSITION);
d0eb8f39 755 fTDCerrorFlag = GetField(data,TRM_TDC_ERROR_FLAGS_MASK,TRM_TDC_ERROR_FLAGS_POSITION);
756 break;
757
758
759 case FILLER_TYPE: // filler
760 break;
761
762
763 default: // other word types
764
765 if (fInsideTRM) { // inside TRM
766
767 switch (fWordType) { // switch word type inside TRM
768 case TRM_CHAIN0_HEADER_TYPE: // TRM chain0 header
769 if (fInsideTRMchain0) { // unexpected TRM chain0 header
770 break;
771 }
772 fInsideTRMchain0 = kTRUE;
773 fTRMchain = 0;
ca6d7f17 774 dummy = 0x0000fff0;
775 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
776 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
d0eb8f39 777 break;
778 case TRM_CHAIN0_TRAILER_TYPE: // TRM chain0 trailer
779 if (!fInsideTRMchain0) { // unexpected TRM chain0 trailer
780 break;
781 }
38f24f3f 782 dummy = 0x0fff0000;
783 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 784 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
d0eb8f39 785 fInsideTRMchain0 = kFALSE;
786 fTRMchain = -1;
787 break;
788 case TRM_CHAIN1_HEADER_TYPE: // TRM chain1 header
789 if (fInsideTRMchain1) { // unexpected TRM chain1 header
790 break;
791 }
792 fInsideTRMchain1 = kTRUE;
793 fTRMchain = 1;
ca6d7f17 794 dummy = 0x0000fff0;
795 //AliInfo(Form(" chain bunch ID = %i", GetField(data,dummy,4)));
796 fChainBunchID[fTRM][fTRMchain] = GetField(data,dummy,4);
d0eb8f39 797 break;
798 case TRM_CHAIN1_TRAILER_TYPE: // TRM chain1 trailer
799 if (!fInsideTRMchain1) { // unexpected TRM chain1 trailer
800 break;
801 }
38f24f3f 802 dummy = 0x0fff0000;
803 //AliInfo(Form(" chain local event counter = %i", GetField(data,dummy,16)));
ca6d7f17 804 fLocalEventCounterChain[fTRM][fTRMchain] = GetField(data,dummy,16);
d0eb8f39 805 fInsideTRMchain1 = kFALSE;
806 fTRMchain = -1;
807 break;
808 } // end switch word type inside TRM
809
810 } // end if (fInsideTRM)
811
812
813 if (
814 ((fInsideTRMchain0&&!fInsideTRMchain1) || (!fInsideTRMchain0&&fInsideTRMchain1))
815 && fWordType!=TRM_CHAIN0_HEADER_TYPE && fWordType!=TRM_CHAIN0_TRAILER_TYPE
816 && fWordType!=TRM_CHAIN1_HEADER_TYPE && fWordType!=TRM_CHAIN1_TRAILER_TYPE
817 ){ // inside TRM chains
15ec34b9 818
819 fPSbit = GetField(data,TRM_PS_BITS_MASK,TRM_PS_BITS_POSITION);
820 fTDC = GetField(data,TRM_TDC_ID_MASK,TRM_TDC_ID_POSITION);
d0eb8f39 821 fTDCchannel = GetField(data,TRM_CHAN_MASK,TRM_CHAN_POSITION);
15ec34b9 822 fErrorFlag = GetField(data,TRM_E_BIT_MASK,TRM_E_BIT_POSITION);
823
824 SetSector();
825 SetPlate();
826 SetStrip();
827 SetPadZ();
828 SetPadX();
829
d0eb8f39 830
831 switch (fPSbit) { // switch fPSbit bits inside TRM chains
15ec34b9 832
833 case 0: // packing ok, digit time and TOT
834 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
32ead898 835 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
cfceaf15 836 /*-
837 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 838 ;
143cfc81 839 if (fgApplyBCCorrections) {
ca6d7f17 840 AliDebug(2,"Apply nominal DDL BC time-shift correction");
841 AliDebug(2,"Apply deltaBC time-shift correction");
842 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 843 fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 844 }
d0eb8f39 845 break;
846
847 case 1: // leading edge digit, long digit time, no TOT
15ec34b9 848 //fToT = -1;
849 //fTime = -1;
32ead898 850 fLeadingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
cfceaf15 851 /*-
852 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 853 ;
143cfc81 854 if (fgApplyBCCorrections) {
ca6d7f17 855 AliDebug(2,"Apply nominal DDL BC time-shift correction");
856 AliDebug(2,"Apply deltaBC time-shift correction");
857 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 858 fLeadingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 859 }
d0eb8f39 860 break;
861
862 case 2: // trailing edge digit, long digit time, no TOT
15ec34b9 863 //fToT = -1;
864 //fTime = -1;
32ead898 865 fTrailingEdge = GetField(data,TRM_LONG_DIGIT_TIME_MASK,TRM_LONG_DIGIT_TIME_POSITION)
cfceaf15 866 /*-
867 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 868 ;
143cfc81 869 if (fgApplyBCCorrections) {
ca6d7f17 870 AliDebug(2,"Apply nominal DDL BC time-shift correction");
871 AliDebug(2,"Apply deltaBC time-shift correction");
872 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 873 fTrailingEdge += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 874 }
d0eb8f39 875 break;
15ec34b9 876
d0eb8f39 877 case 3: // TOT overflow
15ec34b9 878 fToT = GetField(data,TRM_TOT_WIDTH_MASK, TRM_TOT_WIDTH_POSITION);
32ead898 879 fTime = GetField(data,TRM_DIGIT_TIME_MASK,TRM_DIGIT_TIME_POSITION)
cfceaf15 880 /*-
881 fCableLengthMap->GetCableTimeShiftBin(fDDL, fTRM, fTRMchain, fTDC)*/
32ead898 882 ;
143cfc81 883 if (fgApplyBCCorrections) {
ca6d7f17 884 AliDebug(2,"Apply nominal DDL BC time-shift correction");
885 AliDebug(2,"Apply deltaBC time-shift correction");
886 AliDebug(2,Form(" fChainBunchID[%d][%d] = %d ,fEventID = %d",fTRM,fTRMchain,fChainBunchID[fTRM][fTRMchain],fEventID));
e7f49164 887 fTime += fgkddlBCshift[fDDL] * 1024 + (fChainBunchID[fTRM][fTRMchain] - fEventID) * 1024;
143cfc81 888 }
d0eb8f39 889 break;
d0eb8f39 890
15ec34b9 891 } // end switch PS bits inside TRM chains
d0eb8f39 892
893 } // end if is inside TRM chains
894
895 } // end switch on fWordType
571dda3d 896
15ec34b9 897
571dda3d 898 return kTRUE;
7813bb1a 899
571dda3d 900}
901//_____________________________________________________________________________
902
d0eb8f39 903void AliTOFRawStream::SetSector()
571dda3d 904{
905 //
d0eb8f39 906 // Evaluate the TOF sector number -> [ 0;17]
907 // corresponding to the TOF equipment IDs:
908 // fDDL -> [ 0;71]
909 // fTRM -> [ 3;12]
15ec34b9 910 // fTRMchain -> [ 0; 1]
d0eb8f39 911 // fTDC -> [ 0;14]
912 // fTDCchannel -> [ 0; 7]
571dda3d 913 //
914
915 Int_t iSector = -1;
571dda3d 916
d0eb8f39 917 if (!(fDDL==-1)) iSector = Int_t((Float_t)(fDDL)/AliTOFGeometry::NDDL());
918
919 fSector = iSector;
571dda3d 920
921}
922//_____________________________________________________________________________
923
d0eb8f39 924
925void AliTOFRawStream::SetPlate()
571dda3d 926{
927 //
d0eb8f39 928 // Evaluate the TOF plate number ->[ 0; 4]
929 // corresponding to the TOF equipment IDs:
930 // fDDL -> [ 0;71]
931 // fTRM -> [ 3;12]
15ec34b9 932 // fTRMchain -> [ 0; 1]
d0eb8f39 933 // fTDC -> [ 0;14]
934 // fTDCchannel -> [ 0; 7]
571dda3d 935 //
936
937 Int_t iPlate = -1;
d0eb8f39 938 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
939 || fSector==-1))
940 iPlate = Equip2VolNplate(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
571dda3d 941
d0eb8f39 942 fPlate = iPlate;
571dda3d 943
944}
945//_____________________________________________________________________________
946
d0eb8f39 947void AliTOFRawStream::SetStrip()
571dda3d 948{
949 //
d0eb8f39 950 // Evaluate the TOF strip number per module -> [ 0; 14/18]
951 // corresponding to the TOF equipment IDs:
952 // fDDL -> [ 0;71]
953 // fTRM -> [ 3;12]
15ec34b9 954 // fTRMchain -> [ 0; 1]
d0eb8f39 955 // fTDC -> [ 0;14]
956 // fTDCchannel -> [ 0; 7]
571dda3d 957 //
958
959 Int_t iStrip = -1;
960
d0eb8f39 961 if (!(fDDL==-1 || fTRM==-1 || fTDC==-1
962 || fSector==-1 || fPlate==-1))
963 iStrip = Equip2VolNstrip(GetDDLnumberPerSector(fDDL), fTRM, fTDC);
571dda3d 964
d0eb8f39 965 fStrip = iStrip;
571dda3d 966
967}
968//_____________________________________________________________________________
969
d0eb8f39 970void AliTOFRawStream::SetPadZ()
571dda3d 971{
972 //
d0eb8f39 973 // Evaluate the TOF padRow number per strip -> [ 0; 1]
974 // corresponding to the TOF equipment IDs:
975 // fDDL -> [ 0;71]
976 // fTRM -> [ 3;12]
15ec34b9 977 // fTRMchain -> [ 0; 1]
d0eb8f39 978 // fTDC -> [ 0;14]
979 // fTDCchannel -> [ 0; 7]
571dda3d 980 //
981
982 Int_t iPadZ = -1;
983
d0eb8f39 984 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
985 || fSector==-1 || fPlate==-1 || fStrip==-1))
986 {
987 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
988 if (iPadAlongTheStrip!=-1)
989 iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
990 }
571dda3d 991
38f24f3f 992 //iPadZ = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)%AliTOFGeometry::NpadZ();
993 //iPadZ = Equip2VolNpadZ(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
994
d0eb8f39 995 fPadZ = iPadZ;
571dda3d 996
d0eb8f39 997}
998//_____________________________________________________________________________
999
1000void AliTOFRawStream::SetPadX()
1001{
1002 //
1003 // Evaluate the TOF pad number per strip padRow -> [ 0;47]
1004 // corresponding to the TOF equipment IDs:
1005 // fDDL -> [ 0;71]
1006 // fTRM -> [ 3;12]
15ec34b9 1007 // fTRMchain -> [ 0; 1]
d0eb8f39 1008 // fTDC -> [ 0;14]
1009 // fTDCchannel -> [ 0; 7]
1010 //
571dda3d 1011
d0eb8f39 1012 Int_t iPadX = -1;
571dda3d 1013
d0eb8f39 1014 if (!(fDDL==-1 || fTRM==-1 || fTRMchain==-1 || fTDC==-1 || fTDCchannel==-1
1015 || fSector==-1 || fPlate==-1 || fStrip==-1))
1016 {
1017 Int_t iPadAlongTheStrip = Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
1018 if (iPadAlongTheStrip!=-1)
1019 iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1020 }
1021
38f24f3f 1022 //iPadX = (Int_t)(Equip2VolNpad(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel)/(Float_t(AliTOFGeometry::NpadZ())));
1023 //iPadX = Equip2VolNpadX(GetDDLnumberPerSector(fDDL), fTRMchain, fTDC, fTDCchannel);
1024
d0eb8f39 1025 fPadX = iPadX;
571dda3d 1026
1027}
571dda3d 1028
d0eb8f39 1029//----------------------------------------------------------------------------
1030Int_t AliTOFRawStream::GetField(UInt_t word, Int_t fieldMask, Int_t fieldPosition) const
1031{
1032 //
a3ed3947 1033 // Returns 'word' masked by 'fieldMask' and shifted by 'fieldPosition'
d0eb8f39 1034 //
1035
1036 return ((word & fieldMask) >> fieldPosition);
1037}
1038
1039//----------------------------------------------------------------------------
13d6bff9 1040Int_t AliTOFRawStream::Equip2VolNplate(Int_t iDDL, Int_t nTRM, Int_t nTDC)
571dda3d 1041{
1042 //
d0eb8f39 1043 // Returns the TOF plate number [0;4]
1044 // corresponding to the TOF equipment ID numbers:
1045 // iDDL -> DDL number per sector [0;3]
1046 // nTRM -> TRM number [3;12]
1047 // nTDC -> TDC number [0;14]
571dda3d 1048 //
1049
d0eb8f39 1050 Int_t iPlate = -1;
5f72a2bf 1051
d0eb8f39 1052 if (iDDL==0) {
1053
1054 if (nTRM>=4 && nTRM<7) {
1055 iPlate = 0;
1056 } else if (nTRM==7) {
1057 if (nTDC<12) iPlate = 0;
1058 else iPlate = 1;
1059 } else if (nTRM>=8 && nTRM<11) {
1060 iPlate = 1;
1061 } else if (nTRM==11) {
1062 if (nTDC<9) iPlate = 1;
1063 else iPlate = 2;
1064 }else if (nTRM==12) {
1065 iPlate = 2;
1066 }
1067
1068 } else if (iDDL==1) {
1069
1070 if (nTRM==3) {
1071 if (nTDC<3) iPlate = 0;
1072 } else if (nTRM>=4 && nTRM<7) {
1073 iPlate = 0;
1074 } else if (nTRM==7) {
1075 if (nTDC<6) iPlate = 1;
1076 else iPlate = 0;
1077 } else if (nTRM>=8 && nTRM<11) {
1078 iPlate = 1;
1079 } else if (nTRM==11) {
1080 if (nTDC<9) iPlate = 2;
1081 else iPlate = 1;
1082 } else if (nTRM==12) {
1083 iPlate = 2;
1084 }
1085
1086 } else if (iDDL==2) {
1087
1088 if (nTRM>=4 && nTRM<7) {
1089 iPlate = 4;
1090 } else if (nTRM==7) {
1091 if (nTDC<12) iPlate = 4;
1092 else iPlate = 3;
1093 } else if (nTRM>=8 && nTRM<11) {
1094 iPlate = 3;
1095 } else if (nTRM==11) {
1096 if (nTDC<9) iPlate = 3;
1097 else iPlate = 2;
1098 }else if (nTRM==12) {
1099 iPlate = 2;
1100 }
1101
1102 } else if (iDDL==3) {
1103
1104 if (nTRM==3) {
1105 if (nTDC<3) iPlate = 4;
1106 } else if (nTRM>=4 && nTRM<7) {
1107 iPlate = 4;
1108 } else if (nTRM==7) {
1109 if (nTDC<6) iPlate = 3;
1110 else iPlate = 4;
1111 } else if (nTRM>=8 && nTRM<11) {
1112 iPlate = 3;
1113 } else if (nTRM==11) {
1114 if (nTDC<9) iPlate = 2;
1115 else iPlate = 3;
1116 } else if (nTRM==12) {
1117 iPlate = 2;
1118 }
571dda3d 1119
d0eb8f39 1120 }
571dda3d 1121
d0eb8f39 1122 return iPlate;
571dda3d 1123
d0eb8f39 1124}
571dda3d 1125
d0eb8f39 1126//----------------------------------------------------------------------------
13d6bff9 1127Int_t AliTOFRawStream::Equip2VolNstrip(Int_t iDDL, Int_t nTRM, Int_t nTDC)
d0eb8f39 1128{
1129 //
1130 // Returns the TOF strip number per module:
1131 // [0;14], in the central plates,
1132 // [0;18], in the intermediate and external plates
1133 // corresponding to the TOF equipment ID numbers:
1134 // iDDL -> DDL number per sector [0;3]
1135 // nTRM -> TRM number [3;12]
1136 // nTDC -> TDC number [0;14]
1137 //
571dda3d 1138
d0eb8f39 1139 Int_t iStrip = -1;
571dda3d 1140
d0eb8f39 1141 if (iDDL==0) {
1142
1143 if (nTRM== 4) iStrip = (Int_t)(nTDC/3.);
1144 else if (nTRM== 5) iStrip = 5 + (Int_t)(nTDC/3.);
1145 else if (nTRM== 6) iStrip = 10 + (Int_t)(nTDC/3.);
1146 else if (nTRM== 7) {
1147 if (nTDC<12) iStrip = 15 + (Int_t)(nTDC/3.);
1148 else iStrip = (Int_t)(nTDC/3.) - 4;
1149 }
1150 else if (nTRM== 8) iStrip = 1 + (Int_t)(nTDC/3.);
1151 else if (nTRM== 9) iStrip = 6 + (Int_t)(nTDC/3.);
1152 else if (nTRM==10) iStrip = 11 + (Int_t)(nTDC/3.);
1153 else if (nTRM==11) {
1154 if (nTDC<9) iStrip = 16 + (Int_t)(nTDC/3.);
1155 else iStrip = (Int_t)(nTDC/3.) - 3;
1156 }
1157 else if (nTRM==12) iStrip = 2 + (Int_t)(nTDC/3.);
1158
1159 } else if (iDDL==1) {
1160
1161 if (nTRM==3 && nTDC<3) iStrip = (Int_t)(nTDC/3.);
1162 else if (nTRM== 4) iStrip = 5 - (Int_t)(nTDC/3.);
1163 else if (nTRM== 5) iStrip = 10 - (Int_t)(nTDC/3.);
1164 else if (nTRM== 6) iStrip = 15 - (Int_t)(nTDC/3.);
1165 else if (nTRM== 7) {
1166 if (nTDC<6) iStrip = 1 - (Int_t)(nTDC/3.);
1167 else iStrip = 20 - (Int_t)(nTDC/3.);
1168 }
1169 else if (nTRM== 8) iStrip = 6 - (Int_t)(nTDC/3.);
1170 else if (nTRM== 9) iStrip = 11 - (Int_t)(nTDC/3.);
1171 else if (nTRM==10) iStrip = 16 - (Int_t)(nTDC/3.);
1172 else if (nTRM==11) {
1173 if (nTDC<9) iStrip = 2 - (Int_t)(nTDC/3.);
1174 else iStrip = 21 - (Int_t)(nTDC/3.);
1175 }
1176 else if (nTRM==12) iStrip = 7 - (Int_t)(nTDC/3.);
1177
1178 } else if (iDDL==2) {
1179
1180 if (nTRM== 4) iStrip = 18 - (Int_t)(nTDC/3.);
1181 else if (nTRM== 5) iStrip = 18 - ( 5 + (Int_t)(nTDC/3.));
1182 else if (nTRM== 6) iStrip = 18 - (10 + (Int_t)(nTDC/3.));
1183 else if (nTRM== 7) {
1184 if (nTDC<12) iStrip = 18 - (15 + (Int_t)(nTDC/3.));
1185 else iStrip = 18 - ((Int_t)(nTDC/3.) - 4);
1186 }
1187 else if (nTRM== 8) iStrip = 18 - ( 1 + (Int_t)(nTDC/3.));
1188 else if (nTRM== 9) iStrip = 18 - ( 6 + (Int_t)(nTDC/3.));
1189 else if (nTRM==10) iStrip = 18 - (11 + (Int_t)(nTDC/3.));
1190 else if (nTRM==11) {
1191 if (nTDC<9) iStrip = 18 - (16 + (Int_t)(nTDC/3.));
1192 else iStrip = 14 - ((Int_t)(nTDC/3.) - 3);
1193 }
1194 else if (nTRM==12) iStrip = 14 - ( 2 + (Int_t)(nTDC/3.));
1195
1196 } else if (iDDL==3) {
1197
1198 if (nTRM==3 && nTDC<3) iStrip = 18 - (Int_t)(nTDC/3.);
1199 else if (nTRM== 4) iStrip = 18 - ( 5 - (Int_t)(nTDC/3.));
1200 else if (nTRM== 5) iStrip = 18 - (10 - (Int_t)(nTDC/3.));
1201 else if (nTRM== 6) iStrip = 18 - (15 - (Int_t)(nTDC/3.));
1202 else if (nTRM== 7) {
1203 if (nTDC<6) iStrip = 18 - (1 - (Int_t)(nTDC/3.));
1204 else iStrip = 18 - (20 - (Int_t)(nTDC/3.));
1205 }
1206 else if (nTRM== 8) iStrip = 18 - ( 6 - (Int_t)(nTDC/3.));
1207 else if (nTRM== 9) iStrip = 18 - (11 - (Int_t)(nTDC/3.));
1208 else if (nTRM==10) iStrip = 18 - (16 - (Int_t)(nTDC/3.));
1209 else if (nTRM==11) {
1210 if (nTDC<9) iStrip = 14 - ( 2 - (Int_t)(nTDC/3.));
1211 else iStrip = 18 - (21 - (Int_t)(nTDC/3.));
1212 }
1213 else if (nTRM==12) iStrip = 14 - ( 7 - (Int_t)(nTDC/3.));
1214
1215 }
1216
1217 return iStrip;
1218
1219}
1220
1221//----------------------------------------------------------------------------
1222Int_t AliTOFRawStream::Equip2VolNpad(Int_t iDDL, Int_t iChain, Int_t nTDC,
13d6bff9 1223 Int_t iCH)
d0eb8f39 1224{
1225 //
1226 // Returns the TOF pad number per strip [0;95]
1227 // corresponding to the TOF equipment ID numbers:
1228 // iDDL -> DDL number per sector [0;3]
1229 // iChain -> TRM chain number [0;1]
1230 // nTDC -> TDC number [0;14]
1231 // iCH -> TDC channel number [0;7]
1232 //
1233
1234 Int_t iPadAlongTheStrip = -1;
1235
38f24f3f 1236 // wrong
1237 //Int_t iTDClocal = nTDC%3 + (1-iChain)*3;
1238 //if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal;
1239 //else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal);
d0eb8f39 1240
38f24f3f 1241 // right
1242 Int_t iTDClocal = -1;
1243 Int_t iTDClocal03 = nTDC%3 + (1-iChain)*3;
1244 Int_t iTDClocal12 = 2-nTDC%3 + iChain*3;
1245 if (iDDL==0 || iDDL==3) iTDClocal = 5 - iTDClocal03;
1246 else if (iDDL==1 || iDDL==2) iTDClocal = 6 + (5 - iTDClocal12);
d0eb8f39 1247
1248 Int_t iCHlocal = iCH;
1249 if (iDDL==0 || iDDL==3) iCHlocal = 7 - iCH;
1250
1251 iPadAlongTheStrip = iTDClocal*AliTOFGeometry::NCh() + iCHlocal;
1252
1253 if (((iDDL==1 || iDDL==2) && iPadAlongTheStrip< AliTOFGeometry::NpadX()) ||
019f6101 1254 ((iDDL==0 || iDDL==3) && iPadAlongTheStrip>=AliTOFGeometry::NpadX())) {
a3ed3947 1255 std::cerr << "Warning -> AliTOFRawStream::Equip2VolNpad: Problems with the padX number!\n";
13d6bff9 1256 //AliWarning("Problems with the padX number!");
019f6101 1257 }
d0eb8f39 1258 return iPadAlongTheStrip;
1259
1260}
1261
38f24f3f 1262//----------------------------------------------------------------------------
1263Int_t AliTOFRawStream::Equip2VolNpadX(Int_t iDDL, Int_t iChain, Int_t nTDC,
1264 Int_t iCH)
1265{
1266 //
1267 // Returns the TOF padX number [0;47]
1268 // corresponding to the TOF equipment ID numbers:
1269 // iDDL -> DDL number per sector [0;3]
1270 // iChain -> TRM chain number [0;1]
1271 // nTDC -> TDC number [0;14]
1272 // iCH -> TDC channel number [0;7]
1273 //
1274
1275 Int_t iPadX = (Int_t)(AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)/
1276 (Float_t(AliTOFGeometry::NpadZ())));
1277
1278 return iPadX;
1279
1280}
1281
1282//----------------------------------------------------------------------------
1283Int_t AliTOFRawStream::Equip2VolNpadZ(Int_t iDDL, Int_t iChain, Int_t nTDC,
1284 Int_t iCH)
1285{
1286 //
1287 // Returns the TOF padZ number [0;1]
1288 // corresponding to the TOF equipment ID numbers:
1289 // iDDL -> DDL number per sector [0;3]
1290 // iChain -> TRM chain number [0;1]
1291 // nTDC -> TDC number [0;14]
1292 // iCH -> TDC channel number [0;7]
1293 //
1294
1295 Int_t iPadZ = AliTOFRawStream::Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1296
1297 return iPadZ;
1298
1299}
1300
d0eb8f39 1301//----------------------------------------------------------------------------
5f72a2bf 1302Int_t AliTOFRawStream::GetSectorNumber(Int_t nDDL)
d0eb8f39 1303{
1304 //
1305 // Returns the sector number [0;17]
1306 // corresponing to the assigned DRM/DDL number [0;71]
1307 //
1308
1309 Int_t iSector = Int_t((Float_t)(nDDL)/AliTOFGeometry::NDDL());
1310
1311 return iSector;
1312
1313}
1314//----------------------------------------------------------------------------
5f72a2bf 1315Int_t AliTOFRawStream::GetDDLnumberPerSector(Int_t nDDL)
d0eb8f39 1316{
1317 //
1318 // Return the DRM/DDL number per sector [0;3]
1319 // corresponing to the assigned DRM/DDL number [0;71]
1320 //
1321
1322 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1323
1324 return iDDL;
1325
1326}
1327
7813bb1a 1328//----------------------------------------------------------------------------
1329void AliTOFRawStream::EquipmentId2VolumeId(AliTOFHitData *hitData, Int_t *volume) const
1330{
1331 EquipmentId2VolumeId(hitData->GetDDLID(),hitData->GetSlotID(),hitData->GetChain(),hitData->GetTDC(),hitData->GetChan(),volume);
1332}
d0eb8f39 1333//----------------------------------------------------------------------------
1334void AliTOFRawStream::EquipmentId2VolumeId(Int_t nDDL, Int_t nTRM, Int_t iChain,
a3ed3947 1335 Int_t nTDC, Int_t iCH,
1336 Int_t *volume)
d0eb8f39 1337{
1338 //
1339 // To convert:
1340 // nDDL (variable in [0;71]) -> number of the DDL file
1341 // nTRM (variable in [3;12]) -> number of the TRM slot
1342 // iChain (variable in [0; 1]) -> number of the TRM chain
1343 // nTDC (variable in [0;14]) -> number of the TDC
1344 // iCH (variable in [0; 7]) -> number of the TDC channel
1345 //
1346 // in:
1347 // sector number, i.e. volume[0] (variable in [0,17])
1348 // plate number, i.e. volume[1] (variable in [0, 5])
1349 // strip number, i.e. volume[2] (variable in [0,14/18])
1350 // padX number, i.e. volume[3] (variable in [0,47])
1351 // padZ number, i.e. volume[4] (variable in [0, 1])
1352 //
1353
125f7e0b 1354 for (Int_t ii=0; ii<5; ii++) volume[ii] = -1;
1355
d0eb8f39 1356 Int_t iDDL = GetDDLnumberPerSector(nDDL);
1357
125f7e0b 1358 if (iDDL%2==1 && nTRM==3 && nTDC/3>0) { // Signal not coming from a TOF pad but -probably- from a TOF OR signal
1359 //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);
1360 return;
1361 }
1362
d0eb8f39 1363 Int_t iSector = GetSectorNumber(nDDL);
1364
1365 Int_t iPlate = Equip2VolNplate(iDDL, nTRM, nTDC);
019f6101 1366 if (iPlate==-1) {
a9137e31 1367 /*if (fRawReader)
1368 fRawReader->AddMajorErrorLog(kPlateError,"plate = -1");*/
5b4ed716 1369 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the plate number (%2d %2d %2d)!\n",
1370 nDDL, nTRM, nTDC));
019f6101 1371 }
d0eb8f39 1372
1373 Int_t iStrip = Equip2VolNstrip(iDDL, nTRM, nTDC);
019f6101 1374 if (iStrip==-1) {
a9137e31 1375 /*if (fRawReader)
1376 fRawReader->AddMajorErrorLog(kStripError,"strip = -1");*/
5b4ed716 1377 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the strip number (%2d %2d %2d)!\n",
1378 nDDL, nTRM, nTDC));
019f6101 1379 }
d0eb8f39 1380
1381 Int_t iPadAlongTheStrip = Equip2VolNpad(iDDL, iChain, nTDC, iCH);
a9137e31 1382 if (iPadAlongTheStrip==-1) {
1383 /*if (fRawReader)
1384 fRawReader->AddMajorErrorLog(kPadAlongStripError,"pad = -1");*/
5b4ed716 1385 AliWarningGeneral("AliTOFRawStream", Form("Warning -> AliTOFRawStream::EquipmentId2VolumeId: Problems with the pad number along the strip (%2d %1d %2d %1d)!\n",
1386 nDDL, iChain, nTDC, iCH));
019f6101 1387 }
13d6bff9 1388
d0eb8f39 1389 Int_t iPadX = (Int_t)(iPadAlongTheStrip/(Float_t(AliTOFGeometry::NpadZ())));
1390 Int_t iPadZ = iPadAlongTheStrip%AliTOFGeometry::NpadZ();
38f24f3f 1391
1392 //Int_t iPadX = (Int_t)(Equip2VolNpad(iDDL, iChain, nTDC, iCH)/(Float_t(AliTOFGeometry::NpadZ())));
1393 //Int_t iPadZ = Equip2VolNpad(iDDL, iChain, nTDC, iCH)%AliTOFGeometry::NpadZ();
1394
1395 //Int_t iPadX = Equip2VolNpadX(iDDL, iChain, nTDC, iCH);
1396 //Int_t iPadZ = Equip2VolNpadZ(iDDL, iChain, nTDC, iCH);
1397
d0eb8f39 1398 volume[0] = iSector;
1399 volume[1] = iPlate;
1400 volume[2] = iStrip;
1401 volume[3] = iPadX;
1402 volume[4] = iPadZ;
571dda3d 1403
1404}
7813bb1a 1405//-----------------------------------------------------------------------------
019f6101 1406Bool_t AliTOFRawStream::DecodeDDL(Int_t nDDLMin, Int_t nDDLMax, Int_t verbose = 0) {
1407 //
1408 // To decode raw data for DDL number in [nDDLmin; nDDLmax]
1409 //
1410
7813bb1a 1411 //check and fix valid DDL range
019f6101 1412 if (nDDLMin < 0){
1413 nDDLMin = 0;
1414 fRawReader->AddMinorErrorLog(kDDLMinError);
1415 AliWarning("Wrong DDL range: setting first DDL ID to 0");
7813bb1a 1416 }
019f6101 1417 if (nDDLMax > 71){
1418 nDDLMax = 71;
1419 fRawReader->AddMinorErrorLog(kDDLMaxError);
1420 AliWarning("Wrong DDL range: setting last DDL ID to 71");
7813bb1a 1421 }
1422
1423 //select required DDLs
5b4ed716 1424 fRawReader->Reset();
019f6101 1425 fRawReader->Select("TOF", nDDLMin, nDDLMax);
7813bb1a 1426
1427 if (verbose)
019f6101 1428 AliInfo(Form("Selected TOF DDL range: %d-%d", nDDLMin, nDDLMax));
7813bb1a 1429
2fd622fa 1430 return(Decode(verbose));
1431}
1432//-----------------------------------------------------------------------------
019f6101 1433Bool_t AliTOFRawStream::Decode(Int_t verbose = 0) {
1434 //
1435 // New decoder method
1436 //
1437
2fd622fa 1438 Int_t currentEquipment;
1439 Int_t currentDDL;
dd824655 1440 const AliRawDataHeader *currentCDH;
2fd622fa 1441
1442 //pointers
1443 UChar_t *data = 0x0;
1444
7813bb1a 1445 //loop and read DDL headers
1446 while(fRawReader->ReadHeader()){
1447
1448 //memory leak prevention (actually data should be always 0x0 here)
1449 if (data != 0x0)
1450 delete [] data;
1451
1452 //get equipment infos
1453 currentEquipment = fRawReader->GetEquipmentId();
61c4c50d 1454
7813bb1a 1455 currentDDL = fRawReader->GetDDLID();
61c4c50d 1456 if (currentDDL==-1) {
1457 fRawReader->AddMajorErrorLog(kDDLdataReading);
1458 if (verbose)
1459 AliWarning("Error when load DDL. Go to next DDL");
1460 continue;
1461 }
1462
dd824655 1463 currentCDH = fRawReader->GetDataHeader();
7813bb1a 1464 const Int_t kDataSize = fRawReader->GetDataSize();
1465 const Int_t kDataWords = kDataSize / 4;
1466 data = new UChar_t[kDataSize];
1467
1468 if (verbose)
1469 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1470
1471 if (verbose)
1472 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1473
1474 //read equipment payload
1475 if (!fRawReader->ReadNext(data, kDataSize))
1476 {
019f6101 1477 fRawReader->AddMajorErrorLog(kDDLdataReading);
7813bb1a 1478 if (verbose)
019f6101 1479 AliWarning("Error while reading DDL data. Go to next equipment");
7813bb1a 1480 delete [] data;
1481 data = 0x0;
1482 continue;
1483 }
1484
1485 if (verbose)
1486 AliInfo(Form("Equipment # %d (DDL # %d) data has been readed", currentEquipment, currentDDL));
1487
1488
1489 //set up the decoder
1490 fDecoder->SetVerbose(verbose);
d35d0ea0 1491 fDecoder->SetDataBuffer(&fDataBuffer[currentDDL]);
1492 fDecoder->SetPackedDataBuffer(&fPackedDataBuffer[currentDDL]);
7813bb1a 1493
1494 //start decoding
dd824655 1495 if (fDecoder->Decode((UInt_t *)data, kDataWords, currentCDH) == kTRUE) {
019f6101 1496 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1497 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
f02e90a6 1498 ResetDataBuffer(currentDDL);
1499 ResetPackedDataBuffer(currentDDL);
019f6101 1500 }
7813bb1a 1501
1502 delete [] data;
1503 data = 0x0;
1504 }
1505
1506 //reset reader
1507 fRawReader->Reset();
1508
1509 if (verbose)
1510 AliInfo("All done");
1511
1512 return kFALSE;
1513
5b4ed716 1514}
1515//-----------------------------------------------------------------------------
1516Bool_t AliTOFRawStream::DecodeV2(Int_t verbose = 0) {
1517 //
1518 // Enhanced decoder method
1519 //
1520
1521 Int_t currentEquipment;
1522 Int_t currentDDL;
61c4c50d 1523 //const AliRawDataHeader *currentCDH;
5b4ed716 1524
1525 //pointers
1526 UChar_t *data = 0x0;
1527
1528 // read header
1529 if (!fRawReader->ReadHeader()) return kTRUE;
1530
1531 //get equipment infos
1532 currentEquipment = fRawReader->GetEquipmentId();
1533 currentDDL = fRawReader->GetDDLID();
61c4c50d 1534 //currentCDH = fRawReader->GetDataHeader();
5b4ed716 1535 const Int_t kDataSize = fRawReader->GetDataSize();
1536 const Int_t kDataWords = kDataSize / 4;
1537 data = new UChar_t[kDataSize];
1538
1539 if (verbose)
1540 AliInfo(Form("Found equipment # %d header (DDL # %d): %d bytes (%d words)", currentEquipment, currentDDL, kDataSize, kDataWords));
1541
1542 if (verbose)
1543 AliInfo(Form("Reading equipment #%d (DDL # %d) data...", currentEquipment, currentDDL));
1544
1545 //read equipment payload
1546 if (!fRawReader->ReadNext(data, kDataSize))
1547 {
1548 fRawReader->AddMajorErrorLog(kDDLdataReading);
1549 if (verbose)
1550 AliWarning("Error while reading DDL data. Go to next equipment");
1551 delete [] data;
1552 data = 0x0;
1553 return kTRUE;
1554 }
1555
1556 if (verbose)
1557 AliInfo(Form("Equipment # %d (DDL # %d) data has been read", currentEquipment, currentDDL));
1558
1559
1560 //set up the decoder
1561 fDecoderV2->SetVerbose(verbose);
1562
1563 //start decoding
1564 if (fDecoderV2->Decode((UInt_t *)data, kDataWords) == kTRUE) {
1565 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",currentDDL));
1566 AliWarning(Form("Error while decoding DDL # %d: decoder returned with errors", currentDDL));
1567 }
1568
1569 delete [] data;
1570
1571 if (verbose)
1572 AliInfo("All done");
1573
1574 return kFALSE;
1575
7813bb1a 1576}
1577//---------------------------------------------------------------------------
1578void
1579AliTOFRawStream::ResetBuffers()
1580{
19eefa2b 1581 //
1582 // To reset the buffers
1583 //
1584
7813bb1a 1585 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls("TOF"); iDDL++){
1586 ResetDataBuffer(iDDL);
1587 ResetPackedDataBuffer(iDDL);
1588 }
1589}
1590
1591//---------------------------------------------------------------------------
1592Bool_t
1593AliTOFRawStream::LoadRawDataBuffers(Int_t indexDDL, Int_t verbose)
1594{
19eefa2b 1595 //
1596 // To load the buffers
1597 //
1598
7813bb1a 1599 fTOFrawData->Clear();
1600 fPackedDigits = 0;
1601
1602 if (verbose > 0)
1603 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1604
1605 if (DecodeDDL(indexDDL, indexDDL, verbose) != 0){ //decode DDL
019f6101 1606 fRawReader->AddMajorErrorLog(kDDLDecoder,Form("DDL # = %d",indexDDL));
1607 AliWarning(Form("Error while decoding DDL # %d", indexDDL));
7813bb1a 1608 return kTRUE;
1609 }
1610
1611 if (verbose > 0)
d35d0ea0 1612 AliInfo(Form("Done. %d packed %s been found.", fPackedDataBuffer[indexDDL].GetEntries(), fPackedDataBuffer[indexDDL].GetEntries() > 1 ? "hits have" : "hit has"));
7813bb1a 1613
1614 AliTOFHitData *hitData; //hit data pointer
1615
1616 if (verbose > 0)
1617 AliInfo("Filling TClonesArray ...");
1618
dd824655 1619 if (verbose > 0)
1620 if (fgApplyBCCorrections) {
1621 AliInfo("Apply nominal DDL BC time-shift correction");
1622 AliInfo("Apply deltaBC time-shift correction");
1623 }
1624
7813bb1a 1625 //loop over DDL packed hits
d35d0ea0 1626 for (Int_t iHit = 0; iHit < fPackedDataBuffer[indexDDL].GetEntries(); iHit++){
1627 hitData = fPackedDataBuffer[indexDDL].GetHit(iHit); //get hit data
7813bb1a 1628 Int_t hitACQ = hitData->GetACQ();
1629 Int_t hitPS = hitData->GetPS();
1630 Int_t hitSlotID = hitData->GetSlotID();
1631 Int_t hitChain = hitData->GetChain();
1632 Int_t hitTDC = hitData->GetTDC();
1633 Int_t hitChan = hitData->GetChan();
7813bb1a 1634 Int_t hitTimeBin = hitData->GetTimeBin();
7813bb1a 1635 Int_t hitTOTBin = hitData->GetTOTBin();
2bf4d9d6 1636 Int_t hitDeltaBC = hitData->GetDeltaBunchID();
1637 Int_t hitL0L1Latency = hitData->GetL0L1Latency();
dd824655 1638
1639 Int_t hitLeading = hitData->GetTimeBin();
bf33f8f0 1640 Int_t hitTrailing = -1;
1641 Int_t hitError = -1;
7813bb1a 1642
1643 TClonesArray &arrayTofRawData = *fTOFrawData;
2bf4d9d6 1644 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency);
7813bb1a 1645 }
1646
1647 if (verbose > 0)
1648 AliInfo("Done.");
1649
1650 if (verbose > 0)
1651 AliInfo("Resetting buffers ...");
1652
d35d0ea0 1653 fDataBuffer[indexDDL].Reset();
1654 fPackedDataBuffer[indexDDL].Reset();
7813bb1a 1655
1656 if (verbose > 0)
1657 AliInfo("Done.");
1658
1659 return kFALSE;
1660}
1661
5f72a2bf 1662//---------------------------------------------------------------------------
5b4ed716 1663Bool_t
1664AliTOFRawStream::LoadRawDataBuffersV2(Int_t indexDDL, Int_t verbose)
1665{
1666 //
1667 // To load the buffers
1668 //
1669
1670 /*
1671 * decode raw data and fill output array with TOF hits.
1672 * decode algorithm may return with errors due to inconsistent
1673 * raw data format detected during decoding process.
1674 * decoder algorithm has internal recover procedure to deal with
1675 * errors in a safe condition.
1676 *
1677 * the following conditions will cause total hit rejection from
1678 * specific boards where the condition is detected:
1679 *
1680 * --- within DRM payload (full DRM skipped) ---
1681 * - no header/trailer detected
1682 *
1683 * --- within TRM payload (full TRM skippped) ---
1684 * - no header/trailer detected
1685 * - empty event inserted
1686 * - bad event counter
1687 * - bad CRC
1688 * - ACQ mode off
1689 *
1690 * --- within chain payload (full chain skipped) ---
1691 * - no header/trailer detected
1692 * - bad status
1693 * - bad event counter
1694 *
1695 * --- HPTDC (ful TDC skipped) ---
1696 * - error detected
1697 *
1698 */
1699
1700 fTOFrawData->Clear();
1701 fPackedDigits = 0;
1702
1703 if (verbose > 0)
1704 AliInfo(Form("Decoding raw data for DDL # %d ...", indexDDL));
1705
1706 //check and fix valid DDL range
1707 if (indexDDL < 0){
1708 indexDDL = 0;
1709 fRawReader->AddMinorErrorLog(kDDLMinError);
1710 AliWarning("Wrong DDL range: setting first DDL ID to 0");
1711 }
1712 if (indexDDL > 71){
1713 indexDDL = 71;
1714 fRawReader->AddMinorErrorLog(kDDLMaxError);
1715 AliWarning("Wrong DDL range: setting last DDL ID to 71");
1716 }
1717
1718 //select required DDLs
1719 fRawReader->Reset();
1720 fRawReader->Select("TOF", indexDDL, indexDDL);
1721
1722 /* decode */
1723 if (DecodeV2(verbose)) return kTRUE;
1724
1725 /* read and check CDH info */
1726 const AliRawDataHeader *currentCDH = fRawReader->GetDataHeader();
1727 Int_t currentMiniEventID = currentCDH->GetMiniEventID();
1728 Int_t currentEventID1 = currentCDH->GetEventID1();
1729
1730 /* read decoder summary data */
1731 AliTOFDecoderSummaryData *decodersd;
1732 AliTOFDRMSummaryData *drmsd;
1733 // AliTOFLTMSummaryData *ltmsd;
1734 AliTOFTRMSummaryData *trmsd;
1735 AliTOFChainSummaryData *chainsd;
1736 AliTOFTDCHitBuffer *hitBuffer;
1737 AliTOFTDCHit *hit;
1738 AliTOFTDCErrorBuffer *errorBuffer;
1739 AliTOFTDCError *error;
1740 Bool_t tdcErrorFlag[15];
1741 decodersd = fDecoderV2->GetDecoderSummaryData();
1742
1743 /* check error detected/recovered */
1744 if (decodersd->GetErrorDetected()) {
1745 AliWarning(Form("Error detected while decoding DDL %d (errorSlotID mask = %04x)", indexDDL, decodersd->GetErrorSlotID()));
1746 if (decodersd->GetRecoveringError()) {
1747 AliWarning("Couldn't recover from error");
1748 }
1749 else {
1750 AliWarning("Error recovered, anyway something is probably lost");
1751 }
1752 }
1753 /* check DRM header/trailer */
1754 drmsd = decodersd->GetDRMSummaryData();
1755 if (!drmsd->GetHeader() || !drmsd->GetTrailer()) {
1756 AliWarning("DRM header/trailer missing, skip DDL");
1757 return kTRUE;
1758 }
1759 /* check partecipating mask */
1760 if (drmsd->GetPartecipatingSlotID() != drmsd->GetDecoderSlotEnableMask()) {
1761 AliWarning(Form("DRM slot enable mask differs from decoder slot enable mask (%08x != %08x) in DDL %d", drmsd->GetSlotEnableMask(), drmsd->GetDecoderSlotEnableMask(), indexDDL));
1762 for (Int_t ibit = 0; ibit < 11; ibit++)
1763 if ((drmsd->GetPartecipatingSlotID() & (0x1 << ibit)) && !(drmsd->GetDecoderSlotEnableMask() & (0x1 << ibit)))
1764 AliWarning(Form("readout slot %d data is missing in decoder", ibit + 2));
1765 }
1766
1767 /* get DRM data */
1768 Int_t currentL0BCID = drmsd->GetL0BCID();
1769
1770 /* loop over TRM to get hits */
1771 Int_t hitACQ, hitPS, hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitDeltaBC, hitL0L1Latency, hitLeading, hitTrailing, hitError;
1772 Int_t currentBunchID;
1773
1774 /* loop over TRMs */
1775 for (Int_t itrm = 0; itrm < 10; itrm++) {
1776 trmsd = drmsd->GetTRMSummaryData(itrm);
1777 /* check header/trailer */
1778 if (!trmsd->GetHeader() || !trmsd->GetTrailer()) continue;
1779 /* skip if TRM empty event detected */
1780 if (trmsd->GetEBit() != 0) continue;
1781 /* skip if bad TRM event counter detected */
1782 if (trmsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue;
1783 /* skip if bad TRM CRC detected */
1784 if (trmsd->GetEventCRC() != trmsd->GetDecoderCRC()) continue;
1785
1786 /* loop over chains */
1787 for (Int_t ichain = 0; ichain < 2; ichain++) {
1788 chainsd = trmsd->GetChainSummaryData(ichain);
1789 /* check header/trailer */
1790 if (!chainsd->GetHeader() || !chainsd->GetTrailer()) continue;
1791 /* skip if chain bad status detected */
1792 if (chainsd->GetStatus() != 0) continue;
1793 /* skip if bad chain event counter detected */
1794 if (chainsd->GetEventCounter() != drmsd->GetLocalEventCounter()) continue;
1795
1796 currentBunchID = chainsd->GetBunchID();
1797 hitBuffer = chainsd->GetTDCPackedHitBuffer();
1798 errorBuffer = chainsd->GetTDCErrorBuffer();
1799
1800 /* check TDC errors and set TDC error flag */
1801 for (Int_t itdc = 0; itdc < 15; itdc++) tdcErrorFlag[itdc] = kFALSE;
1802 for (Int_t ierr = 0; ierr < errorBuffer->GetEntries(); ierr++) {
1803 error = errorBuffer->GetError(ierr);
1804 tdcErrorFlag[error->GetTDCID()] = kTRUE;
1805 }
1806
1807 /* loop over hits */
1808 for (Int_t ihit = 0; ihit < hitBuffer->GetEntries(); ihit++) {
1809
1810 /* get hit */
1811 hit = hitBuffer->GetHit(ihit);
1812 /* skip hit if coming from a TDC with error detected */
1813 if (tdcErrorFlag[hit->GetTDCID()]) continue;
1814
1815 /* set info */
1816 hitACQ = trmsd->GetACQBits();
1817 hitPS = hit->GetPSBits();
1818 hitSlotID = trmsd->GetSlotID();
1819 hitChain = chainsd->GetChain();
1820 hitTDC = hit->GetTDCID();
1821 hitChan = hit->GetChan();
1822 hitTimeBin = hit->GetHitTime();
1823 hitTOTBin = hit->GetTOTWidth();
1824 hitDeltaBC = currentBunchID - currentEventID1;
1825 hitL0L1Latency = currentMiniEventID - currentL0BCID;
1826
1827 hitLeading = hitTimeBin;
1828 hitTrailing = -1;
1829 hitError = -1;
1830
1831 /* add hit */
1832 TClonesArray &arrayTofRawData = *fTOFrawData;
1833 new (arrayTofRawData[fPackedDigits++]) AliTOFrawData(hitSlotID, hitChain, hitTDC, hitChan, hitTimeBin, hitTOTBin, hitLeading, hitTrailing, hitPS, hitACQ, hitError, hitDeltaBC, hitL0L1Latency);
1834 }
1835 }
1836 }
1837
1838 return kFALSE;
1839}
1840
1841//---------------------------------------------------------------------------
5f72a2bf 1842void AliTOFRawStream::Geant2EquipmentId(Int_t vol[], Int_t eqId[])
1843{
1844 //
1845 // To convert:
1846 // nSector number -vol[0]- (variable in [0,17])
1847 // nPlate number -vol[1]- (variable in [0, 5])
1848 // nStrip number -vol[2]- (variable in [0,14/18])
1849 // nPadZ number -vol[3]- (variable in [0, 1])
1850 // nPadX number -vol[4]- (variable in [0,47])
1851 // in:
e1d95075 1852 // nDDL -eqId[0]- (variable in [0;71]) -> number of the DDL
1853 // nTRM -eqId[1]- (variable in [3;12]) -> number of the TRM
1854 // nTDC -eqId[2]- (variable in [0;14]) -> number of the TDC
1855 // nChain -eqId[3]- (variable in [0; 1]) -> number of the chain
1856 // nChannel -eqId[4]- (variable in [0; 8]) -> number of the channel
5f72a2bf 1857 //
1858
1859 eqId[0] = Geant2DDL(vol);
1860 eqId[1] = Geant2TRM(vol);
1861 eqId[2] = Geant2TDC(vol);
1862 eqId[3] = Geant2Chain(vol);
1863 eqId[4] = Geant2Channel(vol);
1864
1865}
1866
1867//---------------------------------------------------------------------------
1868Int_t AliTOFRawStream::Geant2DDL(Int_t vol[])
1869{
1870 //
1871 // To convert:
1872 // nSector number -vol[0]- (variable in [0,17])
1873 // nPlate number -vol[1]- (variable in [0, 5])
1874 // nStrip number -vol[2]- (variable in [0,14/18])
1875 // nPadZ number -vol[3]- (variable in [0, 1])
1876 // nPadX number -vol[4]- (variable in [0,47])
1877 // in:
e1d95075 1878 // nDDL (variable in [0;71]) -> number of the DDL
5f72a2bf 1879 //
1880
1881
1882 Int_t iDDL = -1;
1883
1884 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1885 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1886 return iDDL;
1887 }
1888 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1889 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1890 return iDDL;
1891 }
1892 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1893 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1894 return iDDL;
1895 }
1896 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
1897 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1898 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
1899 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1900 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
1901 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1902 return iDDL;
1903 }
1904
1905 Int_t nSector = vol[0];
1906 Int_t nPlate = vol[1];
1907 Int_t nStrip = vol[2];
1908 Int_t nPadX = vol[4];
1909
1910 if ( nPadX<24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<7) ) )
1911 iDDL = 0;
1912 else if ( nPadX>=24 && ( nPlate==0 || nPlate==1 || (nPlate==2 && nStrip<8) ) )
1913 iDDL = 1;
1914 else if ( nPadX>=24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>7) ) )
1915 iDDL = 2;
1916 else if ( nPadX<24 && ( nPlate==3 || nPlate==4 || (nPlate==2 && nStrip>6) ) )
1917 iDDL = 3;
1918
1919 return 4*nSector+iDDL;
1920
1921}
1922
1923//---------------------------------------------------------------------------
1924Int_t AliTOFRawStream::Geant2TRM(Int_t vol[])
1925{
1926 //
1927 // To convert:
1928 // nSector number -vol[0]- (variable in [0,17])
1929 // nPlate number -vol[1]- (variable in [0, 5])
1930 // nStrip number -vol[2]- (variable in [0,14/18])
1931 // nPadZ number -vol[3]- (variable in [0, 1])
1932 // nPadX number -vol[4]- (variable in [0,47])
1933 // in:
1934 // nTRM (variable in [3;12]) -> number of the TRM slot
1935 //
1936
1937 Int_t nTRM = -1;
1938
1939 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
1940 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
1941 return nTRM;
1942 }
1943 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
1944 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
1945 return nTRM;
1946 }
1947 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
1948 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
1949 return nTRM;
1950 }
1951 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ()) {
1952 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
1953 return nTRM;
1954 }
1955 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX()) {
1956 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
1957 return nTRM;
1958 }
1959
1960 if ( vol[3]>=AliTOFGeometry::NpadZ() )
1961 {
1962 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
1963 return nTRM;
1964 }
1965
1966 Int_t nPlate = vol[1];
1967 Int_t nStrip = vol[2];
1968
1969 Int_t iDDL = Geant2DDL(vol)%4;
1970
1971 switch (iDDL) {
1972
1973 case 0:
1974
1975 if (nPlate==0) {
1976 if (nStrip<= 4) nTRM = 4;
1977 else if (nStrip> 4 && nStrip<= 9) nTRM = 5;
1978 else if (nStrip> 9 && nStrip<=14) nTRM = 6;
1979 else if (nStrip>14) nTRM = 7;
1980 }
1981 else if (nPlate==1) {
1982 if (nStrip== 0) nTRM = 7;
1983 else if (nStrip> 0 && nStrip<= 5) nTRM = 8;
1984 else if (nStrip> 5 && nStrip<=10) nTRM = 9;
1985 else if (nStrip>10 && nStrip<=15) nTRM = 10;
1986 else if (nStrip>15) nTRM = 11;
1987 }
1988 else if (nPlate==2) {
1989 if (nStrip<= 1) nTRM = 11;
1990 else if (nStrip> 1 && nStrip< 7) nTRM = 12;
1991 }
1992
1993 break;
1994 case 1:
1995
1996 if (nPlate==0) {
1997 if (nStrip== 0) nTRM = 3;
1998 else if (nStrip> 0 && nStrip<= 5) nTRM = 4;
1999 else if (nStrip> 5 && nStrip<=10) nTRM = 5;
2000 else if (nStrip>10 && nStrip<=15) nTRM = 6;
2001 else if (nStrip>15) nTRM = 7;
2002 }
2003 else if (nPlate==1) {
2004 if (nStrip<=1) nTRM = 7;
2005 else if (nStrip> 1 && nStrip<= 6) nTRM = 8;
2006 else if (nStrip> 6 && nStrip<=11) nTRM = 9;
2007 else if (nStrip>11 && nStrip<=16) nTRM = 10;
2008 else if (nStrip>16) nTRM = 11;
2009 }
2010 else if (nPlate==2) {
2011 if (nStrip<= 2) nTRM = 11;
2012 else if (nStrip> 2 && nStrip<= 7) nTRM = 12;
2013 }
2014
2015 break;
2016 case 2:
2017
2018 if (nPlate==4) {
2019 if (nStrip>=14) nTRM = 4;
2020 else if (nStrip<14 && nStrip>= 9) nTRM = 5;
2021 else if (nStrip< 9 && nStrip>= 4) nTRM = 6;
2022 else if (nStrip< 4) nTRM = 7;
2023 }
2024 else if (nPlate==3) {
2025 if (nStrip==18) nTRM = 7;
2026 else if (nStrip<18 && nStrip>=13) nTRM = 8;
2027 else if (nStrip<13 && nStrip>= 8) nTRM = 9;
2028 else if (nStrip< 8 && nStrip>= 3) nTRM = 10;
2029 else if (nStrip< 3) nTRM = 11;
2030 }
2031 else if (nPlate==2) {
2032 if (nStrip>=13) nTRM = 11;
2033 else if (nStrip<13 && nStrip>= 8) nTRM = 12;
2034 }
2035
2036 break;
2037 case 3:
2038
2039 if (nPlate==4) {
2040 if (nStrip==18) nTRM = 3;
2041 else if (nStrip<18 && nStrip>=13) nTRM = 4;
2042 else if (nStrip<13 && nStrip>= 8) nTRM = 5;
2043 else if (nStrip< 8 && nStrip>= 3) nTRM = 6;
2044 else if (nStrip< 3) nTRM = 7;
2045 }
2046 else if (nPlate==3) {
2047 if (nStrip>=17) nTRM = 7;
2048 else if (nStrip<17 && nStrip>=12) nTRM = 8;
2049 else if (nStrip<12 && nStrip>= 7) nTRM = 9;
2050 else if (nStrip< 7 && nStrip>= 2) nTRM = 10;
2051 else if (nStrip< 2) nTRM = 11;
2052 }
2053 else if (nPlate==2) {
2054 if (nStrip>=12) nTRM = 11;
2055 else if (nStrip <12 && nStrip>= 7) nTRM = 12;
2056 }
2057
2058 break;
2059
2060 }
2061
2062 return nTRM;
2063
2064}
2065
2066//---------------------------------------------------------------------------
2067Int_t AliTOFRawStream::Geant2TDC(Int_t vol[])
2068{
2069 //
2070 // To convert:
2071 // nSector number -vol[0]- (variable in [0,17])
2072 // nPlate number -vol[1]- (variable in [0, 5])
2073 // nStrip number -vol[2]- (variable in [0,14/18])
2074 // nPadZ number -vol[3]- (variable in [0, 1])
2075 // nPadX number -vol[4]- (variable in [0,47])
2076 // in:
2077 // nTDC (variable in [0;14]) -> number of the TDC
2078 //
2079
2080 Int_t nTDC = -1;
2081
2082 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2083 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2084 return nTDC;
2085 }
2086 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2087 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2088 return nTDC;
2089 }
2090 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2091 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2092 return nTDC;
2093 }
2094 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2095 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2096 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2097 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2098 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2099 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2100 return nTDC;
2101 }
2102
2103 Int_t nPlate = vol[1];
2104 Int_t nStrip = vol[2];
2105 Int_t iPadX = vol[4];
2106
2107 Int_t iDDL = Geant2DDL(vol)%4;
2108
2109 switch (iDDL) {
2110
2111 case 0:
2112
2113 if (nPlate==0) {
2114 if (nStrip<= 4) nTDC = (3*(nStrip)+2-(iPadX/4)%3);
2115 else if (nStrip> 4 && nStrip<= 9) nTDC = (3*(nStrip- 5)+2-(iPadX/4)%3);
2116 else if (nStrip> 9 && nStrip<=14) nTDC = (3*(nStrip-10)+2-(iPadX/4)%3);
2117 else if (nStrip>14) nTDC = (3*(nStrip-15)+2-(iPadX/4)%3);
2118 }
2119 else if (nPlate==1) {
2120 if (nStrip== 0) nTDC = (3*(nStrip+ 4)+2-(iPadX/4)%3);
2121 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*(nStrip- 1)+2-(iPadX/4)%3);
2122 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(nStrip- 6)+2-(iPadX/4)%3);
2123 else if (nStrip>10 && nStrip<=15) nTDC = (3*(nStrip-11)+2-(iPadX/4)%3);
2124 else if (nStrip>15) nTDC = (3*(nStrip-16)+2-(iPadX/4)%3);
2125 }
2126 else if (nPlate==2) {
2127 if (nStrip<= 1) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
2128 else if (nStrip> 1 && nStrip< 7) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
2129 }
2130
2131 break;
2132 case 1:
2133
2134 if (nPlate==0) {
2135 if (nStrip== 0) nTDC = (3*(nStrip)+(iPadX/4)%3);
2136 else if (nStrip> 0 && nStrip<= 5) nTDC = (3*( 5-nStrip)+(iPadX/4)%3);
2137 else if (nStrip> 5 && nStrip<=10) nTDC = (3*(10-nStrip)+(iPadX/4)%3);
2138 else if (nStrip>10 && nStrip<=15) nTDC = (3*(15-nStrip)+(iPadX/4)%3);
2139 else if (nStrip>15) nTDC = (3*(20-nStrip)+(iPadX/4)%3);
2140 }
2141 else if (nPlate==1) {
2142 if (nStrip<= 1) nTDC = (3*( 1-nStrip)+(iPadX/4)%3);
2143 else if (nStrip> 1 && nStrip<= 6) nTDC = (3*( 6-nStrip)+(iPadX/4)%3);
2144 else if (nStrip> 6 && nStrip<=11) nTDC = (3*(11-nStrip)+(iPadX/4)%3);
2145 else if (nStrip>11 && nStrip<=16) nTDC = (3*(16-nStrip)+(iPadX/4)%3);
2146 else if (nStrip>16) nTDC = (3*(21-nStrip)+(iPadX/4)%3);
2147 }
2148 else if (nPlate==2) {
2149 if (nStrip<= 2) nTDC = (3*( 2-nStrip)+(iPadX/4)%3);
2150 else if (nStrip> 2 && nStrip<= 7) nTDC = (3*( 7-nStrip)+(iPadX/4)%3);
2151 }
2152
2153 break;
2154 case 2:
2155
2156 if (nPlate==4) {
2157 if (nStrip>=14) nTDC = (3*(18-nStrip)+((iPadX/4)%3));
2158 else if (nStrip<14 && nStrip>= 9) nTDC = (3*(13-nStrip)+((iPadX/4)%3));
2159 else if (nStrip< 9 && nStrip>= 4) nTDC = (3*( 8-nStrip)+((iPadX/4)%3));
2160 else if (nStrip< 4) nTDC = (3*( 3-nStrip)+((iPadX/4)%3));
2161 }
2162 else if (nPlate==3) {
2163 if (nStrip==18) nTDC = (3*(22-nStrip)+((iPadX/4)%3));
2164 else if (nStrip<18 && nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
2165 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
2166 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*( 7-nStrip)+((iPadX/4)%3));
2167 else if (nStrip< 3) nTDC = (3*( 2-nStrip)+((iPadX/4)%3));
2168 }
2169 else if (nPlate==2) {
2170 if (nStrip>=13) nTDC = (3*(17-nStrip)+((iPadX/4)%3));
2171 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(12-nStrip)+((iPadX/4)%3));
2172 }
2173
2174 break;
2175 case 3:
2176
2177 if (nPlate==4) {
2178 if (nStrip==18) nTDC = (3*(nStrip-18)+2-(iPadX/4)%3);
2179 else if (nStrip<18 && nStrip>=13) nTDC = (3*(nStrip-13)+2-(iPadX/4)%3);
2180 else if (nStrip<13 && nStrip>= 8) nTDC = (3*(nStrip- 8)+2-(iPadX/4)%3);
2181 else if (nStrip< 8 && nStrip>= 3) nTDC = (3*(nStrip- 3)+2-(iPadX/4)%3);
2182 else if (nStrip< 3) nTDC = (3*(nStrip+ 2)+2-(iPadX/4)%3);
2183 }
2184 else if (nPlate==3) {
2185 if (nStrip>=17) nTDC = (3*(nStrip-17)+2-(iPadX/4)%3);
2186 else if (nStrip<17 && nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
2187 else if (nStrip<12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
2188 else if (nStrip< 7 && nStrip>= 2) nTDC = (3*(nStrip- 2)+2-(iPadX/4)%3);
2189 else if (nStrip< 2) nTDC = (3*(nStrip+ 3)+2-(iPadX/4)%3);
2190 }
2191 else if (nPlate==2) {
2192 if (nStrip>=12) nTDC = (3*(nStrip-12)+2-(iPadX/4)%3);
2193 else if (nStrip <12 && nStrip>= 7) nTDC = (3*(nStrip- 7)+2-(iPadX/4)%3);
2194 }
2195
2196 break;
2197
2198 }
2199
2200 return nTDC;
2201
2202}
2203
2204//---------------------------------------------------------------------------
2205Int_t AliTOFRawStream::Geant2Chain(Int_t vol[])
2206{
2207 //
2208 // To convert:
2209 // nSector number -vol[0]- (variable in [0,17])
2210 // nPlate number -vol[1]- (variable in [0, 5])
2211 // nStrip number -vol[2]- (variable in [0,14/18])
2212 // nPadZ number -vol[3]- (variable in [0, 1])
2213 // nPadX number -vol[4]- variable in [0,47])
2214 // in:
2215 // nChain (variable in [0; 1]) -> number of the TRM chain
2216 //
2217
2218 Int_t nChain = -1;
2219
2220 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2221 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2222 return nChain;
2223 }
2224 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2225 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2226 return nChain;
2227 }
2228 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2229 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2230 return nChain;
2231 }
2232 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2233 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2234 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2235 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2236 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2237 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2238 return nChain;
2239 }
2240
2241 Int_t iPadX = vol[4];
2242
2243 if (iPadX<12 || iPadX>=36) nChain = 0;
2244 else nChain = 1;
2245
2246 return nChain;
2247
2248}
2249
2250//---------------------------------------------------------------------------
2251Int_t AliTOFRawStream::Geant2Channel(Int_t vol[])
2252{
2253 //
2254 // To convert:
2255 // nSector number -vol[0]- (variable in [0,17])
2256 // nPlate number -vol[1]- (variable in [0, 5])
2257 // nStrip number -vol[2]- (variable in [0,14/18])
2258 // nPadZ number -vol[3]- (variable in [0, 1])
2259 // nPadX number -vol[4]- (variable in [0,47])
2260 // in:
2261 // nChannel (variable in [0; 7]) -> number of the TDC channel
2262 //
2263
2264 Int_t nChannel = -1;
2265
2266 if (vol[0]<0 || vol[0]>=AliTOFGeometry::NSectors()) {
2267 printf(" AliTOFRawStream - Error: the sector number (%i) is out of the range: [0,17]\n", vol[0]);
2268 return nChannel;
2269 }
2270 if (vol[1]<0 || vol[1]>=AliTOFGeometry::NPlates()) {
2271 printf(" AliTOFRawStream - Error: the module number (%i) is out of the range: [0,4]\n", vol[1]);
2272 return nChannel;
2273 }
2274 if (vol[2]<0 || vol[2]>=AliTOFGeometry::NStrip(vol[1])) {
2275 printf(" AliTOFRawStream - Error: the strip number (%i) is out of the range: [0,%i]\n", vol[2], AliTOFGeometry::NStrip(vol[1]));
2276 return nChannel;
2277 }
2278 if (vol[3]<0 || vol[3]>=AliTOFGeometry::NpadZ())
2279 printf(" AliTOFRawStream - Error: the padz number (%i) is out of the range: [0,1]\n", vol[3]);
2280 if (vol[4]<0 || vol[4]>=AliTOFGeometry::NpadX())
2281 printf(" AliTOFRawStream - Error: the padx number (%i) is out of the range: [0,47]\n", vol[4]);
2282 if ( vol[3]>=AliTOFGeometry::NpadZ() ) {
2283 printf("Maybe you have to invert the order between vol[3](=%i) and vol[4](=%i)\n", vol[3], vol[4]);
2284 return nChannel;
2285 }
2286
2287 Int_t iPadZ = vol[3];
2288 Int_t iPadX = vol[4];
2289
2290 Int_t iDDL = Geant2DDL(vol)%4;
2291
2292 switch (iDDL) {
2293
2294 case 0:
2295 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2296 break;
2297 case 1:
2298 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2299 break;
2300 case 2:
2301 nChannel = ((2*(iPadX-24) + (iPadZ)))%8;
2302 break;
2303 case 3:
2304 nChannel = ((2*(23-iPadX) + (1-iPadZ)))%8;
2305 break;
2306 }
2307
2308 return nChannel;
2309
2310}
f472295e 2311
2312//____________________________________________________________________________
a3ed3947 2313void AliTOFRawStream::Raw2Digits(AliRawReader* rawReader, TClonesArray * const digitsArray)
f472295e 2314{
2315 //
2316 // Converts raw data to digits for TOF
2317 //
2318
2319 TStopwatch stopwatch;
2320 stopwatch.Start();
2321
2322 //TClonesArray *fDigits = new TClonesArray("AliTOFdigit", 4000);
2323 //digitsTree->Branch("TOF", &fDigits);
2324 TClonesArray &aDigits = *digitsArray;
2325
2326 Int_t inholes = 0;
2327
2328 Clear();
2329 SetRawReader(rawReader);
2330
2331 //ofstream ftxt;
2332 //if (fVerbose==2) ftxt.open("TOFdigitsRead.txt",ios::app);
2333
2334 TClonesArray staticRawData("AliTOFrawData",10000);
2335 staticRawData.Clear();
2336 TClonesArray * clonesRawData = &staticRawData;
2337
2338 Int_t dummy = -1;
2339 Int_t detectorIndex[5] = {-1, -1, -1, -1, -1};
2340 Int_t digit[4];
2341
2342 const Int_t kMaxNumberOfTracksPerDigit = 3;
2343 Int_t tracks[kMaxNumberOfTracksPerDigit];
2344 for (Int_t ii=0; ii<kMaxNumberOfTracksPerDigit; ii++)
2345 tracks[ii] = -1;
2346 Int_t last = -1;
2347
2348 Int_t indexDDL = 0;
2349 Int_t iRawData = 0;
2350 AliTOFrawData *tofRawDatum = 0;
2351 for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
2352
2353 rawReader->Reset();
2354 if (fNewDecoderVersion) {
2355 AliInfo("Using New Decoder \n");
2356 LoadRawDataBuffers(indexDDL, 0);
2357 }
2358 else
2359 LoadRawData(indexDDL);
2360
2361 clonesRawData = GetRawData();
2362 if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
2363 for (iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {
2364
2365 tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);
2366
2367 //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue;
2368 if (tofRawDatum->GetTOF()==-1) continue;
2369
2370 EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
2371 tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
2372
2373 dummy = detectorIndex[3];
2374 detectorIndex[3] = detectorIndex[4];//padz
2375 detectorIndex[4] = dummy;//padx
2376
2377 digit[0] = tofRawDatum->GetTOF();
2378 digit[1] = tofRawDatum->GetTOT();
2379 digit[2] = tofRawDatum->GetTOT();
2380 digit[3] = -1;//tofRawDatum->GetTOF(); //tofND
2381
2382 dummy = detectorIndex[3];
2383 detectorIndex[3] = detectorIndex[4];//padx
2384 detectorIndex[4] = dummy;//padz
2385
2386 // Do not reconstruct anything in the holes
2387 if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
2388 if (detectorIndex[1]==2) { // plate with holes
2389 inholes++;
2390 continue;
2391 }
2392 }
2393
2394 last = digitsArray->GetEntriesFast();
2395 new (aDigits[last]) AliTOFdigit(tracks, detectorIndex, digit);
2396 /*
2397 if (fVerbose==2) {
2398 if (indexDDL<10) ftxt << " " << indexDDL;
2399 else ftxt << " " << indexDDL;
2400 if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM();
2401 else ftxt << " " << tofRawDatum->GetTRM();
2402 ftxt << " " << tofRawDatum->GetTRMchain();
2403 if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC();
2404 else ftxt << " " << tofRawDatum->GetTDC();
2405 ftxt << " " << tofRawDatum->GetTDCchannel();
2406
2407 if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0];
2408 else ftxt << " -> " << detectorIndex[0];
2409 ftxt << " " << detectorIndex[1];
2410 if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2];
2411 else ftxt << " " << detectorIndex[2];
2412 ftxt << " " << detectorIndex[4];
2413 if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3];
2414 else ftxt << " " << detectorIndex[3];
2415
2416 if (digit[1]<10)ftxt << " " << digit[1];
2417 else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1];
2418 else ftxt << " " << digit[1];
2419 if (digit[0]<10) ftxt << " " << digit[0] << endl;
2420 else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl;
2421 else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl;
2422 else ftxt << " " << digit[3] << endl;
2423 }
2424 */
2425 AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d, %d)",
2426 last,
2427 detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3],
2428 digit[0], digit[1], digit[3]));
2429
2430 tofRawDatum = 0;
2431 } // loop on tofRawData array
2432
2433 clonesRawData->Clear();
2434
2435 } // DDL Loop
2436
2437 //if (fVerbose==2) ftxt.close();
2438
2439
2440 if (inholes) AliWarning(Form("Raw data in the TOF holes: %d",inholes));
2441
2442 Int_t nDigits = digitsArray->GetEntries();
2443 AliDebug(1, Form("Got %d TOF digits", nDigits));
2444 AliDebug(1, Form("Execution time to read TOF raw data and fill TOF digit tree : R:%.2fs C:%.2fs",
2445 stopwatch.RealTime(),stopwatch.CpuTime()));
2446
2447}
2448
2449//____________________________________________________________________________
a3ed3947 2450void AliTOFRawStream::Raw2SDigits(AliRawReader* rawReader, TClonesArray * const sdigitsArray)
f472295e 2451{
2452 //
2453 // Converts raw data to sdigits for TOF
2454 //
2455
2456 TStopwatch stopwatch;
2457 stopwatch.Start();
2458
2459 Int_t inholes = 0;
2460
2461 //if(!GetLoader()->TreeS()) {MakeTree("S"); MakeBranch("S");}
2462 TClonesArray &aSDigits = *sdigitsArray;
2463
2464 Clear();
2465 SetRawReader(rawReader);
2466
2467 //ofstream ftxt;
2468 //if (fVerbose==2) ftxt.open("TOFsdigitsRead.txt",ios::app);
2469
2470 TClonesArray staticRawData("AliTOFrawData",10000);
2471 staticRawData.Clear();
2472 TClonesArray * clonesRawData = &staticRawData;
2473
2474 Int_t dummy = -1;
2475 Int_t detectorIndex[5] = {-1, -1, -1, -1, -1};
2476 Int_t digit[2];
2477 Int_t track = -1;
2478 Int_t last = -1;
2479
2480 Int_t indexDDL = 0;
2481 Int_t iRawData = 0;
2482 AliTOFrawData *tofRawDatum = 0;
2483 for (indexDDL=0; indexDDL<AliDAQ::NumberOfDdls("TOF"); indexDDL++) {
2484
2485 rawReader->Reset();
2486 if (fNewDecoderVersion) {
2487 AliInfo("Using New Decoder \n");
2488 LoadRawDataBuffers(indexDDL, 0);
2489 }
2490 else
2491 LoadRawData(indexDDL);
2492
2493 clonesRawData = GetRawData();
2494 if (clonesRawData->GetEntriesFast()!=0) AliInfo(Form(" TOF raw data number = %3d", clonesRawData->GetEntriesFast()));
2495 for (iRawData = 0; iRawData<clonesRawData->GetEntriesFast(); iRawData++) {
2496
2497 tofRawDatum = (AliTOFrawData*)clonesRawData->UncheckedAt(iRawData);
2498
2499 //if (tofRawDatum->GetTOT()==-1 || tofRawDatum->GetTOF()==-1) continue;
2500 if (tofRawDatum->GetTOF()==-1) continue;
2501
2502 EquipmentId2VolumeId(indexDDL, tofRawDatum->GetTRM(), tofRawDatum->GetTRMchain(),
2503 tofRawDatum->GetTDC(), tofRawDatum->GetTDCchannel(), detectorIndex);
2504
2505 dummy = detectorIndex[3];
2506 detectorIndex[3] = detectorIndex[4];//padz
2507 detectorIndex[4] = dummy;//padx
2508
2509 digit[0] = tofRawDatum->GetTOF();
2510 digit[1] = tofRawDatum->GetTOT();
2511
2512 dummy = detectorIndex[3];
2513 detectorIndex[3] = detectorIndex[4];//padx
2514 detectorIndex[4] = dummy;//padz
2515
2516 // Do not reconstruct anything in the holes
2517 if (detectorIndex[0]==13 || detectorIndex[0]==14 || detectorIndex[0]==15 ) { // sectors with holes
2518 if (detectorIndex[1]==2) { // plate with holes
2519 inholes++;
2520 continue;
2521 }
2522 }
2523
2524 last = sdigitsArray->GetEntriesFast();
2525 new (aSDigits[last]) AliTOFSDigit(track, detectorIndex, digit);
2526 /*
2527 if (fVerbose==2) {
2528 if (indexDDL<10) ftxt << " " << indexDDL;
2529 else ftxt << " " << indexDDL;
2530 if (tofRawDatum->GetTRM()<10) ftxt << " " << tofRawDatum->GetTRM();
2531 else ftxt << " " << tofRawDatum->GetTRM();
2532 ftxt << " " << tofRawDatum->GetTRMchain();
2533 if (tofRawDatum->GetTDC()<10) ftxt << " " << tofRawDatum->GetTDC();
2534 else ftxt << " " << tofRawDatum->GetTDC();
2535 ftxt << " " << tofRawDatum->GetTDCchannel();
2536
2537 if (detectorIndex[0]<10) ftxt << " -> " << detectorIndex[0];
2538 else ftxt << " -> " << detectorIndex[0];
2539 ftxt << " " << detectorIndex[1];
2540 if (detectorIndex[2]<10) ftxt << " " << detectorIndex[2];
2541 else ftxt << " " << detectorIndex[2];
2542 ftxt << " " << detectorIndex[4];
2543 if (detectorIndex[4]<10) ftxt << " " << detectorIndex[3];
2544 else ftxt << " " << detectorIndex[3];
2545
2546 if (digit[1]<10)ftxt << " " << digit[1];
2547 else if (digit[1]>=10 && digit[1]<100) ftxt << " " << digit[1];
2548 else ftxt << " " << digit[1];
2549 if (digit[0]<10) ftxt << " " << digit[0] << endl;
2550 else if (digit[0]>=10 && digit[0]<100) ftxt << " " << digit[0] << endl;
2551 else if (digit[0]>=100 && digit[0]<1000) ftxt << " " << digit[0] << endl;
2552 else ftxt << " " << digit[3] << endl;
2553 }
2554 */
9cef3750 2555 AliDebug(2, Form(" Raw data reading %2d -> %2d %1d %2d %1d %2d (%d, %d)",
f472295e 2556 last,
2557 detectorIndex[0], detectorIndex[1], detectorIndex[2], detectorIndex[4], detectorIndex[3],
9cef3750 2558 digit[0], digit[1]));
f472295e 2559
2560 tofRawDatum = 0;
2561 } // while loop
2562
2563 clonesRawData->Clear();
2564
2565 } // DDL Loop
2566
2567 //if (fVerbose==2) ftxt.close();
2568
2569 if (inholes) AliWarning(Form("Clusters in the TOF holes: %d",inholes));
2570
2571 Int_t nSDigits = sdigitsArray->GetEntries();
2572 AliDebug(1, Form("Got %d TOF sdigits", nSDigits));
2573 AliDebug(1, Form("Execution time to read TOF raw data and fill TOF sdigit tree : R:%.2fs C:%.2fs",
2574 stopwatch.RealTime(),stopwatch.CpuTime()));
2575
2576}
08d6922f 2577
a3ed3947 2578void AliTOFRawStream::VolumeID2LTM(Int_t detind[],
61c4c50d 2579 Int_t &iDDL,
2580 Int_t &iTRM,
2581 Int_t &iChain,
2582 Int_t &iTDC,
2583 Int_t &iChannel) const {
08d6922f 2584 //
2585 // To convert the TOF trigger macropad ID (i.e. detind)
2586 // into TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel)
2587 //
2588
a3ed3947 2589 const Int_t kFirstTDCnumber = 12;
08d6922f 2590
a3ed3947 2591 iDDL=-1, iTRM = 3 , iChain=-1, iTDC=-1, iChannel=-1;
08d6922f 2592 if (detind[1]==0 || detind[1]==1 || (detind[1]==2 && detind[2]<=7)) {
a3ed3947 2593 if (detind[4]<24)
2594 iDDL = detind[0]*4;
2595 else
2596 iDDL = detind[0]*4;
08d6922f 2597 }
2598 else {
a3ed3947 2599 if (detind[4]<24)
2600 iDDL = detind[0]*4+2;
2601 else
2602 iDDL = detind[0]*4+2;
08d6922f 2603 }
a3ed3947 2604
2605 iChain=fgkChainMap24[detind[1]][detind[2]];
2606 iTDC=(Int_t)(fgkChannelMap24[detind[1]][detind[2]]/8)+kFirstTDCnumber;
2607 iChannel=fgkChannelMap24[detind[1]][detind[2]]%8;
08d6922f 2608
2609}
2610
a3ed3947 2611void AliTOFRawStream::LTM2VolumeID(Int_t iDDL,
2612 Int_t iTRM,
2613 Int_t iChain,
2614 Int_t iTDC,
08d6922f 2615 Int_t iChannel,
a3ed3947 2616 Int_t detind0[], Int_t detind1[]) const {
08d6922f 2617 //
2618 // To convert the TOF OR signals equipment ID (i.e. iDDL, iTRM, iChain, iTDC, iChannel)
2619 // into TOF trigger macropad IDs (i.e. detind0 and detind1).
2620 // In general, a couple of neighbouring TOF semi-strip represents a TOF trigger macropad.
2621 //
2622
a3ed3947 2623 const Int_t kFirstTDCnumber = 12;
2624
08d6922f 2625 Int_t iSector0=-1, iModule0=-1, iStrip0=-1, iPadX0=-1; // Le variabili del Volume ID
2626 Int_t iSector1=-1, iModule1=-1, iStrip1=-1, iPadX1=-1; // Le variabili del Volume ID
2627
a3ed3947 2628 if( iDDL%2==1 && iTRM==3 && iTDC-kFirstTDCnumber>=0 && iTDC-kFirstTDCnumber<3 ) {
08d6922f 2629 iSector0 = (Int_t)(iDDL/4);
2630 iSector1 = (Int_t)(iDDL/4);
a3ed3947 2631 Int_t iChan= iChannel+(iTDC-kFirstTDCnumber)*8;
4306fa22 2632 if( iDDL%4 == 1 ){
08d6922f 2633 if(iChain==0){ //CRATE 0
2634 iPadX0=0;
2635 iPadX1=0;
2636 iStrip0=fgkStrip0MapCrate0[iChan];
2637 iStrip1=fgkStrip1MapCrate0[iChan];
2638 iModule0=fgkModule0MapCrate0[iChan];
2639 iModule1=fgkModule1MapCrate0[iChan];
2640 }
2641 if(iChain==1){// CRATE 1
2642 iPadX0=24;
2643 iPadX1=24;
2644 iStrip0=fgkStrip0MapCrate1[iChan];
2645 iStrip1=fgkStrip1MapCrate1[iChan];
2646 iModule0=fgkModule0MapCrate1[iChan];
2647 iModule1=fgkModule1MapCrate1[iChan];
2648 }
2649
2650 }
4306fa22 2651 if( iDDL%4 == 3 ){
08d6922f 2652 if(iChain==1){// CRATE 3
2653 iPadX0=0;
2654 iPadX1=0;
2655 iStrip0=fgkStrip0MapCrate3[iChan];
2656 iStrip1=fgkStrip1MapCrate3[iChan];
2657 iModule0=fgkModule0MapCrate3[iChan];
2658 iModule1=fgkModule1MapCrate3[iChan];
2659 }
2660 if(iChain==0){// CRATE 2
2661 iPadX0=24;
2662 iPadX1=24;
2663 iStrip0=fgkStrip0MapCrate2[iChan];
2664 iStrip1=fgkStrip1MapCrate2[iChan];
2665 iModule0=fgkModule0MapCrate2[iChan];
2666 iModule1=fgkModule1MapCrate2[iChan];
2667 }
2668 }
2669 }
4306fa22 2670
2671 if(iStrip1==-1 || iModule1==-1){
2672 detind1[0]=-1;
2673 detind1[1]=-1;
2674 detind1[2]=-1;
2675 detind1[3]=-1;
2676 detind1[4]=-1;
2677 }
2678 else{
2679 detind1[0]=iSector1;
2680 detind1[1]=iModule1;
2681 detind1[2]=iStrip1;
2682 detind1[3]=iPadX1;
2683 detind1[4]=0;
2684 }
2685
2686 if(iStrip0==-1 || iModule0==-1){
2687 detind0[0]=-1;
2688 detind0[1]=-1;
2689 detind0[2]=-1;
2690 detind0[3]=-1;
2691 detind0[4]=-1;
2692 }
2693 else{
2694 detind0[0]=iSector0;
2695 detind0[1]=iModule0;
2696 detind0[2]=iStrip0;
2697 detind0[3]=iPadX0;
2698 detind0[4]=0;
2699 }
08d6922f 2700}