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()),
110 //Default constructor
112 //----------------------------------------------------------------------------
113 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
115 fVerbose(source.fVerbose),
116 fIndex(source.fIndex),
117 fPackedAcquisition(source.fPackedAcquisition),
118 fFakeOrphaneProduction(source.fFakeOrphaneProduction),
119 fMatchingWindow(source.fMatchingWindow),
120 fTOFdigitMap(source.fTOFdigitMap),
121 fTOFdigitArray(source.fTOFdigitArray),
122 fWordsPerDRM(source.fWordsPerDRM),
123 fWordsPerTRM(source.fWordsPerTRM),
124 fWordsPerChain(source.fWordsPerChain)
130 //----------------------------------------------------------------------------
131 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
137 TObject::operator=(source);
138 fIndex=source.fIndex;
139 fVerbose=source.fVerbose;
140 fPackedAcquisition=source.fPackedAcquisition;
141 fFakeOrphaneProduction=source.fFakeOrphaneProduction;
142 fMatchingWindow=source.fMatchingWindow;
143 fTOFdigitMap=source.fTOFdigitMap;
144 fTOFdigitArray=source.fTOFdigitArray;
145 fWordsPerDRM=source.fWordsPerDRM;
146 fWordsPerTRM=source.fWordsPerTRM;
147 fWordsPerChain=source.fWordsPerChain;
151 //----------------------------------------------------------------------------
152 AliTOFDDLRawData::~AliTOFDDLRawData()
158 //----------------------------------------------------------------------------
159 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch)
162 // This method creates the Raw data files for TOF detector
165 const Int_t kSize = 5000; // max number of digits per DDL file times 2
169 // To clear the digit indices map for each event
170 fTOFdigitMap->Clear();
174 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
176 AliFstream* outfile; // logical name of the output file
178 AliRawDataHeaderSim header;
180 UInt_t sizeRawData = 0;
186 //if (!fPackedAcquisition) fMatchingWindow = 2097152;//AdC
194 //loop over TOF DDL files
195 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
197 char fileName[256]="";
198 strncpy(fileName,AliDAQ::DdlFileName("TOF",nDDL),255); //The name of the output file
200 outfile = new AliFstream(fileName);
201 iDDL = AliTOFRawStream::GetDDLnumberPerSector(nDDL);
203 // write Dummy DATA HEADER
204 UInt_t dataHeaderPosition = outfile->Tellp();
205 outfile->WriteBuffer((char*)(&header),sizeof(header));
207 // DRM section: trailer
210 // loop on TRM number per DRM
211 for (nTRM=AliTOFGeometry::NTRM(); nTRM>=3; nTRM--) {
215 // the slot number 3 of the even DRM (i.e. right) doesn't contain TDC digit data
216 if (iDDL%2==0 && nTRM==3) continue;
218 // loop on TRM chain number per TRM
219 for (iChain=AliTOFGeometry::NChain()-1; iChain>=0; iChain--) {
222 MakeTRMchainTrailer(iChain, buf); fWordsPerTRM++;
225 MakeTDCdigits(nDDL, nTRM, iChain, buf);
228 MakeTRMchainHeader(nTRM, iChain, buf); fWordsPerTRM++;
230 } // end loop on iChain
233 MakeTRMheader(nTRM, buf); fWordsPerTRM++;
235 // TRM filler in case where TRM data number is odd
236 if ((fWordsPerTRM+1)%2!=0) {
237 MakeTRMfiller(buf); fWordsPerTRM++;
240 MakeTRMtrailer(buf); fWordsPerDRM++;
242 fWordsPerDRM += fWordsPerTRM;
244 } // end loop on nTRM
249 //buf[fIndex] = MakeFiller(); fWordsPerDRM++; // valid till when LTM word number was 33
250 MakeLTMtrailer(buf); fWordsPerDRM++;
251 MakeLTMdata(buf); fWordsPerDRM+=48;
252 MakeLTMheader(buf); fWordsPerDRM++;
255 MakeDRMheader(nDDL, buf);
257 ReverseArray(buf, fIndex+1);
259 outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t)));
261 for (jj=0; jj<(fIndex+1); jj++) buf[jj]=0;
264 //Write REAL DATA HEADER
265 UInt_t currentFilePosition = outfile->Tellp();
266 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
267 header.fSize = currentFilePosition - dataHeaderPosition;
268 header.SetAttribute(0); // valid data
269 outfile->Seekp(dataHeaderPosition);
270 outfile->WriteBuffer((char*)(&header),sizeof(header));
271 outfile->Seekp(currentFilePosition);
275 } //end loop on DDL file number
281 //----------------------------------------------------------------------------
282 void AliTOFDDLRawData::GetDigits()
285 // Fill the TOF volumes' map with the TOF digit indices
288 Int_t vol[5] = {-1,-1,-1,-1,-1};
291 Int_t ndigits = fTOFdigitArray->GetEntries();
292 AliDebug(2, Form(" Number of read digits = %d",ndigits));
295 // loop on TOF digits
296 for (digit=0; digit<ndigits; digit++) {
297 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(digit);
299 vol[0] = digs->GetSector(); // Sector Number (0-17)
300 vol[1] = digs->GetPlate(); // Plate Number (0-4)
301 vol[2] = digs->GetStrip(); // Strip Number (0-14/18)
302 vol[3] = digs->GetPadx(); // Pad Number in x direction (0-47)
303 vol[4] = digs->GetPadz(); // Pad Number in z direction (0-1)
305 fTOFdigitMap->AddDigit(vol, digit);
307 } // close loop on digit del TOF
308 AliDebug(2,Form(" Number of mapped digits = %d",fTOFdigitMap->GetFilledCellNumber()));
311 //----------------------------------------------------------------------------
312 void AliTOFDDLRawData::MakeDRMheader(Int_t nDDL, UInt_t *buf)
318 //Int_t iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
319 Int_t iDDL = AliTOFRawStream::GetDDLnumberPerSector(nDDL);
321 //Int_t iSector = fTOFrawStream->GetSectorNumber(nDDL);
322 Int_t iSector = AliTOFRawStream::GetSectorNumber(nDDL);
329 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
330 AliBitPacking::PackWord(word,baseWord, 0, 3);
331 word = 0; // event CRC --> CHANGED
332 AliBitPacking::PackWord(word,baseWord, 4,19);
333 word = 0; // reserved for future use
334 AliBitPacking::PackWord(word,baseWord,20,27);
335 word = 4; // 0100 -> DRM header ID
336 AliBitPacking::PackWord(word,baseWord,28,31);
338 buf[fIndex]=baseWord;
340 // DRM status header 4
342 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
343 AliBitPacking::PackWord(word,baseWord, 0, 3);
344 word = 0; // temperature
345 AliBitPacking::PackWord(word,baseWord, 4,13);
347 AliBitPacking::PackWord(word,baseWord, 14,14);
349 AliBitPacking::PackWord(word,baseWord, 15,15);
351 AliBitPacking::PackWord(word,baseWord, 16,18);
353 AliBitPacking::PackWord(word,baseWord, 19,19);
354 word = 0; // reserved for future use
355 AliBitPacking::PackWord(word,baseWord, 20,27);
356 word = 4; // 0100 -> DRM header ID
357 AliBitPacking::PackWord(word,baseWord,28,31);
359 buf[fIndex]=baseWord;
361 // DRM status header 3
363 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
364 AliBitPacking::PackWord(word,baseWord, 0, 3);
366 AliBitPacking::PackWord(word,baseWord, 4,15);
367 word = 0; // Run Time info
368 AliBitPacking::PackWord(word,baseWord, 16,27);
369 word = 4; // 0100 -> DRM header ID
370 AliBitPacking::PackWord(word,baseWord,28,31);
372 buf[fIndex]=baseWord;
374 // DRM status header 2
376 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
377 AliBitPacking::PackWord(word,baseWord, 0, 3);
380 word = 2047; // enable ID: [00000000000;11111111111] for odd
381 // (i.e. right) crates
382 AliBitPacking::PackWord(word,baseWord, 4,14);
384 word = 2045; // enable ID: [00000000000;11111111101] for even
385 // (i.e. left) crates
386 AliBitPacking::PackWord(word,baseWord, 4,14);
390 AliBitPacking::PackWord(word,baseWord,15,15);
391 word = 0; // fault ID
392 AliBitPacking::PackWord(word,baseWord,16,26);
394 AliBitPacking::PackWord(word,baseWord,27,27);
395 word = 4; // 0100 -> DRM header ID
396 AliBitPacking::PackWord(word,baseWord,28,31);
398 buf[fIndex]=baseWord;
400 // DRM status header 1
402 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
403 AliBitPacking::PackWord(word,baseWord, 0, 3);
406 word = 2047; // slot ID: [00000000000;11111111111] for odd
407 // (i.e. right) crates
408 AliBitPacking::PackWord(word,baseWord, 4,14);
410 word = 2045; // slot ID: [00000000000;11111111101] for even
411 // (i.e. left) crates
412 AliBitPacking::PackWord(word,baseWord, 4,14);
415 word = 1; // LHC clock status: 1/0
416 AliBitPacking::PackWord(word,baseWord,15,15);
418 AliBitPacking::PackWord(word,baseWord,16,20);
419 word = 0; // DRMH size
420 AliBitPacking::PackWord(word,baseWord,21,24);
421 word = 0; // reserved for future use
422 AliBitPacking::PackWord(word,baseWord,25,27);
423 word = 4; // 0100 -> DRM header ID
424 AliBitPacking::PackWord(word,baseWord,28,31);
426 buf[fIndex]=baseWord;
430 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
431 AliBitPacking::PackWord(word,baseWord, 0, 3);
432 word = fIndex+1 + 1; // event words
433 AliBitPacking::PackWord(word,baseWord, 4,20);
434 word = iDDL; // crate ID [0;3]
435 AliBitPacking::PackWord(word,baseWord,21,22);
436 word = iSector; // sector ID [0;17]
437 AliBitPacking::PackWord(word,baseWord,23,27);
438 word = 4; // 0100 -> DRM header ID
439 AliBitPacking::PackWord(word,baseWord,28,31);
441 buf[fIndex]=baseWord;
445 //----------------------------------------------------------------------------
446 void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
449 // DRM global trailer
456 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
457 AliBitPacking::PackWord(word,baseWord, 0, 3);
458 word = 0; // local event counter --> TO BE CHANGED IN fWordsPerDRM+5
459 AliBitPacking::PackWord(word,baseWord, 4,15);
460 word = 0; // reserved for future use
461 AliBitPacking::PackWord(word,baseWord,16,27);
462 word = 5; // 0101 -> DRM trailer ID
463 AliBitPacking::PackWord(word,baseWord,28,31);
465 buf[fIndex]=baseWord;
469 //----------------------------------------------------------------------------
470 void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
480 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
481 AliBitPacking::PackWord(word,baseWord, 0, 3);
482 word = 35; // event words
483 AliBitPacking::PackWord(word,baseWord, 4,16);
484 word = 0; // crc error
485 AliBitPacking::PackWord(word,baseWord,17,17);
487 AliBitPacking::PackWord(word,baseWord,18,23);
489 AliBitPacking::PackWord(word,baseWord,24,27);
490 word = 4; // 0100 -> LTM header ID
491 AliBitPacking::PackWord(word,baseWord,28,31);
493 buf[fIndex]=baseWord;
497 //----------------------------------------------------------------------------
498 void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
509 AliBitPacking::PackWord(word,baseWord,0,9);
511 AliBitPacking::PackWord(word,baseWord,10,19);
513 AliBitPacking::PackWord(word,baseWord,20,29);
515 AliBitPacking::PackWord(word,baseWord,30,30);
517 AliBitPacking::PackWord(word,baseWord,31,31);
522 buf[fIndex]=baseWord;
526 buf[fIndex]=baseWord;
530 buf[fIndex]=baseWord;
534 buf[fIndex]=baseWord;
538 buf[fIndex]=baseWord;
542 buf[fIndex]=baseWord;
546 buf[fIndex]=baseWord;
550 buf[fIndex]=baseWord;
554 buf[fIndex]=baseWord;
558 buf[fIndex]=baseWord;
562 buf[fIndex]=baseWord;
566 buf[fIndex]=baseWord;
570 buf[fIndex]=baseWord;
574 buf[fIndex]=baseWord;
578 buf[fIndex]=baseWord;
582 buf[fIndex]=baseWord;
587 word = 100; // Local temperature in LTM11 -> 4 X 25 degree (environment temperature)
588 AliBitPacking::PackWord(word,baseWord, 0, 9);
589 word = 100; // Local temperature in LTM10 -> 4 X 25 degree (environment temperature)
590 AliBitPacking::PackWord(word,baseWord,10,19);
591 word = 100; // Local temperature in LTM9 -> 4 X 25 degree (environment temperature)
592 AliBitPacking::PackWord(word,baseWord,20,29);
594 AliBitPacking::PackWord(word,baseWord,30,30);
596 AliBitPacking::PackWord(word,baseWord,31,31);
599 buf[fIndex]=baseWord;
601 // Local temperature in LTM8, LMT7, LTM6 -> 4 X 25 degree (environment temperature)
603 buf[fIndex]=baseWord;
605 // Local temperature in LTM5, LMT4, LTM3 -> 4 X 25 degree (environment temperature)
607 buf[fIndex]=baseWord;
609 // Local temperature in LTM2, LMT1, LTM0 -> 4 X 25 degree (environment temperature)
611 buf[fIndex]=baseWord;
615 // Local temperature in T7, T6, T5 -> 4 X 25 degree (environment temperature)
617 buf[fIndex]=baseWord;
619 // Local temperature in T4, T3, T2 -> 4 X 25 degree (environment temperature)
621 buf[fIndex]=baseWord;
623 // Local temperature in T1, T0 -> 4 X 25 degree (environment temperature)
624 // Local temperature in VTH15 -> Thereshould voltage for FEAC15
626 buf[fIndex]=baseWord;
629 word = 0; // VTH13 -> Thereshould voltage for FEAC16
630 AliBitPacking::PackWord(word,baseWord, 0, 9);
631 word = 0; // VTH14 -> Thereshould voltage for FEAC14
632 AliBitPacking::PackWord(word,baseWord,10,19);
633 word = 0; // GND-FEAC7 -> Voltage drop between GND and FEAC7
634 AliBitPacking::PackWord(word,baseWord,20,29);
636 AliBitPacking::PackWord(word,baseWord,30,30);
638 AliBitPacking::PackWord(word,baseWord,31,31);
641 buf[fIndex]=baseWord;
643 // VTH11 -> Thereshould voltage for FEAC11
644 // VTH12 -> Thereshould voltage for FEAC12
645 // GND-FEAC6 -> Voltage drop between GND and FEAC6
647 buf[fIndex]=baseWord;
649 // VTH9 -> Thereshould voltage for FEAC11
650 // VTH10 -> Thereshould voltage for FEAC12
651 // GND-FEAC5 -> Voltage drop between GND and FEAC6
653 buf[fIndex]=baseWord;
655 // VTH7 -> Thereshould voltage for FEAC11
656 // VTH8 -> Thereshould voltage for FEAC12
657 // GND-FEAC4 -> Voltage drop between GND and FEAC6
659 buf[fIndex]=baseWord;
661 // VTH5 -> Thereshould voltage for FEAC11
662 // VTH6 -> Thereshould voltage for FEAC12
663 // GND-FEAC3 -> Voltage drop between GND and FEAC6
665 buf[fIndex]=baseWord;
667 // VTH3 -> Thereshould voltage for FEAC11
668 // VTH4 -> Thereshould voltage for FEAC12
669 // GND-FEAC2 -> Voltage drop between GND and FEAC6
671 buf[fIndex]=baseWord;
673 // VTH1 -> Thereshould voltage for FEAC11
674 // VTH2 -> Thereshould voltage for FEAC12
675 // GND-FEAC1 -> Voltage drop between GND and FEAC6
677 buf[fIndex]=baseWord;
680 // VTH0 -> Thereshould voltage for FEAC12
681 // GND-FEAC0 -> Voltage drop between GND and FEAC6
683 buf[fIndex]=baseWord;
686 // VTH0 -> Thereshould voltage for FEAC12
687 // GND-FEAC0 -> Voltage drop between GND and FEAC6
689 buf[fIndex]=baseWord;
695 buf[fIndex]=baseWord;
701 buf[fIndex]=baseWord;
707 buf[fIndex]=baseWord;
713 buf[fIndex]=baseWord;
719 buf[fIndex]=baseWord;
724 word = 0; // PDL45 -> Delay Line setting for PDL41
725 AliBitPacking::PackWord(word,baseWord, 0, 7);
726 word = 0; // PDL46 -> Delay Line setting for PDL42
727 AliBitPacking::PackWord(word,baseWord, 8,15);
728 word = 0; // PDL47 -> Delay Line setting for PDL43
729 AliBitPacking::PackWord(word,baseWord,16,23);
730 word = 0; // PDL48 -> Delay Line setting for PDL44
731 AliBitPacking::PackWord(word,baseWord,24,31);
733 buf[fIndex]=baseWord;
735 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
737 buf[fIndex]=baseWord;
739 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
741 buf[fIndex]=baseWord;
743 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
745 buf[fIndex]=baseWord;
747 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
749 buf[fIndex]=baseWord;
751 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
753 buf[fIndex]=baseWord;
755 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
757 buf[fIndex]=baseWord;
759 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
761 buf[fIndex]=baseWord;
763 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
765 buf[fIndex]=baseWord;
767 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
769 buf[fIndex]=baseWord;
771 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
773 buf[fIndex]=baseWord;
777 //----------------------------------------------------------------------------
778 void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
788 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
789 AliBitPacking::PackWord(word,baseWord, 0, 3);
790 word = 0; // event crc
791 AliBitPacking::PackWord(word,baseWord, 4,15);
792 word = 0; // event number
793 AliBitPacking::PackWord(word,baseWord,16,27);
794 word = 5; // 0101 -> LTM trailer ID
795 AliBitPacking::PackWord(word,baseWord,28,31);
797 buf[fIndex]=baseWord;
801 //----------------------------------------------------------------------------
802 void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
805 // TRM header for the TRM number nTRM [ 3;12]
808 if (nTRM<3 || nTRM>12) {
809 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
817 word = nTRM; // TRM data coming from the VME slot number nTRM
818 AliBitPacking::PackWord(word,baseWord, 0, 3);
819 word = 0; // event words
820 AliBitPacking::PackWord(word,baseWord, 4,16);
822 if (fPackedAcquisition)
823 word = 0; // ACQuisition mode: [0;3] see document
825 word = 3; // ACQuisition mode: [0;3] see document
826 AliBitPacking::PackWord(word,baseWord,17,18);
827 word = 0; // description of a SEU inside LUT tables for INL compensation;
828 // the data are unaffected
829 AliBitPacking::PackWord(word,baseWord,19,19);
830 word = 0; // Must Be Zero (MBZ)
831 AliBitPacking::PackWord(word,baseWord,20,27);
832 word = 4; // 0100 -> TRM header ID
833 AliBitPacking::PackWord(word,baseWord,28,31);
835 buf[fIndex]=baseWord;
839 //----------------------------------------------------------------------------
840 void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
843 // Set TRM Global Trailer
844 // with the calculated CRC
851 word = 15; // 1111 -> TRM trailer ID 1
852 AliBitPacking::PackWord(word,baseWord, 0, 3);
855 for (Int_t ii=fIndex-(fWordsPerTRM-1); ii<fIndex; ii++)
857 //PH printf(" A trmCRC=%d\n",trmCRC);
860 word ^= ( (trmCRC & 0x00000fff) >> 0);
861 word ^= ( (trmCRC & 0x00fff000) >> 12);
862 word ^= ( (trmCRC & 0xff000000) >> 24);
864 //PH printf(" B trmCRC=%d\n",word);
866 AliBitPacking::PackWord(word,baseWord, 4,15); // event CRC --> CHANGED
868 word = 0; // local event counter == DRM local event counter --> TO BE CHANGED
869 AliBitPacking::PackWord(word,baseWord,16,27);
870 word = 5; // 0101 -> TRM trailer ID 2
871 AliBitPacking::PackWord(word,baseWord,28,31);
874 for (Int_t ii=fIndex; ii>fIndex-fWordsPerTRM; ii--)
877 buf[fIndex-fWordsPerTRM] = baseWord;
881 //----------------------------------------------------------------------------
882 void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
892 if (nTRM<3 || nTRM>12) {
893 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
897 if (iChain<0 || iChain>1) {
898 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
903 word = nTRM; // TRM data coming from the VME slot ID nTRM
904 AliBitPacking::PackWord(word,baseWord, 0, 3);
905 word = 0; // bunch ID
906 AliBitPacking::PackWord(word,baseWord, 4,15);
907 word = 0;//100; // PB24 temperature -> 4 X 25 degree (environment temperature)
908 AliBitPacking::PackWord(word,baseWord,16,23);
909 word = 0;//(Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
910 AliBitPacking::PackWord(word,baseWord,24,26);
912 AliBitPacking::PackWord(word,baseWord,27,27);
915 word = 0; // 0000 -> TRM chain 0 ID
918 word = 2; // 0010 -> TRM chain 1 ID
921 AliBitPacking::PackWord(word,baseWord,28,31);
923 buf[fIndex]=baseWord;
927 //----------------------------------------------------------------------------
928 void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf)
937 for (jj=fIndex; jj>fIndex-fWordsPerTRM; jj--)
940 buf[fIndex-fWordsPerTRM] = MakeFiller();
944 //----------------------------------------------------------------------------
945 UInt_t AliTOFDDLRawData::MakeFiller() const
948 // Filler word definition: to make even the number of words per TRM/LTM
955 word = 0; // 0000 -> filler ID 1
956 AliBitPacking::PackWord(word,baseWord, 0, 3);
958 AliBitPacking::PackWord(word,baseWord, 4,27);
959 word = 7; // 0111 -> filler ID 2
960 AliBitPacking::PackWord(word,baseWord, 28,31);
966 //----------------------------------------------------------------------------
967 void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
973 if (iChain<0 || iChain>1) {
974 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
983 AliBitPacking::PackWord(word,baseWord, 0, 3);
985 AliBitPacking::PackWord(word,baseWord, 4,15);
986 word = 0; // event counter --> TO BE CHANGED
987 AliBitPacking::PackWord(word,baseWord,16,27);
990 word = 1; // 0001 -> TRM chain 0 trailer ID
993 word = 3; // 0011 -> TRM chain 1 trailer ID
996 AliBitPacking::PackWord(word,baseWord,28,31);
998 buf[fIndex]=baseWord;
1002 //----------------------------------------------------------------------------
1003 void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain, UInt_t *buf)
1009 const Double_t kOneMoreFilledCell = 1./(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
1010 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
1012 if (nDDL<0 || nDDL>71) {
1013 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
1017 if (nTRM<3 || nTRM>12) {
1018 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
1022 if (iChain<0 || iChain>1) {
1023 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
1027 Int_t psArray[1000];
1028 UInt_t localBuffer[1000];
1029 Int_t localIndex = -1;
1031 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
1033 Int_t volume[5] = {-1, -1, -1, -1, -1};
1034 Int_t indexDigit[3] = {-1, -1, -1};
1036 Int_t totCharge = -1;
1037 Int_t timeOfFlight = -1;
1039 Int_t trailingSpurious = -1;
1040 Int_t leadingSpurious = -1;
1051 //Int_t numberOfMeasuresPerChannel = 0;
1052 //Int_t maxMeasuresPerChannelInTDC = 0;
1054 Bool_t outOut = HeadOrTail();
1058 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
1060 for (jj=0; jj<5; jj++) volume[jj] = -1;
1062 // loop on TDC number
1063 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
1065 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
1066 // for TDC numbers 3-14
1067 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3)!=0) continue;
1069 // loop on TDC channel number
1070 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
1072 //numberOfMeasuresPerChannel = 0;
1074 for (Int_t aa=0; aa<5; aa++) volume[aa]=-1;
1075 AliTOFRawStream::EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
1077 AliDebug(3,Form(" volume -> %2d %1d %2d %2d %1d",volume[0],volume[1],volume[2],volume[3],volume[4]));
1079 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
1080 volume[3]==-1 || volume[4]==-1) continue;
1082 AliDebug(3,Form(" ====== %2d %1d %2d %2d %1d",volume[0],volume[1],volume[2],volume[3],volume[4]));
1084 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
1086 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
1088 if (indexDigit[0]<0) {
1090 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1091 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1093 if ( fFakeOrphaneProduction &&
1094 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
1095 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
1097 percentFilledCells+=kOneMoreFilledCell;
1102 word = trailingSpurious; // trailing edge measurement
1106 word = leadingSpurious; // leading edge measurement
1111 if (nDDL<10) ftxt << " " << nDDL;
1112 else ftxt << " " << nDDL;
1113 if (nTRM<10) ftxt << " " << nTRM;
1114 else ftxt << " " << nTRM;
1115 ftxt << " " << iChain;
1116 if (nTDC<10) ftxt << " " << nTDC;
1117 else ftxt << " " << nTDC;
1119 if (volume[0]<10) ftxt << " -> " << volume[0];
1120 else ftxt << " -> " << volume[0];
1121 ftxt << " " << volume[1];
1122 if (volume[2]<10) ftxt << " " << volume[2];
1123 else ftxt << " " << volume[2];
1124 ftxt << " " << volume[4];
1125 if (volume[3]<10) ftxt << " " << volume[3];
1126 else ftxt << " " << volume[3];
1128 if (word<10) ftxt << " " << word;
1129 else if (word>=10 && word<100) ftxt << " " << word;
1130 else if (word>=100 && word<1000) ftxt << " " << word;
1131 else if (word>=1000 && word<10000) ftxt << " " << word;
1132 else if (word>=10000 && word<100000) ftxt << " " << word;
1133 else if (word>=100000 && word<1000000) ftxt << " " << word;
1134 else ftxt << " " << word;
1135 ftxt << " " << dummyPS << endl;
1138 AliBitPacking::PackWord(word,baseWord, 0,20);
1139 word = iCH; // TDC channel ID [0;7]
1140 AliBitPacking::PackWord(word,baseWord,21,23);
1141 word = nTDC; // TDC ID [0;14]
1142 AliBitPacking::PackWord(word,baseWord,24,27);
1143 word = 0; // error flag
1144 AliBitPacking::PackWord(word,baseWord,28,28);
1145 word = dummyPS; // Packing Status [0;3]
1146 AliBitPacking::PackWord(word,baseWord,29,30);
1147 word = 1; // TRM TDC digit ID
1148 AliBitPacking::PackWord(word,baseWord,31,31);
1150 localIndex++; fWordsPerTRM++;
1151 localBuffer[localIndex]=baseWord;
1152 psArray[localIndex]=dummyPS;
1156 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
1157 } // if (indexDigit[0]<0)
1159 for (jj=0; jj<3;jj++) {
1161 if (indexDigit[jj]<0) continue;
1163 AliDebug(3,Form(" ====== %2d %1d %2d %2d %1d -> %1d %d",volume[0],volume[1],volume[2],volume[3],volume[4],jj,indexDigit[jj]));
1165 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1167 if (digs->GetSector()!=volume[0] ||
1168 digs->GetPlate() !=volume[1] ||
1169 digs->GetStrip() !=volume[2] ||
1170 digs->GetPadx() !=volume[3] ||
1171 digs->GetPadz() !=volume[4]) AliWarning(Form(" --- ERROR --- %2i (%2i) %1i (%1i) %2i (%2i) %2i (%2i) %1i (%1i)",
1172 digs->GetSector(), volume[0],
1173 digs->GetPlate(), volume[1],
1174 digs->GetStrip(), volume[2],
1175 digs->GetPadx(), volume[3],
1176 digs->GetPadz(), volume[4])
1179 timeOfFlight = (Int_t)(digs->GetTdc());
1181 fTOFCableLengthMap->GetCableTimeShiftBin(nDDL, nTRM, iChain, nTDC)*/;
1183 //if (timeOfFlight>=fMatchingWindow+1000) continue; // adc
1184 //if (timeOfFlight>=fMatchingWindow) continue; // adc
1185 if (digs->GetTdcND()>=fMatchingWindow) {
1186 AliDebug(2,"Out of matching window.");
1189 else AliDebug(2,"In matching window");
1191 //numberOfMeasuresPerChannel++;
1193 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1194 totCharge = (Int_t)(digs->GetToT());
1195 // temporary control
1196 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
1198 if (fPackedAcquisition) {
1201 if (nDDL<10) ftxt << " " << nDDL;
1202 else ftxt << " " << nDDL;
1203 if (nTRM<10) ftxt << " " << nTRM;
1204 else ftxt << " " << nTRM;
1205 ftxt << " " << iChain;
1206 if (nTDC<10) ftxt << " " << nTDC;
1207 else ftxt << " " << nTDC;
1209 if (volume[0]<10) ftxt << " -> " << volume[0];
1210 else ftxt << " -> " << volume[0];
1211 ftxt << " " << volume[1];
1212 if (volume[2]<10) ftxt << " " << volume[2];
1213 else ftxt << " " << volume[2];
1214 ftxt << " " << volume[4];
1215 if (volume[3]<10) ftxt << " " << volume[3];
1216 else ftxt << " " << volume[3];
1217 if (totCharge<10) ftxt << " " << totCharge;
1218 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1219 else ftxt << " " << totCharge;
1220 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1221 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1222 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1223 else ftxt << " " << timeOfFlight << endl;
1226 word = timeOfFlight%8192; // time-of-fligth measurement
1227 AliBitPacking::PackWord(word,baseWord, 0,12);
1229 if (totCharge>=256) totCharge = 255;
1230 word = totCharge; // time-over-threshould measurement
1231 AliBitPacking::PackWord(word,baseWord,13,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 = 0; // 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);
1244 localIndex++; fWordsPerTRM++;
1245 localBuffer[localIndex]=baseWord;
1249 if ( fFakeOrphaneProduction &&
1250 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
1252 percentFilledCells+=kOneMoreFilledCell;
1254 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1255 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1260 word = trailingSpurious; // trailing edge measurement
1264 word = leadingSpurious; // leading edge measurement
1269 if (nDDL<10) ftxt << " " << nDDL;
1270 else ftxt << " " << nDDL;
1271 if (nTRM<10) ftxt << " " << nTRM;
1272 else ftxt << " " << nTRM;
1273 ftxt << " " << iChain;
1274 if (nTDC<10) ftxt << " " << nTDC;
1275 else ftxt << " " << nTDC;
1277 if (volume[0]<10) ftxt << " -> " << volume[0];
1278 else ftxt << " -> " << volume[0];
1279 ftxt << " " << volume[1];
1280 if (volume[2]<10) ftxt << " " << volume[2];
1281 else ftxt << " " << volume[2];
1282 ftxt << " " << volume[4];
1283 if (volume[3]<10) ftxt << " " << volume[3];
1284 else ftxt << " " << volume[3];
1286 if (word<10) ftxt << " " << word;
1287 else if (word>=10 && word<100) ftxt << " " << word;
1288 else if (word>=100 && word<1000) ftxt << " " << word;
1289 else if (word>=1000 && word<10000) ftxt << " " << word;
1290 else if (word>=10000 && word<100000) ftxt << " " << word;
1291 else if (word>=100000 && word<1000000) ftxt << " " << word;
1292 else ftxt << " " << word;
1293 ftxt << " " << dummyPS << endl;
1296 AliBitPacking::PackWord(word,baseWord, 0,20);
1297 word = iCH; // TDC channel ID [0;7]
1298 AliBitPacking::PackWord(word,baseWord,21,23);
1299 word = nTDC; // TDC ID [0;14]
1300 AliBitPacking::PackWord(word,baseWord,24,27);
1301 word = 0; // error flag
1302 AliBitPacking::PackWord(word,baseWord,28,28);
1303 word = dummyPS; // Packing Status [0;3]
1304 AliBitPacking::PackWord(word,baseWord,29,30);
1305 word = 1; // TRM TDC digit ID
1306 AliBitPacking::PackWord(word,baseWord,31,31);
1308 localIndex++; fWordsPerTRM++;
1309 localBuffer[localIndex]=baseWord;
1310 psArray[localIndex]=dummyPS;
1314 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
1317 } // if (fPackedAcquisition)
1318 else { // if (!fPackedAcquisition)
1320 if ( fFakeOrphaneProduction &&
1321 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
1323 percentFilledCells+=kOneMoreFilledCell;
1325 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1326 word = trailingSpurious;
1330 if (nDDL<10) ftxt << " " << nDDL;
1331 else ftxt << " " << nDDL;
1332 if (nTRM<10) ftxt << " " << nTRM;
1333 else ftxt << " " << nTRM;
1334 ftxt << " " << iChain;
1335 if (nTDC<10) ftxt << " " << nTDC;
1336 else ftxt << " " << nTDC;
1338 if (volume[0]<10) ftxt << " -> " << volume[0];
1339 else ftxt << " -> " << volume[0];
1340 ftxt << " " << volume[1];
1341 if (volume[2]<10) ftxt << " " << volume[2];
1342 else ftxt << " " << volume[2];
1343 ftxt << " " << volume[4];
1344 if (volume[3]<10) ftxt << " " << volume[3];
1345 else ftxt << " " << volume[3];
1347 if (word<10) ftxt << " " << word;
1348 else if (word>=10 && word<100) ftxt << " " << word;
1349 else if (word>=100 && word<1000) ftxt << " " << word;
1350 else if (word>=1000 && word<10000) ftxt << " " << word;
1351 else if (word>=10000 && word<100000) ftxt << " " << word;
1352 else if (word>=100000 && word<1000000) ftxt << " " << word;
1353 else ftxt << " " << word;
1354 ftxt << " " << dummyPS << endl;
1357 AliBitPacking::PackWord(word,baseWord, 0,20);
1358 word = iCH; // TDC channel ID [0;7]
1359 AliBitPacking::PackWord(word,baseWord,21,23);
1360 word = nTDC; // TDC ID [0;14]
1361 AliBitPacking::PackWord(word,baseWord,24,27);
1362 word = 0; // error flag
1363 AliBitPacking::PackWord(word,baseWord,28,28);
1364 word = dummyPS; // Packing Status [0;3]
1365 AliBitPacking::PackWord(word,baseWord,29,30);
1366 word = 1; // TRM TDC digit ID
1367 AliBitPacking::PackWord(word,baseWord,31,31);
1369 localIndex++; fWordsPerTRM++;
1370 localBuffer[localIndex]=baseWord;
1371 psArray[localIndex]=dummyPS;
1375 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
1378 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
1381 if (nDDL<10) ftxt << " " << nDDL;
1382 else ftxt << " " << nDDL;
1383 if (nTRM<10) ftxt << " " << nTRM;
1384 else ftxt << " " << nTRM;
1385 ftxt << " " << iChain;
1386 if (nTDC<10) ftxt << " " << nTDC;
1387 else ftxt << " " << nTDC;
1389 if (volume[0]<10) ftxt << " -> " << volume[0];
1390 else ftxt << " -> " << volume[0];
1391 ftxt << " " << volume[1];
1392 if (volume[2]<10) ftxt << " " << volume[2];
1393 else ftxt << " " << volume[2];
1394 ftxt << " " << volume[4];
1395 if (volume[3]<10) ftxt << " " << volume[3];
1396 else ftxt << " " << volume[3];
1398 if (word<10) ftxt << " " << word;
1399 else if (word>=10 && word<100) ftxt << " " << word;
1400 else if (word>=100 && word<1000) ftxt << " " << word;
1401 else if (word>=1000 && word<10000) ftxt << " " << word;
1402 else if (word>=10000 && word<100000) ftxt << " " << word;
1403 else if (word>=100000 && word<1000000) ftxt << " " << word;
1404 else ftxt << " " << word;
1405 ftxt << " " << 2 << endl;
1408 AliBitPacking::PackWord(word,baseWord, 0,20);
1410 word = iCH; // TDC channel ID [0;7]
1411 AliBitPacking::PackWord(word,baseWord,21,23);
1412 word = nTDC; // TDC ID [0;14]
1413 AliBitPacking::PackWord(word,baseWord,24,27);
1414 word = 0; // error flag
1415 AliBitPacking::PackWord(word,baseWord,28,28);
1416 word = 2; // Packing Status [0;3]
1417 AliBitPacking::PackWord(word,baseWord,29,30);
1418 word = 1; // TRM TDC digit ID
1419 AliBitPacking::PackWord(word,baseWord,31,31);
1421 localIndex++; fWordsPerTRM++;
1422 localBuffer[localIndex]=baseWord;
1423 psArray[localIndex]=2;
1427 word = timeOfFlight%2097152; // leading edge measurement
1430 if (nDDL<10) ftxt << " " << nDDL;
1431 else ftxt << " " << nDDL;
1432 if (nTRM<10) ftxt << " " << nTRM;
1433 else ftxt << " " << nTRM;
1434 ftxt << " " << iChain;
1435 if (nTDC<10) ftxt << " " << nTDC;
1436 else ftxt << " " << nTDC;
1438 if (volume[0]<10) ftxt << " -> " << volume[0];
1439 else ftxt << " -> " << volume[0];
1440 ftxt << " " << volume[1];
1441 if (volume[2]<10) ftxt << " " << volume[2];
1442 else ftxt << " " << volume[2];
1443 ftxt << " " << volume[4];
1444 if (volume[3]<10) ftxt << " " << volume[3];
1445 else ftxt << " " << volume[3];
1447 if (word<10) ftxt << " " << word;
1448 else if (word>=10 && word<100) ftxt << " " << word;
1449 else if (word>=100 && word<1000) ftxt << " " << word;
1450 else if (word>=1000 && word<10000) ftxt << " " << word;
1451 else if (word>=10000 && word<100000) ftxt << " " << word;
1452 else if (word>=100000 && word<1000000) ftxt << " " << word;
1453 else ftxt << " " << word;
1454 ftxt << " " << 1 << endl;
1457 AliBitPacking::PackWord(word,baseWord, 0,20);
1459 word = iCH; // TDC channel ID [0;7]
1460 AliBitPacking::PackWord(word,baseWord,21,23);
1461 word = nTDC; // TDC ID [0;14]
1462 AliBitPacking::PackWord(word,baseWord,24,27);
1463 word = 0; // error flag
1464 AliBitPacking::PackWord(word,baseWord,28,28);
1465 word = 1; // Packing Status [0;3]
1466 AliBitPacking::PackWord(word,baseWord,29,30);
1467 word = 1; // TRM TDC digit ID
1468 AliBitPacking::PackWord(word,baseWord,31,31);
1470 localIndex++; fWordsPerTRM++;
1471 localBuffer[localIndex]=baseWord;
1472 psArray[localIndex]=1;
1477 if ( fFakeOrphaneProduction &&
1478 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
1480 percentFilledCells+=kOneMoreFilledCell;
1482 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1483 word = leadingSpurious;
1487 if (nDDL<10) ftxt << " " << nDDL;
1488 else ftxt << " " << nDDL;
1489 if (nTRM<10) ftxt << " " << nTRM;
1490 else ftxt << " " << nTRM;
1491 ftxt << " " << iChain;
1492 if (nTDC<10) ftxt << " " << nTDC;
1493 else ftxt << " " << nTDC;
1495 if (volume[0]<10) ftxt << " -> " << volume[0];
1496 else ftxt << " -> " << volume[0];
1497 ftxt << " " << volume[1];
1498 if (volume[2]<10) ftxt << " " << volume[2];
1499 else ftxt << " " << volume[2];
1500 ftxt << " " << volume[4];
1501 if (volume[3]<10) ftxt << " " << volume[3];
1502 else ftxt << " " << volume[3];
1504 if (word<10) ftxt << " " << word;
1505 else if (word>=10 && word<100) ftxt << " " << word;
1506 else if (word>=100 && word<1000) ftxt << " " << word;
1507 else if (word>=1000 && word<10000) ftxt << " " << word;
1508 else if (word>=10000 && word<100000) ftxt << " " << word;
1509 else if (word>=100000 && word<1000000) ftxt << " " << word;
1510 else ftxt << " " << word;
1511 ftxt << " " << dummyPS << endl;
1514 AliBitPacking::PackWord(word,baseWord, 0,20);
1515 word = iCH; // TDC channel ID [0;7]
1516 AliBitPacking::PackWord(word,baseWord,21,23);
1517 word = nTDC; // TDC ID [0;14]
1518 AliBitPacking::PackWord(word,baseWord,24,27);
1519 word = 0; // error flag
1520 AliBitPacking::PackWord(word,baseWord,28,28);
1521 word = dummyPS; // Packing Status [0;3]
1522 AliBitPacking::PackWord(word,baseWord,29,30);
1523 word = 1; // TRM TDC digit ID
1524 AliBitPacking::PackWord(word,baseWord,31,31);
1526 localIndex++; fWordsPerTRM++;
1527 localBuffer[localIndex]=baseWord;
1528 psArray[localIndex]=dummyPS;
1532 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
1535 } // if (!fPackedAcquisition)
1537 } //end loop on digits in the same volume
1539 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1540 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1542 } // end loop on TDC channel number
1544 //AliDebug(3,Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
1546 if (localIndex==-1) continue;
1548 if (fPackedAcquisition) {
1550 for (jj=0; jj<=localIndex; jj++) {
1552 buf[fIndex] = localBuffer[jj];
1553 localBuffer[jj] = 0;
1560 if (maxMeasuresPerChannelInTDC = 1) {
1562 for (Int_t jj=0; jj<=localIndex; jj++) {
1563 if (psArray[jj]==2) {
1565 buf[fIndex] = localBuffer[jj];
1566 localBuffer[jj] = 0;
1570 for (Int_t jj=0; jj<=localIndex; jj++) {
1571 if (psArray[jj]==1) {
1573 buf[fIndex] = localBuffer[jj];
1574 localBuffer[jj] = 0;
1579 } // if (maxMeasuresPerChannelInTDC = 1)
1580 else if (maxMeasuresPerChannelInTDC>1) {
1582 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",
1583 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
1585 for (jj=0; jj<=localIndex; jj++) {
1587 buf[fIndex] = localBuffer[jj];
1588 localBuffer[jj] = 0;
1592 //} // else if (maxMeasuresPerChannelInTDC>1)
1594 } // else (!fPackedAcquisition)
1598 //maxMeasuresPerChannelInTDC = 0;
1600 } // end loop on TDC number
1603 if (fVerbose==2) ftxt.close();
1607 //----------------------------------------------------------------------------
1608 void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1611 // Reverses the n elements of array a
1616 for (ii=0; ii<n/2; ii++) {
1626 //----------------------------------------------------------------------------
1627 Bool_t AliTOFDDLRawData::HeadOrTail() const
1630 // Returns the result of a 'pitch and toss'
1633 Double_t dummy = gRandom->Rndm();
1635 if (dummy<0.5) return kFALSE;