1 /**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.19 2007/06/22 11:37:47 cvetan
19 Fixes in order to write correct raw-data on big-endian platforms (Marco)
21 Revision 1.18 2007/05/21 13:26:19 decaro
22 Correction on matching_window control and bug fixing (R.Preghenella)
24 Revision 1.17 2007/05/10 09:29:34 hristov
25 Last moment fixes and changes from v4-05-Release (Silvia)
27 Revision 1.16 2007/05/03 09:07:22 decaro
28 Double digit in the same TDC channel. Wrong sequence during the raw data writing in unpacked mode: solved
30 Revision 1.15 2007/04/23 16:51:39 decaro
31 Digits-to-raw_data conversion: correction for a more real description (A.De Caro, R.Preghenella)
33 Revision 1.14 2007/03/28 10:50:33 decaro
34 Rounding off problem in rawData coding/decoding: solved
36 Revision 1.13 2007/02/20 15:57:00 decaro
37 Raw data update: to read the TOF raw data defined in UNPACKED mode
39 Revision 1.12 2006/08/22 13:29:42 arcelli
40 removal of effective c++ warnings (C.Zampolli)
42 Revision 1.11 2006/08/10 14:46:54 decaro
43 TOF raw data format: updated version
45 Revision 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')
51 Revision 0.02 2005/7/25 A.De Caro
52 Update number of bits allocated for time-of-flight
53 and 'charge' measurements
55 Revision 0.01 2004/6/11 A.De Caro, S.B.Sellitto, R.Silvestri
56 First implementation: global methods RawDataTOF
60 ////////////////////////////////////////////////////////////////////
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. //
69 ////////////////////////////////////////////////////////////////////
71 #include "Riostream.h"
74 #include "TClonesArray.h"
78 #include "AliBitPacking.h"
81 //#include "AliRawDataHeader.h"
82 #include "AliRawDataHeaderSim.h"
84 #include "AliTOFDDLRawData.h"
85 #include "AliTOFDigitMap.h"
86 #include "AliTOFdigit.h"
87 #include "AliTOFGeometry.h"
88 #include "AliTOFRawStream.h"
89 #include "AliFstream.h"
91 extern TRandom *gRandom;
93 ClassImp(AliTOFDDLRawData)
95 //---------------------------------------------------------------------------
96 AliTOFDDLRawData::AliTOFDDLRawData():
99 fPackedAcquisition(kTRUE),
100 fFakeOrphaneProduction(kFALSE),
101 fMatchingWindow(8192),
102 fTOFdigitMap(new AliTOFDigitMap()),
104 fTOFrawStream(new AliTOFRawStream())
106 //Default constructor
108 //----------------------------------------------------------------------------
109 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
113 fPackedAcquisition(kTRUE),
114 fFakeOrphaneProduction(kFALSE),
115 fMatchingWindow(8192),
116 fTOFdigitMap(new AliTOFDigitMap()),
118 fTOFrawStream(new AliTOFRawStream())
121 this->fIndex=source.fIndex;
122 this->fVerbose=source.fVerbose;
123 this->fPackedAcquisition=source.fPackedAcquisition;
124 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
125 this->fMatchingWindow=source.fMatchingWindow;
126 this->fTOFdigitMap=source.fTOFdigitMap;
127 this->fTOFdigitArray=source.fTOFdigitArray;
128 this->fTOFrawStream=source.fTOFrawStream;
132 //----------------------------------------------------------------------------
133 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
135 this->fIndex=source.fIndex;
136 this->fVerbose=source.fVerbose;
137 this->fPackedAcquisition=source.fPackedAcquisition;
138 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
139 this->fMatchingWindow=source.fMatchingWindow;
140 this->fTOFdigitMap=source.fTOFdigitMap;
141 this->fTOFdigitArray=source.fTOFdigitArray;
142 this->fTOFrawStream=source.fTOFrawStream;
146 //----------------------------------------------------------------------------
147 AliTOFDDLRawData::~AliTOFDDLRawData()
150 delete fTOFrawStream;
152 //----------------------------------------------------------------------------
153 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch)
156 // This method creates the Raw data files for TOF detector
159 const Int_t kSize = 5000; //max number of digits per DDL file times 2
165 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
168 AliFstream* outfile; // logical name of the output file
170 //AliRawDataHeader header;
171 AliRawDataHeaderSim header;
173 UInt_t sizeRawData = 0;
185 UInt_t nWordsPerTRM = 0;
187 //loop over TOF DDL files
188 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
190 strcpy(fileName,AliDAQ::DdlFileName("TOF",nDDL)); //The name of the output file
192 outfile = new AliFstream(fileName);
193 iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
195 // write Dummy DATA HEADER
196 UInt_t dataHeaderPosition = outfile->Tellp();
197 outfile->WriteBuffer((char*)(&header),sizeof(header));
199 // DRM section: trailer
204 buf[fIndex] = MakeFiller();
209 // loop on TRM number per DRM
210 for (nTRM=AliTOFGeometry::NTRM(); nTRM>=3; nTRM--) {
214 // the slot number 3 of the even DRM (i.e. right) doesn't contain TDC digit data
215 if (iDDL%2==0 && nTRM==3) continue;
217 // TRM global trailer
220 // loop on TRM chain number per TRM
221 for (iChain=AliTOFGeometry::NChain()-1; iChain>=0; iChain--) {
224 MakeTRMchainTrailer(iChain, buf);
228 MakeTDCdigits(nDDL, nTRM, iChain, buf, nWordsPerTRM);
231 MakeTRMchainHeader(nTRM, iChain, buf);
234 } // end loop on iChain
237 MakeTRMheader(nTRM, buf);
239 // TRM filler in case where TRM data number is odd
240 if (nWordsPerTRM%2!=0) MakeTRMfiller(buf, nWordsPerTRM);
242 } // end loop on nTRM
245 MakeDRMheader(nDDL, buf);
247 ReverseArray(buf, fIndex+1);
249 outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t)));
251 for (jj=0; jj<(fIndex+1); jj++) buf[jj]=0;
254 //Write REAL DATA HEADER
255 UInt_t currentFilePosition = outfile->Tellp();
256 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
257 header.fSize = currentFilePosition - dataHeaderPosition;
258 header.SetAttribute(0); // valid data
259 outfile->Seekp(dataHeaderPosition);
260 outfile->WriteBuffer((char*)(&header),sizeof(header));
261 outfile->Seekp(currentFilePosition);
265 } //end loop on DDL file number
271 //----------------------------------------------------------------------------
272 void AliTOFDDLRawData::GetDigits()
275 // Fill the TOF volumes' map with the TOF digit indices
278 Int_t vol[5] = {-1,-1,-1,-1,-1};
281 Int_t ndigits = fTOFdigitArray->GetEntries();
285 // loop on TOF digits
286 for (digit=0; digit<ndigits; digit++) {
287 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(digit);
289 vol[0] = digs->GetSector(); // Sector Number (0-17)
290 vol[1] = digs->GetPlate(); // Plate Number (0-4)
291 vol[2] = digs->GetStrip(); // Strip Number (0-14/18)
292 vol[3] = digs->GetPadx(); // Pad Number in x direction (0-47)
293 vol[4] = digs->GetPadz(); // Pad Number in z direction (0-1)
295 fTOFdigitMap->AddDigit(vol, digit);
297 } // close loop on digit del TOF
301 //----------------------------------------------------------------------------
302 void AliTOFDDLRawData::MakeDRMheader(Int_t nDDL, UInt_t *buf)
308 Int_t iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
310 Int_t iSector = fTOFrawStream->GetSectorNumber(nDDL);
317 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
318 AliBitPacking::PackWord(word,baseWord, 0, 3);
319 word = 0; // event CRC
320 AliBitPacking::PackWord(word,baseWord, 4,19);
321 word = 0; // reserved for future use
322 AliBitPacking::PackWord(word,baseWord,20,27);
323 word = 4; // 0100 -> DRM header ID
324 AliBitPacking::PackWord(word,baseWord,28,31);
326 buf[fIndex]=baseWord;
328 // DRM status header 4
330 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
331 AliBitPacking::PackWord(word,baseWord, 0, 3);
332 word = 0; // temperature
333 AliBitPacking::PackWord(word,baseWord, 4,13);
335 AliBitPacking::PackWord(word,baseWord, 14,14);
337 AliBitPacking::PackWord(word,baseWord, 15,15);
339 AliBitPacking::PackWord(word,baseWord, 16,18);
341 AliBitPacking::PackWord(word,baseWord, 19,19);
342 word = 0; // reserved for future use
343 AliBitPacking::PackWord(word,baseWord, 20,27);
344 word = 4; // 0100 -> DRM header ID
345 AliBitPacking::PackWord(word,baseWord,28,31);
347 buf[fIndex]=baseWord;
349 // DRM status header 3
351 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
352 AliBitPacking::PackWord(word,baseWord, 0, 3);
354 AliBitPacking::PackWord(word,baseWord, 4,15);
355 word = 0; // Run Time info
356 AliBitPacking::PackWord(word,baseWord, 16,27);
357 word = 4; // 0100 -> DRM header ID
358 AliBitPacking::PackWord(word,baseWord,28,31);
360 buf[fIndex]=baseWord;
362 // DRM status header 2
364 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
365 AliBitPacking::PackWord(word,baseWord, 0, 3);
368 word = 2047; // enable ID: [00000000000;11111111111] for odd
369 // (i.e. right) crates
370 AliBitPacking::PackWord(word,baseWord, 4,14);
372 word = 2045; // enable ID: [00000000000;11111111101] for even
373 // (i.e. left) crates
374 AliBitPacking::PackWord(word,baseWord, 4,14);
378 AliBitPacking::PackWord(word,baseWord,15,15);
379 word = 0; // fault ID
380 AliBitPacking::PackWord(word,baseWord,16,26);
382 AliBitPacking::PackWord(word,baseWord,27,27);
383 word = 4; // 0100 -> DRM header ID
384 AliBitPacking::PackWord(word,baseWord,28,31);
386 buf[fIndex]=baseWord;
388 // DRM status header 1
390 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
391 AliBitPacking::PackWord(word,baseWord, 0, 3);
394 word = 2047; // slot ID: [00000000000;11111111111] for odd
395 // (i.e. right) crates
396 AliBitPacking::PackWord(word,baseWord, 4,14);
398 word = 2045; // slot ID: [00000000000;11111111101] for even
399 // (i.e. left) crates
400 AliBitPacking::PackWord(word,baseWord, 4,14);
403 word = 1; // LHC clock status: 1/0
404 AliBitPacking::PackWord(word,baseWord,15,15);
406 AliBitPacking::PackWord(word,baseWord,16,20);
407 word = 0; // DRMH size
408 AliBitPacking::PackWord(word,baseWord,21,24);
409 word = 0; // reserved for future use
410 AliBitPacking::PackWord(word,baseWord,25,27);
411 word = 4; // 0100 -> DRM header ID
412 AliBitPacking::PackWord(word,baseWord,28,31);
414 buf[fIndex]=baseWord;
418 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
419 AliBitPacking::PackWord(word,baseWord, 0, 3);
420 word = fIndex+1 + 1; // event words
421 AliBitPacking::PackWord(word,baseWord, 4,20);
422 word = iDDL; // crate ID [0;3]
423 AliBitPacking::PackWord(word,baseWord,21,22);
424 word = iSector; // sector ID [0;17]
425 AliBitPacking::PackWord(word,baseWord,23,27);
426 word = 4; // 0100 -> DRM header ID
427 AliBitPacking::PackWord(word,baseWord,28,31);
429 buf[fIndex]=baseWord;
433 //----------------------------------------------------------------------------
434 void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
437 // DRM global trailer
444 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
445 AliBitPacking::PackWord(word,baseWord, 0, 3);
446 word = 0; // local event counter
447 AliBitPacking::PackWord(word,baseWord, 4,15);
448 word = 0; // reserved for future use
449 AliBitPacking::PackWord(word,baseWord,16,27);
450 word = 5; // 0101 -> DRM trailer ID
451 AliBitPacking::PackWord(word,baseWord,28,31);
453 buf[fIndex]=baseWord;
457 //----------------------------------------------------------------------------
458 void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
468 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
469 AliBitPacking::PackWord(word,baseWord, 0, 3);
470 word = 35; // event words
471 AliBitPacking::PackWord(word,baseWord, 4,16);
472 word = 0; // crc error
473 AliBitPacking::PackWord(word,baseWord,17,17);
475 AliBitPacking::PackWord(word,baseWord,18,23);
477 AliBitPacking::PackWord(word,baseWord,24,27);
478 word = 4; // 0100 -> LTM header ID
479 AliBitPacking::PackWord(word,baseWord,28,31);
481 buf[fIndex]=baseWord;
485 //----------------------------------------------------------------------------
486 void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
496 word = 100; // Local temperature in LTM5 -> 4 X 25 degree (environment temperature)
497 AliBitPacking::PackWord(word,baseWord, 0, 9);
498 word = 100; // Local temperature in LTM6 -> 4 X 25 degree (environment temperature)
499 AliBitPacking::PackWord(word,baseWord,10,19);
500 word = 100; // Local temperature in LTM7 -> 4 X 25 degree (environment temperature)
501 AliBitPacking::PackWord(word,baseWord,20,29);
503 AliBitPacking::PackWord(word,baseWord,30,31);
506 buf[fIndex]=baseWord;
508 // Local temperature in LTM2, LMT3, LTM4 -> 4 X 25 degree (environment temperature)
510 buf[fIndex]=baseWord;
512 // Local temperature in FEAC7, FEAC8, LTM1 -> 4 X 25 degree (environment temperature)
514 buf[fIndex]=baseWord;
516 // Local temperature in FEAC4, FEAC5, FEAC6 -> 4 X 25 degree (environment temperature)
518 buf[fIndex]=baseWord;
520 // Local temperature in FEAC1, FEAC2, FEAC3 -> 4 X 25 degree (environment temperature)
522 buf[fIndex]=baseWord;
525 word = 0; // GND-FEAC15 -> Voltage drop between GND and FEAC15
526 AliBitPacking::PackWord(word,baseWord, 0, 9);
527 word = 0; // VTH16 -> Thereshould voltage for FEAC16
528 AliBitPacking::PackWord(word,baseWord,10,19);
529 word = 0; // GND-FEAC16 -> Voltage drop between GND and FEAC16
530 AliBitPacking::PackWord(word,baseWord,20,29);
532 AliBitPacking::PackWord(word,baseWord,30,31);
535 buf[fIndex]=baseWord;
537 // VTH14 -> Thereshould voltage for FEAC14
538 // GND-FEAC14 -> Voltage drop between GND and FEAC14
539 // VTH15 -> Thereshould voltage for FEAC15
541 buf[fIndex]=baseWord;
543 // GND-FEAC12 -> Voltage drop between GND and FEAC12
544 // VTH13 -> Thereshould voltage for FEAC13
545 // GND-FEAC13 -> Voltage drop between GND and FEAC13
547 buf[fIndex]=baseWord;
549 // VTH11 -> Thereshould voltage for FEAC11
550 // GND-FEAC11 -> Voltage drop between GND and FEAC11
551 // VTH12 -> Thereshould voltage for FEAC12
553 buf[fIndex]=baseWord;
555 // GND-FEAC9 -> Voltage drop between GND and FEAC9
556 // VTH10 -> Thereshould voltage for FEAC10
557 // GND-FEAC10 -> Voltage drop between GND and FEAC10
559 buf[fIndex]=baseWord;
561 // VTH8 -> Thereshould voltage for FEAC8
562 // GND-FEAC8 -> Voltage drop between GND and FEAC8
563 // VTH9 -> Thereshould voltage for FEAC9
565 buf[fIndex]=baseWord;
567 // GND-FEAC6 -> Voltage drop between GND and FEAC6
568 // VTH7 -> Thereshould voltage for FEAC7
569 // GND-FEAC7 -> Voltage drop between GND and FEAC7
571 buf[fIndex]=baseWord;
573 // VTH5 -> Thereshould voltage for FEAC5
574 // GND-FEAC5 -> Voltage drop between GND and FEAC5
575 // VTH6 -> Thereshould voltage for FEAC6
577 buf[fIndex]=baseWord;
579 // GND-FEAC3 -> Voltage drop between GND and FEAC3
580 // VTH4 -> Thereshould voltage for FEAC4
581 // GND-FEAC4 -> Voltage drop between GND and FEAC4
583 buf[fIndex]=baseWord;
585 // VTH2 -> Thereshould voltage for FEAC2
586 // GND-FEAC2 -> Voltage drop between GND and FEAC2
587 // VTH3 -> Thereshould voltage for FEAC3
589 buf[fIndex]=baseWord;
591 // LV16 -> Low Voltage measured by FEAC16
592 // GND-FEAC1 -> Voltage drop between GND and FEAC1
593 // VTH1 -> Thereshould voltage for FEAC1
595 buf[fIndex]=baseWord;
597 // Low Voltage measured by FEAC13, FEAC14, FEAC15
599 buf[fIndex]=baseWord;
601 // Low Voltage measured by FEAC10, FEAC11, FEAC12
603 buf[fIndex]=baseWord;
605 // Low Voltage measured by FEAC7, FEAC8, FEAC9
607 buf[fIndex]=baseWord;
609 // Low Voltage measured by FEAC4, FEAC5, FEAC6
611 buf[fIndex]=baseWord;
613 // Low Voltage measured by FEAC1, FEAC2, FEAC3
615 buf[fIndex]=baseWord;
619 word = 0; // PDL45 -> Delay Line setting for PDL45
620 AliBitPacking::PackWord(word,baseWord, 0, 7);
621 word = 0; // PDL46 -> Delay Line setting for PDL46
622 AliBitPacking::PackWord(word,baseWord, 8,15);
623 word = 0; // PDL47 -> Delay Line setting for PDL47
624 AliBitPacking::PackWord(word,baseWord,16,23);
625 word = 0; // PDL48 -> Delay Line setting for PDL48
626 AliBitPacking::PackWord(word,baseWord,24,31);
628 buf[fIndex]=baseWord;
630 // Delay Line setting for PDL41, PDL42, PDL43, PDL44
632 buf[fIndex]=baseWord;
634 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
636 buf[fIndex]=baseWord;
638 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
640 buf[fIndex]=baseWord;
642 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
644 buf[fIndex]=baseWord;
646 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
648 buf[fIndex]=baseWord;
650 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
652 buf[fIndex]=baseWord;
654 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
656 buf[fIndex]=baseWord;
658 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
660 buf[fIndex]=baseWord;
662 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
664 buf[fIndex]=baseWord;
666 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
668 buf[fIndex]=baseWord;
670 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
672 buf[fIndex]=baseWord;
676 //----------------------------------------------------------------------------
677 void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
687 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
688 AliBitPacking::PackWord(word,baseWord, 0, 3);
689 word = 0; // event crc
690 AliBitPacking::PackWord(word,baseWord, 4,15);
691 word = 0; // event number
692 AliBitPacking::PackWord(word,baseWord,16,27);
693 word = 5; // 0101 -> LTM trailer ID
694 AliBitPacking::PackWord(word,baseWord,28,31);
696 buf[fIndex]=baseWord;
700 //----------------------------------------------------------------------------
701 void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
704 // TRM header for the TRM number nTRM [ 3;12]
707 if (nTRM<3 || nTRM>12) {
708 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
716 word = nTRM; // TRM data coming from the VME slot number nTRM
717 AliBitPacking::PackWord(word,baseWord, 0, 3);
718 word = 0; // event words
719 AliBitPacking::PackWord(word,baseWord, 4,16);
721 if (fPackedAcquisition)
722 word = 0; // ACQuisition mode: [0;3] see document
724 word = 3; // ACQuisition mode: [0;3] see document
725 AliBitPacking::PackWord(word,baseWord,17,18);
726 word = 0; // description of a SEU inside LUT tables for INL compensation;
727 // the data are unaffected
728 AliBitPacking::PackWord(word,baseWord,19,19);
729 word = 0; // Must Be Zero (MBZ)
730 AliBitPacking::PackWord(word,baseWord,20,27);
731 word = 4; // 0100 -> TRM header ID
732 AliBitPacking::PackWord(word,baseWord,28,31);
734 buf[fIndex]=baseWord;
738 //----------------------------------------------------------------------------
739 void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
749 word = 15; // 1111 -> TRM trailer ID 1
750 AliBitPacking::PackWord(word,baseWord, 0, 3);
751 word = 0; // event CRC
752 AliBitPacking::PackWord(word,baseWord, 4,15);
753 word = 0; // local event counter == DRM local event counter
754 AliBitPacking::PackWord(word,baseWord,16,27);
755 word = 5; // 0101 -> TRM trailer ID 2
756 AliBitPacking::PackWord(word,baseWord,28,31);
758 buf[fIndex]=baseWord;
762 //----------------------------------------------------------------------------
763 void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
773 if (nTRM<3 || nTRM>12) {
774 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
778 if (iChain<0 || iChain>1) {
779 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
784 word = nTRM; // TRM data coming from the VME slot ID nTRM
785 AliBitPacking::PackWord(word,baseWord, 0, 3);
786 word = 0; // bunch ID
787 AliBitPacking::PackWord(word,baseWord, 4,15);
788 word = 100; // PB24 temperature -> 4 X 25 degree (environment temperature)
789 AliBitPacking::PackWord(word,baseWord,16,23);
790 word = (Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
791 AliBitPacking::PackWord(word,baseWord,24,26);
793 AliBitPacking::PackWord(word,baseWord,27,27);
796 word = 0; // 0000 -> TRM chain 0 ID
799 word = 2; // 0010 -> TRM chain 1 ID
802 AliBitPacking::PackWord(word,baseWord,28,31);
804 buf[fIndex]=baseWord;
808 //----------------------------------------------------------------------------
809 void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf, UInt_t nWordsPerTRM)
818 for (jj=fIndex; jj>fIndex-(Int_t)nWordsPerTRM; jj--) {
822 buf[fIndex-nWordsPerTRM] = MakeFiller();
826 //----------------------------------------------------------------------------
827 UInt_t AliTOFDDLRawData::MakeFiller()
830 // Filler word definition: to make even the number of words per TRM/LTM
837 word = 0; // 0000 -> filler ID 1
838 AliBitPacking::PackWord(word,baseWord, 0, 3);
840 AliBitPacking::PackWord(word,baseWord, 4,27);
841 word = 7; // 0111 -> filler ID 2
842 AliBitPacking::PackWord(word,baseWord, 28,31);
848 //----------------------------------------------------------------------------
849 void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
855 if (iChain<0 || iChain>1) {
856 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
865 AliBitPacking::PackWord(word,baseWord, 0, 3);
867 AliBitPacking::PackWord(word,baseWord, 4,15);
868 word = 0; // event counter
869 AliBitPacking::PackWord(word,baseWord,16,27);
872 word = 1; // 0001 -> TRM chain 0 trailer ID
875 word = 3; // 0011 -> TRM chain 1 trailer ID
878 AliBitPacking::PackWord(word,baseWord,28,31);
880 buf[fIndex]=baseWord;
884 //----------------------------------------------------------------------------
885 void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain,
886 UInt_t *buf, UInt_t &nWordsPerTRM)
892 const Double_t kOneMoreFilledCell = 1./(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
893 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
895 if (nDDL<0 || nDDL>71) {
896 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
900 if (nTRM<3 || nTRM>12) {
901 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
905 if (iChain<0 || iChain>1) {
906 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
911 UInt_t localBuffer[1000];
912 Int_t localIndex = -1;
914 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
916 Int_t volume[5] = {-1, -1, -1, -1, -1};
917 Int_t indexDigit[3] = {-1, -1, -1};
919 Int_t totCharge = -1;
920 Int_t timeOfFlight = -1;
922 Int_t trailingSpurious = -1;
923 Int_t leadingSpurious = -1;
934 //Int_t numberOfMeasuresPerChannel = 0;
935 //Int_t maxMeasuresPerChannelInTDC = 0;
937 Bool_t outOut = HeadOrTail();
941 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
943 for (jj=0; jj<5; jj++) volume[jj] = -1;
945 // loop on TDC number
946 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
948 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
949 // for TDC numbers 3-14
950 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3.)!=0) continue;
952 // loop on TDC channel number
953 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
955 //numberOfMeasuresPerChannel = 0;
957 fTOFrawStream->EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
959 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
960 volume[3]==-1 || volume[4]==-1) continue;
962 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
964 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
966 if (indexDigit[0]<0) {
968 trailingSpurious = Int_t(2097152*gRandom->Rndm());
969 leadingSpurious = Int_t(2097152*gRandom->Rndm());
971 if ( fFakeOrphaneProduction &&
972 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
973 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
975 percentFilledCells+=kOneMoreFilledCell;
980 word = trailingSpurious; // trailing edge measurement
984 word = leadingSpurious; // leading edge measurement
989 if (nDDL<10) ftxt << " " << nDDL;
990 else ftxt << " " << nDDL;
991 if (nTRM<10) ftxt << " " << nTRM;
992 else ftxt << " " << nTRM;
993 ftxt << " " << iChain;
994 if (nTDC<10) ftxt << " " << nTDC;
995 else ftxt << " " << nTDC;
997 if (volume[0]<10) ftxt << " -> " << volume[0];
998 else ftxt << " -> " << volume[0];
999 ftxt << " " << volume[1];
1000 if (volume[2]<10) ftxt << " " << volume[2];
1001 else ftxt << " " << volume[2];
1002 ftxt << " " << volume[4];
1003 if (volume[3]<10) ftxt << " " << volume[3];
1004 else ftxt << " " << volume[3];
1006 if (word<10) ftxt << " " << word;
1007 else if (word>=10 && word<100) ftxt << " " << word;
1008 else if (word>=100 && word<1000) ftxt << " " << word;
1009 else if (word>=1000 && word<10000) ftxt << " " << word;
1010 else if (word>=10000 && word<100000) ftxt << " " << word;
1011 else if (word>=100000 && word<1000000) ftxt << " " << word;
1012 else ftxt << " " << word;
1013 ftxt << " " << dummyPS << endl;
1016 AliBitPacking::PackWord(word,baseWord, 0,20);
1017 word = iCH; // TDC channel ID [0;7]
1018 AliBitPacking::PackWord(word,baseWord,21,23);
1019 word = nTDC; // TDC ID [0;14]
1020 AliBitPacking::PackWord(word,baseWord,24,27);
1021 word = 0; // error flag
1022 AliBitPacking::PackWord(word,baseWord,28,28);
1023 word = dummyPS; // Packing Status [0;3]
1024 AliBitPacking::PackWord(word,baseWord,29,30);
1025 word = 1; // TRM TDC digit ID
1026 AliBitPacking::PackWord(word,baseWord,31,31);
1029 localBuffer[localIndex]=baseWord;
1030 psArray[localIndex]=dummyPS;
1035 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
1036 } // if (indexDigit[0]<0)
1038 for (jj=0; jj<3;jj++) {
1040 if (indexDigit[jj]<0) continue;
1042 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1044 if (digs->GetSector()!=volume[0] ||
1045 digs->GetPlate() !=volume[1] ||
1046 digs->GetStrip() !=volume[2] ||
1047 digs->GetPadx() !=volume[3] ||
1048 digs->GetPadz() !=volume[4]) AliWarning(" --- ERROR --- ");
1050 timeOfFlight = (Int_t)(digs->GetTdc());
1052 if (timeOfFlight>=fMatchingWindow) continue;
1054 //numberOfMeasuresPerChannel++;
1056 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1057 totCharge = (Int_t)(digs->GetToT());
1058 // temporary control
1059 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
1061 if (fPackedAcquisition) {
1064 if (nDDL<10) ftxt << " " << nDDL;
1065 else ftxt << " " << nDDL;
1066 if (nTRM<10) ftxt << " " << nTRM;
1067 else ftxt << " " << nTRM;
1068 ftxt << " " << iChain;
1069 if (nTDC<10) ftxt << " " << nTDC;
1070 else ftxt << " " << nTDC;
1072 if (volume[0]<10) ftxt << " -> " << volume[0];
1073 else ftxt << " -> " << volume[0];
1074 ftxt << " " << volume[1];
1075 if (volume[2]<10) ftxt << " " << volume[2];
1076 else ftxt << " " << volume[2];
1077 ftxt << " " << volume[4];
1078 if (volume[3]<10) ftxt << " " << volume[3];
1079 else ftxt << " " << volume[3];
1080 if (totCharge<10) ftxt << " " << totCharge;
1081 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1082 else ftxt << " " << totCharge;
1083 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1084 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1085 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1086 else ftxt << " " << timeOfFlight << endl;
1089 word = timeOfFlight%8192; // time-of-fligth measurement
1090 AliBitPacking::PackWord(word,baseWord, 0,12);
1092 if (totCharge>=256) totCharge = 255;
1093 word = totCharge; // time-over-threshould measurement
1094 AliBitPacking::PackWord(word,baseWord,13,20);
1096 word = iCH; // TDC channel ID [0;7]
1097 AliBitPacking::PackWord(word,baseWord,21,23);
1098 word = nTDC; // TDC ID [0;14]
1099 AliBitPacking::PackWord(word,baseWord,24,27);
1100 word = 0; // error flag
1101 AliBitPacking::PackWord(word,baseWord,28,28);
1102 word = 0; // Packing Status [0;3]
1103 AliBitPacking::PackWord(word,baseWord,29,30);
1104 word = 1; // TRM TDC digit ID
1105 AliBitPacking::PackWord(word,baseWord,31,31);
1108 localBuffer[localIndex]=baseWord;
1113 if ( fFakeOrphaneProduction &&
1114 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
1116 percentFilledCells+=kOneMoreFilledCell;
1118 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1119 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1124 word = trailingSpurious; // trailing edge measurement
1128 word = leadingSpurious; // leading edge measurement
1133 if (nDDL<10) ftxt << " " << nDDL;
1134 else ftxt << " " << nDDL;
1135 if (nTRM<10) ftxt << " " << nTRM;
1136 else ftxt << " " << nTRM;
1137 ftxt << " " << iChain;
1138 if (nTDC<10) ftxt << " " << nTDC;
1139 else ftxt << " " << nTDC;
1141 if (volume[0]<10) ftxt << " -> " << volume[0];
1142 else ftxt << " -> " << volume[0];
1143 ftxt << " " << volume[1];
1144 if (volume[2]<10) ftxt << " " << volume[2];
1145 else ftxt << " " << volume[2];
1146 ftxt << " " << volume[4];
1147 if (volume[3]<10) ftxt << " " << volume[3];
1148 else ftxt << " " << volume[3];
1150 if (word<10) ftxt << " " << word;
1151 else if (word>=10 && word<100) ftxt << " " << word;
1152 else if (word>=100 && word<1000) ftxt << " " << word;
1153 else if (word>=1000 && word<10000) ftxt << " " << word;
1154 else if (word>=10000 && word<100000) ftxt << " " << word;
1155 else if (word>=100000 && word<1000000) ftxt << " " << word;
1156 else ftxt << " " << word;
1157 ftxt << " " << dummyPS << endl;
1160 AliBitPacking::PackWord(word,baseWord, 0,20);
1161 word = iCH; // TDC channel ID [0;7]
1162 AliBitPacking::PackWord(word,baseWord,21,23);
1163 word = nTDC; // TDC ID [0;14]
1164 AliBitPacking::PackWord(word,baseWord,24,27);
1165 word = 0; // error flag
1166 AliBitPacking::PackWord(word,baseWord,28,28);
1167 word = dummyPS; // Packing Status [0;3]
1168 AliBitPacking::PackWord(word,baseWord,29,30);
1169 word = 1; // TRM TDC digit ID
1170 AliBitPacking::PackWord(word,baseWord,31,31);
1173 localBuffer[localIndex]=baseWord;
1174 psArray[localIndex]=dummyPS;
1179 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
1182 } // if (fPackedAcquisition)
1183 else { // if (!fPackedAcquisition)
1185 if ( fFakeOrphaneProduction &&
1186 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
1188 percentFilledCells+=kOneMoreFilledCell;
1190 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1191 word = trailingSpurious;
1195 if (nDDL<10) ftxt << " " << nDDL;
1196 else ftxt << " " << nDDL;
1197 if (nTRM<10) ftxt << " " << nTRM;
1198 else ftxt << " " << nTRM;
1199 ftxt << " " << iChain;
1200 if (nTDC<10) ftxt << " " << nTDC;
1201 else ftxt << " " << nTDC;
1203 if (volume[0]<10) ftxt << " -> " << volume[0];
1204 else ftxt << " -> " << volume[0];
1205 ftxt << " " << volume[1];
1206 if (volume[2]<10) ftxt << " " << volume[2];
1207 else ftxt << " " << volume[2];
1208 ftxt << " " << volume[4];
1209 if (volume[3]<10) ftxt << " " << volume[3];
1210 else ftxt << " " << volume[3];
1212 if (word<10) ftxt << " " << word;
1213 else if (word>=10 && word<100) ftxt << " " << word;
1214 else if (word>=100 && word<1000) ftxt << " " << word;
1215 else if (word>=1000 && word<10000) ftxt << " " << word;
1216 else if (word>=10000 && word<100000) ftxt << " " << word;
1217 else if (word>=100000 && word<1000000) ftxt << " " << word;
1218 else ftxt << " " << word;
1219 ftxt << " " << dummyPS << endl;
1222 AliBitPacking::PackWord(word,baseWord, 0,20);
1223 word = iCH; // TDC channel ID [0;7]
1224 AliBitPacking::PackWord(word,baseWord,21,23);
1225 word = nTDC; // TDC ID [0;14]
1226 AliBitPacking::PackWord(word,baseWord,24,27);
1227 word = 0; // error flag
1228 AliBitPacking::PackWord(word,baseWord,28,28);
1229 word = dummyPS; // Packing Status [0;3]
1230 AliBitPacking::PackWord(word,baseWord,29,30);
1231 word = 1; // TRM TDC digit ID
1232 AliBitPacking::PackWord(word,baseWord,31,31);
1235 localBuffer[localIndex]=baseWord;
1236 psArray[localIndex]=dummyPS;
1241 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
1244 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
1247 if (nDDL<10) ftxt << " " << nDDL;
1248 else ftxt << " " << nDDL;
1249 if (nTRM<10) ftxt << " " << nTRM;
1250 else ftxt << " " << nTRM;
1251 ftxt << " " << iChain;
1252 if (nTDC<10) ftxt << " " << nTDC;
1253 else ftxt << " " << nTDC;
1255 if (volume[0]<10) ftxt << " -> " << volume[0];
1256 else ftxt << " -> " << volume[0];
1257 ftxt << " " << volume[1];
1258 if (volume[2]<10) ftxt << " " << volume[2];
1259 else ftxt << " " << volume[2];
1260 ftxt << " " << volume[4];
1261 if (volume[3]<10) ftxt << " " << volume[3];
1262 else ftxt << " " << volume[3];
1264 if (word<10) ftxt << " " << word;
1265 else if (word>=10 && word<100) ftxt << " " << word;
1266 else if (word>=100 && word<1000) ftxt << " " << word;
1267 else if (word>=1000 && word<10000) ftxt << " " << word;
1268 else if (word>=10000 && word<100000) ftxt << " " << word;
1269 else if (word>=100000 && word<1000000) ftxt << " " << word;
1270 else ftxt << " " << word;
1271 ftxt << " " << 2 << endl;
1274 AliBitPacking::PackWord(word,baseWord, 0,20);
1276 word = iCH; // TDC channel ID [0;7]
1277 AliBitPacking::PackWord(word,baseWord,21,23);
1278 word = nTDC; // TDC ID [0;14]
1279 AliBitPacking::PackWord(word,baseWord,24,27);
1280 word = 0; // error flag
1281 AliBitPacking::PackWord(word,baseWord,28,28);
1282 word = 2; // Packing Status [0;3]
1283 AliBitPacking::PackWord(word,baseWord,29,30);
1284 word = 1; // TRM TDC digit ID
1285 AliBitPacking::PackWord(word,baseWord,31,31);
1288 localBuffer[localIndex]=baseWord;
1289 psArray[localIndex]=2;
1294 word = timeOfFlight%2097152; // leading edge measurement
1297 if (nDDL<10) ftxt << " " << nDDL;
1298 else ftxt << " " << nDDL;
1299 if (nTRM<10) ftxt << " " << nTRM;
1300 else ftxt << " " << nTRM;
1301 ftxt << " " << iChain;
1302 if (nTDC<10) ftxt << " " << nTDC;
1303 else ftxt << " " << nTDC;
1305 if (volume[0]<10) ftxt << " -> " << volume[0];
1306 else ftxt << " -> " << volume[0];
1307 ftxt << " " << volume[1];
1308 if (volume[2]<10) ftxt << " " << volume[2];
1309 else ftxt << " " << volume[2];
1310 ftxt << " " << volume[4];
1311 if (volume[3]<10) ftxt << " " << volume[3];
1312 else ftxt << " " << volume[3];
1314 if (word<10) ftxt << " " << word;
1315 else if (word>=10 && word<100) ftxt << " " << word;
1316 else if (word>=100 && word<1000) ftxt << " " << word;
1317 else if (word>=1000 && word<10000) ftxt << " " << word;
1318 else if (word>=10000 && word<100000) ftxt << " " << word;
1319 else if (word>=100000 && word<1000000) ftxt << " " << word;
1320 else ftxt << " " << word;
1321 ftxt << " " << 1 << endl;
1324 AliBitPacking::PackWord(word,baseWord, 0,20);
1326 word = iCH; // TDC channel ID [0;7]
1327 AliBitPacking::PackWord(word,baseWord,21,23);
1328 word = nTDC; // TDC ID [0;14]
1329 AliBitPacking::PackWord(word,baseWord,24,27);
1330 word = 0; // error flag
1331 AliBitPacking::PackWord(word,baseWord,28,28);
1332 word = 1; // Packing Status [0;3]
1333 AliBitPacking::PackWord(word,baseWord,29,30);
1334 word = 1; // TRM TDC digit ID
1335 AliBitPacking::PackWord(word,baseWord,31,31);
1338 localBuffer[localIndex]=baseWord;
1339 psArray[localIndex]=1;
1345 if ( fFakeOrphaneProduction &&
1346 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
1348 percentFilledCells+=kOneMoreFilledCell;
1350 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1351 word = leadingSpurious;
1355 if (nDDL<10) ftxt << " " << nDDL;
1356 else ftxt << " " << nDDL;
1357 if (nTRM<10) ftxt << " " << nTRM;
1358 else ftxt << " " << nTRM;
1359 ftxt << " " << iChain;
1360 if (nTDC<10) ftxt << " " << nTDC;
1361 else ftxt << " " << nTDC;
1363 if (volume[0]<10) ftxt << " -> " << volume[0];
1364 else ftxt << " -> " << volume[0];
1365 ftxt << " " << volume[1];
1366 if (volume[2]<10) ftxt << " " << volume[2];
1367 else ftxt << " " << volume[2];
1368 ftxt << " " << volume[4];
1369 if (volume[3]<10) ftxt << " " << volume[3];
1370 else ftxt << " " << volume[3];
1372 if (word<10) ftxt << " " << word;
1373 else if (word>=10 && word<100) ftxt << " " << word;
1374 else if (word>=100 && word<1000) ftxt << " " << word;
1375 else if (word>=1000 && word<10000) ftxt << " " << word;
1376 else if (word>=10000 && word<100000) ftxt << " " << word;
1377 else if (word>=100000 && word<1000000) ftxt << " " << word;
1378 else ftxt << " " << word;
1379 ftxt << " " << dummyPS << endl;
1382 AliBitPacking::PackWord(word,baseWord, 0,20);
1383 word = iCH; // TDC channel ID [0;7]
1384 AliBitPacking::PackWord(word,baseWord,21,23);
1385 word = nTDC; // TDC ID [0;14]
1386 AliBitPacking::PackWord(word,baseWord,24,27);
1387 word = 0; // error flag
1388 AliBitPacking::PackWord(word,baseWord,28,28);
1389 word = dummyPS; // Packing Status [0;3]
1390 AliBitPacking::PackWord(word,baseWord,29,30);
1391 word = 1; // TRM TDC digit ID
1392 AliBitPacking::PackWord(word,baseWord,31,31);
1395 localBuffer[localIndex]=baseWord;
1396 psArray[localIndex]=dummyPS;
1401 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
1404 } // if (!fPackedAcquisition)
1406 } //end loop on digits in the same volume
1408 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1409 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1411 } // end loop on TDC channel number
1413 //AliInfo(Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
1415 if (localIndex==-1) continue;
1417 if (fPackedAcquisition) {
1419 for (Int_t jj=0; jj<=localIndex; jj++) {
1421 buf[fIndex] = localBuffer[jj];
1422 localBuffer[jj] = 0;
1429 if (maxMeasuresPerChannelInTDC = 1) {
1431 for (Int_t jj=0; jj<=localIndex; jj++) {
1432 if (psArray[jj]==2) {
1434 buf[fIndex] = localBuffer[jj];
1435 localBuffer[jj] = 0;
1439 for (Int_t jj=0; jj<=localIndex; jj++) {
1440 if (psArray[jj]==1) {
1442 buf[fIndex] = localBuffer[jj];
1443 localBuffer[jj] = 0;
1448 } // if (maxMeasuresPerChannelInTDC = 1)
1449 else if (maxMeasuresPerChannelInTDC>1) {
1451 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",
1452 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
1454 for (Int_t jj=0; jj<=localIndex; jj++) {
1456 buf[fIndex] = localBuffer[jj];
1457 localBuffer[jj] = 0;
1461 //} // else if (maxMeasuresPerChannelInTDC>1)
1463 } // else (!fPackedAcquisition)
1467 //maxMeasuresPerChannelInTDC = 0;
1469 } // end loop on TDC number
1472 if (fVerbose==2) ftxt.close();
1476 //----------------------------------------------------------------------------
1477 void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1480 // Reverses the n elements of array a
1485 for (ii=0; ii<n/2; ii++) {
1495 //----------------------------------------------------------------------------
1496 Bool_t AliTOFDDLRawData::HeadOrTail() const
1499 // Returns the result of a 'pitch and toss'
1502 Double_t dummy = gRandom->Rndm();
1504 if (dummy<0.5) return kFALSE;