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():
100 fPackedAcquisition(kFALSE),
101 fFakeOrphaneProduction(kFALSE),
102 fMatchingWindow(8192),
103 fTOFdigitMap(new AliTOFDigitMap()),
105 fTOFrawStream(new AliTOFRawStream()),
106 fTOFCableLengthMap(new AliTOFCableLengthMap())
108 //Default constructor
110 //----------------------------------------------------------------------------
111 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
115 fPackedAcquisition(kFALSE),
116 fFakeOrphaneProduction(kFALSE),
117 fMatchingWindow(8192),
118 fTOFdigitMap(new AliTOFDigitMap()),
120 fTOFrawStream(new AliTOFRawStream()),
121 fTOFCableLengthMap(new AliTOFCableLengthMap())
124 this->fIndex=source.fIndex;
125 this->fVerbose=source.fVerbose;
126 this->fPackedAcquisition=source.fPackedAcquisition;
127 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
128 this->fMatchingWindow=source.fMatchingWindow;
129 this->fTOFdigitMap=source.fTOFdigitMap;
130 this->fTOFdigitArray=source.fTOFdigitArray;
131 this->fTOFrawStream=source.fTOFrawStream;
132 this->fTOFCableLengthMap=source.fTOFCableLengthMap;
136 //----------------------------------------------------------------------------
137 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
139 this->fIndex=source.fIndex;
140 this->fVerbose=source.fVerbose;
141 this->fPackedAcquisition=source.fPackedAcquisition;
142 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
143 this->fMatchingWindow=source.fMatchingWindow;
144 this->fTOFdigitMap=source.fTOFdigitMap;
145 this->fTOFdigitArray=source.fTOFdigitArray;
146 this->fTOFrawStream=source.fTOFrawStream;
147 this->fTOFCableLengthMap=source.fTOFCableLengthMap;
151 //----------------------------------------------------------------------------
152 AliTOFDDLRawData::~AliTOFDDLRawData()
155 delete fTOFrawStream;
156 delete fTOFCableLengthMap;
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
171 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
174 AliFstream* outfile; // logical name of the output file
176 //AliRawDataHeader header;
177 AliRawDataHeaderSim header;
179 UInt_t sizeRawData = 0;
191 UInt_t nWordsPerTRM = 0;
193 //loop over TOF DDL files
194 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
196 strcpy(fileName,AliDAQ::DdlFileName("TOF",nDDL)); //The name of the output file
198 outfile = new AliFstream(fileName);
199 iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
201 // write Dummy DATA HEADER
202 UInt_t dataHeaderPosition = outfile->Tellp();
203 outfile->WriteBuffer((char*)(&header),sizeof(header));
205 // DRM section: trailer
210 buf[fIndex] = MakeFiller();
215 // loop on TRM number per DRM
216 for (nTRM=AliTOFGeometry::NTRM(); nTRM>=3; nTRM--) {
220 // the slot number 3 of the even DRM (i.e. right) doesn't contain TDC digit data
221 if (iDDL%2==0 && nTRM==3) continue;
223 // TRM global trailer
226 // loop on TRM chain number per TRM
227 for (iChain=AliTOFGeometry::NChain()-1; iChain>=0; iChain--) {
230 MakeTRMchainTrailer(iChain, buf);
234 MakeTDCdigits(nDDL, nTRM, iChain, buf, nWordsPerTRM);
237 MakeTRMchainHeader(nTRM, iChain, buf);
240 } // end loop on iChain
243 MakeTRMheader(nTRM, buf);
245 // TRM filler in case where TRM data number is odd
246 if (nWordsPerTRM%2!=0) MakeTRMfiller(buf, nWordsPerTRM);
248 } // end loop on nTRM
251 MakeDRMheader(nDDL, buf);
253 ReverseArray(buf, fIndex+1);
255 outfile->WriteBuffer((char *)buf,((fIndex+1)*sizeof(UInt_t)));
257 for (jj=0; jj<(fIndex+1); jj++) buf[jj]=0;
260 //Write REAL DATA HEADER
261 UInt_t currentFilePosition = outfile->Tellp();
262 sizeRawData = currentFilePosition - dataHeaderPosition - sizeof(header);
263 header.fSize = currentFilePosition - dataHeaderPosition;
264 header.SetAttribute(0); // valid data
265 outfile->Seekp(dataHeaderPosition);
266 outfile->WriteBuffer((char*)(&header),sizeof(header));
267 outfile->Seekp(currentFilePosition);
271 } //end loop on DDL file number
277 //----------------------------------------------------------------------------
278 void AliTOFDDLRawData::GetDigits()
281 // Fill the TOF volumes' map with the TOF digit indices
284 Int_t vol[5] = {-1,-1,-1,-1,-1};
287 Int_t ndigits = fTOFdigitArray->GetEntries();
291 // loop on TOF digits
292 for (digit=0; digit<ndigits; digit++) {
293 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(digit);
295 vol[0] = digs->GetSector(); // Sector Number (0-17)
296 vol[1] = digs->GetPlate(); // Plate Number (0-4)
297 vol[2] = digs->GetStrip(); // Strip Number (0-14/18)
298 vol[3] = digs->GetPadx(); // Pad Number in x direction (0-47)
299 vol[4] = digs->GetPadz(); // Pad Number in z direction (0-1)
301 fTOFdigitMap->AddDigit(vol, digit);
303 } // close loop on digit del TOF
307 //----------------------------------------------------------------------------
308 void AliTOFDDLRawData::MakeDRMheader(Int_t nDDL, UInt_t *buf)
314 Int_t iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
316 Int_t iSector = fTOFrawStream->GetSectorNumber(nDDL);
323 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
324 AliBitPacking::PackWord(word,baseWord, 0, 3);
325 word = 0; // event CRC
326 AliBitPacking::PackWord(word,baseWord, 4,19);
327 word = 0; // reserved for future use
328 AliBitPacking::PackWord(word,baseWord,20,27);
329 word = 4; // 0100 -> DRM header ID
330 AliBitPacking::PackWord(word,baseWord,28,31);
332 buf[fIndex]=baseWord;
334 // DRM status header 4
336 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
337 AliBitPacking::PackWord(word,baseWord, 0, 3);
338 word = 0; // temperature
339 AliBitPacking::PackWord(word,baseWord, 4,13);
341 AliBitPacking::PackWord(word,baseWord, 14,14);
343 AliBitPacking::PackWord(word,baseWord, 15,15);
345 AliBitPacking::PackWord(word,baseWord, 16,18);
347 AliBitPacking::PackWord(word,baseWord, 19,19);
348 word = 0; // reserved for future use
349 AliBitPacking::PackWord(word,baseWord, 20,27);
350 word = 4; // 0100 -> DRM header ID
351 AliBitPacking::PackWord(word,baseWord,28,31);
353 buf[fIndex]=baseWord;
355 // DRM status header 3
357 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
358 AliBitPacking::PackWord(word,baseWord, 0, 3);
360 AliBitPacking::PackWord(word,baseWord, 4,15);
361 word = 0; // Run Time info
362 AliBitPacking::PackWord(word,baseWord, 16,27);
363 word = 4; // 0100 -> DRM header ID
364 AliBitPacking::PackWord(word,baseWord,28,31);
366 buf[fIndex]=baseWord;
368 // DRM status header 2
370 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
371 AliBitPacking::PackWord(word,baseWord, 0, 3);
374 word = 2047; // enable ID: [00000000000;11111111111] for odd
375 // (i.e. right) crates
376 AliBitPacking::PackWord(word,baseWord, 4,14);
378 word = 2045; // enable ID: [00000000000;11111111101] for even
379 // (i.e. left) crates
380 AliBitPacking::PackWord(word,baseWord, 4,14);
384 AliBitPacking::PackWord(word,baseWord,15,15);
385 word = 0; // fault ID
386 AliBitPacking::PackWord(word,baseWord,16,26);
388 AliBitPacking::PackWord(word,baseWord,27,27);
389 word = 4; // 0100 -> DRM header ID
390 AliBitPacking::PackWord(word,baseWord,28,31);
392 buf[fIndex]=baseWord;
394 // DRM status header 1
396 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
397 AliBitPacking::PackWord(word,baseWord, 0, 3);
400 word = 2047; // slot ID: [00000000000;11111111111] for odd
401 // (i.e. right) crates
402 AliBitPacking::PackWord(word,baseWord, 4,14);
404 word = 2045; // slot ID: [00000000000;11111111101] for even
405 // (i.e. left) crates
406 AliBitPacking::PackWord(word,baseWord, 4,14);
409 word = 1; // LHC clock status: 1/0
410 AliBitPacking::PackWord(word,baseWord,15,15);
412 AliBitPacking::PackWord(word,baseWord,16,20);
413 word = 0; // DRMH size
414 AliBitPacking::PackWord(word,baseWord,21,24);
415 word = 0; // reserved for future use
416 AliBitPacking::PackWord(word,baseWord,25,27);
417 word = 4; // 0100 -> DRM header ID
418 AliBitPacking::PackWord(word,baseWord,28,31);
420 buf[fIndex]=baseWord;
424 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
425 AliBitPacking::PackWord(word,baseWord, 0, 3);
426 word = fIndex+1 + 1; // event words
427 AliBitPacking::PackWord(word,baseWord, 4,20);
428 word = iDDL; // crate ID [0;3]
429 AliBitPacking::PackWord(word,baseWord,21,22);
430 word = iSector; // sector ID [0;17]
431 AliBitPacking::PackWord(word,baseWord,23,27);
432 word = 4; // 0100 -> DRM header ID
433 AliBitPacking::PackWord(word,baseWord,28,31);
435 buf[fIndex]=baseWord;
439 //----------------------------------------------------------------------------
440 void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
443 // DRM global trailer
450 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
451 AliBitPacking::PackWord(word,baseWord, 0, 3);
452 word = 0; // local event counter
453 AliBitPacking::PackWord(word,baseWord, 4,15);
454 word = 0; // reserved for future use
455 AliBitPacking::PackWord(word,baseWord,16,27);
456 word = 5; // 0101 -> DRM trailer ID
457 AliBitPacking::PackWord(word,baseWord,28,31);
459 buf[fIndex]=baseWord;
463 //----------------------------------------------------------------------------
464 void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
474 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
475 AliBitPacking::PackWord(word,baseWord, 0, 3);
476 word = 35; // event words
477 AliBitPacking::PackWord(word,baseWord, 4,16);
478 word = 0; // crc error
479 AliBitPacking::PackWord(word,baseWord,17,17);
481 AliBitPacking::PackWord(word,baseWord,18,23);
483 AliBitPacking::PackWord(word,baseWord,24,27);
484 word = 4; // 0100 -> LTM header ID
485 AliBitPacking::PackWord(word,baseWord,28,31);
487 buf[fIndex]=baseWord;
491 //----------------------------------------------------------------------------
492 void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
502 word = 100; // Local temperature in LTM5 -> 4 X 25 degree (environment temperature)
503 AliBitPacking::PackWord(word,baseWord, 0, 9);
504 word = 100; // Local temperature in LTM6 -> 4 X 25 degree (environment temperature)
505 AliBitPacking::PackWord(word,baseWord,10,19);
506 word = 100; // Local temperature in LTM7 -> 4 X 25 degree (environment temperature)
507 AliBitPacking::PackWord(word,baseWord,20,29);
509 AliBitPacking::PackWord(word,baseWord,30,31);
512 buf[fIndex]=baseWord;
514 // Local temperature in LTM2, LMT3, LTM4 -> 4 X 25 degree (environment temperature)
516 buf[fIndex]=baseWord;
518 // Local temperature in FEAC7, FEAC8, LTM1 -> 4 X 25 degree (environment temperature)
520 buf[fIndex]=baseWord;
522 // Local temperature in FEAC4, FEAC5, FEAC6 -> 4 X 25 degree (environment temperature)
524 buf[fIndex]=baseWord;
526 // Local temperature in FEAC1, FEAC2, FEAC3 -> 4 X 25 degree (environment temperature)
528 buf[fIndex]=baseWord;
531 word = 0; // GND-FEAC15 -> Voltage drop between GND and FEAC15
532 AliBitPacking::PackWord(word,baseWord, 0, 9);
533 word = 0; // VTH16 -> Thereshould voltage for FEAC16
534 AliBitPacking::PackWord(word,baseWord,10,19);
535 word = 0; // GND-FEAC16 -> Voltage drop between GND and FEAC16
536 AliBitPacking::PackWord(word,baseWord,20,29);
538 AliBitPacking::PackWord(word,baseWord,30,31);
541 buf[fIndex]=baseWord;
543 // VTH14 -> Thereshould voltage for FEAC14
544 // GND-FEAC14 -> Voltage drop between GND and FEAC14
545 // VTH15 -> Thereshould voltage for FEAC15
547 buf[fIndex]=baseWord;
549 // GND-FEAC12 -> Voltage drop between GND and FEAC12
550 // VTH13 -> Thereshould voltage for FEAC13
551 // GND-FEAC13 -> Voltage drop between GND and FEAC13
553 buf[fIndex]=baseWord;
555 // VTH11 -> Thereshould voltage for FEAC11
556 // GND-FEAC11 -> Voltage drop between GND and FEAC11
557 // VTH12 -> Thereshould voltage for FEAC12
559 buf[fIndex]=baseWord;
561 // GND-FEAC9 -> Voltage drop between GND and FEAC9
562 // VTH10 -> Thereshould voltage for FEAC10
563 // GND-FEAC10 -> Voltage drop between GND and FEAC10
565 buf[fIndex]=baseWord;
567 // VTH8 -> Thereshould voltage for FEAC8
568 // GND-FEAC8 -> Voltage drop between GND and FEAC8
569 // VTH9 -> Thereshould voltage for FEAC9
571 buf[fIndex]=baseWord;
573 // GND-FEAC6 -> Voltage drop between GND and FEAC6
574 // VTH7 -> Thereshould voltage for FEAC7
575 // GND-FEAC7 -> Voltage drop between GND and FEAC7
577 buf[fIndex]=baseWord;
579 // VTH5 -> Thereshould voltage for FEAC5
580 // GND-FEAC5 -> Voltage drop between GND and FEAC5
581 // VTH6 -> Thereshould voltage for FEAC6
583 buf[fIndex]=baseWord;
585 // GND-FEAC3 -> Voltage drop between GND and FEAC3
586 // VTH4 -> Thereshould voltage for FEAC4
587 // GND-FEAC4 -> Voltage drop between GND and FEAC4
589 buf[fIndex]=baseWord;
591 // VTH2 -> Thereshould voltage for FEAC2
592 // GND-FEAC2 -> Voltage drop between GND and FEAC2
593 // VTH3 -> Thereshould voltage for FEAC3
595 buf[fIndex]=baseWord;
597 // LV16 -> Low Voltage measured by FEAC16
598 // GND-FEAC1 -> Voltage drop between GND and FEAC1
599 // VTH1 -> Thereshould voltage for FEAC1
601 buf[fIndex]=baseWord;
603 // Low Voltage measured by FEAC13, FEAC14, FEAC15
605 buf[fIndex]=baseWord;
607 // Low Voltage measured by FEAC10, FEAC11, FEAC12
609 buf[fIndex]=baseWord;
611 // Low Voltage measured by FEAC7, FEAC8, FEAC9
613 buf[fIndex]=baseWord;
615 // Low Voltage measured by FEAC4, FEAC5, FEAC6
617 buf[fIndex]=baseWord;
619 // Low Voltage measured by FEAC1, FEAC2, FEAC3
621 buf[fIndex]=baseWord;
625 word = 0; // PDL45 -> Delay Line setting for PDL45
626 AliBitPacking::PackWord(word,baseWord, 0, 7);
627 word = 0; // PDL46 -> Delay Line setting for PDL46
628 AliBitPacking::PackWord(word,baseWord, 8,15);
629 word = 0; // PDL47 -> Delay Line setting for PDL47
630 AliBitPacking::PackWord(word,baseWord,16,23);
631 word = 0; // PDL48 -> Delay Line setting for PDL48
632 AliBitPacking::PackWord(word,baseWord,24,31);
634 buf[fIndex]=baseWord;
636 // Delay Line setting for PDL41, PDL42, PDL43, PDL44
638 buf[fIndex]=baseWord;
640 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
642 buf[fIndex]=baseWord;
644 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
646 buf[fIndex]=baseWord;
648 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
650 buf[fIndex]=baseWord;
652 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
654 buf[fIndex]=baseWord;
656 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
658 buf[fIndex]=baseWord;
660 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
662 buf[fIndex]=baseWord;
664 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
666 buf[fIndex]=baseWord;
668 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
670 buf[fIndex]=baseWord;
672 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
674 buf[fIndex]=baseWord;
676 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
678 buf[fIndex]=baseWord;
682 //----------------------------------------------------------------------------
683 void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
693 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
694 AliBitPacking::PackWord(word,baseWord, 0, 3);
695 word = 0; // event crc
696 AliBitPacking::PackWord(word,baseWord, 4,15);
697 word = 0; // event number
698 AliBitPacking::PackWord(word,baseWord,16,27);
699 word = 5; // 0101 -> LTM trailer ID
700 AliBitPacking::PackWord(word,baseWord,28,31);
702 buf[fIndex]=baseWord;
706 //----------------------------------------------------------------------------
707 void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
710 // TRM header for the TRM number nTRM [ 3;12]
713 if (nTRM<3 || nTRM>12) {
714 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
722 word = nTRM; // TRM data coming from the VME slot number nTRM
723 AliBitPacking::PackWord(word,baseWord, 0, 3);
724 word = 0; // event words
725 AliBitPacking::PackWord(word,baseWord, 4,16);
727 if (fPackedAcquisition)
728 word = 0; // ACQuisition mode: [0;3] see document
730 word = 3; // ACQuisition mode: [0;3] see document
731 AliBitPacking::PackWord(word,baseWord,17,18);
732 word = 0; // description of a SEU inside LUT tables for INL compensation;
733 // the data are unaffected
734 AliBitPacking::PackWord(word,baseWord,19,19);
735 word = 0; // Must Be Zero (MBZ)
736 AliBitPacking::PackWord(word,baseWord,20,27);
737 word = 4; // 0100 -> TRM header ID
738 AliBitPacking::PackWord(word,baseWord,28,31);
740 buf[fIndex]=baseWord;
744 //----------------------------------------------------------------------------
745 void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
755 word = 15; // 1111 -> TRM trailer ID 1
756 AliBitPacking::PackWord(word,baseWord, 0, 3);
757 word = 0; // event CRC
758 AliBitPacking::PackWord(word,baseWord, 4,15);
759 word = 0; // local event counter == DRM local event counter
760 AliBitPacking::PackWord(word,baseWord,16,27);
761 word = 5; // 0101 -> TRM trailer ID 2
762 AliBitPacking::PackWord(word,baseWord,28,31);
764 buf[fIndex]=baseWord;
768 //----------------------------------------------------------------------------
769 void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
779 if (nTRM<3 || nTRM>12) {
780 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
784 if (iChain<0 || iChain>1) {
785 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
790 word = nTRM; // TRM data coming from the VME slot ID nTRM
791 AliBitPacking::PackWord(word,baseWord, 0, 3);
792 word = 0; // bunch ID
793 AliBitPacking::PackWord(word,baseWord, 4,15);
794 word = 100; // PB24 temperature -> 4 X 25 degree (environment temperature)
795 AliBitPacking::PackWord(word,baseWord,16,23);
796 word = (Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
797 AliBitPacking::PackWord(word,baseWord,24,26);
799 AliBitPacking::PackWord(word,baseWord,27,27);
802 word = 0; // 0000 -> TRM chain 0 ID
805 word = 2; // 0010 -> TRM chain 1 ID
808 AliBitPacking::PackWord(word,baseWord,28,31);
810 buf[fIndex]=baseWord;
814 //----------------------------------------------------------------------------
815 void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf, UInt_t nWordsPerTRM)
824 for (jj=fIndex; jj>fIndex-(Int_t)nWordsPerTRM; jj--) {
828 buf[fIndex-nWordsPerTRM] = MakeFiller();
832 //----------------------------------------------------------------------------
833 UInt_t AliTOFDDLRawData::MakeFiller()
836 // Filler word definition: to make even the number of words per TRM/LTM
843 word = 0; // 0000 -> filler ID 1
844 AliBitPacking::PackWord(word,baseWord, 0, 3);
846 AliBitPacking::PackWord(word,baseWord, 4,27);
847 word = 7; // 0111 -> filler ID 2
848 AliBitPacking::PackWord(word,baseWord, 28,31);
854 //----------------------------------------------------------------------------
855 void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
861 if (iChain<0 || iChain>1) {
862 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
871 AliBitPacking::PackWord(word,baseWord, 0, 3);
873 AliBitPacking::PackWord(word,baseWord, 4,15);
874 word = 0; // event counter
875 AliBitPacking::PackWord(word,baseWord,16,27);
878 word = 1; // 0001 -> TRM chain 0 trailer ID
881 word = 3; // 0011 -> TRM chain 1 trailer ID
884 AliBitPacking::PackWord(word,baseWord,28,31);
886 buf[fIndex]=baseWord;
890 //----------------------------------------------------------------------------
891 void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain,
892 UInt_t *buf, UInt_t &nWordsPerTRM)
898 const Double_t kOneMoreFilledCell = 1./(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
899 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors());
901 if (nDDL<0 || nDDL>71) {
902 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
906 if (nTRM<3 || nTRM>12) {
907 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
911 if (iChain<0 || iChain>1) {
912 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
917 UInt_t localBuffer[1000];
918 Int_t localIndex = -1;
920 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
922 Int_t volume[5] = {-1, -1, -1, -1, -1};
923 Int_t indexDigit[3] = {-1, -1, -1};
925 Int_t totCharge = -1;
926 Int_t timeOfFlight = -1;
928 Int_t trailingSpurious = -1;
929 Int_t leadingSpurious = -1;
940 //Int_t numberOfMeasuresPerChannel = 0;
941 //Int_t maxMeasuresPerChannelInTDC = 0;
943 Bool_t outOut = HeadOrTail();
947 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
949 for (jj=0; jj<5; jj++) volume[jj] = -1;
951 // loop on TDC number
952 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
954 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
955 // for TDC numbers 3-14
956 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3.)!=0) continue;
958 // loop on TDC channel number
959 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
961 //numberOfMeasuresPerChannel = 0;
963 fTOFrawStream->EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
965 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
966 volume[3]==-1 || volume[4]==-1) continue;
968 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
970 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
972 if (indexDigit[0]<0) {
974 trailingSpurious = Int_t(2097152*gRandom->Rndm());
975 leadingSpurious = Int_t(2097152*gRandom->Rndm());
977 if ( fFakeOrphaneProduction &&
978 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
979 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
981 percentFilledCells+=kOneMoreFilledCell;
986 word = trailingSpurious; // trailing edge measurement
990 word = leadingSpurious; // leading edge measurement
995 if (nDDL<10) ftxt << " " << nDDL;
996 else ftxt << " " << nDDL;
997 if (nTRM<10) ftxt << " " << nTRM;
998 else ftxt << " " << nTRM;
999 ftxt << " " << iChain;
1000 if (nTDC<10) ftxt << " " << nTDC;
1001 else ftxt << " " << nTDC;
1003 if (volume[0]<10) ftxt << " -> " << volume[0];
1004 else ftxt << " -> " << volume[0];
1005 ftxt << " " << volume[1];
1006 if (volume[2]<10) ftxt << " " << volume[2];
1007 else ftxt << " " << volume[2];
1008 ftxt << " " << volume[4];
1009 if (volume[3]<10) ftxt << " " << volume[3];
1010 else ftxt << " " << volume[3];
1012 if (word<10) ftxt << " " << word;
1013 else if (word>=10 && word<100) ftxt << " " << word;
1014 else if (word>=100 && word<1000) ftxt << " " << word;
1015 else if (word>=1000 && word<10000) ftxt << " " << word;
1016 else if (word>=10000 && word<100000) ftxt << " " << word;
1017 else if (word>=100000 && word<1000000) ftxt << " " << word;
1018 else ftxt << " " << word;
1019 ftxt << " " << dummyPS << endl;
1022 AliBitPacking::PackWord(word,baseWord, 0,20);
1023 word = iCH; // TDC channel ID [0;7]
1024 AliBitPacking::PackWord(word,baseWord,21,23);
1025 word = nTDC; // TDC ID [0;14]
1026 AliBitPacking::PackWord(word,baseWord,24,27);
1027 word = 0; // error flag
1028 AliBitPacking::PackWord(word,baseWord,28,28);
1029 word = dummyPS; // Packing Status [0;3]
1030 AliBitPacking::PackWord(word,baseWord,29,30);
1031 word = 1; // TRM TDC digit ID
1032 AliBitPacking::PackWord(word,baseWord,31,31);
1035 localBuffer[localIndex]=baseWord;
1036 psArray[localIndex]=dummyPS;
1041 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
1042 } // if (indexDigit[0]<0)
1044 for (jj=0; jj<3;jj++) {
1046 if (indexDigit[jj]<0) continue;
1048 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1050 if (digs->GetSector()!=volume[0] ||
1051 digs->GetPlate() !=volume[1] ||
1052 digs->GetStrip() !=volume[2] ||
1053 digs->GetPadx() !=volume[3] ||
1054 digs->GetPadz() !=volume[4]) AliWarning(" --- ERROR --- ");
1056 timeOfFlight = (Int_t)(digs->GetTdc())
1058 fTOFCableLengthMap->GetCableTimeShiftBin(nDDL, nTRM, iChain, nTDC);
1060 if (timeOfFlight>=fMatchingWindow+1000) continue; // adc
1062 //numberOfMeasuresPerChannel++;
1064 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1065 totCharge = (Int_t)(digs->GetToT());
1066 // temporary control
1067 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
1069 if (fPackedAcquisition) {
1072 if (nDDL<10) ftxt << " " << nDDL;
1073 else ftxt << " " << nDDL;
1074 if (nTRM<10) ftxt << " " << nTRM;
1075 else ftxt << " " << nTRM;
1076 ftxt << " " << iChain;
1077 if (nTDC<10) ftxt << " " << nTDC;
1078 else ftxt << " " << nTDC;
1080 if (volume[0]<10) ftxt << " -> " << volume[0];
1081 else ftxt << " -> " << volume[0];
1082 ftxt << " " << volume[1];
1083 if (volume[2]<10) ftxt << " " << volume[2];
1084 else ftxt << " " << volume[2];
1085 ftxt << " " << volume[4];
1086 if (volume[3]<10) ftxt << " " << volume[3];
1087 else ftxt << " " << volume[3];
1088 if (totCharge<10) ftxt << " " << totCharge;
1089 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1090 else ftxt << " " << totCharge;
1091 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1092 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1093 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1094 else ftxt << " " << timeOfFlight << endl;
1097 word = timeOfFlight%8192; // time-of-fligth measurement
1098 AliBitPacking::PackWord(word,baseWord, 0,12);
1100 if (totCharge>=256) totCharge = 255;
1101 word = totCharge; // time-over-threshould measurement
1102 AliBitPacking::PackWord(word,baseWord,13,20);
1104 word = iCH; // TDC channel ID [0;7]
1105 AliBitPacking::PackWord(word,baseWord,21,23);
1106 word = nTDC; // TDC ID [0;14]
1107 AliBitPacking::PackWord(word,baseWord,24,27);
1108 word = 0; // error flag
1109 AliBitPacking::PackWord(word,baseWord,28,28);
1110 word = 0; // Packing Status [0;3]
1111 AliBitPacking::PackWord(word,baseWord,29,30);
1112 word = 1; // TRM TDC digit ID
1113 AliBitPacking::PackWord(word,baseWord,31,31);
1116 localBuffer[localIndex]=baseWord;
1121 if ( fFakeOrphaneProduction &&
1122 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
1124 percentFilledCells+=kOneMoreFilledCell;
1126 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1127 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1132 word = trailingSpurious; // trailing edge measurement
1136 word = leadingSpurious; // leading edge measurement
1141 if (nDDL<10) ftxt << " " << nDDL;
1142 else ftxt << " " << nDDL;
1143 if (nTRM<10) ftxt << " " << nTRM;
1144 else ftxt << " " << nTRM;
1145 ftxt << " " << iChain;
1146 if (nTDC<10) ftxt << " " << nTDC;
1147 else ftxt << " " << nTDC;
1149 if (volume[0]<10) ftxt << " -> " << volume[0];
1150 else ftxt << " -> " << volume[0];
1151 ftxt << " " << volume[1];
1152 if (volume[2]<10) ftxt << " " << volume[2];
1153 else ftxt << " " << volume[2];
1154 ftxt << " " << volume[4];
1155 if (volume[3]<10) ftxt << " " << volume[3];
1156 else ftxt << " " << volume[3];
1158 if (word<10) ftxt << " " << word;
1159 else if (word>=10 && word<100) ftxt << " " << word;
1160 else if (word>=100 && word<1000) ftxt << " " << word;
1161 else if (word>=1000 && word<10000) ftxt << " " << word;
1162 else if (word>=10000 && word<100000) ftxt << " " << word;
1163 else if (word>=100000 && word<1000000) ftxt << " " << word;
1164 else ftxt << " " << word;
1165 ftxt << " " << dummyPS << endl;
1168 AliBitPacking::PackWord(word,baseWord, 0,20);
1169 word = iCH; // TDC channel ID [0;7]
1170 AliBitPacking::PackWord(word,baseWord,21,23);
1171 word = nTDC; // TDC ID [0;14]
1172 AliBitPacking::PackWord(word,baseWord,24,27);
1173 word = 0; // error flag
1174 AliBitPacking::PackWord(word,baseWord,28,28);
1175 word = dummyPS; // Packing Status [0;3]
1176 AliBitPacking::PackWord(word,baseWord,29,30);
1177 word = 1; // TRM TDC digit ID
1178 AliBitPacking::PackWord(word,baseWord,31,31);
1181 localBuffer[localIndex]=baseWord;
1182 psArray[localIndex]=dummyPS;
1187 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
1190 } // if (fPackedAcquisition)
1191 else { // if (!fPackedAcquisition)
1193 if ( fFakeOrphaneProduction &&
1194 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
1196 percentFilledCells+=kOneMoreFilledCell;
1198 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1199 word = trailingSpurious;
1203 if (nDDL<10) ftxt << " " << nDDL;
1204 else ftxt << " " << nDDL;
1205 if (nTRM<10) ftxt << " " << nTRM;
1206 else ftxt << " " << nTRM;
1207 ftxt << " " << iChain;
1208 if (nTDC<10) ftxt << " " << nTDC;
1209 else ftxt << " " << nTDC;
1211 if (volume[0]<10) ftxt << " -> " << volume[0];
1212 else ftxt << " -> " << volume[0];
1213 ftxt << " " << volume[1];
1214 if (volume[2]<10) ftxt << " " << volume[2];
1215 else ftxt << " " << volume[2];
1216 ftxt << " " << volume[4];
1217 if (volume[3]<10) ftxt << " " << volume[3];
1218 else ftxt << " " << volume[3];
1220 if (word<10) ftxt << " " << word;
1221 else if (word>=10 && word<100) ftxt << " " << word;
1222 else if (word>=100 && word<1000) ftxt << " " << word;
1223 else if (word>=1000 && word<10000) ftxt << " " << word;
1224 else if (word>=10000 && word<100000) ftxt << " " << word;
1225 else if (word>=100000 && word<1000000) ftxt << " " << word;
1226 else ftxt << " " << word;
1227 ftxt << " " << dummyPS << endl;
1230 AliBitPacking::PackWord(word,baseWord, 0,20);
1231 word = iCH; // TDC channel ID [0;7]
1232 AliBitPacking::PackWord(word,baseWord,21,23);
1233 word = nTDC; // TDC ID [0;14]
1234 AliBitPacking::PackWord(word,baseWord,24,27);
1235 word = 0; // error flag
1236 AliBitPacking::PackWord(word,baseWord,28,28);
1237 word = dummyPS; // Packing Status [0;3]
1238 AliBitPacking::PackWord(word,baseWord,29,30);
1239 word = 1; // TRM TDC digit ID
1240 AliBitPacking::PackWord(word,baseWord,31,31);
1243 localBuffer[localIndex]=baseWord;
1244 psArray[localIndex]=dummyPS;
1249 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
1252 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
1255 if (nDDL<10) ftxt << " " << nDDL;
1256 else ftxt << " " << nDDL;
1257 if (nTRM<10) ftxt << " " << nTRM;
1258 else ftxt << " " << nTRM;
1259 ftxt << " " << iChain;
1260 if (nTDC<10) ftxt << " " << nTDC;
1261 else ftxt << " " << nTDC;
1263 if (volume[0]<10) ftxt << " -> " << volume[0];
1264 else ftxt << " -> " << volume[0];
1265 ftxt << " " << volume[1];
1266 if (volume[2]<10) ftxt << " " << volume[2];
1267 else ftxt << " " << volume[2];
1268 ftxt << " " << volume[4];
1269 if (volume[3]<10) ftxt << " " << volume[3];
1270 else ftxt << " " << volume[3];
1272 if (word<10) ftxt << " " << word;
1273 else if (word>=10 && word<100) ftxt << " " << word;
1274 else if (word>=100 && word<1000) ftxt << " " << word;
1275 else if (word>=1000 && word<10000) ftxt << " " << word;
1276 else if (word>=10000 && word<100000) ftxt << " " << word;
1277 else if (word>=100000 && word<1000000) ftxt << " " << word;
1278 else ftxt << " " << word;
1279 ftxt << " " << 2 << endl;
1282 AliBitPacking::PackWord(word,baseWord, 0,20);
1284 word = iCH; // TDC channel ID [0;7]
1285 AliBitPacking::PackWord(word,baseWord,21,23);
1286 word = nTDC; // TDC ID [0;14]
1287 AliBitPacking::PackWord(word,baseWord,24,27);
1288 word = 0; // error flag
1289 AliBitPacking::PackWord(word,baseWord,28,28);
1290 word = 2; // Packing Status [0;3]
1291 AliBitPacking::PackWord(word,baseWord,29,30);
1292 word = 1; // TRM TDC digit ID
1293 AliBitPacking::PackWord(word,baseWord,31,31);
1296 localBuffer[localIndex]=baseWord;
1297 psArray[localIndex]=2;
1302 word = timeOfFlight%2097152; // leading edge measurement
1305 if (nDDL<10) ftxt << " " << nDDL;
1306 else ftxt << " " << nDDL;
1307 if (nTRM<10) ftxt << " " << nTRM;
1308 else ftxt << " " << nTRM;
1309 ftxt << " " << iChain;
1310 if (nTDC<10) ftxt << " " << nTDC;
1311 else ftxt << " " << nTDC;
1313 if (volume[0]<10) ftxt << " -> " << volume[0];
1314 else ftxt << " -> " << volume[0];
1315 ftxt << " " << volume[1];
1316 if (volume[2]<10) ftxt << " " << volume[2];
1317 else ftxt << " " << volume[2];
1318 ftxt << " " << volume[4];
1319 if (volume[3]<10) ftxt << " " << volume[3];
1320 else ftxt << " " << volume[3];
1322 if (word<10) ftxt << " " << word;
1323 else if (word>=10 && word<100) ftxt << " " << word;
1324 else if (word>=100 && word<1000) ftxt << " " << word;
1325 else if (word>=1000 && word<10000) ftxt << " " << word;
1326 else if (word>=10000 && word<100000) ftxt << " " << word;
1327 else if (word>=100000 && word<1000000) ftxt << " " << word;
1328 else ftxt << " " << word;
1329 ftxt << " " << 1 << endl;
1332 AliBitPacking::PackWord(word,baseWord, 0,20);
1334 word = iCH; // TDC channel ID [0;7]
1335 AliBitPacking::PackWord(word,baseWord,21,23);
1336 word = nTDC; // TDC ID [0;14]
1337 AliBitPacking::PackWord(word,baseWord,24,27);
1338 word = 0; // error flag
1339 AliBitPacking::PackWord(word,baseWord,28,28);
1340 word = 1; // Packing Status [0;3]
1341 AliBitPacking::PackWord(word,baseWord,29,30);
1342 word = 1; // TRM TDC digit ID
1343 AliBitPacking::PackWord(word,baseWord,31,31);
1346 localBuffer[localIndex]=baseWord;
1347 psArray[localIndex]=1;
1353 if ( fFakeOrphaneProduction &&
1354 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
1356 percentFilledCells+=kOneMoreFilledCell;
1358 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1359 word = leadingSpurious;
1363 if (nDDL<10) ftxt << " " << nDDL;
1364 else ftxt << " " << nDDL;
1365 if (nTRM<10) ftxt << " " << nTRM;
1366 else ftxt << " " << nTRM;
1367 ftxt << " " << iChain;
1368 if (nTDC<10) ftxt << " " << nTDC;
1369 else ftxt << " " << nTDC;
1371 if (volume[0]<10) ftxt << " -> " << volume[0];
1372 else ftxt << " -> " << volume[0];
1373 ftxt << " " << volume[1];
1374 if (volume[2]<10) ftxt << " " << volume[2];
1375 else ftxt << " " << volume[2];
1376 ftxt << " " << volume[4];
1377 if (volume[3]<10) ftxt << " " << volume[3];
1378 else ftxt << " " << volume[3];
1380 if (word<10) ftxt << " " << word;
1381 else if (word>=10 && word<100) ftxt << " " << word;
1382 else if (word>=100 && word<1000) ftxt << " " << word;
1383 else if (word>=1000 && word<10000) ftxt << " " << word;
1384 else if (word>=10000 && word<100000) ftxt << " " << word;
1385 else if (word>=100000 && word<1000000) ftxt << " " << word;
1386 else ftxt << " " << word;
1387 ftxt << " " << dummyPS << endl;
1390 AliBitPacking::PackWord(word,baseWord, 0,20);
1391 word = iCH; // TDC channel ID [0;7]
1392 AliBitPacking::PackWord(word,baseWord,21,23);
1393 word = nTDC; // TDC ID [0;14]
1394 AliBitPacking::PackWord(word,baseWord,24,27);
1395 word = 0; // error flag
1396 AliBitPacking::PackWord(word,baseWord,28,28);
1397 word = dummyPS; // Packing Status [0;3]
1398 AliBitPacking::PackWord(word,baseWord,29,30);
1399 word = 1; // TRM TDC digit ID
1400 AliBitPacking::PackWord(word,baseWord,31,31);
1403 localBuffer[localIndex]=baseWord;
1404 psArray[localIndex]=dummyPS;
1409 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
1412 } // if (!fPackedAcquisition)
1414 } //end loop on digits in the same volume
1416 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1417 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1419 } // end loop on TDC channel number
1421 //AliInfo(Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
1423 if (localIndex==-1) continue;
1425 if (fPackedAcquisition) {
1427 for (jj=0; jj<=localIndex; jj++) {
1429 buf[fIndex] = localBuffer[jj];
1430 localBuffer[jj] = 0;
1437 if (maxMeasuresPerChannelInTDC = 1) {
1439 for (Int_t jj=0; jj<=localIndex; jj++) {
1440 if (psArray[jj]==2) {
1442 buf[fIndex] = localBuffer[jj];
1443 localBuffer[jj] = 0;
1447 for (Int_t jj=0; jj<=localIndex; jj++) {
1448 if (psArray[jj]==1) {
1450 buf[fIndex] = localBuffer[jj];
1451 localBuffer[jj] = 0;
1456 } // if (maxMeasuresPerChannelInTDC = 1)
1457 else if (maxMeasuresPerChannelInTDC>1) {
1459 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",
1460 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
1462 for (jj=0; jj<=localIndex; jj++) {
1464 buf[fIndex] = localBuffer[jj];
1465 localBuffer[jj] = 0;
1469 //} // else if (maxMeasuresPerChannelInTDC>1)
1471 } // else (!fPackedAcquisition)
1475 //maxMeasuresPerChannelInTDC = 0;
1477 } // end loop on TDC number
1480 if (fVerbose==2) ftxt.close();
1484 //----------------------------------------------------------------------------
1485 void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1488 // Reverses the n elements of array a
1493 for (ii=0; ii<n/2; ii++) {
1503 //----------------------------------------------------------------------------
1504 Bool_t AliTOFDDLRawData::HeadOrTail() const
1507 // Returns the result of a 'pitch and toss'
1510 Double_t dummy = gRandom->Rndm();
1512 if (dummy<0.5) return kFALSE;