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"
83 #include "AliFstream.h"
85 #include "AliTOFDDLRawData.h"
86 #include "AliTOFDigitMap.h"
87 #include "AliTOFdigit.h"
88 #include "AliTOFGeometry.h"
89 #include "AliTOFRawStream.h"
90 //#include "AliTOFCableLengthMap.h"
92 extern TRandom *gRandom;
94 ClassImp(AliTOFDDLRawData)
96 //---------------------------------------------------------------------------
97 AliTOFDDLRawData::AliTOFDDLRawData():
101 fPackedAcquisition(kFALSE),
102 fFakeOrphaneProduction(kFALSE),
103 fMatchingWindow(8192),
104 fTOFdigitMap(new AliTOFDigitMap()),
106 //fTOFrawStream(AliTOFRawStream()),
107 //fTOFCableLengthMap(new AliTOFCableLengthMap())
109 //Default constructor
111 //----------------------------------------------------------------------------
112 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
114 fVerbose(source.fVerbose),
115 fIndex(source.fIndex),
116 fPackedAcquisition(source.fPackedAcquisition),
117 fFakeOrphaneProduction(source.fFakeOrphaneProduction),
118 fMatchingWindow(source.fMatchingWindow),
119 fTOFdigitMap(source.fTOFdigitMap),
120 fTOFdigitArray(source.fTOFdigitArray)
121 //fTOFrawStream(source.fTOFrawStream),
122 //fTOFCableLengthMap(source.fTOFCableLengthMap)
128 //----------------------------------------------------------------------------
129 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
135 TObject::operator=(source);
136 fIndex=source.fIndex;
137 fVerbose=source.fVerbose;
138 fPackedAcquisition=source.fPackedAcquisition;
139 fFakeOrphaneProduction=source.fFakeOrphaneProduction;
140 fMatchingWindow=source.fMatchingWindow;
141 fTOFdigitMap=source.fTOFdigitMap;
142 fTOFdigitArray=source.fTOFdigitArray;
143 //fTOFrawStream=source.fTOFrawStream;
144 //fTOFCableLengthMap=source.fTOFCableLengthMap;
148 //----------------------------------------------------------------------------
149 AliTOFDDLRawData::~AliTOFDDLRawData()
152 //delete fTOFrawStream;
153 //delete fTOFCableLengthMap;
155 //----------------------------------------------------------------------------
156 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch)
159 // This method creates the Raw data files for TOF detector
162 const Int_t kSize = 5000; // max number of digits per DDL file times 2
166 // To clear the digit indices map for each event
167 fTOFdigitMap->Clear();
169 //fTOFrawStream->Clear();
173 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
175 const Int_t kDimension=15;
176 char fileName[kDimension];
177 AliFstream* outfile; // logical name of the output file
179 //AliRawDataHeader header;
180 AliRawDataHeaderSim header;
182 UInt_t sizeRawData = 0;
188 //if (!fPackedAcquisition) fMatchingWindow = 2097152;//AdC
196 UInt_t nWordsPerTRM = 0;
198 //loop over TOF DDL files
199 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
201 strncpy(fileName,AliDAQ::DdlFileName("TOF",nDDL),kDimension); //The name of the output file
203 outfile = new AliFstream(fileName);
204 //iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
205 iDDL = AliTOFRawStream::GetDDLnumberPerSector(nDDL);
207 // write Dummy DATA HEADER
208 UInt_t dataHeaderPosition = outfile->Tellp();
209 outfile->WriteBuffer((char*)(&header),sizeof(header));
211 // DRM section: trailer
216 buf[fIndex] = MakeFiller();
221 // loop on TRM number per DRM
222 for (nTRM=AliTOFGeometry::NTRM(); nTRM>=3; nTRM--) {
226 // the slot number 3 of the even DRM (i.e. right) doesn't contain TDC digit data
227 if (iDDL%2==0 && nTRM==3) continue;
229 // TRM global trailer
232 // loop on TRM chain number per TRM
233 for (iChain=AliTOFGeometry::NChain()-1; iChain>=0; iChain--) {
236 MakeTRMchainTrailer(iChain, buf);
240 MakeTDCdigits(nDDL, nTRM, iChain, buf, nWordsPerTRM);
243 MakeTRMchainHeader(nTRM, iChain, buf);
246 } // end loop on iChain
249 MakeTRMheader(nTRM, buf);
251 // TRM filler in case where TRM data number is odd
252 if (nWordsPerTRM%2!=0) MakeTRMfiller(buf, nWordsPerTRM);
254 } // end loop on nTRM
257 MakeDRMheader(nDDL, buf);
259 ReverseArray(buf, fIndex+1);
261 outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t)));
263 for (jj=0; jj<(fIndex+1); jj++) buf[jj]=0;
266 //Write REAL DATA HEADER
267 UInt_t currentFilePosition = outfile->Tellp();
268 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
269 header.fSize = currentFilePosition - dataHeaderPosition;
270 header.SetAttribute(0); // valid data
271 outfile->Seekp(dataHeaderPosition);
272 outfile->WriteBuffer((char*)(&header),sizeof(header));
273 outfile->Seekp(currentFilePosition);
277 } //end loop on DDL file number
283 //----------------------------------------------------------------------------
284 void AliTOFDDLRawData::GetDigits()
287 // Fill the TOF volumes' map with the TOF digit indices
290 Int_t vol[5] = {-1,-1,-1,-1,-1};
293 Int_t ndigits = fTOFdigitArray->GetEntries();
294 AliDebug(2, Form(" Number of read digits = %d",ndigits));
297 // loop on TOF digits
298 for (digit=0; digit<ndigits; digit++) {
299 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(digit);
301 vol[0] = digs->GetSector(); // Sector Number (0-17)
302 vol[1] = digs->GetPlate(); // Plate Number (0-4)
303 vol[2] = digs->GetStrip(); // Strip Number (0-14/18)
304 vol[3] = digs->GetPadx(); // Pad Number in x direction (0-47)
305 vol[4] = digs->GetPadz(); // Pad Number in z direction (0-1)
307 fTOFdigitMap->AddDigit(vol, digit);
309 } // close loop on digit del TOF
310 AliDebug(2,Form(" Number of mapped digits = %d",fTOFdigitMap->GetFilledCellNumber()));
313 //----------------------------------------------------------------------------
314 void AliTOFDDLRawData::MakeDRMheader(Int_t nDDL, UInt_t *buf)
320 //Int_t iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
321 Int_t iDDL = AliTOFRawStream::GetDDLnumberPerSector(nDDL);
323 //Int_t iSector = fTOFrawStream->GetSectorNumber(nDDL);
324 Int_t iSector = AliTOFRawStream::GetSectorNumber(nDDL);
331 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
332 AliBitPacking::PackWord(word,baseWord, 0, 3);
333 word = 0; // event CRC
334 AliBitPacking::PackWord(word,baseWord, 4,19);
335 word = 0; // reserved for future use
336 AliBitPacking::PackWord(word,baseWord,20,27);
337 word = 4; // 0100 -> DRM header ID
338 AliBitPacking::PackWord(word,baseWord,28,31);
340 buf[fIndex]=baseWord;
342 // DRM status header 4
344 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
345 AliBitPacking::PackWord(word,baseWord, 0, 3);
346 word = 0; // temperature
347 AliBitPacking::PackWord(word,baseWord, 4,13);
349 AliBitPacking::PackWord(word,baseWord, 14,14);
351 AliBitPacking::PackWord(word,baseWord, 15,15);
353 AliBitPacking::PackWord(word,baseWord, 16,18);
355 AliBitPacking::PackWord(word,baseWord, 19,19);
356 word = 0; // reserved for future use
357 AliBitPacking::PackWord(word,baseWord, 20,27);
358 word = 4; // 0100 -> DRM header ID
359 AliBitPacking::PackWord(word,baseWord,28,31);
361 buf[fIndex]=baseWord;
363 // DRM status header 3
365 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
366 AliBitPacking::PackWord(word,baseWord, 0, 3);
368 AliBitPacking::PackWord(word,baseWord, 4,15);
369 word = 0; // Run Time info
370 AliBitPacking::PackWord(word,baseWord, 16,27);
371 word = 4; // 0100 -> DRM header ID
372 AliBitPacking::PackWord(word,baseWord,28,31);
374 buf[fIndex]=baseWord;
376 // DRM status header 2
378 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
379 AliBitPacking::PackWord(word,baseWord, 0, 3);
382 word = 2047; // enable ID: [00000000000;11111111111] for odd
383 // (i.e. right) crates
384 AliBitPacking::PackWord(word,baseWord, 4,14);
386 word = 2045; // enable ID: [00000000000;11111111101] for even
387 // (i.e. left) crates
388 AliBitPacking::PackWord(word,baseWord, 4,14);
392 AliBitPacking::PackWord(word,baseWord,15,15);
393 word = 0; // fault ID
394 AliBitPacking::PackWord(word,baseWord,16,26);
396 AliBitPacking::PackWord(word,baseWord,27,27);
397 word = 4; // 0100 -> DRM header ID
398 AliBitPacking::PackWord(word,baseWord,28,31);
400 buf[fIndex]=baseWord;
402 // DRM status header 1
404 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
405 AliBitPacking::PackWord(word,baseWord, 0, 3);
408 word = 2047; // slot ID: [00000000000;11111111111] for odd
409 // (i.e. right) crates
410 AliBitPacking::PackWord(word,baseWord, 4,14);
412 word = 2045; // slot ID: [00000000000;11111111101] for even
413 // (i.e. left) crates
414 AliBitPacking::PackWord(word,baseWord, 4,14);
417 word = 1; // LHC clock status: 1/0
418 AliBitPacking::PackWord(word,baseWord,15,15);
420 AliBitPacking::PackWord(word,baseWord,16,20);
421 word = 0; // DRMH size
422 AliBitPacking::PackWord(word,baseWord,21,24);
423 word = 0; // reserved for future use
424 AliBitPacking::PackWord(word,baseWord,25,27);
425 word = 4; // 0100 -> DRM header ID
426 AliBitPacking::PackWord(word,baseWord,28,31);
428 buf[fIndex]=baseWord;
432 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
433 AliBitPacking::PackWord(word,baseWord, 0, 3);
434 word = fIndex+1 + 1; // event words
435 AliBitPacking::PackWord(word,baseWord, 4,20);
436 word = iDDL; // crate ID [0;3]
437 AliBitPacking::PackWord(word,baseWord,21,22);
438 word = iSector; // sector ID [0;17]
439 AliBitPacking::PackWord(word,baseWord,23,27);
440 word = 4; // 0100 -> DRM header ID
441 AliBitPacking::PackWord(word,baseWord,28,31);
443 buf[fIndex]=baseWord;
447 //----------------------------------------------------------------------------
448 void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
451 // DRM global trailer
458 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
459 AliBitPacking::PackWord(word,baseWord, 0, 3);
460 word = 0; // local event counter
461 AliBitPacking::PackWord(word,baseWord, 4,15);
462 word = 0; // reserved for future use
463 AliBitPacking::PackWord(word,baseWord,16,27);
464 word = 5; // 0101 -> DRM trailer ID
465 AliBitPacking::PackWord(word,baseWord,28,31);
467 buf[fIndex]=baseWord;
471 //----------------------------------------------------------------------------
472 void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
482 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
483 AliBitPacking::PackWord(word,baseWord, 0, 3);
484 word = 35; // event words
485 AliBitPacking::PackWord(word,baseWord, 4,16);
486 word = 0; // crc error
487 AliBitPacking::PackWord(word,baseWord,17,17);
489 AliBitPacking::PackWord(word,baseWord,18,23);
491 AliBitPacking::PackWord(word,baseWord,24,27);
492 word = 4; // 0100 -> LTM header ID
493 AliBitPacking::PackWord(word,baseWord,28,31);
495 buf[fIndex]=baseWord;
499 //----------------------------------------------------------------------------
500 void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
511 AliBitPacking::PackWord(word,baseWord,0,9);
513 AliBitPacking::PackWord(word,baseWord,10,19);
515 AliBitPacking::PackWord(word,baseWord,20,29);
517 AliBitPacking::PackWord(word,baseWord,30,30);
519 AliBitPacking::PackWord(word,baseWord,31,31);
524 buf[fIndex]=baseWord;
528 buf[fIndex]=baseWord;
532 buf[fIndex]=baseWord;
536 buf[fIndex]=baseWord;
540 buf[fIndex]=baseWord;
544 buf[fIndex]=baseWord;
548 buf[fIndex]=baseWord;
552 buf[fIndex]=baseWord;
556 buf[fIndex]=baseWord;
560 buf[fIndex]=baseWord;
564 buf[fIndex]=baseWord;
568 buf[fIndex]=baseWord;
572 buf[fIndex]=baseWord;
576 buf[fIndex]=baseWord;
580 buf[fIndex]=baseWord;
584 buf[fIndex]=baseWord;
589 word = 100; // Local temperature in LTM11 -> 4 X 25 degree (environment temperature)
590 AliBitPacking::PackWord(word,baseWord, 0, 9);
591 word = 100; // Local temperature in LTM10 -> 4 X 25 degree (environment temperature)
592 AliBitPacking::PackWord(word,baseWord,10,19);
593 word = 100; // Local temperature in LTM9 -> 4 X 25 degree (environment temperature)
594 AliBitPacking::PackWord(word,baseWord,20,29);
596 AliBitPacking::PackWord(word,baseWord,30,30);
598 AliBitPacking::PackWord(word,baseWord,31,31);
601 buf[fIndex]=baseWord;
603 // Local temperature in LTM8, LMT7, LTM6 -> 4 X 25 degree (environment temperature)
605 buf[fIndex]=baseWord;
607 // Local temperature in LTM5, LMT4, LTM3 -> 4 X 25 degree (environment temperature)
609 buf[fIndex]=baseWord;
611 // Local temperature in LTM2, LMT1, LTM0 -> 4 X 25 degree (environment temperature)
613 buf[fIndex]=baseWord;
617 // Local temperature in T7, T6, T5 -> 4 X 25 degree (environment temperature)
619 buf[fIndex]=baseWord;
621 // Local temperature in T4, T3, T2 -> 4 X 25 degree (environment temperature)
623 buf[fIndex]=baseWord;
625 // Local temperature in T1, T0 -> 4 X 25 degree (environment temperature)
626 // Local temperature in VTH15 -> Thereshould voltage for FEAC15
628 buf[fIndex]=baseWord;
631 word = 0; // VTH13 -> Thereshould voltage for FEAC16
632 AliBitPacking::PackWord(word,baseWord, 0, 9);
633 word = 0; // VTH14 -> Thereshould voltage for FEAC14
634 AliBitPacking::PackWord(word,baseWord,10,19);
635 word = 0; // GND-FEAC7 -> Voltage drop between GND and FEAC7
636 AliBitPacking::PackWord(word,baseWord,20,29);
638 AliBitPacking::PackWord(word,baseWord,30,30);
640 AliBitPacking::PackWord(word,baseWord,31,31);
643 buf[fIndex]=baseWord;
645 // VTH11 -> Thereshould voltage for FEAC11
646 // VTH12 -> Thereshould voltage for FEAC12
647 // GND-FEAC6 -> Voltage drop between GND and FEAC6
649 buf[fIndex]=baseWord;
651 // VTH9 -> Thereshould voltage for FEAC11
652 // VTH10 -> Thereshould voltage for FEAC12
653 // GND-FEAC5 -> Voltage drop between GND and FEAC6
655 buf[fIndex]=baseWord;
657 // VTH7 -> Thereshould voltage for FEAC11
658 // VTH8 -> Thereshould voltage for FEAC12
659 // GND-FEAC4 -> Voltage drop between GND and FEAC6
661 buf[fIndex]=baseWord;
663 // VTH5 -> Thereshould voltage for FEAC11
664 // VTH6 -> Thereshould voltage for FEAC12
665 // GND-FEAC3 -> Voltage drop between GND and FEAC6
667 buf[fIndex]=baseWord;
669 // VTH3 -> Thereshould voltage for FEAC11
670 // VTH4 -> Thereshould voltage for FEAC12
671 // GND-FEAC2 -> Voltage drop between GND and FEAC6
673 buf[fIndex]=baseWord;
675 // VTH1 -> Thereshould voltage for FEAC11
676 // VTH2 -> Thereshould voltage for FEAC12
677 // GND-FEAC1 -> Voltage drop between GND and FEAC6
679 buf[fIndex]=baseWord;
682 // VTH0 -> Thereshould voltage for FEAC12
683 // GND-FEAC0 -> Voltage drop between GND and FEAC6
685 buf[fIndex]=baseWord;
688 // VTH0 -> Thereshould voltage for FEAC12
689 // GND-FEAC0 -> Voltage drop between GND and FEAC6
691 buf[fIndex]=baseWord;
697 buf[fIndex]=baseWord;
703 buf[fIndex]=baseWord;
709 buf[fIndex]=baseWord;
715 buf[fIndex]=baseWord;
721 buf[fIndex]=baseWord;
726 word = 0; // PDL45 -> Delay Line setting for PDL41
727 AliBitPacking::PackWord(word,baseWord, 0, 7);
728 word = 0; // PDL46 -> Delay Line setting for PDL42
729 AliBitPacking::PackWord(word,baseWord, 8,15);
730 word = 0; // PDL47 -> Delay Line setting for PDL43
731 AliBitPacking::PackWord(word,baseWord,16,23);
732 word = 0; // PDL48 -> Delay Line setting for PDL44
733 AliBitPacking::PackWord(word,baseWord,24,31);
735 buf[fIndex]=baseWord;
737 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
739 buf[fIndex]=baseWord;
741 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
743 buf[fIndex]=baseWord;
745 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
747 buf[fIndex]=baseWord;
749 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
751 buf[fIndex]=baseWord;
753 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
755 buf[fIndex]=baseWord;
757 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
759 buf[fIndex]=baseWord;
761 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
763 buf[fIndex]=baseWord;
765 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
767 buf[fIndex]=baseWord;
769 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
771 buf[fIndex]=baseWord;
773 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
775 buf[fIndex]=baseWord;
779 //----------------------------------------------------------------------------
780 void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
790 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
791 AliBitPacking::PackWord(word,baseWord, 0, 3);
792 word = 0; // event crc
793 AliBitPacking::PackWord(word,baseWord, 4,15);
794 word = 0; // event number
795 AliBitPacking::PackWord(word,baseWord,16,27);
796 word = 5; // 0101 -> LTM trailer ID
797 AliBitPacking::PackWord(word,baseWord,28,31);
799 buf[fIndex]=baseWord;
803 //----------------------------------------------------------------------------
804 void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
807 // TRM header for the TRM number nTRM [ 3;12]
810 if (nTRM<3 || nTRM>12) {
811 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
819 word = nTRM; // TRM data coming from the VME slot number nTRM
820 AliBitPacking::PackWord(word,baseWord, 0, 3);
821 word = 0; // event words
822 AliBitPacking::PackWord(word,baseWord, 4,16);
824 if (fPackedAcquisition)
825 word = 0; // ACQuisition mode: [0;3] see document
827 word = 3; // ACQuisition mode: [0;3] see document
828 AliBitPacking::PackWord(word,baseWord,17,18);
829 word = 0; // description of a SEU inside LUT tables for INL compensation;
830 // the data are unaffected
831 AliBitPacking::PackWord(word,baseWord,19,19);
832 word = 0; // Must Be Zero (MBZ)
833 AliBitPacking::PackWord(word,baseWord,20,27);
834 word = 4; // 0100 -> TRM header ID
835 AliBitPacking::PackWord(word,baseWord,28,31);
837 buf[fIndex]=baseWord;
841 //----------------------------------------------------------------------------
842 void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
852 word = 15; // 1111 -> TRM trailer ID 1
853 AliBitPacking::PackWord(word,baseWord, 0, 3);
854 word = 0; // event CRC
855 AliBitPacking::PackWord(word,baseWord, 4,15);
856 word = 0; // local event counter == DRM local event counter
857 AliBitPacking::PackWord(word,baseWord,16,27);
858 word = 5; // 0101 -> TRM trailer ID 2
859 AliBitPacking::PackWord(word,baseWord,28,31);
861 buf[fIndex]=baseWord;
865 //----------------------------------------------------------------------------
866 void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
876 if (nTRM<3 || nTRM>12) {
877 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
881 if (iChain<0 || iChain>1) {
882 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
887 word = nTRM; // TRM data coming from the VME slot ID nTRM
888 AliBitPacking::PackWord(word,baseWord, 0, 3);
889 word = 0; // bunch ID
890 AliBitPacking::PackWord(word,baseWord, 4,15);
891 word = 100; // PB24 temperature -> 4 X 25 degree (environment temperature)
892 AliBitPacking::PackWord(word,baseWord,16,23);
893 word = (Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
894 AliBitPacking::PackWord(word,baseWord,24,26);
896 AliBitPacking::PackWord(word,baseWord,27,27);
899 word = 0; // 0000 -> TRM chain 0 ID
902 word = 2; // 0010 -> TRM chain 1 ID
905 AliBitPacking::PackWord(word,baseWord,28,31);
907 buf[fIndex]=baseWord;
911 //----------------------------------------------------------------------------
912 void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf, UInt_t nWordsPerTRM)
921 for (jj=fIndex; jj>fIndex-(Int_t)nWordsPerTRM; jj--) {
925 buf[fIndex-nWordsPerTRM] = MakeFiller();
929 //----------------------------------------------------------------------------
930 UInt_t AliTOFDDLRawData::MakeFiller() const
933 // Filler word definition: to make even the number of words per TRM/LTM
940 word = 0; // 0000 -> filler ID 1
941 AliBitPacking::PackWord(word,baseWord, 0, 3);
943 AliBitPacking::PackWord(word,baseWord, 4,27);
944 word = 7; // 0111 -> filler ID 2
945 AliBitPacking::PackWord(word,baseWord, 28,31);
951 //----------------------------------------------------------------------------
952 void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
958 if (iChain<0 || iChain>1) {
959 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
968 AliBitPacking::PackWord(word,baseWord, 0, 3);
970 AliBitPacking::PackWord(word,baseWord, 4,15);
971 word = 0; // event counter
972 AliBitPacking::PackWord(word,baseWord,16,27);
975 word = 1; // 0001 -> TRM chain 0 trailer ID
978 word = 3; // 0011 -> TRM chain 1 trailer ID
981 AliBitPacking::PackWord(word,baseWord,28,31);
983 buf[fIndex]=baseWord;
987 //----------------------------------------------------------------------------
988 void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain,
989 UInt_t *buf, UInt_t &nWordsPerTRM)
995 const Double_t kOneMoreFilledCell = 1./(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
996 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
998 if (nDDL<0 || nDDL>71) {
999 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
1003 if (nTRM<3 || nTRM>12) {
1004 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
1008 if (iChain<0 || iChain>1) {
1009 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
1013 Int_t psArray[1000];
1014 UInt_t localBuffer[1000];
1015 Int_t localIndex = -1;
1017 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1019 Int_t volume[5] = {-1, -1, -1, -1, -1};
1020 Int_t indexDigit[3] = {-1, -1, -1};
1022 Int_t totCharge = -1;
1023 Int_t timeOfFlight = -1;
1025 Int_t trailingSpurious = -1;
1026 Int_t leadingSpurious = -1;
1037 //Int_t numberOfMeasuresPerChannel = 0;
1038 //Int_t maxMeasuresPerChannelInTDC = 0;
1040 Bool_t outOut = HeadOrTail();
1044 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
1046 for (jj=0; jj<5; jj++) volume[jj] = -1;
1048 // loop on TDC number
1049 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
1051 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
1052 // for TDC numbers 3-14
1053 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3)!=0) continue;
1055 // loop on TDC channel number
1056 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
1058 //numberOfMeasuresPerChannel = 0;
1060 for (Int_t aa=0; aa<5; aa++) volume[aa]=-1;
1061 AliTOFRawStream::EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
1063 AliDebug(3,Form(" volume -> %2d %1d %2d %2d %1d",volume[0],volume[1],volume[2],volume[3],volume[4]));
1065 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
1066 volume[3]==-1 || volume[4]==-1) continue;
1068 AliDebug(3,Form(" ====== %2d %1d %2d %2d %1d",volume[0],volume[1],volume[2],volume[3],volume[4]));
1070 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
1072 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
1074 if (indexDigit[0]<0) {
1076 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1077 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1079 if ( fFakeOrphaneProduction &&
1080 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
1081 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
1083 percentFilledCells+=kOneMoreFilledCell;
1088 word = trailingSpurious; // trailing edge measurement
1092 word = leadingSpurious; // leading edge measurement
1097 if (nDDL<10) ftxt << " " << nDDL;
1098 else ftxt << " " << nDDL;
1099 if (nTRM<10) ftxt << " " << nTRM;
1100 else ftxt << " " << nTRM;
1101 ftxt << " " << iChain;
1102 if (nTDC<10) ftxt << " " << nTDC;
1103 else ftxt << " " << nTDC;
1105 if (volume[0]<10) ftxt << " -> " << volume[0];
1106 else ftxt << " -> " << volume[0];
1107 ftxt << " " << volume[1];
1108 if (volume[2]<10) ftxt << " " << volume[2];
1109 else ftxt << " " << volume[2];
1110 ftxt << " " << volume[4];
1111 if (volume[3]<10) ftxt << " " << volume[3];
1112 else ftxt << " " << volume[3];
1114 if (word<10) ftxt << " " << word;
1115 else if (word>=10 && word<100) ftxt << " " << word;
1116 else if (word>=100 && word<1000) ftxt << " " << word;
1117 else if (word>=1000 && word<10000) ftxt << " " << word;
1118 else if (word>=10000 && word<100000) ftxt << " " << word;
1119 else if (word>=100000 && word<1000000) ftxt << " " << word;
1120 else ftxt << " " << word;
1121 ftxt << " " << dummyPS << endl;
1124 AliBitPacking::PackWord(word,baseWord, 0,20);
1125 word = iCH; // TDC channel ID [0;7]
1126 AliBitPacking::PackWord(word,baseWord,21,23);
1127 word = nTDC; // TDC ID [0;14]
1128 AliBitPacking::PackWord(word,baseWord,24,27);
1129 word = 0; // error flag
1130 AliBitPacking::PackWord(word,baseWord,28,28);
1131 word = dummyPS; // Packing Status [0;3]
1132 AliBitPacking::PackWord(word,baseWord,29,30);
1133 word = 1; // TRM TDC digit ID
1134 AliBitPacking::PackWord(word,baseWord,31,31);
1137 localBuffer[localIndex]=baseWord;
1138 psArray[localIndex]=dummyPS;
1143 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
1144 } // if (indexDigit[0]<0)
1146 for (jj=0; jj<3;jj++) {
1148 if (indexDigit[jj]<0) continue;
1150 AliDebug(3,Form(" ====== %2d %1d %2d %2d %1d -> %1d %d",volume[0],volume[1],volume[2],volume[3],volume[4],jj,indexDigit[jj]));
1152 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1154 if (digs->GetSector()!=volume[0] ||
1155 digs->GetPlate() !=volume[1] ||
1156 digs->GetStrip() !=volume[2] ||
1157 digs->GetPadx() !=volume[3] ||
1158 digs->GetPadz() !=volume[4]) AliWarning(Form(" --- ERROR --- %2i (%2i) %1i (%1i) %2i (%2i) %2i (%2i) %1i (%1i)",
1159 digs->GetSector(), volume[0],
1160 digs->GetPlate(), volume[1],
1161 digs->GetStrip(), volume[2],
1162 digs->GetPadx(), volume[3],
1163 digs->GetPadz(), volume[4])
1166 timeOfFlight = (Int_t)(digs->GetTdc());
1168 fTOFCableLengthMap->GetCableTimeShiftBin(nDDL, nTRM, iChain, nTDC)*/;
1170 //if (timeOfFlight>=fMatchingWindow+1000) continue; // adc
1171 //if (timeOfFlight>=fMatchingWindow) continue; // adc
1172 if (digs->GetTdcND()>=fMatchingWindow) {
1173 AliDebug(2,"Out of matching window.");
1176 else AliDebug(2,"In matching window");
1178 //numberOfMeasuresPerChannel++;
1180 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1181 totCharge = (Int_t)(digs->GetToT());
1182 // temporary control
1183 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
1185 if (fPackedAcquisition) {
1188 if (nDDL<10) ftxt << " " << nDDL;
1189 else ftxt << " " << nDDL;
1190 if (nTRM<10) ftxt << " " << nTRM;
1191 else ftxt << " " << nTRM;
1192 ftxt << " " << iChain;
1193 if (nTDC<10) ftxt << " " << nTDC;
1194 else ftxt << " " << nTDC;
1196 if (volume[0]<10) ftxt << " -> " << volume[0];
1197 else ftxt << " -> " << volume[0];
1198 ftxt << " " << volume[1];
1199 if (volume[2]<10) ftxt << " " << volume[2];
1200 else ftxt << " " << volume[2];
1201 ftxt << " " << volume[4];
1202 if (volume[3]<10) ftxt << " " << volume[3];
1203 else ftxt << " " << volume[3];
1204 if (totCharge<10) ftxt << " " << totCharge;
1205 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1206 else ftxt << " " << totCharge;
1207 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1208 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1209 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1210 else ftxt << " " << timeOfFlight << endl;
1213 word = timeOfFlight%8192; // time-of-fligth measurement
1214 AliBitPacking::PackWord(word,baseWord, 0,12);
1216 if (totCharge>=256) totCharge = 255;
1217 word = totCharge; // time-over-threshould measurement
1218 AliBitPacking::PackWord(word,baseWord,13,20);
1220 word = iCH; // TDC channel ID [0;7]
1221 AliBitPacking::PackWord(word,baseWord,21,23);
1222 word = nTDC; // TDC ID [0;14]
1223 AliBitPacking::PackWord(word,baseWord,24,27);
1224 word = 0; // error flag
1225 AliBitPacking::PackWord(word,baseWord,28,28);
1226 word = 0; // Packing Status [0;3]
1227 AliBitPacking::PackWord(word,baseWord,29,30);
1228 word = 1; // TRM TDC digit ID
1229 AliBitPacking::PackWord(word,baseWord,31,31);
1232 localBuffer[localIndex]=baseWord;
1237 if ( fFakeOrphaneProduction &&
1238 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
1240 percentFilledCells+=kOneMoreFilledCell;
1242 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1243 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1248 word = trailingSpurious; // trailing edge measurement
1252 word = leadingSpurious; // leading edge measurement
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;
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];
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 << " " << dummyPS << endl;
1284 AliBitPacking::PackWord(word,baseWord, 0,20);
1285 word = iCH; // TDC channel ID [0;7]
1286 AliBitPacking::PackWord(word,baseWord,21,23);
1287 word = nTDC; // TDC ID [0;14]
1288 AliBitPacking::PackWord(word,baseWord,24,27);
1289 word = 0; // error flag
1290 AliBitPacking::PackWord(word,baseWord,28,28);
1291 word = dummyPS; // Packing Status [0;3]
1292 AliBitPacking::PackWord(word,baseWord,29,30);
1293 word = 1; // TRM TDC digit ID
1294 AliBitPacking::PackWord(word,baseWord,31,31);
1297 localBuffer[localIndex]=baseWord;
1298 psArray[localIndex]=dummyPS;
1303 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
1306 } // if (fPackedAcquisition)
1307 else { // if (!fPackedAcquisition)
1309 if ( fFakeOrphaneProduction &&
1310 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
1312 percentFilledCells+=kOneMoreFilledCell;
1314 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1315 word = trailingSpurious;
1319 if (nDDL<10) ftxt << " " << nDDL;
1320 else ftxt << " " << nDDL;
1321 if (nTRM<10) ftxt << " " << nTRM;
1322 else ftxt << " " << nTRM;
1323 ftxt << " " << iChain;
1324 if (nTDC<10) ftxt << " " << nTDC;
1325 else ftxt << " " << nTDC;
1327 if (volume[0]<10) ftxt << " -> " << volume[0];
1328 else ftxt << " -> " << volume[0];
1329 ftxt << " " << volume[1];
1330 if (volume[2]<10) ftxt << " " << volume[2];
1331 else ftxt << " " << volume[2];
1332 ftxt << " " << volume[4];
1333 if (volume[3]<10) ftxt << " " << volume[3];
1334 else ftxt << " " << volume[3];
1336 if (word<10) ftxt << " " << word;
1337 else if (word>=10 && word<100) ftxt << " " << word;
1338 else if (word>=100 && word<1000) ftxt << " " << word;
1339 else if (word>=1000 && word<10000) ftxt << " " << word;
1340 else if (word>=10000 && word<100000) ftxt << " " << word;
1341 else if (word>=100000 && word<1000000) ftxt << " " << word;
1342 else ftxt << " " << word;
1343 ftxt << " " << dummyPS << endl;
1346 AliBitPacking::PackWord(word,baseWord, 0,20);
1347 word = iCH; // TDC channel ID [0;7]
1348 AliBitPacking::PackWord(word,baseWord,21,23);
1349 word = nTDC; // TDC ID [0;14]
1350 AliBitPacking::PackWord(word,baseWord,24,27);
1351 word = 0; // error flag
1352 AliBitPacking::PackWord(word,baseWord,28,28);
1353 word = dummyPS; // Packing Status [0;3]
1354 AliBitPacking::PackWord(word,baseWord,29,30);
1355 word = 1; // TRM TDC digit ID
1356 AliBitPacking::PackWord(word,baseWord,31,31);
1359 localBuffer[localIndex]=baseWord;
1360 psArray[localIndex]=dummyPS;
1365 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
1368 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
1371 if (nDDL<10) ftxt << " " << nDDL;
1372 else ftxt << " " << nDDL;
1373 if (nTRM<10) ftxt << " " << nTRM;
1374 else ftxt << " " << nTRM;
1375 ftxt << " " << iChain;
1376 if (nTDC<10) ftxt << " " << nTDC;
1377 else ftxt << " " << nTDC;
1379 if (volume[0]<10) ftxt << " -> " << volume[0];
1380 else ftxt << " -> " << volume[0];
1381 ftxt << " " << volume[1];
1382 if (volume[2]<10) ftxt << " " << volume[2];
1383 else ftxt << " " << volume[2];
1384 ftxt << " " << volume[4];
1385 if (volume[3]<10) ftxt << " " << volume[3];
1386 else ftxt << " " << volume[3];
1388 if (word<10) ftxt << " " << word;
1389 else if (word>=10 && word<100) ftxt << " " << word;
1390 else if (word>=100 && word<1000) ftxt << " " << word;
1391 else if (word>=1000 && word<10000) ftxt << " " << word;
1392 else if (word>=10000 && word<100000) ftxt << " " << word;
1393 else if (word>=100000 && word<1000000) ftxt << " " << word;
1394 else ftxt << " " << word;
1395 ftxt << " " << 2 << endl;
1398 AliBitPacking::PackWord(word,baseWord, 0,20);
1400 word = iCH; // TDC channel ID [0;7]
1401 AliBitPacking::PackWord(word,baseWord,21,23);
1402 word = nTDC; // TDC ID [0;14]
1403 AliBitPacking::PackWord(word,baseWord,24,27);
1404 word = 0; // error flag
1405 AliBitPacking::PackWord(word,baseWord,28,28);
1406 word = 2; // Packing Status [0;3]
1407 AliBitPacking::PackWord(word,baseWord,29,30);
1408 word = 1; // TRM TDC digit ID
1409 AliBitPacking::PackWord(word,baseWord,31,31);
1412 localBuffer[localIndex]=baseWord;
1413 psArray[localIndex]=2;
1418 word = timeOfFlight%2097152; // leading edge measurement
1421 if (nDDL<10) ftxt << " " << nDDL;
1422 else ftxt << " " << nDDL;
1423 if (nTRM<10) ftxt << " " << nTRM;
1424 else ftxt << " " << nTRM;
1425 ftxt << " " << iChain;
1426 if (nTDC<10) ftxt << " " << nTDC;
1427 else ftxt << " " << nTDC;
1429 if (volume[0]<10) ftxt << " -> " << volume[0];
1430 else ftxt << " -> " << volume[0];
1431 ftxt << " " << volume[1];
1432 if (volume[2]<10) ftxt << " " << volume[2];
1433 else ftxt << " " << volume[2];
1434 ftxt << " " << volume[4];
1435 if (volume[3]<10) ftxt << " " << volume[3];
1436 else ftxt << " " << volume[3];
1438 if (word<10) ftxt << " " << word;
1439 else if (word>=10 && word<100) ftxt << " " << word;
1440 else if (word>=100 && word<1000) ftxt << " " << word;
1441 else if (word>=1000 && word<10000) ftxt << " " << word;
1442 else if (word>=10000 && word<100000) ftxt << " " << word;
1443 else if (word>=100000 && word<1000000) ftxt << " " << word;
1444 else ftxt << " " << word;
1445 ftxt << " " << 1 << endl;
1448 AliBitPacking::PackWord(word,baseWord, 0,20);
1450 word = iCH; // TDC channel ID [0;7]
1451 AliBitPacking::PackWord(word,baseWord,21,23);
1452 word = nTDC; // TDC ID [0;14]
1453 AliBitPacking::PackWord(word,baseWord,24,27);
1454 word = 0; // error flag
1455 AliBitPacking::PackWord(word,baseWord,28,28);
1456 word = 1; // Packing Status [0;3]
1457 AliBitPacking::PackWord(word,baseWord,29,30);
1458 word = 1; // TRM TDC digit ID
1459 AliBitPacking::PackWord(word,baseWord,31,31);
1462 localBuffer[localIndex]=baseWord;
1463 psArray[localIndex]=1;
1469 if ( fFakeOrphaneProduction &&
1470 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
1472 percentFilledCells+=kOneMoreFilledCell;
1474 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1475 word = leadingSpurious;
1479 if (nDDL<10) ftxt << " " << nDDL;
1480 else ftxt << " " << nDDL;
1481 if (nTRM<10) ftxt << " " << nTRM;
1482 else ftxt << " " << nTRM;
1483 ftxt << " " << iChain;
1484 if (nTDC<10) ftxt << " " << nTDC;
1485 else ftxt << " " << nTDC;
1487 if (volume[0]<10) ftxt << " -> " << volume[0];
1488 else ftxt << " -> " << volume[0];
1489 ftxt << " " << volume[1];
1490 if (volume[2]<10) ftxt << " " << volume[2];
1491 else ftxt << " " << volume[2];
1492 ftxt << " " << volume[4];
1493 if (volume[3]<10) ftxt << " " << volume[3];
1494 else ftxt << " " << volume[3];
1496 if (word<10) ftxt << " " << word;
1497 else if (word>=10 && word<100) ftxt << " " << word;
1498 else if (word>=100 && word<1000) ftxt << " " << word;
1499 else if (word>=1000 && word<10000) ftxt << " " << word;
1500 else if (word>=10000 && word<100000) ftxt << " " << word;
1501 else if (word>=100000 && word<1000000) ftxt << " " << word;
1502 else ftxt << " " << word;
1503 ftxt << " " << dummyPS << endl;
1506 AliBitPacking::PackWord(word,baseWord, 0,20);
1507 word = iCH; // TDC channel ID [0;7]
1508 AliBitPacking::PackWord(word,baseWord,21,23);
1509 word = nTDC; // TDC ID [0;14]
1510 AliBitPacking::PackWord(word,baseWord,24,27);
1511 word = 0; // error flag
1512 AliBitPacking::PackWord(word,baseWord,28,28);
1513 word = dummyPS; // Packing Status [0;3]
1514 AliBitPacking::PackWord(word,baseWord,29,30);
1515 word = 1; // TRM TDC digit ID
1516 AliBitPacking::PackWord(word,baseWord,31,31);
1519 localBuffer[localIndex]=baseWord;
1520 psArray[localIndex]=dummyPS;
1525 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
1528 } // if (!fPackedAcquisition)
1530 } //end loop on digits in the same volume
1532 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1533 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1535 } // end loop on TDC channel number
1537 //AliDebug(3,Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
1539 if (localIndex==-1) continue;
1541 if (fPackedAcquisition) {
1543 for (jj=0; jj<=localIndex; jj++) {
1545 buf[fIndex] = localBuffer[jj];
1546 localBuffer[jj] = 0;
1553 if (maxMeasuresPerChannelInTDC = 1) {
1555 for (Int_t jj=0; jj<=localIndex; jj++) {
1556 if (psArray[jj]==2) {
1558 buf[fIndex] = localBuffer[jj];
1559 localBuffer[jj] = 0;
1563 for (Int_t jj=0; jj<=localIndex; jj++) {
1564 if (psArray[jj]==1) {
1566 buf[fIndex] = localBuffer[jj];
1567 localBuffer[jj] = 0;
1572 } // if (maxMeasuresPerChannelInTDC = 1)
1573 else if (maxMeasuresPerChannelInTDC>1) {
1575 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",
1576 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
1578 for (jj=0; jj<=localIndex; jj++) {
1580 buf[fIndex] = localBuffer[jj];
1581 localBuffer[jj] = 0;
1585 //} // else if (maxMeasuresPerChannelInTDC>1)
1587 } // else (!fPackedAcquisition)
1591 //maxMeasuresPerChannelInTDC = 0;
1593 } // end loop on TDC number
1596 if (fVerbose==2) ftxt.close();
1600 //----------------------------------------------------------------------------
1601 void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1604 // Reverses the n elements of array a
1609 for (ii=0; ii<n/2; ii++) {
1619 //----------------------------------------------------------------------------
1620 Bool_t AliTOFDDLRawData::HeadOrTail() const
1623 // Returns the result of a 'pitch and toss'
1626 Double_t dummy = gRandom->Rndm();
1628 if (dummy<0.5) return kFALSE;