]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TOF/AliTOFDDLRawData.cxx
Extending period for DCS DPs query to the time when the run number was created
[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
94ClassImp(AliTOFDDLRawData)
95
d0eb8f39 96//---------------------------------------------------------------------------
655e379f 97AliTOFDDLRawData::AliTOFDDLRawData():
98 fVerbose(0),
99 fIndex(-1),
32ead898 100 fPackedAcquisition(kFALSE),
515faf5d 101 fFakeOrphaneProduction(kFALSE),
102 fMatchingWindow(8192),
655e379f 103 fTOFdigitMap(new AliTOFDigitMap()),
104 fTOFdigitArray(0x0),
32ead898 105 fTOFrawStream(new AliTOFRawStream()),
106 fTOFCableLengthMap(new AliTOFCableLengthMap())
7e6dce66 107{
108 //Default constructor
d3c7bfac 109}
d0eb8f39 110//----------------------------------------------------------------------------
111AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
655e379f 112 TObject(source),
113 fVerbose(0),
114 fIndex(-1),
32ead898 115 fPackedAcquisition(kFALSE),
515faf5d 116 fFakeOrphaneProduction(kFALSE),
117 fMatchingWindow(8192),
655e379f 118 fTOFdigitMap(new AliTOFDigitMap()),
119 fTOFdigitArray(0x0),
32ead898 120 fTOFrawStream(new AliTOFRawStream()),
121 fTOFCableLengthMap(new AliTOFCableLengthMap())
655e379f 122 {
7e6dce66 123 //Copy Constructor
124 this->fIndex=source.fIndex;
125 this->fVerbose=source.fVerbose;
15ec34b9 126 this->fPackedAcquisition=source.fPackedAcquisition;
515faf5d 127 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
128 this->fMatchingWindow=source.fMatchingWindow;
d0eb8f39 129 this->fTOFdigitMap=source.fTOFdigitMap;
130 this->fTOFdigitArray=source.fTOFdigitArray;
131 this->fTOFrawStream=source.fTOFrawStream;
32ead898 132 this->fTOFCableLengthMap=source.fTOFCableLengthMap;
7e6dce66 133 return;
134}
135
d0eb8f39 136//----------------------------------------------------------------------------
137AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
7e6dce66 138 //Assigment operator
139 this->fIndex=source.fIndex;
140 this->fVerbose=source.fVerbose;
15ec34b9 141 this->fPackedAcquisition=source.fPackedAcquisition;
515faf5d 142 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
143 this->fMatchingWindow=source.fMatchingWindow;
d0eb8f39 144 this->fTOFdigitMap=source.fTOFdigitMap;
145 this->fTOFdigitArray=source.fTOFdigitArray;
146 this->fTOFrawStream=source.fTOFrawStream;
32ead898 147 this->fTOFCableLengthMap=source.fTOFCableLengthMap;
7e6dce66 148 return *this;
149}
150
d321691a 151//----------------------------------------------------------------------------
152AliTOFDDLRawData::~AliTOFDDLRawData()
153{
154 delete fTOFdigitMap;
155 delete fTOFrawStream;
32ead898 156 delete fTOFCableLengthMap;
d321691a 157}
d0eb8f39 158//----------------------------------------------------------------------------
159Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch)
7e6dce66 160{
571dda3d 161 //
162 // This method creates the Raw data files for TOF detector
163 //
164
165 const Int_t kSize = 5000; //max number of digits per DDL file times 2
166
7e6dce66 167 UInt_t buf[kSize];
7e6dce66 168
d0eb8f39 169 fIndex = -1;
170
171 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
7e6dce66 172
7e6dce66 173 char fileName[15];
08f92f14 174 AliFstream* outfile; // logical name of the output file
d0eb8f39 175
176 //AliRawDataHeader header;
177 AliRawDataHeaderSim header;
178
571dda3d 179 UInt_t sizeRawData = 0;
7e6dce66 180
d0eb8f39 181 branch->GetEvent();
182
183 GetDigits();
184
3e2f0097 185 //if (!fPackedAcquisition) fMatchingWindow = 2097152;//AdC
186
d0eb8f39 187 Int_t jj = -1;
188 Int_t iDDL = -1;
189 Int_t nDDL = -1;
190 Int_t nTRM = 0;
191 Int_t iChain = -1;
192
193 UInt_t nWordsPerTRM = 0;
194
7e6dce66 195 //loop over TOF DDL files
d0eb8f39 196 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
571dda3d 197
d0eb8f39 198 strcpy(fileName,AliDAQ::DdlFileName("TOF",nDDL)); //The name of the output file
571dda3d 199
08f92f14 200 outfile = new AliFstream(fileName);
d0eb8f39 201 iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
202
203 // write Dummy DATA HEADER
08f92f14 204 UInt_t dataHeaderPosition = outfile->Tellp();
205 outfile->WriteBuffer((char*)(&header),sizeof(header));
7e6dce66 206
d0eb8f39 207 // DRM section: trailer
208 MakeDRMtrailer(buf);
7e6dce66 209
d0eb8f39 210 // LTM section
7e6dce66 211 fIndex++;
d0eb8f39 212 buf[fIndex] = MakeFiller();
213 MakeLTMtrailer(buf);
214 MakeLTMdata(buf);
215 MakeLTMheader(buf);
216
217 // loop on TRM number per DRM
218 for (nTRM=AliTOFGeometry::NTRM(); nTRM>=3; nTRM--) {
219
220 nWordsPerTRM = 0;
221
222 // the slot number 3 of the even DRM (i.e. right) doesn't contain TDC digit data
223 if (iDDL%2==0 && nTRM==3) continue;
224
225 // TRM global trailer
226 MakeTRMtrailer(buf);
227
228 // loop on TRM chain number per TRM
229 for (iChain=AliTOFGeometry::NChain()-1; iChain>=0; iChain--) {
230
231 // TRM chain trailer
232 MakeTRMchainTrailer(iChain, buf);
233 nWordsPerTRM++;
234
235 // TRM TDC digits
236 MakeTDCdigits(nDDL, nTRM, iChain, buf, nWordsPerTRM);
237
238 // TRM chain header
239 MakeTRMchainHeader(nTRM, iChain, buf);
240 nWordsPerTRM++;
241
242 } // end loop on iChain
7e6dce66 243
d0eb8f39 244 // TRM global header
245 MakeTRMheader(nTRM, buf);
246
247 // TRM filler in case where TRM data number is odd
248 if (nWordsPerTRM%2!=0) MakeTRMfiller(buf, nWordsPerTRM);
249
250 } // end loop on nTRM
251
252 // DRM section: in
253 MakeDRMheader(nDDL, buf);
254
255 ReverseArray(buf, fIndex+1);
7e6dce66 256
08f92f14 257 outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t)));
7e6dce66 258
d0eb8f39 259 for (jj=0; jj<(fIndex+1); jj++) buf[jj]=0;
260 fIndex = -1;
7e6dce66 261
262 //Write REAL DATA HEADER
08f92f14 263 UInt_t currentFilePosition = outfile->Tellp();
571dda3d 264 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
d0eb8f39 265 header.fSize = currentFilePosition - dataHeaderPosition;
7e6dce66 266 header.SetAttribute(0); // valid data
08f92f14 267 outfile->Seekp(dataHeaderPosition);
268 outfile->WriteBuffer((char*)(&header),sizeof(header));
269 outfile->Seekp(currentFilePosition);
571dda3d 270
08f92f14 271 delete outfile;
7e6dce66 272
d0eb8f39 273 } //end loop on DDL file number
274
275 return 0;
276
277}
278
279//----------------------------------------------------------------------------
280void AliTOFDDLRawData::GetDigits()
281{
282 //
283 // Fill the TOF volumes' map with the TOF digit indices
284 //
285
286 Int_t vol[5] = {-1,-1,-1,-1,-1};
287
288 Int_t digit = -1;
289 Int_t ndigits = fTOFdigitArray->GetEntries();
290
291 AliTOFdigit *digs;
292
293 // loop on TOF digits
294 for (digit=0; digit<ndigits; digit++) {
295 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(digit);
296
297 vol[0] = digs->GetSector(); // Sector Number (0-17)
298 vol[1] = digs->GetPlate(); // Plate Number (0-4)
299 vol[2] = digs->GetStrip(); // Strip Number (0-14/18)
300 vol[3] = digs->GetPadx(); // Pad Number in x direction (0-47)
301 vol[4] = digs->GetPadz(); // Pad Number in z direction (0-1)
302
303 fTOFdigitMap->AddDigit(vol, digit);
304
305 } // close loop on digit del TOF
306
307}
308
309//----------------------------------------------------------------------------
310void AliTOFDDLRawData::MakeDRMheader(Int_t nDDL, UInt_t *buf)
311{
312 //
313 // DRM global header
314 //
315
316 Int_t iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
317
318 Int_t iSector = fTOFrawStream->GetSectorNumber(nDDL);
319
320 UInt_t baseWord=0;
321 UInt_t word;
322
323 // DRM event CRC
324 baseWord=0;
325 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
326 AliBitPacking::PackWord(word,baseWord, 0, 3);
327 word = 0; // event CRC
328 AliBitPacking::PackWord(word,baseWord, 4,19);
329 word = 0; // reserved for future use
330 AliBitPacking::PackWord(word,baseWord,20,27);
331 word = 4; // 0100 -> DRM header ID
332 AliBitPacking::PackWord(word,baseWord,28,31);
333 fIndex++;
334 buf[fIndex]=baseWord;
335
73620dbf 336 // DRM status header 4
337 baseWord=0;
338 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
339 AliBitPacking::PackWord(word,baseWord, 0, 3);
340 word = 0; // temperature
341 AliBitPacking::PackWord(word,baseWord, 4,13);
342 word = 0; // zero
343 AliBitPacking::PackWord(word,baseWord, 14,14);
344 word = 0; // ACK
345 AliBitPacking::PackWord(word,baseWord, 15,15);
346 word = 0; // Sens AD
347 AliBitPacking::PackWord(word,baseWord, 16,18);
348 word = 0; // zero
349 AliBitPacking::PackWord(word,baseWord, 19,19);
350 word = 0; // reserved for future use
351 AliBitPacking::PackWord(word,baseWord, 20,27);
352 word = 4; // 0100 -> DRM header ID
353 AliBitPacking::PackWord(word,baseWord,28,31);
354 fIndex++;
355 buf[fIndex]=baseWord;
356
d0eb8f39 357 // DRM status header 3
358 baseWord=0;
359 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
360 AliBitPacking::PackWord(word,baseWord, 0, 3);
73620dbf 361 word = 0; // L0 BCID
362 AliBitPacking::PackWord(word,baseWord, 4,15);
363 word = 0; // Run Time info
364 AliBitPacking::PackWord(word,baseWord, 16,27);
d0eb8f39 365 word = 4; // 0100 -> DRM header ID
366 AliBitPacking::PackWord(word,baseWord,28,31);
367 fIndex++;
368 buf[fIndex]=baseWord;
369
370 // DRM status header 2
371 baseWord=0;
372 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
373 AliBitPacking::PackWord(word,baseWord, 0, 3);
374
375 if (iDDL%2==1) {
376 word = 2047; // enable ID: [00000000000;11111111111] for odd
377 // (i.e. right) crates
378 AliBitPacking::PackWord(word,baseWord, 4,14);
379 } else {
380 word = 2045; // enable ID: [00000000000;11111111101] for even
381 // (i.e. left) crates
382 AliBitPacking::PackWord(word,baseWord, 4,14);
383 }
384
385 word = 0; //
386 AliBitPacking::PackWord(word,baseWord,15,15);
387 word = 0; // fault ID
73620dbf 388 AliBitPacking::PackWord(word,baseWord,16,26);
389 word = 0; // RTO
390 AliBitPacking::PackWord(word,baseWord,27,27);
d0eb8f39 391 word = 4; // 0100 -> DRM header ID
392 AliBitPacking::PackWord(word,baseWord,28,31);
393 fIndex++;
394 buf[fIndex]=baseWord;
7e6dce66 395
d0eb8f39 396 // DRM status header 1
397 baseWord=0;
398 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
399 AliBitPacking::PackWord(word,baseWord, 0, 3);
400
401 if (iDDL%2==1) {
402 word = 2047; // slot ID: [00000000000;11111111111] for odd
403 // (i.e. right) crates
404 AliBitPacking::PackWord(word,baseWord, 4,14);
405 } else {
406 word = 2045; // slot ID: [00000000000;11111111101] for even
407 // (i.e. left) crates
408 AliBitPacking::PackWord(word,baseWord, 4,14);
409 }
410
411 word = 1; // LHC clock status: 1/0
412 AliBitPacking::PackWord(word,baseWord,15,15);
73620dbf 413 word = 0; // Vers ID
414 AliBitPacking::PackWord(word,baseWord,16,20);
415 word = 0; // DRMH size
416 AliBitPacking::PackWord(word,baseWord,21,24);
d0eb8f39 417 word = 0; // reserved for future use
73620dbf 418 AliBitPacking::PackWord(word,baseWord,25,27);
d0eb8f39 419 word = 4; // 0100 -> DRM header ID
420 AliBitPacking::PackWord(word,baseWord,28,31);
421 fIndex++;
422 buf[fIndex]=baseWord;
423
424 // DRM global header
425 baseWord=0;
426 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
427 AliBitPacking::PackWord(word,baseWord, 0, 3);
428 word = fIndex+1 + 1; // event words
429 AliBitPacking::PackWord(word,baseWord, 4,20);
430 word = iDDL; // crate ID [0;3]
431 AliBitPacking::PackWord(word,baseWord,21,22);
432 word = iSector; // sector ID [0;17]
433 AliBitPacking::PackWord(word,baseWord,23,27);
434 word = 4; // 0100 -> DRM header ID
435 AliBitPacking::PackWord(word,baseWord,28,31);
436 fIndex++;
437 buf[fIndex]=baseWord;
438
7e6dce66 439}
440
d0eb8f39 441//----------------------------------------------------------------------------
442void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
443{
444 //
445 // DRM global trailer
446 //
447
448 UInt_t baseWord;
449 UInt_t word;
450
451 baseWord=0;
452 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
453 AliBitPacking::PackWord(word,baseWord, 0, 3);
454 word = 0; // local event counter
455 AliBitPacking::PackWord(word,baseWord, 4,15);
456 word = 0; // reserved for future use
457 AliBitPacking::PackWord(word,baseWord,16,27);
458 word = 5; // 0101 -> DRM trailer ID
459 AliBitPacking::PackWord(word,baseWord,28,31);
460 fIndex++;
461 buf[fIndex]=baseWord;
462
463}
464
465//----------------------------------------------------------------------------
466void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
467{
468 //
469 // LTM header
470 //
471
472 UInt_t baseWord;
473 UInt_t word;
474
475 baseWord=0;
476 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
477 AliBitPacking::PackWord(word,baseWord, 0, 3);
478 word = 35; // event words
479 AliBitPacking::PackWord(word,baseWord, 4,16);
480 word = 0; // crc error
481 AliBitPacking::PackWord(word,baseWord,17,17);
482 word = 0; // fault
483 AliBitPacking::PackWord(word,baseWord,18,23);
484 word = 0;
485 AliBitPacking::PackWord(word,baseWord,24,27);
486 word = 4; // 0100 -> LTM header ID
487 AliBitPacking::PackWord(word,baseWord,28,31);
488 fIndex++;
489 buf[fIndex]=baseWord;
490
491}
492
493//----------------------------------------------------------------------------
494void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
495{
496 //
497 // LTM data
498 //
499
500 UInt_t baseWord;
501 UInt_t word;
502
503 baseWord=0;
504 word = 100; // Local temperature in LTM5 -> 4 X 25 degree (environment temperature)
505 AliBitPacking::PackWord(word,baseWord, 0, 9);
506 word = 100; // Local temperature in LTM6 -> 4 X 25 degree (environment temperature)
507 AliBitPacking::PackWord(word,baseWord,10,19);
508 word = 100; // Local temperature in LTM7 -> 4 X 25 degree (environment temperature)
509 AliBitPacking::PackWord(word,baseWord,20,29);
510 word = 0;
511 AliBitPacking::PackWord(word,baseWord,30,31);
512
513 fIndex++;
514 buf[fIndex]=baseWord;
515
516 // Local temperature in LTM2, LMT3, LTM4 -> 4 X 25 degree (environment temperature)
517 fIndex++;
518 buf[fIndex]=baseWord;
519
520 // Local temperature in FEAC7, FEAC8, LTM1 -> 4 X 25 degree (environment temperature)
521 fIndex++;
522 buf[fIndex]=baseWord;
523
524 // Local temperature in FEAC4, FEAC5, FEAC6 -> 4 X 25 degree (environment temperature)
525 fIndex++;
526 buf[fIndex]=baseWord;
527
528 // Local temperature in FEAC1, FEAC2, FEAC3 -> 4 X 25 degree (environment temperature)
529 fIndex++;
530 buf[fIndex]=baseWord;
531
532 baseWord=0;
533 word = 0; // GND-FEAC15 -> Voltage drop between GND and FEAC15
534 AliBitPacking::PackWord(word,baseWord, 0, 9);
535 word = 0; // VTH16 -> Thereshould voltage for FEAC16
536 AliBitPacking::PackWord(word,baseWord,10,19);
537 word = 0; // GND-FEAC16 -> Voltage drop between GND and FEAC16
538 AliBitPacking::PackWord(word,baseWord,20,29);
539 word = 0;
540 AliBitPacking::PackWord(word,baseWord,30,31);
541
542 fIndex++;
543 buf[fIndex]=baseWord;
544
545 // VTH14 -> Thereshould voltage for FEAC14
546 // GND-FEAC14 -> Voltage drop between GND and FEAC14
547 // VTH15 -> Thereshould voltage for FEAC15
548 fIndex++;
549 buf[fIndex]=baseWord;
550
551 // GND-FEAC12 -> Voltage drop between GND and FEAC12
552 // VTH13 -> Thereshould voltage for FEAC13
553 // GND-FEAC13 -> Voltage drop between GND and FEAC13
554 fIndex++;
555 buf[fIndex]=baseWord;
556
557 // VTH11 -> Thereshould voltage for FEAC11
558 // GND-FEAC11 -> Voltage drop between GND and FEAC11
559 // VTH12 -> Thereshould voltage for FEAC12
560 fIndex++;
561 buf[fIndex]=baseWord;
562
563 // GND-FEAC9 -> Voltage drop between GND and FEAC9
564 // VTH10 -> Thereshould voltage for FEAC10
565 // GND-FEAC10 -> Voltage drop between GND and FEAC10
566 fIndex++;
567 buf[fIndex]=baseWord;
568
569 // VTH8 -> Thereshould voltage for FEAC8
570 // GND-FEAC8 -> Voltage drop between GND and FEAC8
571 // VTH9 -> Thereshould voltage for FEAC9
572 fIndex++;
573 buf[fIndex]=baseWord;
574
575 // GND-FEAC6 -> Voltage drop between GND and FEAC6
576 // VTH7 -> Thereshould voltage for FEAC7
577 // GND-FEAC7 -> Voltage drop between GND and FEAC7
578 fIndex++;
579 buf[fIndex]=baseWord;
580
581 // VTH5 -> Thereshould voltage for FEAC5
582 // GND-FEAC5 -> Voltage drop between GND and FEAC5
583 // VTH6 -> Thereshould voltage for FEAC6
584 fIndex++;
585 buf[fIndex]=baseWord;
586
587 // GND-FEAC3 -> Voltage drop between GND and FEAC3
588 // VTH4 -> Thereshould voltage for FEAC4
589 // GND-FEAC4 -> Voltage drop between GND and FEAC4
590 fIndex++;
591 buf[fIndex]=baseWord;
592
593 // VTH2 -> Thereshould voltage for FEAC2
594 // GND-FEAC2 -> Voltage drop between GND and FEAC2
595 // VTH3 -> Thereshould voltage for FEAC3
596 fIndex++;
597 buf[fIndex]=baseWord;
598
599 // LV16 -> Low Voltage measured by FEAC16
600 // GND-FEAC1 -> Voltage drop between GND and FEAC1
601 // VTH1 -> Thereshould voltage for FEAC1
602 fIndex++;
603 buf[fIndex]=baseWord;
604
605 // Low Voltage measured by FEAC13, FEAC14, FEAC15
606 fIndex++;
607 buf[fIndex]=baseWord;
608
609 // Low Voltage measured by FEAC10, FEAC11, FEAC12
610 fIndex++;
611 buf[fIndex]=baseWord;
612
613 // Low Voltage measured by FEAC7, FEAC8, FEAC9
614 fIndex++;
615 buf[fIndex]=baseWord;
616
617 // Low Voltage measured by FEAC4, FEAC5, FEAC6
618 fIndex++;
619 buf[fIndex]=baseWord;
620
621 // Low Voltage measured by FEAC1, FEAC2, FEAC3
622 fIndex++;
623 buf[fIndex]=baseWord;
624
625
626 baseWord=0;
627 word = 0; // PDL45 -> Delay Line setting for PDL45
628 AliBitPacking::PackWord(word,baseWord, 0, 7);
629 word = 0; // PDL46 -> Delay Line setting for PDL46
630 AliBitPacking::PackWord(word,baseWord, 8,15);
631 word = 0; // PDL47 -> Delay Line setting for PDL47
632 AliBitPacking::PackWord(word,baseWord,16,23);
633 word = 0; // PDL48 -> Delay Line setting for PDL48
634 AliBitPacking::PackWord(word,baseWord,24,31);
635 fIndex++;
636 buf[fIndex]=baseWord;
637
638 // Delay Line setting for PDL41, PDL42, PDL43, PDL44
639 fIndex++;
640 buf[fIndex]=baseWord;
641
642 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
643 fIndex++;
644 buf[fIndex]=baseWord;
645
646 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
647 fIndex++;
648 buf[fIndex]=baseWord;
649
650 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
651 fIndex++;
652 buf[fIndex]=baseWord;
653
654 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
655 fIndex++;
656 buf[fIndex]=baseWord;
657
658 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
659 fIndex++;
660 buf[fIndex]=baseWord;
661
662 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
663 fIndex++;
664 buf[fIndex]=baseWord;
665
666 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
667 fIndex++;
668 buf[fIndex]=baseWord;
669
670 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
671 fIndex++;
672 buf[fIndex]=baseWord;
673
674 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
675 fIndex++;
676 buf[fIndex]=baseWord;
677
678 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
679 fIndex++;
680 buf[fIndex]=baseWord;
681
682}
683
684//----------------------------------------------------------------------------
685void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
686{
687 //
688 // LTM trailer
689 //
690
691 UInt_t baseWord;
692 UInt_t word;
693
694 baseWord=0;
695 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
696 AliBitPacking::PackWord(word,baseWord, 0, 3);
697 word = 0; // event crc
698 AliBitPacking::PackWord(word,baseWord, 4,15);
699 word = 0; // event number
700 AliBitPacking::PackWord(word,baseWord,16,27);
701 word = 5; // 0101 -> LTM trailer ID
702 AliBitPacking::PackWord(word,baseWord,28,31);
703 fIndex++;
704 buf[fIndex]=baseWord;
705
706}
707
708//----------------------------------------------------------------------------
709void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
710{
711 //
712 // TRM header for the TRM number nTRM [ 3;12]
713 //
714
715 if (nTRM<3 || nTRM>12) {
716 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
717 return;
718 }
719
720 UInt_t baseWord;
721 UInt_t word;
722
723 baseWord = 0;
724 word = nTRM; // TRM data coming from the VME slot number nTRM
725 AliBitPacking::PackWord(word,baseWord, 0, 3);
726 word = 0; // event words
727 AliBitPacking::PackWord(word,baseWord, 4,16);
15ec34b9 728
729 if (fPackedAcquisition)
730 word = 0; // ACQuisition mode: [0;3] see document
731 else
732 word = 3; // ACQuisition mode: [0;3] see document
d0eb8f39 733 AliBitPacking::PackWord(word,baseWord,17,18);
734 word = 0; // description of a SEU inside LUT tables for INL compensation;
735 // the data are unaffected
736 AliBitPacking::PackWord(word,baseWord,19,19);
737 word = 0; // Must Be Zero (MBZ)
738 AliBitPacking::PackWord(word,baseWord,20,27);
739 word = 4; // 0100 -> TRM header ID
740 AliBitPacking::PackWord(word,baseWord,28,31);
741 fIndex++;
742 buf[fIndex]=baseWord;
743
744}
745
746//----------------------------------------------------------------------------
747void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
748{
749 //
750 // TRM trailer
751 //
752
753 UInt_t baseWord;
754 UInt_t word;
755
756 baseWord=0;
757 word = 15; // 1111 -> TRM trailer ID 1
758 AliBitPacking::PackWord(word,baseWord, 0, 3);
759 word = 0; // event CRC
760 AliBitPacking::PackWord(word,baseWord, 4,15);
761 word = 0; // local event counter == DRM local event counter
762 AliBitPacking::PackWord(word,baseWord,16,27);
763 word = 5; // 0101 -> TRM trailer ID 2
764 AliBitPacking::PackWord(word,baseWord,28,31);
765 fIndex++;
766 buf[fIndex]=baseWord;
767
768}
769
770//----------------------------------------------------------------------------
771void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
772 UInt_t *buf)
773{
774 //
775 // TRM chain header
776 //
777
778 UInt_t baseWord;
779 UInt_t word;
780
781 if (nTRM<3 || nTRM>12) {
782 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
783 return;
784 }
785
786 if (iChain<0 || iChain>1) {
787 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
788 return;
789 }
790
791 baseWord=0;
792 word = nTRM; // TRM data coming from the VME slot ID nTRM
793 AliBitPacking::PackWord(word,baseWord, 0, 3);
794 word = 0; // bunch ID
795 AliBitPacking::PackWord(word,baseWord, 4,15);
796 word = 100; // PB24 temperature -> 4 X 25 degree (environment temperature)
797 AliBitPacking::PackWord(word,baseWord,16,23);
798 word = (Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
799 AliBitPacking::PackWord(word,baseWord,24,26);
800 word = 0; // TS
801 AliBitPacking::PackWord(word,baseWord,27,27);
802 switch (iChain) {
803 case 0:
804 word = 0; // 0000 -> TRM chain 0 ID
805 break;
806 case 1:
807 word = 2; // 0010 -> TRM chain 1 ID
808 break;
809 }
810 AliBitPacking::PackWord(word,baseWord,28,31);
811 fIndex++;
812 buf[fIndex]=baseWord;
813
814}
815
816//----------------------------------------------------------------------------
817void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf, UInt_t nWordsPerTRM)
818{
819 //
820 // TRM filler
821 //
822
823 Int_t jj = -1;
824
825 fIndex++;
826 for (jj=fIndex; jj>fIndex-(Int_t)nWordsPerTRM; jj--) {
827 buf[jj] = buf[jj-1];
828 }
829
830 buf[fIndex-nWordsPerTRM] = MakeFiller();
831
832}
833
834//----------------------------------------------------------------------------
835UInt_t AliTOFDDLRawData::MakeFiller()
836{
837 //
838 // Filler word definition: to make even the number of words per TRM/LTM
839 //
840
841 UInt_t baseWord;
842 UInt_t word;
843
844 baseWord=0;
845 word = 0; // 0000 -> filler ID 1
846 AliBitPacking::PackWord(word,baseWord, 0, 3);
847 word = 0; // MBZ
848 AliBitPacking::PackWord(word,baseWord, 4,27);
849 word = 7; // 0111 -> filler ID 2
850 AliBitPacking::PackWord(word,baseWord, 28,31);
851
852 return baseWord;
853
854}
855
856//----------------------------------------------------------------------------
857void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
858{
859 //
860 // TRM chain trailer
861 //
862
863 if (iChain<0 || iChain>1) {
864 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
865 return;
866 }
867
868 UInt_t baseWord;
869 UInt_t word;
870
871 baseWord=0;
872 word = 0; // status
873 AliBitPacking::PackWord(word,baseWord, 0, 3);
874 word = 0; // MBZ
875 AliBitPacking::PackWord(word,baseWord, 4,15);
876 word = 0; // event counter
877 AliBitPacking::PackWord(word,baseWord,16,27);
878 switch (iChain) {
879 case 0:
880 word = 1; // 0001 -> TRM chain 0 trailer ID
881 break;
882 case 1:
883 word = 3; // 0011 -> TRM chain 1 trailer ID
884 break;
885 }
886 AliBitPacking::PackWord(word,baseWord,28,31);
887 fIndex++;
888 buf[fIndex]=baseWord;
889
890}
891
892//----------------------------------------------------------------------------
893void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain,
894 UInt_t *buf, UInt_t &nWordsPerTRM)
895{
896 //
897 // TRM TDC digit
898 //
899
96f01799 900 const Double_t kOneMoreFilledCell = 1./(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
901 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
15ec34b9 902
d0eb8f39 903 if (nDDL<0 || nDDL>71) {
904 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
905 return;
906 }
907
908 if (nTRM<3 || nTRM>12) {
909 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
910 return;
911 }
912
913 if (iChain<0 || iChain>1) {
914 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
915 return;
916 }
917
15ec34b9 918 Int_t psArray[1000];
919 UInt_t localBuffer[1000];
920 Int_t localIndex = -1;
921
d0eb8f39 922 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
923
924 Int_t volume[5] = {-1, -1, -1, -1, -1};
925 Int_t indexDigit[3] = {-1, -1, -1};
926
927 Int_t totCharge = -1;
928 Int_t timeOfFlight = -1;
929
15ec34b9 930 Int_t trailingSpurious = -1;
931 Int_t leadingSpurious = -1;
932
d0eb8f39 933 AliTOFdigit *digs;
934
935 UInt_t baseWord=0;
936 UInt_t word=0;
937
938 Int_t jj = -1;
939 Int_t nTDC = -1;
940 Int_t iCH = -1;
941
a403781d 942 //Int_t numberOfMeasuresPerChannel = 0;
943 //Int_t maxMeasuresPerChannelInTDC = 0;
515faf5d 944
945 Bool_t outOut = HeadOrTail();
946
d0eb8f39 947 ofstream ftxt;
948
949 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
950
951 for (jj=0; jj<5; jj++) volume[jj] = -1;
952
953 // loop on TDC number
954 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
955
956 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
957 // for TDC numbers 3-14
958 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3.)!=0) continue;
959
960 // loop on TDC channel number
961 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
962
a403781d 963 //numberOfMeasuresPerChannel = 0;
515faf5d 964
d0eb8f39 965 fTOFrawStream->EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
966
967 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
968 volume[3]==-1 || volume[4]==-1) continue;
d0eb8f39 969
970 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
971
972 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
973
15ec34b9 974 if (indexDigit[0]<0) {
975
515faf5d 976 trailingSpurious = Int_t(2097152*gRandom->Rndm());
977 leadingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 978
515faf5d 979 if ( fFakeOrphaneProduction &&
980 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
981 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
15ec34b9 982
983 percentFilledCells+=kOneMoreFilledCell;
984
985 Int_t dummyPS = 0;
986
515faf5d 987 if (outOut) {
15ec34b9 988 word = trailingSpurious; // trailing edge measurement
989 dummyPS = 2;
990 }
991 else {
992 word = leadingSpurious; // leading edge measurement
993 dummyPS = 1;
994 }
995
996 if (fVerbose==2) {
997 if (nDDL<10) ftxt << " " << nDDL;
998 else ftxt << " " << nDDL;
999 if (nTRM<10) ftxt << " " << nTRM;
1000 else ftxt << " " << nTRM;
1001 ftxt << " " << iChain;
1002 if (nTDC<10) ftxt << " " << nTDC;
1003 else ftxt << " " << nTDC;
1004 ftxt << " " << iCH;
1005 if (volume[0]<10) ftxt << " -> " << volume[0];
1006 else ftxt << " -> " << volume[0];
1007 ftxt << " " << volume[1];
1008 if (volume[2]<10) ftxt << " " << volume[2];
1009 else ftxt << " " << volume[2];
1010 ftxt << " " << volume[4];
1011 if (volume[3]<10) ftxt << " " << volume[3];
1012 else ftxt << " " << volume[3];
515faf5d 1013 ftxt << " " << -1;
1014 if (word<10) ftxt << " " << word;
1015 else if (word>=10 && word<100) ftxt << " " << word;
1016 else if (word>=100 && word<1000) ftxt << " " << word;
1017 else if (word>=1000 && word<10000) ftxt << " " << word;
1018 else if (word>=10000 && word<100000) ftxt << " " << word;
1019 else if (word>=100000 && word<1000000) ftxt << " " << word;
1020 else ftxt << " " << word;
1021 ftxt << " " << dummyPS << endl;
15ec34b9 1022 }
1023
1024 AliBitPacking::PackWord(word,baseWord, 0,20);
1025 word = iCH; // TDC channel ID [0;7]
1026 AliBitPacking::PackWord(word,baseWord,21,23);
1027 word = nTDC; // TDC ID [0;14]
1028 AliBitPacking::PackWord(word,baseWord,24,27);
1029 word = 0; // error flag
1030 AliBitPacking::PackWord(word,baseWord,28,28);
1031 word = dummyPS; // Packing Status [0;3]
1032 AliBitPacking::PackWord(word,baseWord,29,30);
1033 word = 1; // TRM TDC digit ID
1034 AliBitPacking::PackWord(word,baseWord,31,31);
1035
1036 localIndex++;
1037 localBuffer[localIndex]=baseWord;
1038 psArray[localIndex]=dummyPS;
1039
1040 nWordsPerTRM++;
1041 baseWord=0;
1042
515faf5d 1043 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
15ec34b9 1044 } // if (indexDigit[0]<0)
1045
d0eb8f39 1046 for (jj=0; jj<3;jj++) {
1047
1048 if (indexDigit[jj]<0) continue;
a403781d 1049
d0eb8f39 1050 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1051
1052 if (digs->GetSector()!=volume[0] ||
1053 digs->GetPlate() !=volume[1] ||
1054 digs->GetStrip() !=volume[2] ||
1055 digs->GetPadx() !=volume[3] ||
1056 digs->GetPadz() !=volume[4]) AliWarning(" --- ERROR --- ");
1057
32ead898 1058 timeOfFlight = (Int_t)(digs->GetTdc())
1059 +
1060 fTOFCableLengthMap->GetCableTimeShiftBin(nDDL, nTRM, iChain, nTDC);
d11fc181 1061
32ead898 1062 if (timeOfFlight>=fMatchingWindow+1000) continue; // adc
515faf5d 1063
a403781d 1064 //numberOfMeasuresPerChannel++;
1065
515faf5d 1066 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1067 totCharge = (Int_t)(digs->GetToT());
d0eb8f39 1068 // temporary control
d11fc181 1069 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
d0eb8f39 1070
15ec34b9 1071 if (fPackedAcquisition) {
1072
d0eb8f39 1073 if (fVerbose==2) {
1074 if (nDDL<10) ftxt << " " << nDDL;
1075 else ftxt << " " << nDDL;
1076 if (nTRM<10) ftxt << " " << nTRM;
1077 else ftxt << " " << nTRM;
1078 ftxt << " " << iChain;
1079 if (nTDC<10) ftxt << " " << nTDC;
1080 else ftxt << " " << nTDC;
1081 ftxt << " " << iCH;
1082 if (volume[0]<10) ftxt << " -> " << volume[0];
1083 else ftxt << " -> " << volume[0];
1084 ftxt << " " << volume[1];
1085 if (volume[2]<10) ftxt << " " << volume[2];
1086 else ftxt << " " << volume[2];
1087 ftxt << " " << volume[4];
1088 if (volume[3]<10) ftxt << " " << volume[3];
1089 else ftxt << " " << volume[3];
515faf5d 1090 if (totCharge<10) ftxt << " " << totCharge;
1091 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1092 else ftxt << " " << totCharge;
1093 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1094 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1095 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1096 else ftxt << " " << timeOfFlight << endl;
d0eb8f39 1097 }
1098
515faf5d 1099 word = timeOfFlight%8192; // time-of-fligth measurement
d0eb8f39 1100 AliBitPacking::PackWord(word,baseWord, 0,12);
1101
515faf5d 1102 if (totCharge>=256) totCharge = 255;
d0eb8f39 1103 word = totCharge; // time-over-threshould measurement
1104 AliBitPacking::PackWord(word,baseWord,13,20);
1105
1106 word = iCH; // TDC channel ID [0;7]
1107 AliBitPacking::PackWord(word,baseWord,21,23);
1108 word = nTDC; // TDC ID [0;14]
1109 AliBitPacking::PackWord(word,baseWord,24,27);
1110 word = 0; // error flag
1111 AliBitPacking::PackWord(word,baseWord,28,28);
15ec34b9 1112 word = 0; // Packing Status [0;3]
1113 AliBitPacking::PackWord(word,baseWord,29,30);
1114 word = 1; // TRM TDC digit ID
1115 AliBitPacking::PackWord(word,baseWord,31,31);
1116
1117 localIndex++;
1118 localBuffer[localIndex]=baseWord;
1119
1120 nWordsPerTRM++;
1121 baseWord=0;
1122
515faf5d 1123 if ( fFakeOrphaneProduction &&
1124 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
15ec34b9 1125
1126 percentFilledCells+=kOneMoreFilledCell;
1127
515faf5d 1128 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1129 leadingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1130
1131 Int_t dummyPS = 0;
1132
515faf5d 1133 if (outOut) {
15ec34b9 1134 word = trailingSpurious; // trailing edge measurement
1135 dummyPS = 2;
1136 }
1137 else {
1138 word = leadingSpurious; // leading edge measurement
1139 dummyPS = 1;
1140 }
1141
1142 if (fVerbose==2) {
1143 if (nDDL<10) ftxt << " " << nDDL;
1144 else ftxt << " " << nDDL;
1145 if (nTRM<10) ftxt << " " << nTRM;
1146 else ftxt << " " << nTRM;
1147 ftxt << " " << iChain;
1148 if (nTDC<10) ftxt << " " << nTDC;
1149 else ftxt << " " << nTDC;
1150 ftxt << " " << iCH;
1151 if (volume[0]<10) ftxt << " -> " << volume[0];
1152 else ftxt << " -> " << volume[0];
1153 ftxt << " " << volume[1];
1154 if (volume[2]<10) ftxt << " " << volume[2];
1155 else ftxt << " " << volume[2];
1156 ftxt << " " << volume[4];
1157 if (volume[3]<10) ftxt << " " << volume[3];
1158 else ftxt << " " << volume[3];
515faf5d 1159 ftxt << " " << -1;
1160 if (word<10) ftxt << " " << word;
1161 else if (word>=10 && word<100) ftxt << " " << word;
1162 else if (word>=100 && word<1000) ftxt << " " << word;
1163 else if (word>=1000 && word<10000) ftxt << " " << word;
1164 else if (word>=10000 && word<100000) ftxt << " " << word;
1165 else if (word>=100000 && word<1000000) ftxt << " " << word;
1166 else ftxt << " " << word;
1167 ftxt << " " << dummyPS << endl;
15ec34b9 1168 }
1169
1170 AliBitPacking::PackWord(word,baseWord, 0,20);
1171 word = iCH; // TDC channel ID [0;7]
1172 AliBitPacking::PackWord(word,baseWord,21,23);
1173 word = nTDC; // TDC ID [0;14]
1174 AliBitPacking::PackWord(word,baseWord,24,27);
1175 word = 0; // error flag
1176 AliBitPacking::PackWord(word,baseWord,28,28);
1177 word = dummyPS; // Packing Status [0;3]
1178 AliBitPacking::PackWord(word,baseWord,29,30);
1179 word = 1; // TRM TDC digit ID
1180 AliBitPacking::PackWord(word,baseWord,31,31);
1181
1182 localIndex++;
1183 localBuffer[localIndex]=baseWord;
1184 psArray[localIndex]=dummyPS;
1185
1186 nWordsPerTRM++;
1187 baseWord=0;
1188
515faf5d 1189 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
15ec34b9 1190
1191
1192 } // if (fPackedAcquisition)
1193 else { // if (!fPackedAcquisition)
1194
515faf5d 1195 if ( fFakeOrphaneProduction &&
1196 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
15ec34b9 1197
1198 percentFilledCells+=kOneMoreFilledCell;
1199
515faf5d 1200 trailingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1201 word = trailingSpurious;
1202 Int_t dummyPS = 2;
1203
1204 if (fVerbose==2) {
1205 if (nDDL<10) ftxt << " " << nDDL;
1206 else ftxt << " " << nDDL;
1207 if (nTRM<10) ftxt << " " << nTRM;
1208 else ftxt << " " << nTRM;
1209 ftxt << " " << iChain;
1210 if (nTDC<10) ftxt << " " << nTDC;
1211 else ftxt << " " << nTDC;
1212 ftxt << " " << iCH;
1213 if (volume[0]<10) ftxt << " -> " << volume[0];
1214 else ftxt << " -> " << volume[0];
1215 ftxt << " " << volume[1];
1216 if (volume[2]<10) ftxt << " " << volume[2];
1217 else ftxt << " " << volume[2];
1218 ftxt << " " << volume[4];
1219 if (volume[3]<10) ftxt << " " << volume[3];
1220 else ftxt << " " << volume[3];
515faf5d 1221 ftxt << " " << -1;
1222 if (word<10) ftxt << " " << word;
1223 else if (word>=10 && word<100) ftxt << " " << word;
1224 else if (word>=100 && word<1000) ftxt << " " << word;
1225 else if (word>=1000 && word<10000) ftxt << " " << word;
1226 else if (word>=10000 && word<100000) ftxt << " " << word;
1227 else if (word>=100000 && word<1000000) ftxt << " " << word;
1228 else ftxt << " " << word;
1229 ftxt << " " << dummyPS << endl;
15ec34b9 1230 }
1231
1232 AliBitPacking::PackWord(word,baseWord, 0,20);
1233 word = iCH; // TDC channel ID [0;7]
1234 AliBitPacking::PackWord(word,baseWord,21,23);
1235 word = nTDC; // TDC ID [0;14]
1236 AliBitPacking::PackWord(word,baseWord,24,27);
1237 word = 0; // error flag
1238 AliBitPacking::PackWord(word,baseWord,28,28);
1239 word = dummyPS; // Packing Status [0;3]
1240 AliBitPacking::PackWord(word,baseWord,29,30);
1241 word = 1; // TRM TDC digit ID
1242 AliBitPacking::PackWord(word,baseWord,31,31);
1243
1244 localIndex++;
1245 localBuffer[localIndex]=baseWord;
1246 psArray[localIndex]=dummyPS;
1247
1248 nWordsPerTRM++;
1249 baseWord=0;
1250
515faf5d 1251 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
15ec34b9 1252
1253
515faf5d 1254 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
15ec34b9 1255
1256 if (fVerbose==2) {
1257 if (nDDL<10) ftxt << " " << nDDL;
1258 else ftxt << " " << nDDL;
1259 if (nTRM<10) ftxt << " " << nTRM;
1260 else ftxt << " " << nTRM;
1261 ftxt << " " << iChain;
1262 if (nTDC<10) ftxt << " " << nTDC;
1263 else ftxt << " " << nTDC;
1264 ftxt << " " << iCH;
1265 if (volume[0]<10) ftxt << " -> " << volume[0];
1266 else ftxt << " -> " << volume[0];
1267 ftxt << " " << volume[1];
1268 if (volume[2]<10) ftxt << " " << volume[2];
1269 else ftxt << " " << volume[2];
1270 ftxt << " " << volume[4];
1271 if (volume[3]<10) ftxt << " " << volume[3];
1272 else ftxt << " " << volume[3];
515faf5d 1273 ftxt << " " << -1;
1274 if (word<10) ftxt << " " << word;
1275 else if (word>=10 && word<100) ftxt << " " << word;
1276 else if (word>=100 && word<1000) ftxt << " " << word;
1277 else if (word>=1000 && word<10000) ftxt << " " << word;
1278 else if (word>=10000 && word<100000) ftxt << " " << word;
1279 else if (word>=100000 && word<1000000) ftxt << " " << word;
1280 else ftxt << " " << word;
1281 ftxt << " " << 2 << endl;
15ec34b9 1282 }
1283
1284 AliBitPacking::PackWord(word,baseWord, 0,20);
1285
1286 word = iCH; // TDC channel ID [0;7]
1287 AliBitPacking::PackWord(word,baseWord,21,23);
1288 word = nTDC; // TDC ID [0;14]
1289 AliBitPacking::PackWord(word,baseWord,24,27);
1290 word = 0; // error flag
1291 AliBitPacking::PackWord(word,baseWord,28,28);
1292 word = 2; // Packing Status [0;3]
d0eb8f39 1293 AliBitPacking::PackWord(word,baseWord,29,30);
1294 word = 1; // TRM TDC digit ID
1295 AliBitPacking::PackWord(word,baseWord,31,31);
15ec34b9 1296
1297 localIndex++;
1298 localBuffer[localIndex]=baseWord;
1299 psArray[localIndex]=2;
d0eb8f39 1300
1301 nWordsPerTRM++;
1302 baseWord=0;
1303
515faf5d 1304 word = timeOfFlight%2097152; // leading edge measurement
15ec34b9 1305
1306 if (fVerbose==2) {
1307 if (nDDL<10) ftxt << " " << nDDL;
1308 else ftxt << " " << nDDL;
1309 if (nTRM<10) ftxt << " " << nTRM;
1310 else ftxt << " " << nTRM;
1311 ftxt << " " << iChain;
1312 if (nTDC<10) ftxt << " " << nTDC;
1313 else ftxt << " " << nTDC;
1314 ftxt << " " << iCH;
1315 if (volume[0]<10) ftxt << " -> " << volume[0];
1316 else ftxt << " -> " << volume[0];
1317 ftxt << " " << volume[1];
1318 if (volume[2]<10) ftxt << " " << volume[2];
1319 else ftxt << " " << volume[2];
1320 ftxt << " " << volume[4];
1321 if (volume[3]<10) ftxt << " " << volume[3];
1322 else ftxt << " " << volume[3];
515faf5d 1323 ftxt << " " << -1;
1324 if (word<10) ftxt << " " << word;
1325 else if (word>=10 && word<100) ftxt << " " << word;
1326 else if (word>=100 && word<1000) ftxt << " " << word;
1327 else if (word>=1000 && word<10000) ftxt << " " << word;
1328 else if (word>=10000 && word<100000) ftxt << " " << word;
1329 else if (word>=100000 && word<1000000) ftxt << " " << word;
1330 else ftxt << " " << word;
1331 ftxt << " " << 1 << endl;
15ec34b9 1332 }
1333
1334 AliBitPacking::PackWord(word,baseWord, 0,20);
1335
1336 word = iCH; // TDC channel ID [0;7]
1337 AliBitPacking::PackWord(word,baseWord,21,23);
1338 word = nTDC; // TDC ID [0;14]
1339 AliBitPacking::PackWord(word,baseWord,24,27);
1340 word = 0; // error flag
1341 AliBitPacking::PackWord(word,baseWord,28,28);
1342 word = 1; // Packing Status [0;3]
1343 AliBitPacking::PackWord(word,baseWord,29,30);
1344 word = 1; // TRM TDC digit ID
1345 AliBitPacking::PackWord(word,baseWord,31,31);
1346
1347 localIndex++;
1348 localBuffer[localIndex]=baseWord;
1349 psArray[localIndex]=1;
1350
1351 nWordsPerTRM++;
1352 baseWord=0;
1353
1354
515faf5d 1355 if ( fFakeOrphaneProduction &&
1356 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
15ec34b9 1357
1358 percentFilledCells+=kOneMoreFilledCell;
1359
515faf5d 1360 leadingSpurious = Int_t(2097152*gRandom->Rndm());
15ec34b9 1361 word = leadingSpurious;
1362 Int_t dummyPS = 1;
1363
1364 if (fVerbose==2) {
1365 if (nDDL<10) ftxt << " " << nDDL;
1366 else ftxt << " " << nDDL;
1367 if (nTRM<10) ftxt << " " << nTRM;
1368 else ftxt << " " << nTRM;
1369 ftxt << " " << iChain;
1370 if (nTDC<10) ftxt << " " << nTDC;
1371 else ftxt << " " << nTDC;
1372 ftxt << " " << iCH;
1373 if (volume[0]<10) ftxt << " -> " << volume[0];
1374 else ftxt << " -> " << volume[0];
1375 ftxt << " " << volume[1];
1376 if (volume[2]<10) ftxt << " " << volume[2];
1377 else ftxt << " " << volume[2];
1378 ftxt << " " << volume[4];
1379 if (volume[3]<10) ftxt << " " << volume[3];
1380 else ftxt << " " << volume[3];
515faf5d 1381 ftxt << " " << -1;
1382 if (word<10) ftxt << " " << word;
1383 else if (word>=10 && word<100) ftxt << " " << word;
1384 else if (word>=100 && word<1000) ftxt << " " << word;
1385 else if (word>=1000 && word<10000) ftxt << " " << word;
1386 else if (word>=10000 && word<100000) ftxt << " " << word;
1387 else if (word>=100000 && word<1000000) ftxt << " " << word;
1388 else ftxt << " " << word;
1389 ftxt << " " << dummyPS << endl;
15ec34b9 1390 }
1391
1392 AliBitPacking::PackWord(word,baseWord, 0,20);
1393 word = iCH; // TDC channel ID [0;7]
1394 AliBitPacking::PackWord(word,baseWord,21,23);
1395 word = nTDC; // TDC ID [0;14]
1396 AliBitPacking::PackWord(word,baseWord,24,27);
1397 word = 0; // error flag
1398 AliBitPacking::PackWord(word,baseWord,28,28);
1399 word = dummyPS; // Packing Status [0;3]
1400 AliBitPacking::PackWord(word,baseWord,29,30);
1401 word = 1; // TRM TDC digit ID
1402 AliBitPacking::PackWord(word,baseWord,31,31);
1403
1404 localIndex++;
1405 localBuffer[localIndex]=baseWord;
1406 psArray[localIndex]=dummyPS;
1407
1408 nWordsPerTRM++;
1409 baseWord=0;
1410
515faf5d 1411 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
15ec34b9 1412
1413
1414 } // if (!fPackedAcquisition)
1415
d0eb8f39 1416 } //end loop on digits in the same volume
1417
a403781d 1418 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1419 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1420
d0eb8f39 1421 } // end loop on TDC channel number
1422
a403781d 1423 //AliInfo(Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
1424
515faf5d 1425 if (localIndex==-1) continue;
15ec34b9 1426
515faf5d 1427 if (fPackedAcquisition) {
15ec34b9 1428
3c609b5c 1429 for (jj=0; jj<=localIndex; jj++) {
15ec34b9 1430 fIndex++;
1431 buf[fIndex] = localBuffer[jj];
515faf5d 1432 localBuffer[jj] = 0;
1433 psArray[jj] = -1;
15ec34b9 1434 }
515faf5d 1435
15ec34b9 1436 }
515faf5d 1437 else {
a403781d 1438 /*
515faf5d 1439 if (maxMeasuresPerChannelInTDC = 1) {
1440
1441 for (Int_t jj=0; jj<=localIndex; jj++) {
1442 if (psArray[jj]==2) {
1443 fIndex++;
1444 buf[fIndex] = localBuffer[jj];
1445 localBuffer[jj] = 0;
1446 psArray[jj] = -1;
1447 }
1448 }
1449 for (Int_t jj=0; jj<=localIndex; jj++) {
1450 if (psArray[jj]==1) {
1451 fIndex++;
1452 buf[fIndex] = localBuffer[jj];
1453 localBuffer[jj] = 0;
1454 psArray[jj] = -1;
1455 }
1456 }
1457
1458 } // if (maxMeasuresPerChannelInTDC = 1)
1459 else if (maxMeasuresPerChannelInTDC>1) {
1460
a403781d 1461 AliInfo(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 1462 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
a403781d 1463 */
3c609b5c 1464 for (jj=0; jj<=localIndex; jj++) {
515faf5d 1465 fIndex++;
1466 buf[fIndex] = localBuffer[jj];
1467 localBuffer[jj] = 0;
1468 psArray[jj] = -1;
1469 }
1470
a403781d 1471 //} // else if (maxMeasuresPerChannelInTDC>1)
515faf5d 1472
1473 } // else (!fPackedAcquisition)
1474
1475 localIndex = -1;
1476
a403781d 1477 //maxMeasuresPerChannelInTDC = 0;
1478
515faf5d 1479 } // end loop on TDC number
15ec34b9 1480
d0eb8f39 1481
1482 if (fVerbose==2) ftxt.close();
1483
1484}
1485
1486//----------------------------------------------------------------------------
1487void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1488{
1489 //
1490 // Reverses the n elements of array a
1491 //
1492
1493 Int_t ii, temp;
1494
1495 for (ii=0; ii<n/2; ii++) {
1496 temp = a[ii];
1497 a[ii] = a[n-ii-1];
1498 a[n-ii-1] = temp;
1499 }
1500
1501 return;
1502
1503}
15ec34b9 1504
1505//----------------------------------------------------------------------------
1506Bool_t AliTOFDDLRawData::HeadOrTail() const
1507{
1508 //
1509 // Returns the result of a 'pitch and toss'
1510 //
1511
1512 Double_t dummy = gRandom->Rndm();
1513
1514 if (dummy<0.5) return kFALSE;
1515 else return kTRUE;
1516
1517}