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