]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TOF/AliTOFDDLRawData.cxx
Fix for coverity (AdC)
[u/mrichter/AliRoot.git] / TOF / AliTOFDDLRawData.cxx
CommitLineData
7e6dce66 1/**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/*
d0eb8f39 17$Log$
96f01799 18Revision 1.19 2007/06/22 11:37:47 cvetan
19Fixes in order to write correct raw-data on big-endian platforms (Marco)
20
08f92f14 21Revision 1.18 2007/05/21 13:26:19 decaro
22Correction on matching_window control and bug fixing (R.Preghenella)
23
018d19cf 24Revision 1.17 2007/05/10 09:29:34 hristov
25Last moment fixes and changes from v4-05-Release (Silvia)
26
d321691a 27Revision 1.16 2007/05/03 09:07:22 decaro
28Double digit in the same TDC channel. Wrong sequence during the raw data writing in unpacked mode: solved
29
a403781d 30Revision 1.15 2007/04/23 16:51:39 decaro
31Digits-to-raw_data conversion: correction for a more real description (A.De Caro, R.Preghenella)
32
515faf5d 33Revision 1.14 2007/03/28 10:50:33 decaro
34Rounding off problem in rawData coding/decoding: solved
35
d11fc181 36Revision 1.13 2007/02/20 15:57:00 decaro
37Raw data update: to read the TOF raw data defined in UNPACKED mode
38
15ec34b9 39Revision 1.12 2006/08/22 13:29:42 arcelli
40removal of effective c++ warnings (C.Zampolli)
41
655e379f 42Revision 1.11 2006/08/10 14:46:54 decaro
43TOF raw data format: updated version
44
d0eb8f39 45Revision 1.10.1 2006/06/28 A.De Caro
46 Update TOF raw data format
47 according to the final version
48 (see ALICE internal note in preparation
49 'ALICE TOF raw data format')
50
571dda3d 51Revision 0.02 2005/7/25 A.De Caro
52 Update number of bits allocated for time-of-flight
53 and 'charge' measurements
54
7e6dce66 55Revision 0.01 2004/6/11 A.De Caro, S.B.Sellitto, R.Silvestri
56 First implementation: global methods RawDataTOF
57 GetDigits
7e6dce66 58*/
571dda3d 59
d0eb8f39 60////////////////////////////////////////////////////////////////////
61// //
62// This class contains the methods to create the Raw Data files //
63// for the TOF detector starting from the Digits. //
64// In this implementation, we defined the structure //
65// of the ALICE-TOF raw data (according to the //
66// ALICE technical note, in preparation) //
67// starting from the TOF digit format. //
68// //
69////////////////////////////////////////////////////////////////////
7e6dce66 70
0e46b9ae 71#include "Riostream.h"
72
73#include "TBranch.h"
74#include "TClonesArray.h"
75#include "TMath.h"
d0eb8f39 76#include "TRandom.h"
43f77f2d 77
571dda3d 78#include "AliBitPacking.h"
d0eb8f39 79#include "AliDAQ.h"
0e46b9ae 80#include "AliLog.h"
d0eb8f39 81//#include "AliRawDataHeader.h"
82#include "AliRawDataHeaderSim.h"
32ead898 83#include "AliFstream.h"
571dda3d 84
0e46b9ae 85#include "AliTOFDDLRawData.h"
d0eb8f39 86#include "AliTOFDigitMap.h"
7e6dce66 87#include "AliTOFdigit.h"
0e46b9ae 88#include "AliTOFGeometry.h"
571dda3d 89#include "AliTOFRawStream.h"
32ead898 90//#include "AliTOFCableLengthMap.h"
d0eb8f39 91
92extern TRandom *gRandom;
7e6dce66 93
fe7d86eb 94using std::ofstream;
95using std::endl;
96using std::cout;
97using std::ios;
7e6dce66 98ClassImp(AliTOFDDLRawData)
99
d0eb8f39 100//---------------------------------------------------------------------------
655e379f 101AliTOFDDLRawData::AliTOFDDLRawData():
6e4ef37b 102 TObject(),
655e379f 103 fVerbose(0),
104 fIndex(-1),
32ead898 105 fPackedAcquisition(kFALSE),
515faf5d 106 fFakeOrphaneProduction(kFALSE),
107 fMatchingWindow(8192),
655e379f 108 fTOFdigitMap(new AliTOFDigitMap()),
c5cf594b 109 fTOFdigitArray(0x0),
110 fWordsPerDRM(0),
111 fWordsPerTRM(0),
112 fWordsPerChain(0)
7e6dce66 113{
114 //Default constructor
d3c7bfac 115}
d0eb8f39 116//----------------------------------------------------------------------------
117AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
655e379f 118 TObject(source),
8a190ba2 119 fVerbose(source.fVerbose),
120 fIndex(source.fIndex),
121 fPackedAcquisition(source.fPackedAcquisition),
122 fFakeOrphaneProduction(source.fFakeOrphaneProduction),
123 fMatchingWindow(source.fMatchingWindow),
124 fTOFdigitMap(source.fTOFdigitMap),
c5cf594b 125 fTOFdigitArray(source.fTOFdigitArray),
126 fWordsPerDRM(source.fWordsPerDRM),
127 fWordsPerTRM(source.fWordsPerTRM),
128 fWordsPerChain(source.fWordsPerChain)
655e379f 129 {
7e6dce66 130 //Copy Constructor
7e6dce66 131 return;
132}
133
d0eb8f39 134//----------------------------------------------------------------------------
135AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
7e6dce66 136 //Assigment operator
8a190ba2 137
138 if (this == &source)
139 return *this;
140
141 TObject::operator=(source);
142 fIndex=source.fIndex;
143 fVerbose=source.fVerbose;
144 fPackedAcquisition=source.fPackedAcquisition;
145 fFakeOrphaneProduction=source.fFakeOrphaneProduction;
146 fMatchingWindow=source.fMatchingWindow;
147 fTOFdigitMap=source.fTOFdigitMap;
148 fTOFdigitArray=source.fTOFdigitArray;
c5cf594b 149 fWordsPerDRM=source.fWordsPerDRM;
150 fWordsPerTRM=source.fWordsPerTRM;
151 fWordsPerChain=source.fWordsPerChain;
7e6dce66 152 return *this;
153}
154
d321691a 155//----------------------------------------------------------------------------
156AliTOFDDLRawData::~AliTOFDDLRawData()
157{
c5cf594b 158 // dtr
159
d321691a 160 delete fTOFdigitMap;
d321691a 161}
d0eb8f39 162//----------------------------------------------------------------------------
163Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch)
7e6dce66 164{
571dda3d 165 //
166 // This method creates the Raw data files for TOF detector
167 //
168
6e4ef37b 169 const Int_t kSize = 5000; // max number of digits per DDL file times 2
571dda3d 170
7e6dce66 171 UInt_t buf[kSize];
7e6dce66 172
6e4ef37b 173 // To clear the digit indices map for each event
174 fTOFdigitMap->Clear();
175
d0eb8f39 176 fIndex = -1;
177
178 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
7e6dce66 179
6e4ef37b 180 AliFstream* outfile; // logical name of the output file
d0eb8f39 181
d0eb8f39 182 AliRawDataHeaderSim header;
183
571dda3d 184 UInt_t sizeRawData = 0;
7e6dce66 185
d0eb8f39 186 branch->GetEvent();
187
188 GetDigits();
189
3e2f0097 190 //if (!fPackedAcquisition) fMatchingWindow = 2097152;//AdC
191
d0eb8f39 192 Int_t jj = -1;
193 Int_t iDDL = -1;
194 Int_t nDDL = -1;
195 Int_t nTRM = 0;
196 Int_t iChain = -1;
197
7e6dce66 198 //loop over TOF DDL files
d0eb8f39 199 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
571dda3d 200
d6d4cfce 201 char fileName[256]="";
202 strncpy(fileName,AliDAQ::DdlFileName("TOF",nDDL),255); //The name of the output file
571dda3d 203
08f92f14 204 outfile = new AliFstream(fileName);
177b002e 205 iDDL = AliTOFRawStream::GetDDLnumberPerSector(nDDL);
d0eb8f39 206
207 // write Dummy DATA HEADER
08f92f14 208 UInt_t dataHeaderPosition = outfile->Tellp();
209 outfile->WriteBuffer((char*)(&header),sizeof(header));
7e6dce66 210
d0eb8f39 211 // DRM section: trailer
212 MakeDRMtrailer(buf);
7e6dce66 213
d0eb8f39 214 // loop on TRM number per DRM
215 for (nTRM=AliTOFGeometry::NTRM(); nTRM>=3; nTRM--) {
216
c5cf594b 217 fWordsPerTRM = 0;
d0eb8f39 218
219 // the slot number 3 of the even DRM (i.e. right) doesn't contain TDC digit data
220 if (iDDL%2==0 && nTRM==3) continue;
221
d0eb8f39 222 // loop on TRM chain number per TRM
223 for (iChain=AliTOFGeometry::NChain()-1; iChain>=0; iChain--) {
224
225 // TRM chain trailer
c5cf594b 226 MakeTRMchainTrailer(iChain, buf); fWordsPerTRM++;
d0eb8f39 227
228 // TRM TDC digits
c5cf594b 229 MakeTDCdigits(nDDL, nTRM, iChain, buf);
d0eb8f39 230
231 // TRM chain header
c5cf594b 232 MakeTRMchainHeader(nTRM, iChain, buf); fWordsPerTRM++;
d0eb8f39 233
234 } // end loop on iChain
7e6dce66 235
d0eb8f39 236 // TRM global header
c5cf594b 237 MakeTRMheader(nTRM, buf); fWordsPerTRM++;
d0eb8f39 238
239 // TRM filler in case where TRM data number is odd
c5cf594b 240 if ((fWordsPerTRM+1)%2!=0) {
241 MakeTRMfiller(buf); fWordsPerTRM++;
242 }
243
244 MakeTRMtrailer(buf); fWordsPerDRM++;
245
246 fWordsPerDRM += fWordsPerTRM;
d0eb8f39 247
248 } // end loop on nTRM
c5cf594b 249
250
251 // LTM section
252 //fIndex++;
253 //buf[fIndex] = MakeFiller(); fWordsPerDRM++; // valid till when LTM word number was 33
254 MakeLTMtrailer(buf); fWordsPerDRM++;
255 MakeLTMdata(buf); fWordsPerDRM+=48;
256 MakeLTMheader(buf); fWordsPerDRM++;
257
d0eb8f39 258 // DRM section: in
259 MakeDRMheader(nDDL, buf);
260
261 ReverseArray(buf, fIndex+1);
7e6dce66 262
08f92f14 263 outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t)));
7e6dce66 264
d0eb8f39 265 for (jj=0; jj<(fIndex+1); jj++) buf[jj]=0;
266 fIndex = -1;
7e6dce66 267
268 //Write REAL DATA HEADER
08f92f14 269 UInt_t currentFilePosition = outfile->Tellp();
571dda3d 270 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
d0eb8f39 271 header.fSize = currentFilePosition - dataHeaderPosition;
7e6dce66 272 header.SetAttribute(0); // valid data
08f92f14 273 outfile->Seekp(dataHeaderPosition);
274 outfile->WriteBuffer((char*)(&header),sizeof(header));
275 outfile->Seekp(currentFilePosition);
571dda3d 276
08f92f14 277 delete outfile;
7e6dce66 278
d0eb8f39 279 } //end loop on DDL file number
280
281 return 0;
282
283}
284
285//----------------------------------------------------------------------------
286void AliTOFDDLRawData::GetDigits()
287{
288 //
289 // Fill the TOF volumes' map with the TOF digit indices
290 //
291
292 Int_t vol[5] = {-1,-1,-1,-1,-1};
293
294 Int_t digit = -1;
295 Int_t ndigits = fTOFdigitArray->GetEntries();
96b13296 296 AliDebug(2, Form(" Number of read digits = %d",ndigits));
d0eb8f39 297 AliTOFdigit *digs;
298
299 // loop on TOF digits
300 for (digit=0; digit<ndigits; digit++) {
301 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(digit);
302
303 vol[0] = digs->GetSector(); // Sector Number (0-17)
304 vol[1] = digs->GetPlate(); // Plate Number (0-4)
305 vol[2] = digs->GetStrip(); // Strip Number (0-14/18)
306 vol[3] = digs->GetPadx(); // Pad Number in x direction (0-47)
307 vol[4] = digs->GetPadz(); // Pad Number in z direction (0-1)
308
309 fTOFdigitMap->AddDigit(vol, digit);
310
311 } // close loop on digit del TOF
96b13296 312 AliDebug(2,Form(" Number of mapped digits = %d",fTOFdigitMap->GetFilledCellNumber()));
d0eb8f39 313}
314
315//----------------------------------------------------------------------------
316void AliTOFDDLRawData::MakeDRMheader(Int_t nDDL, UInt_t *buf)
317{
318 //
319 // DRM global header
320 //
321
177b002e 322 //Int_t iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
323 Int_t iDDL = AliTOFRawStream::GetDDLnumberPerSector(nDDL);
d0eb8f39 324
177b002e 325 //Int_t iSector = fTOFrawStream->GetSectorNumber(nDDL);
326 Int_t iSector = AliTOFRawStream::GetSectorNumber(nDDL);
d0eb8f39 327
328 UInt_t baseWord=0;
329 UInt_t word;
330
331 // DRM event CRC
332 baseWord=0;
333 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
334 AliBitPacking::PackWord(word,baseWord, 0, 3);
c5cf594b 335 word = 0; // event CRC --> CHANGED
d0eb8f39 336 AliBitPacking::PackWord(word,baseWord, 4,19);
337 word = 0; // reserved for future use
338 AliBitPacking::PackWord(word,baseWord,20,27);
339 word = 4; // 0100 -> DRM header ID
340 AliBitPacking::PackWord(word,baseWord,28,31);
341 fIndex++;
342 buf[fIndex]=baseWord;
343
73620dbf 344 // DRM status header 4
345 baseWord=0;
346 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
347 AliBitPacking::PackWord(word,baseWord, 0, 3);
348 word = 0; // temperature
349 AliBitPacking::PackWord(word,baseWord, 4,13);
350 word = 0; // zero
351 AliBitPacking::PackWord(word,baseWord, 14,14);
352 word = 0; // ACK
353 AliBitPacking::PackWord(word,baseWord, 15,15);
354 word = 0; // Sens AD
355 AliBitPacking::PackWord(word,baseWord, 16,18);
356 word = 0; // zero
357 AliBitPacking::PackWord(word,baseWord, 19,19);
358 word = 0; // reserved for future use
359 AliBitPacking::PackWord(word,baseWord, 20,27);
360 word = 4; // 0100 -> DRM header ID
361 AliBitPacking::PackWord(word,baseWord,28,31);
362 fIndex++;
363 buf[fIndex]=baseWord;
364
d0eb8f39 365 // DRM status header 3
366 baseWord=0;
367 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
368 AliBitPacking::PackWord(word,baseWord, 0, 3);
73620dbf 369 word = 0; // L0 BCID
370 AliBitPacking::PackWord(word,baseWord, 4,15);
371 word = 0; // Run Time info
372 AliBitPacking::PackWord(word,baseWord, 16,27);
d0eb8f39 373 word = 4; // 0100 -> DRM header ID
374 AliBitPacking::PackWord(word,baseWord,28,31);
375 fIndex++;
376 buf[fIndex]=baseWord;
377
378 // DRM status header 2
379 baseWord=0;
380 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
381 AliBitPacking::PackWord(word,baseWord, 0, 3);
382
383 if (iDDL%2==1) {
384 word = 2047; // enable ID: [00000000000;11111111111] for odd
385 // (i.e. right) crates
386 AliBitPacking::PackWord(word,baseWord, 4,14);
387 } else {
388 word = 2045; // enable ID: [00000000000;11111111101] for even
389 // (i.e. left) crates
390 AliBitPacking::PackWord(word,baseWord, 4,14);
391 }
392
393 word = 0; //
394 AliBitPacking::PackWord(word,baseWord,15,15);
395 word = 0; // fault ID
73620dbf 396 AliBitPacking::PackWord(word,baseWord,16,26);
397 word = 0; // RTO
398 AliBitPacking::PackWord(word,baseWord,27,27);
d0eb8f39 399 word = 4; // 0100 -> DRM header ID
400 AliBitPacking::PackWord(word,baseWord,28,31);
401 fIndex++;
402 buf[fIndex]=baseWord;
7e6dce66 403
d0eb8f39 404 // DRM status header 1
405 baseWord=0;
406 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
407 AliBitPacking::PackWord(word,baseWord, 0, 3);
408
409 if (iDDL%2==1) {
410 word = 2047; // slot ID: [00000000000;11111111111] for odd
411 // (i.e. right) crates
412 AliBitPacking::PackWord(word,baseWord, 4,14);
413 } else {
414 word = 2045; // slot ID: [00000000000;11111111101] for even
415 // (i.e. left) crates
416 AliBitPacking::PackWord(word,baseWord, 4,14);
417 }
418
419 word = 1; // LHC clock status: 1/0
420 AliBitPacking::PackWord(word,baseWord,15,15);
73620dbf 421 word = 0; // Vers ID
422 AliBitPacking::PackWord(word,baseWord,16,20);
423 word = 0; // DRMH size
424 AliBitPacking::PackWord(word,baseWord,21,24);
d0eb8f39 425 word = 0; // reserved for future use
73620dbf 426 AliBitPacking::PackWord(word,baseWord,25,27);
d0eb8f39 427 word = 4; // 0100 -> DRM header ID
428 AliBitPacking::PackWord(word,baseWord,28,31);
429 fIndex++;
430 buf[fIndex]=baseWord;
431
432 // DRM global header
433 baseWord=0;
434 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
435 AliBitPacking::PackWord(word,baseWord, 0, 3);
436 word = fIndex+1 + 1; // event words
437 AliBitPacking::PackWord(word,baseWord, 4,20);
438 word = iDDL; // crate ID [0;3]
439 AliBitPacking::PackWord(word,baseWord,21,22);
440 word = iSector; // sector ID [0;17]
441 AliBitPacking::PackWord(word,baseWord,23,27);
442 word = 4; // 0100 -> DRM header ID
443 AliBitPacking::PackWord(word,baseWord,28,31);
444 fIndex++;
445 buf[fIndex]=baseWord;
446
7e6dce66 447}
448
d0eb8f39 449//----------------------------------------------------------------------------
450void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
451{
452 //
453 // DRM global trailer
454 //
455
456 UInt_t baseWord;
457 UInt_t word;
458
459 baseWord=0;
460 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
461 AliBitPacking::PackWord(word,baseWord, 0, 3);
c5cf594b 462 word = 0; // local event counter --> TO BE CHANGED IN fWordsPerDRM+5
d0eb8f39 463 AliBitPacking::PackWord(word,baseWord, 4,15);
464 word = 0; // reserved for future use
465 AliBitPacking::PackWord(word,baseWord,16,27);
466 word = 5; // 0101 -> DRM trailer ID
467 AliBitPacking::PackWord(word,baseWord,28,31);
468 fIndex++;
469 buf[fIndex]=baseWord;
470
471}
472
473//----------------------------------------------------------------------------
474void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
475{
476 //
477 // LTM header
478 //
479
480 UInt_t baseWord;
481 UInt_t word;
482
483 baseWord=0;
484 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
485 AliBitPacking::PackWord(word,baseWord, 0, 3);
486 word = 35; // event words
487 AliBitPacking::PackWord(word,baseWord, 4,16);
488 word = 0; // crc error
489 AliBitPacking::PackWord(word,baseWord,17,17);
490 word = 0; // fault
491 AliBitPacking::PackWord(word,baseWord,18,23);
492 word = 0;
493 AliBitPacking::PackWord(word,baseWord,24,27);
494 word = 4; // 0100 -> LTM header ID
495 AliBitPacking::PackWord(word,baseWord,28,31);
496 fIndex++;
497 buf[fIndex]=baseWord;
498
499}
500
501//----------------------------------------------------------------------------
502void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
503{
504 //
505 // LTM data
506 //
507
508 UInt_t baseWord;
509 UInt_t word;
96b13296 510
d0eb8f39 511 baseWord=0;
96b13296 512 word = 0;
513 AliBitPacking::PackWord(word,baseWord,0,9);
514 word = 0;
d0eb8f39 515 AliBitPacking::PackWord(word,baseWord,10,19);
96b13296 516 word = 0;
d0eb8f39 517 AliBitPacking::PackWord(word,baseWord,20,29);
518 word = 0;
96b13296 519 AliBitPacking::PackWord(word,baseWord,30,30);
520 word = 0;
521 AliBitPacking::PackWord(word,baseWord,31,31);
522
523
524 // OR45, OR46, OR47
525 fIndex++;
526 buf[fIndex]=baseWord;
527
528 // OR42, OR43, OR44
529 fIndex++;
530 buf[fIndex]=baseWord;
531
532 // OR39, OR40, OR41
533 fIndex++;
534 buf[fIndex]=baseWord;
535
536 // OR36, OR37, OR38
537 fIndex++;
538 buf[fIndex]=baseWord;
539
540 // OR33, OR34, OR35
541 fIndex++;
542 buf[fIndex]=baseWord;
543
544 // OR30, OR31, OR32
545 fIndex++;
546 buf[fIndex]=baseWord;
547
548 // OR27, OR28, OR29
549 fIndex++;
550 buf[fIndex]=baseWord;
551
552 // OR24, OR25, OR26
553 fIndex++;
554 buf[fIndex]=baseWord;
555
556 // OR21, OR22, OR23
557 fIndex++;
558 buf[fIndex]=baseWord;
559
560 // OR18, OR19, OR20
561 fIndex++;
562 buf[fIndex]=baseWord;
d0eb8f39 563
96b13296 564 // OR15, OR16, OR17
d0eb8f39 565 fIndex++;
566 buf[fIndex]=baseWord;
567
96b13296 568 // OR12, OR12, OR24
d0eb8f39 569 fIndex++;
570 buf[fIndex]=baseWord;
571
96b13296 572 // OR9, OR10, OR11
d0eb8f39 573 fIndex++;
574 buf[fIndex]=baseWord;
575
96b13296 576 // OR6, OR7, OR8
d0eb8f39 577 fIndex++;
578 buf[fIndex]=baseWord;
579
96b13296 580 // OR3, OR4, OR5
d0eb8f39 581 fIndex++;
582 buf[fIndex]=baseWord;
583
96b13296 584 // OR0, OR1, OR2
585 fIndex++;
586 buf[fIndex]=baseWord;
587
588
589
d0eb8f39 590 baseWord=0;
96b13296 591 word = 100; // Local temperature in LTM11 -> 4 X 25 degree (environment temperature)
d0eb8f39 592 AliBitPacking::PackWord(word,baseWord, 0, 9);
96b13296 593 word = 100; // Local temperature in LTM10 -> 4 X 25 degree (environment temperature)
d0eb8f39 594 AliBitPacking::PackWord(word,baseWord,10,19);
96b13296 595 word = 100; // Local temperature in LTM9 -> 4 X 25 degree (environment temperature)
d0eb8f39 596 AliBitPacking::PackWord(word,baseWord,20,29);
597 word = 0;
96b13296 598 AliBitPacking::PackWord(word,baseWord,30,30);
599 word = 0;
600 AliBitPacking::PackWord(word,baseWord,31,31);
601
602 fIndex++;
603 buf[fIndex]=baseWord;
604
605 // Local temperature in LTM8, LMT7, LTM6 -> 4 X 25 degree (environment temperature)
606 fIndex++;
607 buf[fIndex]=baseWord;
608
609 // Local temperature in LTM5, LMT4, LTM3 -> 4 X 25 degree (environment temperature)
610 fIndex++;
611 buf[fIndex]=baseWord;
612
613 // Local temperature in LTM2, LMT1, LTM0 -> 4 X 25 degree (environment temperature)
614 fIndex++;
615 buf[fIndex]=baseWord;
616
617
d0eb8f39 618
96b13296 619 // Local temperature in T7, T6, T5 -> 4 X 25 degree (environment temperature)
d0eb8f39 620 fIndex++;
621 buf[fIndex]=baseWord;
622
96b13296 623 // Local temperature in T4, T3, T2 -> 4 X 25 degree (environment temperature)
d0eb8f39 624 fIndex++;
625 buf[fIndex]=baseWord;
626
96b13296 627 // Local temperature in T1, T0 -> 4 X 25 degree (environment temperature)
628 // Local temperature in VTH15 -> Thereshould voltage for FEAC15
629 fIndex++;
630 buf[fIndex]=baseWord;
631
632 baseWord=0;
633 word = 0; // VTH13 -> Thereshould voltage for FEAC16
634 AliBitPacking::PackWord(word,baseWord, 0, 9);
635 word = 0; // VTH14 -> Thereshould voltage for FEAC14
636 AliBitPacking::PackWord(word,baseWord,10,19);
637 word = 0; // GND-FEAC7 -> Voltage drop between GND and FEAC7
638 AliBitPacking::PackWord(word,baseWord,20,29);
639 word = 0;
640 AliBitPacking::PackWord(word,baseWord,30,30);
641 word = 0;
642 AliBitPacking::PackWord(word,baseWord,31,31);
643
d0eb8f39 644 fIndex++;
645 buf[fIndex]=baseWord;
646
647 // VTH11 -> Thereshould voltage for FEAC11
d0eb8f39 648 // VTH12 -> Thereshould voltage for FEAC12
96b13296 649 // GND-FEAC6 -> Voltage drop between GND and FEAC6
d0eb8f39 650 fIndex++;
651 buf[fIndex]=baseWord;
652
96b13296 653 // VTH9 -> Thereshould voltage for FEAC11
654 // VTH10 -> Thereshould voltage for FEAC12
655 // GND-FEAC5 -> Voltage drop between GND and FEAC6
d0eb8f39 656 fIndex++;
657 buf[fIndex]=baseWord;
658
96b13296 659 // VTH7 -> Thereshould voltage for FEAC11
660 // VTH8 -> Thereshould voltage for FEAC12
661 // GND-FEAC4 -> Voltage drop between GND and FEAC6
d0eb8f39 662 fIndex++;
663 buf[fIndex]=baseWord;
664
96b13296 665 // VTH5 -> Thereshould voltage for FEAC11
666 // VTH6 -> Thereshould voltage for FEAC12
667 // GND-FEAC3 -> Voltage drop between GND and FEAC6
d0eb8f39 668 fIndex++;
669 buf[fIndex]=baseWord;
670
96b13296 671 // VTH3 -> Thereshould voltage for FEAC11
672 // VTH4 -> Thereshould voltage for FEAC12
673 // GND-FEAC2 -> Voltage drop between GND and FEAC6
d0eb8f39 674 fIndex++;
675 buf[fIndex]=baseWord;
676
96b13296 677 // VTH1 -> Thereshould voltage for FEAC11
678 // VTH2 -> Thereshould voltage for FEAC12
679 // GND-FEAC1 -> Voltage drop between GND and FEAC6
d0eb8f39 680 fIndex++;
681 buf[fIndex]=baseWord;
682
96b13296 683 // LV15
684 // VTH0 -> Thereshould voltage for FEAC12
685 // GND-FEAC0 -> Voltage drop between GND and FEAC6
d0eb8f39 686 fIndex++;
687 buf[fIndex]=baseWord;
688
96b13296 689 // LV15
690 // VTH0 -> Thereshould voltage for FEAC12
691 // GND-FEAC0 -> Voltage drop between GND and FEAC6
d0eb8f39 692 fIndex++;
693 buf[fIndex]=baseWord;
694
96b13296 695 // LV12
696 // LV13
697 // LV14
d0eb8f39 698 fIndex++;
699 buf[fIndex]=baseWord;
700
96b13296 701 // LV9
702 // LV10
703 // LV11
d0eb8f39 704 fIndex++;
705 buf[fIndex]=baseWord;
706
96b13296 707 // LV6
708 // LV7
709 // LV8
d0eb8f39 710 fIndex++;
711 buf[fIndex]=baseWord;
712
96b13296 713 // LV3
714 // LV4
715 // LV5
d0eb8f39 716 fIndex++;
717 buf[fIndex]=baseWord;
718
96b13296 719 // LV0
720 // LV1
721 // LV2
d0eb8f39 722 fIndex++;
723 buf[fIndex]=baseWord;
724
725
96b13296 726
d0eb8f39 727 baseWord=0;
96b13296 728 word = 0; // PDL45 -> Delay Line setting for PDL41
d0eb8f39 729 AliBitPacking::PackWord(word,baseWord, 0, 7);
96b13296 730 word = 0; // PDL46 -> Delay Line setting for PDL42
d0eb8f39 731 AliBitPacking::PackWord(word,baseWord, 8,15);
96b13296 732 word = 0; // PDL47 -> Delay Line setting for PDL43
d0eb8f39 733 AliBitPacking::PackWord(word,baseWord,16,23);
96b13296 734 word = 0; // PDL48 -> Delay Line setting for PDL44
d0eb8f39 735 AliBitPacking::PackWord(word,baseWord,24,31);
736 fIndex++;
737 buf[fIndex]=baseWord;
738
d0eb8f39 739 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
740 fIndex++;
741 buf[fIndex]=baseWord;
742
743 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
744 fIndex++;
745 buf[fIndex]=baseWord;
746
747 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
748 fIndex++;
749 buf[fIndex]=baseWord;
750
751 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
752 fIndex++;
753 buf[fIndex]=baseWord;
754
755 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
756 fIndex++;
757 buf[fIndex]=baseWord;
758
759 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
760 fIndex++;
761 buf[fIndex]=baseWord;
762
763 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
764 fIndex++;
765 buf[fIndex]=baseWord;
766
767 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
768 fIndex++;
769 buf[fIndex]=baseWord;
770
771 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
772 fIndex++;
773 buf[fIndex]=baseWord;
774
775 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
776 fIndex++;
777 buf[fIndex]=baseWord;
778
779}
780
781//----------------------------------------------------------------------------
782void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
783{
784 //
785 // LTM trailer
786 //
787
788 UInt_t baseWord;
789 UInt_t word;
790
791 baseWord=0;
792 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
793 AliBitPacking::PackWord(word,baseWord, 0, 3);
794 word = 0; // event crc
795 AliBitPacking::PackWord(word,baseWord, 4,15);
796 word = 0; // event number
797 AliBitPacking::PackWord(word,baseWord,16,27);
798 word = 5; // 0101 -> LTM trailer ID
799 AliBitPacking::PackWord(word,baseWord,28,31);
800 fIndex++;
801 buf[fIndex]=baseWord;
802
803}
804
805//----------------------------------------------------------------------------
806void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
807{
808 //
809 // TRM header for the TRM number nTRM [ 3;12]
810 //
811
812 if (nTRM<3 || nTRM>12) {
813 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
814 return;
815 }
816
817 UInt_t baseWord;
818 UInt_t word;
819
820 baseWord = 0;
821 word = nTRM; // TRM data coming from the VME slot number nTRM
822 AliBitPacking::PackWord(word,baseWord, 0, 3);
823 word = 0; // event words
824 AliBitPacking::PackWord(word,baseWord, 4,16);
15ec34b9 825
826 if (fPackedAcquisition)
827 word = 0; // ACQuisition mode: [0;3] see document
828 else
829 word = 3; // ACQuisition mode: [0;3] see document
d0eb8f39 830 AliBitPacking::PackWord(word,baseWord,17,18);
831 word = 0; // description of a SEU inside LUT tables for INL compensation;
832 // the data are unaffected
833 AliBitPacking::PackWord(word,baseWord,19,19);
834 word = 0; // Must Be Zero (MBZ)
835 AliBitPacking::PackWord(word,baseWord,20,27);
836 word = 4; // 0100 -> TRM header ID
837 AliBitPacking::PackWord(word,baseWord,28,31);
838 fIndex++;
839 buf[fIndex]=baseWord;
840
841}
842
843//----------------------------------------------------------------------------
844void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
845{
846 //
c5cf594b 847 // Set TRM Global Trailer
848 // with the calculated CRC
d0eb8f39 849 //
850
851 UInt_t baseWord;
852 UInt_t word;
853
854 baseWord=0;
855 word = 15; // 1111 -> TRM trailer ID 1
856 AliBitPacking::PackWord(word,baseWord, 0, 3);
c5cf594b 857
858 UInt_t trmCRC=0x0;
859 for (Int_t ii=fIndex-(fWordsPerTRM-1); ii<fIndex; ii++)
860 trmCRC ^= buf[ii];
b035d4ce 861 //PH printf(" A trmCRC=%d\n",trmCRC);
c5cf594b 862
863 word = 0x0;
864 word ^= ( (trmCRC & 0x00000fff) >> 0);
865 word ^= ( (trmCRC & 0x00fff000) >> 12);
866 word ^= ( (trmCRC & 0xff000000) >> 24);
867
b035d4ce 868 //PH printf(" B trmCRC=%d\n",word);
c5cf594b 869
870 AliBitPacking::PackWord(word,baseWord, 4,15); // event CRC --> CHANGED
871
872 word = 0; // local event counter == DRM local event counter --> TO BE CHANGED
d0eb8f39 873 AliBitPacking::PackWord(word,baseWord,16,27);
874 word = 5; // 0101 -> TRM trailer ID 2
875 AliBitPacking::PackWord(word,baseWord,28,31);
c5cf594b 876
d0eb8f39 877 fIndex++;
c5cf594b 878 for (Int_t ii=fIndex; ii>fIndex-fWordsPerTRM; ii--)
879 buf[ii]=buf[ii-1];
d0eb8f39 880
c5cf594b 881 buf[fIndex-fWordsPerTRM] = baseWord;
d0eb8f39 882
c5cf594b 883}
884
d0eb8f39 885//----------------------------------------------------------------------------
886void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
887 UInt_t *buf)
888{
889 //
890 // TRM chain header
891 //
892
893 UInt_t baseWord;
894 UInt_t word;
895
896 if (nTRM<3 || nTRM>12) {
897 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
898 return;
899 }
900
901 if (iChain<0 || iChain>1) {
902 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
903 return;
904 }
905
906 baseWord=0;
907 word = nTRM; // TRM data coming from the VME slot ID nTRM
908 AliBitPacking::PackWord(word,baseWord, 0, 3);
909 word = 0; // bunch ID
910 AliBitPacking::PackWord(word,baseWord, 4,15);
c5cf594b 911 word = 0;//100; // PB24 temperature -> 4 X 25 degree (environment temperature)
d0eb8f39 912 AliBitPacking::PackWord(word,baseWord,16,23);
c5cf594b 913 word = 0;//(Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
d0eb8f39 914 AliBitPacking::PackWord(word,baseWord,24,26);
915 word = 0; // TS
916 AliBitPacking::PackWord(word,baseWord,27,27);
917 switch (iChain) {
918 case 0:
919 word = 0; // 0000 -> TRM chain 0 ID
920 break;
921 case 1:
922 word = 2; // 0010 -> TRM chain 1 ID
923 break;
924 }
925 AliBitPacking::PackWord(word,baseWord,28,31);
926 fIndex++;
927 buf[fIndex]=baseWord;
928
929}
930
931//----------------------------------------------------------------------------
c5cf594b 932void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf)
d0eb8f39 933{
934 //
935 // TRM filler
936 //
937
938 Int_t jj = -1;
939
940 fIndex++;
c5cf594b 941 for (jj=fIndex; jj>fIndex-fWordsPerTRM; jj--)
d0eb8f39 942 buf[jj] = buf[jj-1];
d0eb8f39 943
c5cf594b 944 buf[fIndex-fWordsPerTRM] = MakeFiller();
d0eb8f39 945
946}
947
948//----------------------------------------------------------------------------
3407e19b 949UInt_t AliTOFDDLRawData::MakeFiller() const
d0eb8f39 950{
951 //
952 // Filler word definition: to make even the number of words per TRM/LTM
953 //
954
955 UInt_t baseWord;
956 UInt_t word;
957
958 baseWord=0;
959 word = 0; // 0000 -> filler ID 1
960 AliBitPacking::PackWord(word,baseWord, 0, 3);
961 word = 0; // MBZ
962 AliBitPacking::PackWord(word,baseWord, 4,27);
963 word = 7; // 0111 -> filler ID 2
964 AliBitPacking::PackWord(word,baseWord, 28,31);
965
966 return baseWord;
967
968}
969
970//----------------------------------------------------------------------------
971void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
972{
973 //
974 // TRM chain trailer
975 //
976
977 if (iChain<0 || iChain>1) {
978 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
979 return;
980 }
981
982 UInt_t baseWord;
983 UInt_t word;
984
985 baseWord=0;
986 word = 0; // status
987 AliBitPacking::PackWord(word,baseWord, 0, 3);
988 word = 0; // MBZ
989 AliBitPacking::PackWord(word,baseWord, 4,15);
c5cf594b 990 word = 0; // event counter --> TO BE CHANGED
d0eb8f39 991 AliBitPacking::PackWord(word,baseWord,16,27);
992 switch (iChain) {
993 case 0:
994 word = 1; // 0001 -> TRM chain 0 trailer ID
995 break;
996 case 1:
997 word = 3; // 0011 -> TRM chain 1 trailer ID
998 break;
999 }
1000 AliBitPacking::PackWord(word,baseWord,28,31);
1001 fIndex++;
1002 buf[fIndex]=baseWord;
1003
1004}
1005
1006//----------------------------------------------------------------------------
c5cf594b 1007void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain, UInt_t *buf)
d0eb8f39 1008{
1009 //
1010 // TRM TDC digit
1011 //
1012
96f01799 1013 const Double_t kOneMoreFilledCell = 1./(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
1014 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
15ec34b9 1015
d0eb8f39 1016 if (nDDL<0 || nDDL>71) {
1017 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
1018 return;
1019 }
1020
1021 if (nTRM<3 || nTRM>12) {
1022 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
1023 return;
1024 }
1025
1026 if (iChain<0 || iChain>1) {
1027 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
1028 return;
1029 }
1030
15ec34b9 1031 UInt_t localBuffer[1000];
1032 Int_t localIndex = -1;
1033
d0eb8f39 1034 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1035
1036 Int_t volume[5] = {-1, -1, -1, -1, -1};
1037 Int_t indexDigit[3] = {-1, -1, -1};
1038
1039 Int_t totCharge = -1;
1040 Int_t timeOfFlight = -1;
1041
15ec34b9 1042 Int_t trailingSpurious = -1;
1043 Int_t leadingSpurious = -1;
1044
d0eb8f39 1045 AliTOFdigit *digs;
1046
1047 UInt_t baseWord=0;
1048 UInt_t word=0;
1049
1050 Int_t jj = -1;
1051 Int_t nTDC = -1;
1052 Int_t iCH = -1;
1053
a403781d 1054 //Int_t numberOfMeasuresPerChannel = 0;
1055 //Int_t maxMeasuresPerChannelInTDC = 0;
515faf5d 1056
1057 Bool_t outOut = HeadOrTail();
1058
d0eb8f39 1059 ofstream ftxt;
1060
1061 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
1062
1063 for (jj=0; jj<5; jj++) volume[jj] = -1;
1064
1065 // loop on TDC number
1066 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
1067
1068 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
1069 // for TDC numbers 3-14
96b13296 1070 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3)!=0) continue;
d0eb8f39 1071
1072 // loop on TDC channel number
1073 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
1074
a403781d 1075 //numberOfMeasuresPerChannel = 0;
515faf5d 1076
96b13296 1077 for (Int_t aa=0; aa<5; aa++) volume[aa]=-1;
177b002e 1078 AliTOFRawStream::EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
d0eb8f39 1079
96b13296 1080 AliDebug(3,Form(" volume -> %2d %1d %2d %2d %1d",volume[0],volume[1],volume[2],volume[3],volume[4]));
1081
d0eb8f39 1082 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
1083 volume[3]==-1 || volume[4]==-1) continue;
d0eb8f39 1084
96b13296 1085 AliDebug(3,Form(" ====== %2d %1d %2d %2d %1d",volume[0],volume[1],volume[2],volume[3],volume[4]));
1086
d0eb8f39 1087 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
1088
1089 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
1090
15ec34b9 1091 if (indexDigit[0]<0) {
1092
515faf5d 1093 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1094 leadingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1095
515faf5d 1096 if ( fFakeOrphaneProduction &&
1097 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
1098 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
15ec34b9 1099
1100 percentFilledCells+=kOneMoreFilledCell;
1101
1102 Int_t dummyPS = 0;
1103
515faf5d 1104 if (outOut) {
15ec34b9 1105 word = trailingSpurious; // trailing edge measurement
1106 dummyPS = 2;
1107 }
1108 else {
1109 word = leadingSpurious; // leading edge measurement
1110 dummyPS = 1;
1111 }
1112
1113 if (fVerbose==2) {
1114 if (nDDL<10) ftxt << " " << nDDL;
1115 else ftxt << " " << nDDL;
1116 if (nTRM<10) ftxt << " " << nTRM;
1117 else ftxt << " " << nTRM;
1118 ftxt << " " << iChain;
1119 if (nTDC<10) ftxt << " " << nTDC;
1120 else ftxt << " " << nTDC;
1121 ftxt << " " << iCH;
1122 if (volume[0]<10) ftxt << " -> " << volume[0];
1123 else ftxt << " -> " << volume[0];
1124 ftxt << " " << volume[1];
1125 if (volume[2]<10) ftxt << " " << volume[2];
1126 else ftxt << " " << volume[2];
1127 ftxt << " " << volume[4];
1128 if (volume[3]<10) ftxt << " " << volume[3];
1129 else ftxt << " " << volume[3];
515faf5d 1130 ftxt << " " << -1;
1131 if (word<10) ftxt << " " << word;
1132 else if (word>=10 && word<100) ftxt << " " << word;
1133 else if (word>=100 && word<1000) ftxt << " " << word;
1134 else if (word>=1000 && word<10000) ftxt << " " << word;
1135 else if (word>=10000 && word<100000) ftxt << " " << word;
1136 else if (word>=100000 && word<1000000) ftxt << " " << word;
1137 else ftxt << " " << word;
1138 ftxt << " " << dummyPS << endl;
15ec34b9 1139 }
1140
1141 AliBitPacking::PackWord(word,baseWord, 0,20);
1142 word = iCH; // TDC channel ID [0;7]
1143 AliBitPacking::PackWord(word,baseWord,21,23);
1144 word = nTDC; // TDC ID [0;14]
1145 AliBitPacking::PackWord(word,baseWord,24,27);
1146 word = 0; // error flag
1147 AliBitPacking::PackWord(word,baseWord,28,28);
1148 word = dummyPS; // Packing Status [0;3]
1149 AliBitPacking::PackWord(word,baseWord,29,30);
1150 word = 1; // TRM TDC digit ID
1151 AliBitPacking::PackWord(word,baseWord,31,31);
1152
c5cf594b 1153 localIndex++; fWordsPerTRM++;
15ec34b9 1154 localBuffer[localIndex]=baseWord;
701ac4b0 1155 //psArray[localIndex]=dummyPS;
15ec34b9 1156
15ec34b9 1157 baseWord=0;
1158
515faf5d 1159 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
15ec34b9 1160 } // if (indexDigit[0]<0)
1161
d0eb8f39 1162 for (jj=0; jj<3;jj++) {
1163
1164 if (indexDigit[jj]<0) continue;
a403781d 1165
96b13296 1166 AliDebug(3,Form(" ====== %2d %1d %2d %2d %1d -> %1d %d",volume[0],volume[1],volume[2],volume[3],volume[4],jj,indexDigit[jj]));
1167
d0eb8f39 1168 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1169
1170 if (digs->GetSector()!=volume[0] ||
1171 digs->GetPlate() !=volume[1] ||
1172 digs->GetStrip() !=volume[2] ||
1173 digs->GetPadx() !=volume[3] ||
6e4ef37b 1174 digs->GetPadz() !=volume[4]) AliWarning(Form(" --- ERROR --- %2i (%2i) %1i (%1i) %2i (%2i) %2i (%2i) %1i (%1i)",
1175 digs->GetSector(), volume[0],
1176 digs->GetPlate(), volume[1],
1177 digs->GetStrip(), volume[2],
1178 digs->GetPadx(), volume[3],
1179 digs->GetPadz(), volume[4])
1180 );
d0eb8f39 1181
96b13296 1182 timeOfFlight = (Int_t)(digs->GetTdc());
1183 /*+
cfceaf15 1184 fTOFCableLengthMap->GetCableTimeShiftBin(nDDL, nTRM, iChain, nTDC)*/;
d11fc181 1185
cfceaf15 1186 //if (timeOfFlight>=fMatchingWindow+1000) continue; // adc
96b13296 1187 //if (timeOfFlight>=fMatchingWindow) continue; // adc
1188 if (digs->GetTdcND()>=fMatchingWindow) {
1189 AliDebug(2,"Out of matching window.");
1190 continue; // adc
1191 }
1192 else AliDebug(2,"In matching window");
515faf5d 1193
a403781d 1194 //numberOfMeasuresPerChannel++;
1195
515faf5d 1196 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1197 totCharge = (Int_t)(digs->GetToT());
d0eb8f39 1198 // temporary control
d11fc181 1199 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
d0eb8f39 1200
15ec34b9 1201 if (fPackedAcquisition) {
1202
d0eb8f39 1203 if (fVerbose==2) {
1204 if (nDDL<10) ftxt << " " << nDDL;
1205 else ftxt << " " << nDDL;
1206 if (nTRM<10) ftxt << " " << nTRM;
1207 else ftxt << " " << nTRM;
1208 ftxt << " " << iChain;
1209 if (nTDC<10) ftxt << " " << nTDC;
1210 else ftxt << " " << nTDC;
1211 ftxt << " " << iCH;
1212 if (volume[0]<10) ftxt << " -> " << volume[0];
1213 else ftxt << " -> " << volume[0];
1214 ftxt << " " << volume[1];
1215 if (volume[2]<10) ftxt << " " << volume[2];
1216 else ftxt << " " << volume[2];
1217 ftxt << " " << volume[4];
1218 if (volume[3]<10) ftxt << " " << volume[3];
1219 else ftxt << " " << volume[3];
515faf5d 1220 if (totCharge<10) ftxt << " " << totCharge;
1221 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1222 else ftxt << " " << totCharge;
1223 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1224 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1225 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1226 else ftxt << " " << timeOfFlight << endl;
d0eb8f39 1227 }
1228
515faf5d 1229 word = timeOfFlight%8192; // time-of-fligth measurement
d0eb8f39 1230 AliBitPacking::PackWord(word,baseWord, 0,12);
1231
515faf5d 1232 if (totCharge>=256) totCharge = 255;
d0eb8f39 1233 word = totCharge; // time-over-threshould measurement
1234 AliBitPacking::PackWord(word,baseWord,13,20);
1235
1236 word = iCH; // TDC channel ID [0;7]
1237 AliBitPacking::PackWord(word,baseWord,21,23);
1238 word = nTDC; // TDC ID [0;14]
1239 AliBitPacking::PackWord(word,baseWord,24,27);
1240 word = 0; // error flag
1241 AliBitPacking::PackWord(word,baseWord,28,28);
15ec34b9 1242 word = 0; // Packing Status [0;3]
1243 AliBitPacking::PackWord(word,baseWord,29,30);
1244 word = 1; // TRM TDC digit ID
1245 AliBitPacking::PackWord(word,baseWord,31,31);
1246
c5cf594b 1247 localIndex++; fWordsPerTRM++;
15ec34b9 1248 localBuffer[localIndex]=baseWord;
1249
15ec34b9 1250 baseWord=0;
1251
515faf5d 1252 if ( fFakeOrphaneProduction &&
1253 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
15ec34b9 1254
1255 percentFilledCells+=kOneMoreFilledCell;
1256
515faf5d 1257 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1258 leadingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1259
1260 Int_t dummyPS = 0;
1261
515faf5d 1262 if (outOut) {
15ec34b9 1263 word = trailingSpurious; // trailing edge measurement
1264 dummyPS = 2;
1265 }
1266 else {
1267 word = leadingSpurious; // leading edge measurement
1268 dummyPS = 1;
1269 }
1270
1271 if (fVerbose==2) {
1272 if (nDDL<10) ftxt << " " << nDDL;
1273 else ftxt << " " << nDDL;
1274 if (nTRM<10) ftxt << " " << nTRM;
1275 else ftxt << " " << nTRM;
1276 ftxt << " " << iChain;
1277 if (nTDC<10) ftxt << " " << nTDC;
1278 else ftxt << " " << nTDC;
1279 ftxt << " " << iCH;
1280 if (volume[0]<10) ftxt << " -> " << volume[0];
1281 else ftxt << " -> " << volume[0];
1282 ftxt << " " << volume[1];
1283 if (volume[2]<10) ftxt << " " << volume[2];
1284 else ftxt << " " << volume[2];
1285 ftxt << " " << volume[4];
1286 if (volume[3]<10) ftxt << " " << volume[3];
1287 else ftxt << " " << volume[3];
515faf5d 1288 ftxt << " " << -1;
1289 if (word<10) ftxt << " " << word;
1290 else if (word>=10 && word<100) ftxt << " " << word;
1291 else if (word>=100 && word<1000) ftxt << " " << word;
1292 else if (word>=1000 && word<10000) ftxt << " " << word;
1293 else if (word>=10000 && word<100000) ftxt << " " << word;
1294 else if (word>=100000 && word<1000000) ftxt << " " << word;
1295 else ftxt << " " << word;
1296 ftxt << " " << dummyPS << endl;
15ec34b9 1297 }
1298
1299 AliBitPacking::PackWord(word,baseWord, 0,20);
1300 word = iCH; // TDC channel ID [0;7]
1301 AliBitPacking::PackWord(word,baseWord,21,23);
1302 word = nTDC; // TDC ID [0;14]
1303 AliBitPacking::PackWord(word,baseWord,24,27);
1304 word = 0; // error flag
1305 AliBitPacking::PackWord(word,baseWord,28,28);
1306 word = dummyPS; // Packing Status [0;3]
1307 AliBitPacking::PackWord(word,baseWord,29,30);
1308 word = 1; // TRM TDC digit ID
1309 AliBitPacking::PackWord(word,baseWord,31,31);
1310
c5cf594b 1311 localIndex++; fWordsPerTRM++;
15ec34b9 1312 localBuffer[localIndex]=baseWord;
701ac4b0 1313 //psArray[localIndex]=dummyPS;
15ec34b9 1314
15ec34b9 1315 baseWord=0;
1316
515faf5d 1317 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
15ec34b9 1318
1319
1320 } // if (fPackedAcquisition)
1321 else { // if (!fPackedAcquisition)
1322
515faf5d 1323 if ( fFakeOrphaneProduction &&
1324 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
15ec34b9 1325
1326 percentFilledCells+=kOneMoreFilledCell;
1327
515faf5d 1328 trailingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1329 word = trailingSpurious;
1330 Int_t dummyPS = 2;
1331
1332 if (fVerbose==2) {
1333 if (nDDL<10) ftxt << " " << nDDL;
1334 else ftxt << " " << nDDL;
1335 if (nTRM<10) ftxt << " " << nTRM;
1336 else ftxt << " " << nTRM;
1337 ftxt << " " << iChain;
1338 if (nTDC<10) ftxt << " " << nTDC;
1339 else ftxt << " " << nTDC;
1340 ftxt << " " << iCH;
1341 if (volume[0]<10) ftxt << " -> " << volume[0];
1342 else ftxt << " -> " << volume[0];
1343 ftxt << " " << volume[1];
1344 if (volume[2]<10) ftxt << " " << volume[2];
1345 else ftxt << " " << volume[2];
1346 ftxt << " " << volume[4];
1347 if (volume[3]<10) ftxt << " " << volume[3];
1348 else ftxt << " " << volume[3];
515faf5d 1349 ftxt << " " << -1;
1350 if (word<10) ftxt << " " << word;
1351 else if (word>=10 && word<100) ftxt << " " << word;
1352 else if (word>=100 && word<1000) ftxt << " " << word;
1353 else if (word>=1000 && word<10000) ftxt << " " << word;
1354 else if (word>=10000 && word<100000) ftxt << " " << word;
1355 else if (word>=100000 && word<1000000) ftxt << " " << word;
1356 else ftxt << " " << word;
1357 ftxt << " " << dummyPS << endl;
15ec34b9 1358 }
1359
1360 AliBitPacking::PackWord(word,baseWord, 0,20);
1361 word = iCH; // TDC channel ID [0;7]
1362 AliBitPacking::PackWord(word,baseWord,21,23);
1363 word = nTDC; // TDC ID [0;14]
1364 AliBitPacking::PackWord(word,baseWord,24,27);
1365 word = 0; // error flag
1366 AliBitPacking::PackWord(word,baseWord,28,28);
1367 word = dummyPS; // Packing Status [0;3]
1368 AliBitPacking::PackWord(word,baseWord,29,30);
1369 word = 1; // TRM TDC digit ID
1370 AliBitPacking::PackWord(word,baseWord,31,31);
1371
c5cf594b 1372 localIndex++; fWordsPerTRM++;
15ec34b9 1373 localBuffer[localIndex]=baseWord;
701ac4b0 1374 //psArray[localIndex]=dummyPS;
15ec34b9 1375
15ec34b9 1376 baseWord=0;
1377
515faf5d 1378 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
15ec34b9 1379
1380
515faf5d 1381 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
15ec34b9 1382
1383 if (fVerbose==2) {
1384 if (nDDL<10) ftxt << " " << nDDL;
1385 else ftxt << " " << nDDL;
1386 if (nTRM<10) ftxt << " " << nTRM;
1387 else ftxt << " " << nTRM;
1388 ftxt << " " << iChain;
1389 if (nTDC<10) ftxt << " " << nTDC;
1390 else ftxt << " " << nTDC;
1391 ftxt << " " << iCH;
1392 if (volume[0]<10) ftxt << " -> " << volume[0];
1393 else ftxt << " -> " << volume[0];
1394 ftxt << " " << volume[1];
1395 if (volume[2]<10) ftxt << " " << volume[2];
1396 else ftxt << " " << volume[2];
1397 ftxt << " " << volume[4];
1398 if (volume[3]<10) ftxt << " " << volume[3];
1399 else ftxt << " " << volume[3];
515faf5d 1400 ftxt << " " << -1;
1401 if (word<10) ftxt << " " << word;
1402 else if (word>=10 && word<100) ftxt << " " << word;
1403 else if (word>=100 && word<1000) ftxt << " " << word;
1404 else if (word>=1000 && word<10000) ftxt << " " << word;
1405 else if (word>=10000 && word<100000) ftxt << " " << word;
1406 else if (word>=100000 && word<1000000) ftxt << " " << word;
1407 else ftxt << " " << word;
1408 ftxt << " " << 2 << endl;
15ec34b9 1409 }
1410
1411 AliBitPacking::PackWord(word,baseWord, 0,20);
1412
1413 word = iCH; // TDC channel ID [0;7]
1414 AliBitPacking::PackWord(word,baseWord,21,23);
1415 word = nTDC; // TDC ID [0;14]
1416 AliBitPacking::PackWord(word,baseWord,24,27);
1417 word = 0; // error flag
1418 AliBitPacking::PackWord(word,baseWord,28,28);
1419 word = 2; // Packing Status [0;3]
d0eb8f39 1420 AliBitPacking::PackWord(word,baseWord,29,30);
1421 word = 1; // TRM TDC digit ID
1422 AliBitPacking::PackWord(word,baseWord,31,31);
15ec34b9 1423
c5cf594b 1424 localIndex++; fWordsPerTRM++;
15ec34b9 1425 localBuffer[localIndex]=baseWord;
701ac4b0 1426 //psArray[localIndex]=2;
d0eb8f39 1427
d0eb8f39 1428 baseWord=0;
1429
515faf5d 1430 word = timeOfFlight%2097152; // leading edge measurement
15ec34b9 1431
1432 if (fVerbose==2) {
1433 if (nDDL<10) ftxt << " " << nDDL;
1434 else ftxt << " " << nDDL;
1435 if (nTRM<10) ftxt << " " << nTRM;
1436 else ftxt << " " << nTRM;
1437 ftxt << " " << iChain;
1438 if (nTDC<10) ftxt << " " << nTDC;
1439 else ftxt << " " << nTDC;
1440 ftxt << " " << iCH;
1441 if (volume[0]<10) ftxt << " -> " << volume[0];
1442 else ftxt << " -> " << volume[0];
1443 ftxt << " " << volume[1];
1444 if (volume[2]<10) ftxt << " " << volume[2];
1445 else ftxt << " " << volume[2];
1446 ftxt << " " << volume[4];
1447 if (volume[3]<10) ftxt << " " << volume[3];
1448 else ftxt << " " << volume[3];
515faf5d 1449 ftxt << " " << -1;
1450 if (word<10) ftxt << " " << word;
1451 else if (word>=10 && word<100) ftxt << " " << word;
1452 else if (word>=100 && word<1000) ftxt << " " << word;
1453 else if (word>=1000 && word<10000) ftxt << " " << word;
1454 else if (word>=10000 && word<100000) ftxt << " " << word;
1455 else if (word>=100000 && word<1000000) ftxt << " " << word;
1456 else ftxt << " " << word;
1457 ftxt << " " << 1 << endl;
15ec34b9 1458 }
1459
1460 AliBitPacking::PackWord(word,baseWord, 0,20);
1461
1462 word = iCH; // TDC channel ID [0;7]
1463 AliBitPacking::PackWord(word,baseWord,21,23);
1464 word = nTDC; // TDC ID [0;14]
1465 AliBitPacking::PackWord(word,baseWord,24,27);
1466 word = 0; // error flag
1467 AliBitPacking::PackWord(word,baseWord,28,28);
1468 word = 1; // Packing Status [0;3]
1469 AliBitPacking::PackWord(word,baseWord,29,30);
1470 word = 1; // TRM TDC digit ID
1471 AliBitPacking::PackWord(word,baseWord,31,31);
1472
c5cf594b 1473 localIndex++; fWordsPerTRM++;
15ec34b9 1474 localBuffer[localIndex]=baseWord;
701ac4b0 1475 //psArray[localIndex]=1;
15ec34b9 1476
15ec34b9 1477 baseWord=0;
1478
1479
515faf5d 1480 if ( fFakeOrphaneProduction &&
1481 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
15ec34b9 1482
1483 percentFilledCells+=kOneMoreFilledCell;
1484
515faf5d 1485 leadingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1486 word = leadingSpurious;
1487 Int_t dummyPS = 1;
1488
1489 if (fVerbose==2) {
1490 if (nDDL<10) ftxt << " " << nDDL;
1491 else ftxt << " " << nDDL;
1492 if (nTRM<10) ftxt << " " << nTRM;
1493 else ftxt << " " << nTRM;
1494 ftxt << " " << iChain;
1495 if (nTDC<10) ftxt << " " << nTDC;
1496 else ftxt << " " << nTDC;
1497 ftxt << " " << iCH;
1498 if (volume[0]<10) ftxt << " -> " << volume[0];
1499 else ftxt << " -> " << volume[0];
1500 ftxt << " " << volume[1];
1501 if (volume[2]<10) ftxt << " " << volume[2];
1502 else ftxt << " " << volume[2];
1503 ftxt << " " << volume[4];
1504 if (volume[3]<10) ftxt << " " << volume[3];
1505 else ftxt << " " << volume[3];
515faf5d 1506 ftxt << " " << -1;
1507 if (word<10) ftxt << " " << word;
1508 else if (word>=10 && word<100) ftxt << " " << word;
1509 else if (word>=100 && word<1000) ftxt << " " << word;
1510 else if (word>=1000 && word<10000) ftxt << " " << word;
1511 else if (word>=10000 && word<100000) ftxt << " " << word;
1512 else if (word>=100000 && word<1000000) ftxt << " " << word;
1513 else ftxt << " " << word;
1514 ftxt << " " << dummyPS << endl;
15ec34b9 1515 }
1516
1517 AliBitPacking::PackWord(word,baseWord, 0,20);
1518 word = iCH; // TDC channel ID [0;7]
1519 AliBitPacking::PackWord(word,baseWord,21,23);
1520 word = nTDC; // TDC ID [0;14]
1521 AliBitPacking::PackWord(word,baseWord,24,27);
1522 word = 0; // error flag
1523 AliBitPacking::PackWord(word,baseWord,28,28);
1524 word = dummyPS; // Packing Status [0;3]
1525 AliBitPacking::PackWord(word,baseWord,29,30);
1526 word = 1; // TRM TDC digit ID
1527 AliBitPacking::PackWord(word,baseWord,31,31);
1528
c5cf594b 1529 localIndex++; fWordsPerTRM++;
15ec34b9 1530 localBuffer[localIndex]=baseWord;
701ac4b0 1531 //psArray[localIndex]=dummyPS;
15ec34b9 1532
15ec34b9 1533 baseWord=0;
1534
515faf5d 1535 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
15ec34b9 1536
1537
1538 } // if (!fPackedAcquisition)
1539
d0eb8f39 1540 } //end loop on digits in the same volume
1541
a403781d 1542 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1543 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1544
d0eb8f39 1545 } // end loop on TDC channel number
1546
e8285af5 1547 //AliDebug(3,Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
a403781d 1548
515faf5d 1549 if (localIndex==-1) continue;
15ec34b9 1550
515faf5d 1551 if (fPackedAcquisition) {
15ec34b9 1552
3c609b5c 1553 for (jj=0; jj<=localIndex; jj++) {
15ec34b9 1554 fIndex++;
1555 buf[fIndex] = localBuffer[jj];
515faf5d 1556 localBuffer[jj] = 0;
701ac4b0 1557 //psArray[jj] = -1;
15ec34b9 1558 }
515faf5d 1559
15ec34b9 1560 }
515faf5d 1561 else {
a403781d 1562 /*
515faf5d 1563 if (maxMeasuresPerChannelInTDC = 1) {
1564
1565 for (Int_t jj=0; jj<=localIndex; jj++) {
1566 if (psArray[jj]==2) {
1567 fIndex++;
1568 buf[fIndex] = localBuffer[jj];
1569 localBuffer[jj] = 0;
1570 psArray[jj] = -1;
1571 }
1572 }
1573 for (Int_t jj=0; jj<=localIndex; jj++) {
1574 if (psArray[jj]==1) {
1575 fIndex++;
1576 buf[fIndex] = localBuffer[jj];
1577 localBuffer[jj] = 0;
1578 psArray[jj] = -1;
1579 }
1580 }
1581
1582 } // if (maxMeasuresPerChannelInTDC = 1)
1583 else if (maxMeasuresPerChannelInTDC>1) {
1584
96b13296 1585 AliDebug(3,Form(" In the TOF DDL %2i, TRM %2i, TDC %2i, chain %1i, the maximum number of t.o.f. good measurements per channel is %2i",
515faf5d 1586 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
a403781d 1587 */
3c609b5c 1588 for (jj=0; jj<=localIndex; jj++) {
515faf5d 1589 fIndex++;
1590 buf[fIndex] = localBuffer[jj];
1591 localBuffer[jj] = 0;
701ac4b0 1592 //psArray[jj] = -1;
515faf5d 1593 }
1594
a403781d 1595 //} // else if (maxMeasuresPerChannelInTDC>1)
515faf5d 1596
1597 } // else (!fPackedAcquisition)
1598
1599 localIndex = -1;
1600
a403781d 1601 //maxMeasuresPerChannelInTDC = 0;
1602
515faf5d 1603 } // end loop on TDC number
15ec34b9 1604
d0eb8f39 1605
1606 if (fVerbose==2) ftxt.close();
1607
1608}
1609
1610//----------------------------------------------------------------------------
1611void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1612{
1613 //
1614 // Reverses the n elements of array a
1615 //
1616
1617 Int_t ii, temp;
1618
1619 for (ii=0; ii<n/2; ii++) {
1620 temp = a[ii];
1621 a[ii] = a[n-ii-1];
1622 a[n-ii-1] = temp;
1623 }
1624
1625 return;
1626
1627}
15ec34b9 1628
1629//----------------------------------------------------------------------------
1630Bool_t AliTOFDDLRawData::HeadOrTail() const
1631{
1632 //
1633 // Returns the result of a 'pitch and toss'
1634 //
1635
1636 Double_t dummy = gRandom->Rndm();
1637
1638 if (dummy<0.5) return kFALSE;
1639 else return kTRUE;
1640
1641}