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.15 2007/04/23 16:51:39 decaro
19 Digits-to-raw_data conversion: correction for a more real description (A.De Caro, R.Preghenella)
21 Revision 1.14 2007/03/28 10:50:33 decaro
22 Rounding off problem in rawData coding/decoding: solved
24 Revision 1.13 2007/02/20 15:57:00 decaro
25 Raw data update: to read the TOF raw data defined in UNPACKED mode
27 Revision 1.12 2006/08/22 13:29:42 arcelli
28 removal of effective c++ warnings (C.Zampolli)
30 Revision 1.11 2006/08/10 14:46:54 decaro
31 TOF raw data format: updated version
33 Revision 1.10.1 2006/06/28 A.De Caro
34 Update TOF raw data format
35 according to the final version
36 (see ALICE internal note in preparation
37 'ALICE TOF raw data format')
39 Revision 0.02 2005/7/25 A.De Caro
40 Update number of bits allocated for time-of-flight
41 and 'charge' measurements
43 Revision 0.01 2004/6/11 A.De Caro, S.B.Sellitto, R.Silvestri
44 First implementation: global methods RawDataTOF
48 ////////////////////////////////////////////////////////////////////
50 // This class contains the methods to create the Raw Data files //
51 // for the TOF detector starting from the Digits. //
52 // In this implementation, we defined the structure //
53 // of the ALICE-TOF raw data (according to the //
54 // ALICE technical note, in preparation) //
55 // starting from the TOF digit format. //
57 ////////////////////////////////////////////////////////////////////
59 #include "Riostream.h"
62 #include "TClonesArray.h"
66 #include "AliBitPacking.h"
69 //#include "AliRawDataHeader.h"
70 #include "AliRawDataHeaderSim.h"
72 #include "AliTOFDDLRawData.h"
73 #include "AliTOFDigitMap.h"
74 #include "AliTOFdigit.h"
75 #include "AliTOFGeometry.h"
76 #include "AliTOFRawStream.h"
78 extern TRandom *gRandom;
80 ClassImp(AliTOFDDLRawData)
82 //---------------------------------------------------------------------------
83 AliTOFDDLRawData::AliTOFDDLRawData():
86 fPackedAcquisition(kTRUE),
87 fFakeOrphaneProduction(kFALSE),
88 fMatchingWindow(8192),
90 fTOFdigitMap(new AliTOFDigitMap()),
92 fTOFrawStream(new AliTOFRawStream())
97 //----------------------------------------------------------------------------
98 AliTOFDDLRawData::AliTOFDDLRawData(AliTOFGeometry *tofGeom):
101 fPackedAcquisition(kTRUE),
102 fFakeOrphaneProduction(kFALSE),
103 fMatchingWindow(8192),
104 fTOFgeometry(tofGeom),
105 fTOFdigitMap(new AliTOFDigitMap()),
107 fTOFrawStream(new AliTOFRawStream())
113 //----------------------------------------------------------------------------
114 AliTOFDDLRawData::AliTOFDDLRawData(const AliTOFDDLRawData &source) :
118 fPackedAcquisition(kTRUE),
119 fFakeOrphaneProduction(kFALSE),
120 fMatchingWindow(8192),
122 fTOFdigitMap(new AliTOFDigitMap()),
124 fTOFrawStream(new AliTOFRawStream())
127 this->fIndex=source.fIndex;
128 this->fVerbose=source.fVerbose;
129 this->fPackedAcquisition=source.fPackedAcquisition;
130 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
131 this->fMatchingWindow=source.fMatchingWindow;
132 this->fTOFgeometry=source.fTOFgeometry;
133 this->fTOFdigitMap=source.fTOFdigitMap;
134 this->fTOFdigitArray=source.fTOFdigitArray;
135 this->fTOFrawStream=source.fTOFrawStream;
139 //----------------------------------------------------------------------------
140 AliTOFDDLRawData& AliTOFDDLRawData::operator=(const AliTOFDDLRawData &source) {
142 this->fIndex=source.fIndex;
143 this->fVerbose=source.fVerbose;
144 this->fPackedAcquisition=source.fPackedAcquisition;
145 this->fFakeOrphaneProduction=source.fFakeOrphaneProduction;
146 this->fMatchingWindow=source.fMatchingWindow;
147 this->fTOFgeometry=source.fTOFgeometry;
148 this->fTOFdigitMap=source.fTOFdigitMap;
149 this->fTOFdigitArray=source.fTOFdigitArray;
150 this->fTOFrawStream=source.fTOFrawStream;
154 //----------------------------------------------------------------------------
155 Int_t AliTOFDDLRawData::RawDataTOF(TBranch* branch)
158 // This method creates the Raw data files for TOF detector
161 const Int_t kSize = 5000; //max number of digits per DDL file times 2
167 fTOFdigitArray = * (TClonesArray**) branch->GetAddress();
170 ofstream outfile; // logical name of the output file
172 //AliRawDataHeader header;
173 AliRawDataHeaderSim header;
175 UInt_t sizeRawData = 0;
187 UInt_t nWordsPerTRM = 0;
189 //loop over TOF DDL files
190 for (nDDL=0; nDDL<AliDAQ::NumberOfDdls("TOF"); nDDL++) {
192 strcpy(fileName,AliDAQ::DdlFileName("TOF",nDDL)); //The name of the output file
194 outfile.open(fileName,ios::binary);
196 outfile.open(fileName);
199 iDDL = fTOFrawStream->GetDDLnumberPerSector(nDDL);
201 // write Dummy DATA HEADER
202 UInt_t dataHeaderPosition = outfile.tellp();
203 outfile.write((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.write((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.write((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 3
336 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
337 AliBitPacking::PackWord(word,baseWord, 0, 3);
338 word = 0; // TTC event counter
339 AliBitPacking::PackWord(word,baseWord, 4,27);
340 word = 4; // 0100 -> DRM header ID
341 AliBitPacking::PackWord(word,baseWord,28,31);
343 buf[fIndex]=baseWord;
345 // DRM status header 2
347 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
348 AliBitPacking::PackWord(word,baseWord, 0, 3);
351 word = 2047; // enable ID: [00000000000;11111111111] for odd
352 // (i.e. right) crates
353 AliBitPacking::PackWord(word,baseWord, 4,14);
355 word = 2045; // enable ID: [00000000000;11111111101] for even
356 // (i.e. left) crates
357 AliBitPacking::PackWord(word,baseWord, 4,14);
361 AliBitPacking::PackWord(word,baseWord,15,15);
362 word = 0; // fault ID
363 AliBitPacking::PackWord(word,baseWord,16,27);
364 word = 4; // 0100 -> DRM header ID
365 AliBitPacking::PackWord(word,baseWord,28,31);
367 buf[fIndex]=baseWord;
369 // DRM status header 1
371 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
372 AliBitPacking::PackWord(word,baseWord, 0, 3);
375 word = 2047; // slot ID: [00000000000;11111111111] for odd
376 // (i.e. right) crates
377 AliBitPacking::PackWord(word,baseWord, 4,14);
379 word = 2045; // slot ID: [00000000000;11111111101] for even
380 // (i.e. left) crates
381 AliBitPacking::PackWord(word,baseWord, 4,14);
384 word = 1; // LHC clock status: 1/0
385 AliBitPacking::PackWord(word,baseWord,15,15);
386 word = 0; // reserved for future use
387 AliBitPacking::PackWord(word,baseWord,16,27);
388 word = 4; // 0100 -> DRM header ID
389 AliBitPacking::PackWord(word,baseWord,28,31);
391 buf[fIndex]=baseWord;
395 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
396 AliBitPacking::PackWord(word,baseWord, 0, 3);
397 word = fIndex+1 + 1; // event words
398 AliBitPacking::PackWord(word,baseWord, 4,20);
399 word = iDDL; // crate ID [0;3]
400 AliBitPacking::PackWord(word,baseWord,21,22);
401 word = iSector; // sector ID [0;17]
402 AliBitPacking::PackWord(word,baseWord,23,27);
403 word = 4; // 0100 -> DRM header ID
404 AliBitPacking::PackWord(word,baseWord,28,31);
406 buf[fIndex]=baseWord;
410 //----------------------------------------------------------------------------
411 void AliTOFDDLRawData::MakeDRMtrailer(UInt_t *buf)
414 // DRM global trailer
421 word = 1; // 0001 -> DRM data are coming from the VME slot number 1
422 AliBitPacking::PackWord(word,baseWord, 0, 3);
423 word = 0; // local event counter
424 AliBitPacking::PackWord(word,baseWord, 4,15);
425 word = 0; // reserved for future use
426 AliBitPacking::PackWord(word,baseWord,16,27);
427 word = 5; // 0101 -> DRM trailer ID
428 AliBitPacking::PackWord(word,baseWord,28,31);
430 buf[fIndex]=baseWord;
434 //----------------------------------------------------------------------------
435 void AliTOFDDLRawData::MakeLTMheader(UInt_t *buf)
445 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
446 AliBitPacking::PackWord(word,baseWord, 0, 3);
447 word = 35; // event words
448 AliBitPacking::PackWord(word,baseWord, 4,16);
449 word = 0; // crc error
450 AliBitPacking::PackWord(word,baseWord,17,17);
452 AliBitPacking::PackWord(word,baseWord,18,23);
454 AliBitPacking::PackWord(word,baseWord,24,27);
455 word = 4; // 0100 -> LTM header ID
456 AliBitPacking::PackWord(word,baseWord,28,31);
458 buf[fIndex]=baseWord;
462 //----------------------------------------------------------------------------
463 void AliTOFDDLRawData::MakeLTMdata(UInt_t *buf)
473 word = 100; // Local temperature in LTM5 -> 4 X 25 degree (environment temperature)
474 AliBitPacking::PackWord(word,baseWord, 0, 9);
475 word = 100; // Local temperature in LTM6 -> 4 X 25 degree (environment temperature)
476 AliBitPacking::PackWord(word,baseWord,10,19);
477 word = 100; // Local temperature in LTM7 -> 4 X 25 degree (environment temperature)
478 AliBitPacking::PackWord(word,baseWord,20,29);
480 AliBitPacking::PackWord(word,baseWord,30,31);
483 buf[fIndex]=baseWord;
485 // Local temperature in LTM2, LMT3, LTM4 -> 4 X 25 degree (environment temperature)
487 buf[fIndex]=baseWord;
489 // Local temperature in FEAC7, FEAC8, LTM1 -> 4 X 25 degree (environment temperature)
491 buf[fIndex]=baseWord;
493 // Local temperature in FEAC4, FEAC5, FEAC6 -> 4 X 25 degree (environment temperature)
495 buf[fIndex]=baseWord;
497 // Local temperature in FEAC1, FEAC2, FEAC3 -> 4 X 25 degree (environment temperature)
499 buf[fIndex]=baseWord;
502 word = 0; // GND-FEAC15 -> Voltage drop between GND and FEAC15
503 AliBitPacking::PackWord(word,baseWord, 0, 9);
504 word = 0; // VTH16 -> Thereshould voltage for FEAC16
505 AliBitPacking::PackWord(word,baseWord,10,19);
506 word = 0; // GND-FEAC16 -> Voltage drop between GND and FEAC16
507 AliBitPacking::PackWord(word,baseWord,20,29);
509 AliBitPacking::PackWord(word,baseWord,30,31);
512 buf[fIndex]=baseWord;
514 // VTH14 -> Thereshould voltage for FEAC14
515 // GND-FEAC14 -> Voltage drop between GND and FEAC14
516 // VTH15 -> Thereshould voltage for FEAC15
518 buf[fIndex]=baseWord;
520 // GND-FEAC12 -> Voltage drop between GND and FEAC12
521 // VTH13 -> Thereshould voltage for FEAC13
522 // GND-FEAC13 -> Voltage drop between GND and FEAC13
524 buf[fIndex]=baseWord;
526 // VTH11 -> Thereshould voltage for FEAC11
527 // GND-FEAC11 -> Voltage drop between GND and FEAC11
528 // VTH12 -> Thereshould voltage for FEAC12
530 buf[fIndex]=baseWord;
532 // GND-FEAC9 -> Voltage drop between GND and FEAC9
533 // VTH10 -> Thereshould voltage for FEAC10
534 // GND-FEAC10 -> Voltage drop between GND and FEAC10
536 buf[fIndex]=baseWord;
538 // VTH8 -> Thereshould voltage for FEAC8
539 // GND-FEAC8 -> Voltage drop between GND and FEAC8
540 // VTH9 -> Thereshould voltage for FEAC9
542 buf[fIndex]=baseWord;
544 // GND-FEAC6 -> Voltage drop between GND and FEAC6
545 // VTH7 -> Thereshould voltage for FEAC7
546 // GND-FEAC7 -> Voltage drop between GND and FEAC7
548 buf[fIndex]=baseWord;
550 // VTH5 -> Thereshould voltage for FEAC5
551 // GND-FEAC5 -> Voltage drop between GND and FEAC5
552 // VTH6 -> Thereshould voltage for FEAC6
554 buf[fIndex]=baseWord;
556 // GND-FEAC3 -> Voltage drop between GND and FEAC3
557 // VTH4 -> Thereshould voltage for FEAC4
558 // GND-FEAC4 -> Voltage drop between GND and FEAC4
560 buf[fIndex]=baseWord;
562 // VTH2 -> Thereshould voltage for FEAC2
563 // GND-FEAC2 -> Voltage drop between GND and FEAC2
564 // VTH3 -> Thereshould voltage for FEAC3
566 buf[fIndex]=baseWord;
568 // LV16 -> Low Voltage measured by FEAC16
569 // GND-FEAC1 -> Voltage drop between GND and FEAC1
570 // VTH1 -> Thereshould voltage for FEAC1
572 buf[fIndex]=baseWord;
574 // Low Voltage measured by FEAC13, FEAC14, FEAC15
576 buf[fIndex]=baseWord;
578 // Low Voltage measured by FEAC10, FEAC11, FEAC12
580 buf[fIndex]=baseWord;
582 // Low Voltage measured by FEAC7, FEAC8, FEAC9
584 buf[fIndex]=baseWord;
586 // Low Voltage measured by FEAC4, FEAC5, FEAC6
588 buf[fIndex]=baseWord;
590 // Low Voltage measured by FEAC1, FEAC2, FEAC3
592 buf[fIndex]=baseWord;
596 word = 0; // PDL45 -> Delay Line setting for PDL45
597 AliBitPacking::PackWord(word,baseWord, 0, 7);
598 word = 0; // PDL46 -> Delay Line setting for PDL46
599 AliBitPacking::PackWord(word,baseWord, 8,15);
600 word = 0; // PDL47 -> Delay Line setting for PDL47
601 AliBitPacking::PackWord(word,baseWord,16,23);
602 word = 0; // PDL48 -> Delay Line setting for PDL48
603 AliBitPacking::PackWord(word,baseWord,24,31);
605 buf[fIndex]=baseWord;
607 // Delay Line setting for PDL41, PDL42, PDL43, PDL44
609 buf[fIndex]=baseWord;
611 // Delay Line setting for PDL37, PDL38, PDL39, PDL40
613 buf[fIndex]=baseWord;
615 // Delay Line setting for PDL33, PDL34, PDL35, PDL36
617 buf[fIndex]=baseWord;
619 // Delay Line setting for PDL29, PDL30, PDL31, PDL32
621 buf[fIndex]=baseWord;
623 // Delay Line setting for PDL25, PDL26, PDL27, PDL28
625 buf[fIndex]=baseWord;
627 // Delay Line setting for PDL21, PDL22, PDL23, PDL24
629 buf[fIndex]=baseWord;
631 // Delay Line setting for PDL17, PDL18, PDL19, PDL20
633 buf[fIndex]=baseWord;
635 // Delay Line setting for PDL13, PDL14, PDL15, PDL16
637 buf[fIndex]=baseWord;
639 // Delay Line setting for PDL9, PDL10, PDL11, PDL12
641 buf[fIndex]=baseWord;
643 // Delay Line setting for PDL5, PDL6, PDL7, PDL8
645 buf[fIndex]=baseWord;
647 // Delay Line setting for PDL1, PDL2, PDL3, PDL4
649 buf[fIndex]=baseWord;
653 //----------------------------------------------------------------------------
654 void AliTOFDDLRawData::MakeLTMtrailer(UInt_t *buf)
664 word = 2; // 0010 -> LTM data are coming from the VME slot number 2
665 AliBitPacking::PackWord(word,baseWord, 0, 3);
666 word = 0; // event crc
667 AliBitPacking::PackWord(word,baseWord, 4,15);
668 word = 0; // event number
669 AliBitPacking::PackWord(word,baseWord,16,27);
670 word = 5; // 0101 -> LTM trailer ID
671 AliBitPacking::PackWord(word,baseWord,28,31);
673 buf[fIndex]=baseWord;
677 //----------------------------------------------------------------------------
678 void AliTOFDDLRawData::MakeTRMheader(Int_t nTRM, UInt_t *buf)
681 // TRM header for the TRM number nTRM [ 3;12]
684 if (nTRM<3 || nTRM>12) {
685 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i",nTRM));
693 word = nTRM; // TRM data coming from the VME slot number nTRM
694 AliBitPacking::PackWord(word,baseWord, 0, 3);
695 word = 0; // event words
696 AliBitPacking::PackWord(word,baseWord, 4,16);
698 if (fPackedAcquisition)
699 word = 0; // ACQuisition mode: [0;3] see document
701 word = 3; // ACQuisition mode: [0;3] see document
702 AliBitPacking::PackWord(word,baseWord,17,18);
703 word = 0; // description of a SEU inside LUT tables for INL compensation;
704 // the data are unaffected
705 AliBitPacking::PackWord(word,baseWord,19,19);
706 word = 0; // Must Be Zero (MBZ)
707 AliBitPacking::PackWord(word,baseWord,20,27);
708 word = 4; // 0100 -> TRM header ID
709 AliBitPacking::PackWord(word,baseWord,28,31);
711 buf[fIndex]=baseWord;
715 //----------------------------------------------------------------------------
716 void AliTOFDDLRawData::MakeTRMtrailer(UInt_t *buf)
726 word = 15; // 1111 -> TRM trailer ID 1
727 AliBitPacking::PackWord(word,baseWord, 0, 3);
728 word = 0; // event CRC
729 AliBitPacking::PackWord(word,baseWord, 4,15);
730 word = 0; // local event counter == DRM local event counter
731 AliBitPacking::PackWord(word,baseWord,16,27);
732 word = 5; // 0101 -> TRM trailer ID 2
733 AliBitPacking::PackWord(word,baseWord,28,31);
735 buf[fIndex]=baseWord;
739 //----------------------------------------------------------------------------
740 void AliTOFDDLRawData::MakeTRMchainHeader(Int_t nTRM, Int_t iChain,
750 if (nTRM<3 || nTRM>12) {
751 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
755 if (iChain<0 || iChain>1) {
756 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
761 word = nTRM; // TRM data coming from the VME slot ID nTRM
762 AliBitPacking::PackWord(word,baseWord, 0, 3);
763 word = 0; // bunch ID
764 AliBitPacking::PackWord(word,baseWord, 4,15);
765 word = 100; // PB24 temperature -> 4 X 25 degree (environment temperature)
766 AliBitPacking::PackWord(word,baseWord,16,23);
767 word = (Int_t)(5 * gRandom->Rndm()); // PB24 ID [0;4]
768 AliBitPacking::PackWord(word,baseWord,24,26);
770 AliBitPacking::PackWord(word,baseWord,27,27);
773 word = 0; // 0000 -> TRM chain 0 ID
776 word = 2; // 0010 -> TRM chain 1 ID
779 AliBitPacking::PackWord(word,baseWord,28,31);
781 buf[fIndex]=baseWord;
785 //----------------------------------------------------------------------------
786 void AliTOFDDLRawData::MakeTRMfiller(UInt_t *buf, UInt_t nWordsPerTRM)
795 for (jj=fIndex; jj>fIndex-(Int_t)nWordsPerTRM; jj--) {
799 buf[fIndex-nWordsPerTRM] = MakeFiller();
803 //----------------------------------------------------------------------------
804 UInt_t AliTOFDDLRawData::MakeFiller()
807 // Filler word definition: to make even the number of words per TRM/LTM
814 word = 0; // 0000 -> filler ID 1
815 AliBitPacking::PackWord(word,baseWord, 0, 3);
817 AliBitPacking::PackWord(word,baseWord, 4,27);
818 word = 7; // 0111 -> filler ID 2
819 AliBitPacking::PackWord(word,baseWord, 28,31);
825 //----------------------------------------------------------------------------
826 void AliTOFDDLRawData::MakeTRMchainTrailer(Int_t iChain, UInt_t *buf)
832 if (iChain<0 || iChain>1) {
833 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
842 AliBitPacking::PackWord(word,baseWord, 0, 3);
844 AliBitPacking::PackWord(word,baseWord, 4,15);
845 word = 0; // event counter
846 AliBitPacking::PackWord(word,baseWord,16,27);
849 word = 1; // 0001 -> TRM chain 0 trailer ID
852 word = 3; // 0011 -> TRM chain 1 trailer ID
855 AliBitPacking::PackWord(word,baseWord,28,31);
857 buf[fIndex]=baseWord;
861 //----------------------------------------------------------------------------
862 void AliTOFDDLRawData::MakeTDCdigits(Int_t nDDL, Int_t nTRM, Int_t iChain,
863 UInt_t *buf, UInt_t &nWordsPerTRM)
869 const Double_t kOneMoreFilledCell = 1./(fTOFgeometry->NPadXSector()*fTOFgeometry->NSectors());
870 Double_t percentFilledCells = Double_t(fTOFdigitMap->GetFilledCellNumber())/(fTOFgeometry->NPadXSector()*fTOFgeometry->NSectors());
872 if (nDDL<0 || nDDL>71) {
873 AliWarning(Form(" DDL number is out of the right range [0;71] (nDDL = %3i", nDDL));
877 if (nTRM<3 || nTRM>12) {
878 AliWarning(Form(" TRM number is out of the right range [3;12] (nTRM = %3i", nTRM));
882 if (iChain<0 || iChain>1) {
883 AliWarning(Form(" Chain number is out of the right range [0;1] (iChain = %3i", iChain));
888 UInt_t localBuffer[1000];
889 Int_t localIndex = -1;
891 Int_t iDDL = nDDL%AliTOFGeometry::NDDL();
893 Int_t volume[5] = {-1, -1, -1, -1, -1};
894 Int_t indexDigit[3] = {-1, -1, -1};
896 Int_t totCharge = -1;
897 Int_t timeOfFlight = -1;
899 Int_t trailingSpurious = -1;
900 Int_t leadingSpurious = -1;
911 //Int_t numberOfMeasuresPerChannel = 0;
912 //Int_t maxMeasuresPerChannelInTDC = 0;
914 Bool_t outOut = HeadOrTail();
918 if (fVerbose==2) ftxt.open("TOFdigits.txt",ios::app);
920 for (jj=0; jj<5; jj++) volume[jj] = -1;
922 // loop on TDC number
923 for (nTDC=AliTOFGeometry::NTdc()-1; nTDC>=0; nTDC--) {
925 // the DRM odd (i.e. left) slot number 3 doesn't contain TDC digit data
926 // for TDC numbers 3-14
927 if (iDDL%2==1 && nTRM==3 && (Int_t)(nTDC/3.)!=0) continue;
929 // loop on TDC channel number
930 for (iCH=AliTOFGeometry::NCh()-1; iCH>=0; iCH--) {
932 //numberOfMeasuresPerChannel = 0;
934 fTOFrawStream->EquipmentId2VolumeId(nDDL, nTRM, iChain, nTDC, iCH, volume);
936 if (volume[0]==-1 || volume[1]==-1 || volume[2]==-1 ||
937 volume[3]==-1 || volume[4]==-1) continue;
939 for (jj=0; jj<3; jj++) indexDigit[jj] = -1;
941 fTOFdigitMap->GetDigitIndex(volume, indexDigit);
943 if (indexDigit[0]<0) {
945 trailingSpurious = Int_t(2097152*gRandom->Rndm());
946 leadingSpurious = Int_t(2097152*gRandom->Rndm());
948 if ( fFakeOrphaneProduction &&
949 ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) ||
950 (!fPackedAcquisition && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) ) ) ) {
952 percentFilledCells+=kOneMoreFilledCell;
957 word = trailingSpurious; // trailing edge measurement
961 word = leadingSpurious; // leading edge measurement
966 if (nDDL<10) ftxt << " " << nDDL;
967 else ftxt << " " << nDDL;
968 if (nTRM<10) ftxt << " " << nTRM;
969 else ftxt << " " << nTRM;
970 ftxt << " " << iChain;
971 if (nTDC<10) ftxt << " " << nTDC;
972 else ftxt << " " << nTDC;
974 if (volume[0]<10) ftxt << " -> " << volume[0];
975 else ftxt << " -> " << volume[0];
976 ftxt << " " << volume[1];
977 if (volume[2]<10) ftxt << " " << volume[2];
978 else ftxt << " " << volume[2];
979 ftxt << " " << volume[4];
980 if (volume[3]<10) ftxt << " " << volume[3];
981 else ftxt << " " << volume[3];
983 if (word<10) ftxt << " " << word;
984 else if (word>=10 && word<100) ftxt << " " << word;
985 else if (word>=100 && word<1000) ftxt << " " << word;
986 else if (word>=1000 && word<10000) ftxt << " " << word;
987 else if (word>=10000 && word<100000) ftxt << " " << word;
988 else if (word>=100000 && word<1000000) ftxt << " " << word;
989 else ftxt << " " << word;
990 ftxt << " " << dummyPS << endl;
993 AliBitPacking::PackWord(word,baseWord, 0,20);
994 word = iCH; // TDC channel ID [0;7]
995 AliBitPacking::PackWord(word,baseWord,21,23);
996 word = nTDC; // TDC ID [0;14]
997 AliBitPacking::PackWord(word,baseWord,24,27);
998 word = 0; // error flag
999 AliBitPacking::PackWord(word,baseWord,28,28);
1000 word = dummyPS; // Packing Status [0;3]
1001 AliBitPacking::PackWord(word,baseWord,29,30);
1002 word = 1; // TRM TDC digit ID
1003 AliBitPacking::PackWord(word,baseWord,31,31);
1006 localBuffer[localIndex]=baseWord;
1007 psArray[localIndex]=dummyPS;
1012 } // if ( fFakeOrphaneProduction && ( ( fPackedAcquisition && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) or ... ) )
1013 } // if (indexDigit[0]<0)
1015 for (jj=0; jj<3;jj++) {
1017 if (indexDigit[jj]<0) continue;
1019 digs = (AliTOFdigit*)fTOFdigitArray->UncheckedAt(indexDigit[jj]);
1021 if (digs->GetSector()!=volume[0] ||
1022 digs->GetPlate() !=volume[1] ||
1023 digs->GetStrip() !=volume[2] ||
1024 digs->GetPadx() !=volume[3] ||
1025 digs->GetPadz() !=volume[4]) AliWarning(" --- ERROR --- ");
1027 timeOfFlight = (Int_t)(digs->GetTdc())%8192;
1029 if (timeOfFlight>fMatchingWindow) continue;
1031 //numberOfMeasuresPerChannel++;
1033 // totCharge = (Int_t)digs->GetAdc(); //Use realistic ToT, for Standard production with no miscalibration/Slewing it == fAdC in digit (see AliTOFDigitizer)
1034 totCharge = (Int_t)(digs->GetToT());
1035 // temporary control
1036 if (totCharge<0) totCharge = 0;//TMath::Abs(totCharge);
1038 if (fPackedAcquisition) {
1041 if (nDDL<10) ftxt << " " << nDDL;
1042 else ftxt << " " << nDDL;
1043 if (nTRM<10) ftxt << " " << nTRM;
1044 else ftxt << " " << nTRM;
1045 ftxt << " " << iChain;
1046 if (nTDC<10) ftxt << " " << nTDC;
1047 else ftxt << " " << nTDC;
1049 if (volume[0]<10) ftxt << " -> " << volume[0];
1050 else ftxt << " -> " << volume[0];
1051 ftxt << " " << volume[1];
1052 if (volume[2]<10) ftxt << " " << volume[2];
1053 else ftxt << " " << volume[2];
1054 ftxt << " " << volume[4];
1055 if (volume[3]<10) ftxt << " " << volume[3];
1056 else ftxt << " " << volume[3];
1057 if (totCharge<10) ftxt << " " << totCharge;
1058 else if (totCharge>=10 && totCharge<100) ftxt << " " << totCharge;
1059 else ftxt << " " << totCharge;
1060 if (timeOfFlight<10) ftxt << " " << timeOfFlight << endl;
1061 else if (timeOfFlight>=10 && timeOfFlight<100) ftxt << " " << timeOfFlight << endl;
1062 else if (timeOfFlight>=100 && timeOfFlight<1000) ftxt << " " << timeOfFlight << endl;
1063 else ftxt << " " << timeOfFlight << endl;
1066 word = timeOfFlight%8192; // time-of-fligth measurement
1067 AliBitPacking::PackWord(word,baseWord, 0,12);
1069 if (totCharge>=256) totCharge = 255;
1070 word = totCharge; // time-over-threshould measurement
1071 AliBitPacking::PackWord(word,baseWord,13,20);
1073 word = iCH; // TDC channel ID [0;7]
1074 AliBitPacking::PackWord(word,baseWord,21,23);
1075 word = nTDC; // TDC ID [0;14]
1076 AliBitPacking::PackWord(word,baseWord,24,27);
1077 word = 0; // error flag
1078 AliBitPacking::PackWord(word,baseWord,28,28);
1079 word = 0; // Packing Status [0;3]
1080 AliBitPacking::PackWord(word,baseWord,29,30);
1081 word = 1; // TRM TDC digit ID
1082 AliBitPacking::PackWord(word,baseWord,31,31);
1085 localBuffer[localIndex]=baseWord;
1090 if ( fFakeOrphaneProduction &&
1091 percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) ) {
1093 percentFilledCells+=kOneMoreFilledCell;
1095 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1096 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1101 word = trailingSpurious; // trailing edge measurement
1105 word = leadingSpurious; // leading edge measurement
1110 if (nDDL<10) ftxt << " " << nDDL;
1111 else ftxt << " " << nDDL;
1112 if (nTRM<10) ftxt << " " << nTRM;
1113 else ftxt << " " << nTRM;
1114 ftxt << " " << iChain;
1115 if (nTDC<10) ftxt << " " << nTDC;
1116 else ftxt << " " << nTDC;
1118 if (volume[0]<10) ftxt << " -> " << volume[0];
1119 else ftxt << " -> " << volume[0];
1120 ftxt << " " << volume[1];
1121 if (volume[2]<10) ftxt << " " << volume[2];
1122 else ftxt << " " << volume[2];
1123 ftxt << " " << volume[4];
1124 if (volume[3]<10) ftxt << " " << volume[3];
1125 else ftxt << " " << volume[3];
1127 if (word<10) ftxt << " " << word;
1128 else if (word>=10 && word<100) ftxt << " " << word;
1129 else if (word>=100 && word<1000) ftxt << " " << word;
1130 else if (word>=1000 && word<10000) ftxt << " " << word;
1131 else if (word>=10000 && word<100000) ftxt << " " << word;
1132 else if (word>=100000 && word<1000000) ftxt << " " << word;
1133 else ftxt << " " << word;
1134 ftxt << " " << dummyPS << endl;
1137 AliBitPacking::PackWord(word,baseWord, 0,20);
1138 word = iCH; // TDC channel ID [0;7]
1139 AliBitPacking::PackWord(word,baseWord,21,23);
1140 word = nTDC; // TDC ID [0;14]
1141 AliBitPacking::PackWord(word,baseWord,24,27);
1142 word = 0; // error flag
1143 AliBitPacking::PackWord(word,baseWord,28,28);
1144 word = dummyPS; // Packing Status [0;3]
1145 AliBitPacking::PackWord(word,baseWord,29,30);
1146 word = 1; // TRM TDC digit ID
1147 AliBitPacking::PackWord(word,baseWord,31,31);
1150 localBuffer[localIndex]=baseWord;
1151 psArray[localIndex]=dummyPS;
1156 } // if ( fFakeOrphaneProduction && percentFilledCells<0.12 && gRandom->Rndm()<(0.12-percentFilledCells) )
1159 } // if (fPackedAcquisition)
1160 else { // if (!fPackedAcquisition)
1162 if ( fFakeOrphaneProduction &&
1163 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut ) {
1165 percentFilledCells+=kOneMoreFilledCell;
1167 trailingSpurious = Int_t(2097152*gRandom->Rndm());
1168 word = trailingSpurious;
1172 if (nDDL<10) ftxt << " " << nDDL;
1173 else ftxt << " " << nDDL;
1174 if (nTRM<10) ftxt << " " << nTRM;
1175 else ftxt << " " << nTRM;
1176 ftxt << " " << iChain;
1177 if (nTDC<10) ftxt << " " << nTDC;
1178 else ftxt << " " << nTDC;
1180 if (volume[0]<10) ftxt << " -> " << volume[0];
1181 else ftxt << " -> " << volume[0];
1182 ftxt << " " << volume[1];
1183 if (volume[2]<10) ftxt << " " << volume[2];
1184 else ftxt << " " << volume[2];
1185 ftxt << " " << volume[4];
1186 if (volume[3]<10) ftxt << " " << volume[3];
1187 else ftxt << " " << volume[3];
1189 if (word<10) ftxt << " " << word;
1190 else if (word>=10 && word<100) ftxt << " " << word;
1191 else if (word>=100 && word<1000) ftxt << " " << word;
1192 else if (word>=1000 && word<10000) ftxt << " " << word;
1193 else if (word>=10000 && word<100000) ftxt << " " << word;
1194 else if (word>=100000 && word<1000000) ftxt << " " << word;
1195 else ftxt << " " << word;
1196 ftxt << " " << dummyPS << endl;
1199 AliBitPacking::PackWord(word,baseWord, 0,20);
1200 word = iCH; // TDC channel ID [0;7]
1201 AliBitPacking::PackWord(word,baseWord,21,23);
1202 word = nTDC; // TDC ID [0;14]
1203 AliBitPacking::PackWord(word,baseWord,24,27);
1204 word = 0; // error flag
1205 AliBitPacking::PackWord(word,baseWord,28,28);
1206 word = dummyPS; // Packing Status [0;3]
1207 AliBitPacking::PackWord(word,baseWord,29,30);
1208 word = 1; // TRM TDC digit ID
1209 AliBitPacking::PackWord(word,baseWord,31,31);
1212 localBuffer[localIndex]=baseWord;
1213 psArray[localIndex]=dummyPS;
1218 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && outOut )
1221 word = (timeOfFlight + Int_t(totCharge*AliTOFGeometry::ToTBinWidth()/AliTOFGeometry::TdcBinWidth()))%2097152; // trailing edge measurement
1224 if (nDDL<10) ftxt << " " << nDDL;
1225 else ftxt << " " << nDDL;
1226 if (nTRM<10) ftxt << " " << nTRM;
1227 else ftxt << " " << nTRM;
1228 ftxt << " " << iChain;
1229 if (nTDC<10) ftxt << " " << nTDC;
1230 else ftxt << " " << nTDC;
1232 if (volume[0]<10) ftxt << " -> " << volume[0];
1233 else ftxt << " -> " << volume[0];
1234 ftxt << " " << volume[1];
1235 if (volume[2]<10) ftxt << " " << volume[2];
1236 else ftxt << " " << volume[2];
1237 ftxt << " " << volume[4];
1238 if (volume[3]<10) ftxt << " " << volume[3];
1239 else ftxt << " " << volume[3];
1241 if (word<10) ftxt << " " << word;
1242 else if (word>=10 && word<100) ftxt << " " << word;
1243 else if (word>=100 && word<1000) ftxt << " " << word;
1244 else if (word>=1000 && word<10000) ftxt << " " << word;
1245 else if (word>=10000 && word<100000) ftxt << " " << word;
1246 else if (word>=100000 && word<1000000) ftxt << " " << word;
1247 else ftxt << " " << word;
1248 ftxt << " " << 2 << endl;
1251 AliBitPacking::PackWord(word,baseWord, 0,20);
1253 word = iCH; // TDC channel ID [0;7]
1254 AliBitPacking::PackWord(word,baseWord,21,23);
1255 word = nTDC; // TDC ID [0;14]
1256 AliBitPacking::PackWord(word,baseWord,24,27);
1257 word = 0; // error flag
1258 AliBitPacking::PackWord(word,baseWord,28,28);
1259 word = 2; // Packing Status [0;3]
1260 AliBitPacking::PackWord(word,baseWord,29,30);
1261 word = 1; // TRM TDC digit ID
1262 AliBitPacking::PackWord(word,baseWord,31,31);
1265 localBuffer[localIndex]=baseWord;
1266 psArray[localIndex]=2;
1271 word = timeOfFlight%2097152; // leading edge measurement
1274 if (nDDL<10) ftxt << " " << nDDL;
1275 else ftxt << " " << nDDL;
1276 if (nTRM<10) ftxt << " " << nTRM;
1277 else ftxt << " " << nTRM;
1278 ftxt << " " << iChain;
1279 if (nTDC<10) ftxt << " " << nTDC;
1280 else ftxt << " " << nTDC;
1282 if (volume[0]<10) ftxt << " -> " << volume[0];
1283 else ftxt << " -> " << volume[0];
1284 ftxt << " " << volume[1];
1285 if (volume[2]<10) ftxt << " " << volume[2];
1286 else ftxt << " " << volume[2];
1287 ftxt << " " << volume[4];
1288 if (volume[3]<10) ftxt << " " << volume[3];
1289 else ftxt << " " << volume[3];
1291 if (word<10) ftxt << " " << word;
1292 else if (word>=10 && word<100) ftxt << " " << word;
1293 else if (word>=100 && word<1000) ftxt << " " << word;
1294 else if (word>=1000 && word<10000) ftxt << " " << word;
1295 else if (word>=10000 && word<100000) ftxt << " " << word;
1296 else if (word>=100000 && word<1000000) ftxt << " " << word;
1297 else ftxt << " " << word;
1298 ftxt << " " << 1 << endl;
1301 AliBitPacking::PackWord(word,baseWord, 0,20);
1303 word = iCH; // TDC channel ID [0;7]
1304 AliBitPacking::PackWord(word,baseWord,21,23);
1305 word = nTDC; // TDC ID [0;14]
1306 AliBitPacking::PackWord(word,baseWord,24,27);
1307 word = 0; // error flag
1308 AliBitPacking::PackWord(word,baseWord,28,28);
1309 word = 1; // Packing Status [0;3]
1310 AliBitPacking::PackWord(word,baseWord,29,30);
1311 word = 1; // TRM TDC digit ID
1312 AliBitPacking::PackWord(word,baseWord,31,31);
1315 localBuffer[localIndex]=baseWord;
1316 psArray[localIndex]=1;
1322 if ( fFakeOrphaneProduction &&
1323 percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut ) {
1325 percentFilledCells+=kOneMoreFilledCell;
1327 leadingSpurious = Int_t(2097152*gRandom->Rndm());
1328 word = leadingSpurious;
1332 if (nDDL<10) ftxt << " " << nDDL;
1333 else ftxt << " " << nDDL;
1334 if (nTRM<10) ftxt << " " << nTRM;
1335 else ftxt << " " << nTRM;
1336 ftxt << " " << iChain;
1337 if (nTDC<10) ftxt << " " << nTDC;
1338 else ftxt << " " << nTDC;
1340 if (volume[0]<10) ftxt << " -> " << volume[0];
1341 else ftxt << " -> " << volume[0];
1342 ftxt << " " << volume[1];
1343 if (volume[2]<10) ftxt << " " << volume[2];
1344 else ftxt << " " << volume[2];
1345 ftxt << " " << volume[4];
1346 if (volume[3]<10) ftxt << " " << volume[3];
1347 else ftxt << " " << volume[3];
1349 if (word<10) ftxt << " " << word;
1350 else if (word>=10 && word<100) ftxt << " " << word;
1351 else if (word>=100 && word<1000) ftxt << " " << word;
1352 else if (word>=1000 && word<10000) ftxt << " " << word;
1353 else if (word>=10000 && word<100000) ftxt << " " << word;
1354 else if (word>=100000 && word<1000000) ftxt << " " << word;
1355 else ftxt << " " << word;
1356 ftxt << " " << dummyPS << endl;
1359 AliBitPacking::PackWord(word,baseWord, 0,20);
1360 word = iCH; // TDC channel ID [0;7]
1361 AliBitPacking::PackWord(word,baseWord,21,23);
1362 word = nTDC; // TDC ID [0;14]
1363 AliBitPacking::PackWord(word,baseWord,24,27);
1364 word = 0; // error flag
1365 AliBitPacking::PackWord(word,baseWord,28,28);
1366 word = dummyPS; // Packing Status [0;3]
1367 AliBitPacking::PackWord(word,baseWord,29,30);
1368 word = 1; // TRM TDC digit ID
1369 AliBitPacking::PackWord(word,baseWord,31,31);
1372 localBuffer[localIndex]=baseWord;
1373 psArray[localIndex]=dummyPS;
1378 } // if ( fFakeOrphaneProduction && percentFilledCells<0.24 && gRandom->Rndm()<(0.24-percentFilledCells) && !outOut )
1381 } // if (!fPackedAcquisition)
1383 } //end loop on digits in the same volume
1385 //if (numberOfMeasuresPerChannel>maxMeasuresPerChannelInTDC)
1386 //maxMeasuresPerChannelInTDC = numberOfMeasuresPerChannel;
1388 } // end loop on TDC channel number
1390 //AliInfo(Form(" TDC number %2i: numberOfMeasuresPerChannel = %2i --- maxMeasuresPerChannelInTDC = %2i ", nTDC, numberOfMeasuresPerChannel, maxMeasuresPerChannelInTDC));
1392 if (localIndex==-1) continue;
1394 if (fPackedAcquisition) {
1396 for (Int_t jj=0; jj<=localIndex; jj++) {
1398 buf[fIndex] = localBuffer[jj];
1399 localBuffer[jj] = 0;
1406 if (maxMeasuresPerChannelInTDC = 1) {
1408 for (Int_t jj=0; jj<=localIndex; jj++) {
1409 if (psArray[jj]==2) {
1411 buf[fIndex] = localBuffer[jj];
1412 localBuffer[jj] = 0;
1416 for (Int_t jj=0; jj<=localIndex; jj++) {
1417 if (psArray[jj]==1) {
1419 buf[fIndex] = localBuffer[jj];
1420 localBuffer[jj] = 0;
1425 } // if (maxMeasuresPerChannelInTDC = 1)
1426 else if (maxMeasuresPerChannelInTDC>1) {
1428 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",
1429 nDDL, nTRM, iChain, nTDC, iCH, maxMeasuresPerChannelInTDC));
1431 for (Int_t jj=0; jj<=localIndex; jj++) {
1433 buf[fIndex] = localBuffer[jj];
1434 localBuffer[jj] = 0;
1438 //} // else if (maxMeasuresPerChannelInTDC>1)
1440 } // else (!fPackedAcquisition)
1444 //maxMeasuresPerChannelInTDC = 0;
1446 } // end loop on TDC number
1449 if (fVerbose==2) ftxt.close();
1453 //----------------------------------------------------------------------------
1454 void AliTOFDDLRawData::ReverseArray(UInt_t a[], Int_t n) const
1457 // Reverses the n elements of array a
1462 for (ii=0; ii<n/2; ii++) {
1472 //----------------------------------------------------------------------------
1473 Bool_t AliTOFDDLRawData::HeadOrTail() const
1476 // Returns the result of a 'pitch and toss'
1479 Double_t dummy = gRandom->Rndm();
1481 if (dummy<0.5) return kFALSE;