1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 ///////////////////////////////////////////////////////////////////////////////
20 // T0 raw data conversion class //
22 ///////////////////////////////////////////////////////////////////////////////
24 //#include <Riostream.h>
28 #include "AliT0RawData.h"
29 #include "AliT0digit.h"
30 #include "AliBitPacking.h"
31 #include "AliRawDataHeader.h"
32 #include "AliRawDataHeaderSim.h"
33 #include "AliBitPacking.h"
34 #include "AliFstream.h"
35 #include "AliRunLoader.h"
37 #include "AliT0LookUpValue.h"
38 #include "AliT0LookUpKey.h"
42 ClassImp(AliT0RawData)
44 //_____________________________________________________________________________
45 AliT0RawData::AliT0RawData():TObject(),
49 fTimeCFD(new TArrayI(24)),
50 fADC1( new TArrayI(24)),
51 fTimeLED( new TArrayI(24)),
52 fADC0( new TArrayI(24)),
63 - 48 channels (2 words each as in TOF DDL) for :
64 word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
65 and the same but for amplified signal. Now I wrote the same time because
66 CDF are not ready and differences didn't measured yet.
68 - 48 channel for amplitude: very preliminary, QTC features are not
69 known now, preliminary i put as T1 time signal for this PMT in first
70 channel and T1+A in second, where A=Log(Amplitude);
71 and the same for amplified but A=Log(10*Amplitude).
73 - T0-A and T0-C 2 channels
74 - T0A-T0C vertex information
75 - Time Meaner where T0C TOF increase to the T0A TOF distance
76 - 6 multiplicity signals the same way as amplitude and with the same
80 //open the output file
82 // strcpy(fileName,AliDAQ::DdlFileName("T0",0)); //The name of the output file
83 TString fileName = Form("%s",AliDAQ::DdlFileName("T0",0));
84 fFile = new AliFstream(fileName.Data());
85 memset(fBuffer,0,512*sizeof(UInt_t));
88 AliRunLoader *runloader = AliRunLoader::Instance();
90 fEventNumber = runloader->GetEventNumber();
93 // Inverse lookup table for simulation
95 fParam = AliT0Parameters::Instance();
97 AliT0LookUpKey* lookkey;//= new AliT0LookUpKey();
98 AliT0LookUpValue* lookvalue;//= new AliT0LookUpValue();
99 TMap *lookup = fParam->GetMapLookup();
100 TMapIter iter(lookup);
102 for( Int_t iline=0; iline<106; iline++)
104 lookvalue = ( AliT0LookUpValue*) iter.Next();
105 lookkey = (AliT0LookUpKey*) lookup->GetValue(lookvalue);
106 fLookUp.Add(lookkey, lookvalue);
107 //lookkey= new AliT0LookUpKey();
108 //lookvalue= new AliT0LookUpValue();
113 //_____________________________________________________________________________
115 AliT0RawData::AliT0RawData(const AliT0RawData &r):TObject(),
119 fTimeCFD(new TArrayI(24)),
120 fADC1( new TArrayI(24)),
121 fTimeLED( new TArrayI(24)),
122 fADC0( new TArrayI(24)),
125 fDRMDataHeaderPos(0),
126 fTRMDataHeaderPos(0),
132 // AliT0rawData copy constructor
135 ((AliT0RawData &) r).Copy(*this);
139 //_____________________________________________________________________________
140 AliT0RawData::~AliT0RawData()
152 //_____________________________________________________________________________
153 AliT0RawData &AliT0RawData::operator=(const AliT0RawData &r)
156 // Assignment operator
159 if (this != &r) ((AliT0RawData &) r).Copy(*this);
164 //_____________________________________________________________________________
165 void AliT0RawData::GetDigits(AliT0digit *fDigits)
166 //void AliT0RawData::GetDigits(fDigits)
169 //This method packs the T0 digits in a proper 32 bits structure
171 //read T0 digits and fill TDC and ADC arrays
175 Int_t time, positionOfTRMHeader;
177 // Get the digits array
179 fDigits->GetTimeCFD(*fTimeCFD);
180 fDigits->GetQT0(*fADC1);
181 fDigits->GetTimeLED(*fTimeLED);
182 fDigits->GetQT1(*fADC0);
183 Int_t meantime = fDigits->MeanTime();
184 Int_t timediff = fDigits->TimeDiff();
185 Int_t mult0=fDigits->SumMult();
186 Int_t mult1=fDigits->SumMult();
187 Int_t timeA = fDigits->BestTimeC();
188 Int_t timeC = fDigits->BestTimeA();
191 // TArrayI *allData = new TArrayI(110);
192 Int_t allData[110][1];
193 for (Int_t i=0; i<110; i++) allData[i][0] = 0;
196 for (Int_t i=1; i<13; i++) {
197 allData[i][0] = fTimeCFD->At(i-1);
198 allData[i+12][0] = fTimeLED->At(i-1);
199 allData[i+56][0] = fTimeCFD->At(i-1+12);
200 allData[i+68][0] = fTimeLED->At(i-1+12);
203 for (Int_t iii=0; iii<12; iii++) {
204 allData[2*iii+25][0] = fADC1->At(iii);
205 allData[2*iii+26][0] = fADC0->At(iii);
207 for (Int_t ii=12; ii<24; ii++) {
208 allData[2*ii+57][0] = fADC1->At(ii);
209 allData[2*ii+58][0] = fADC0->At(ii);
212 allData[49][0] = meantime;
213 allData[50][0] = timediff;
214 allData[51][0] = timeA;
215 allData[52][0] = timeC;
216 allData[53][0] = mult0;
217 allData[54][0] = mult1;
218 allData[55][0] = mult0;
219 allData[56][0] = mult1;
221 // cout.setf( ios_base::hex, ios_base::basefield );
222 //space for DRM header
226 Int_t startTRM=fIndex;
227 //space for 1st TRM header
229 positionOfTRMHeader= fIndex;
230 //space for chain header
232 WriteChainDataHeader(1, 1); //
235 // Loop through all PMT
243 AliT0LookUpKey * lookkey = new AliT0LookUpKey();
244 AliT0LookUpValue * lookvalue ;//= new AliT0LookUpValue(trm,tdc,chain,channel);
245 for (Int_t det = 0; det < 105; det++) {
246 time = allData[det][0];
247 if (time >0 && time !=99999) {
248 lookkey->SetKey(det);
249 lookvalue = (AliT0LookUpValue*) fLookUp.GetValue((TObject*)lookkey);
253 itrm= lookvalue->GetTRM();
254 if (det >56 &&inside == 0) {
255 WriteChainDataTrailer(1); // 1st chain trailer
257 WriteChainDataHeader(2, 1);
261 chain = lookvalue->GetChain();
262 iTDC = lookvalue->GetTDC();
263 channel = lookvalue->GetChannel();
264 FillTime(channel, iTDC, time);
265 AliDebug(1,Form("look %i itrm %i , chain %i , iTDC %i, channel %i time %i", det,itrm,chain,iTDC,channel, time));
269 cout<<" no lookup value for key "<<det<<endl;
276 WriteChainDataTrailer(1); // 1st chain trailer
278 WriteChainDataHeader(2, 1);
280 // WriteChainDataHeader(2, 1); //
281 WriteChainDataTrailer(3); // 2st chain trailer
282 WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
285 trm1words = fIndex - startTRM;
286 //space for 2st TRM header
288 WriteTRMDataHeader(itrm, trm1words , positionOfTRMHeader);
291 WriteTrailer(1,0,fEventNumber,5);
293 WriteDRMDataHeader();
297 //_____________________________________________________________________________
299 void AliT0RawData::WriteDRMDataHeader()
301 //Write a (dummy or real) DDL DRM data header,
302 //set the compression bit if compressed
303 // UInt_t drmheader[4];
309 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
312 AliBitPacking::PackWord(word,baseWord,4, 20); // event words
314 AliBitPacking::PackWord(word,baseWord, 21, 27); // event words
316 AliBitPacking::PackWord(word,baseWord,28, 31);// 0100 marks header
317 fBuffer[0]= baseWord;
320 //DRM status header 1
322 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
324 AliBitPacking::PackWord(word,baseWord,4, 14); // slotID now 0000000001
326 AliBitPacking::PackWord(word,baseWord,15, 15); //if 1 LHC clock is coorectly recieved from CPDM
328 AliBitPacking::PackWord(word,baseWord,16,27); // reserve for future use
330 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
331 fBuffer[1] = baseWord;
336 //DRM status header 2
338 AliBitPacking::PackWord(word,baseWord, 0, 3); // 0001
340 AliBitPacking::PackWord(word,baseWord, 4, 14); //enable slotID now 00000000011
342 AliBitPacking::PackWord(word,baseWord, 15, 15); // something
344 AliBitPacking::PackWord(word,baseWord, 16, 27); // fault ID for simulation 0
346 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
347 fBuffer[2]= baseWord;
351 //DRM status header 3
353 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
355 AliBitPacking::PackWord(word,baseWord,4, 27); // TTC event counter
357 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
358 fBuffer[3]= baseWord;
361 fBuffer[4]= baseWord;
362 fBuffer[5]= baseWord;
369 //_____________________________________________________________________________
371 void AliT0RawData::WriteTRMDataHeader(UInt_t slotID, Int_t nWordsInTRM,
372 Int_t positionOfTRMHeader)
374 //Write a (dummy or real) DDL TRM data header,
375 //set the compression bit if compressed
382 AliBitPacking::PackWord(word,baseWord,0, 3); // slotID
384 //+this word - DRM header
386 AliBitPacking::PackWord(word,baseWord,4, 16); // event words
388 AliBitPacking::PackWord(word,baseWord,17,18); // ACQ
390 AliBitPacking::PackWord(word,baseWord,19,19); // L SEY inside LUT
392 AliBitPacking::PackWord(word,baseWord,20,27); // MBZ
394 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
395 fBuffer[positionOfTRMHeader] = baseWord;
402 //_____________________________________________________________________________
404 void AliT0RawData::WriteChainDataHeader(UInt_t chainNumber,UInt_t slotID)
406 //Write a (dummy or real) DDL Chain data header,
407 //set the compression bit if compressed
408 // chainNumber 00 or 10
413 word = slotID; // ask Tatiana 7 or 9
414 AliBitPacking::PackWord(word,baseWord,0, 3); // slotID
416 AliBitPacking::PackWord(word,baseWord,4, 15); // bunchID
418 AliBitPacking::PackWord(word,baseWord,16,23); // PB24 temperature
420 AliBitPacking::PackWord(word,baseWord,24,26); // PB24 ID
422 AliBitPacking::PackWord(word,baseWord,27,27); // TS
424 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
425 fBuffer[fIndex] = baseWord;
426 //cout<<" chain header "<<baseWord<<" number "<<chainNumber<<endl;
431 //_____________________________________________________________________________
433 void AliT0RawData::WriteChainDataTrailer(UInt_t chainNumber )
435 //Write a (dummy or real) DDL Chain data trailer
436 //set the compression bit if compressed
437 // chainNumber 00 or 10
440 word = 0; // ask Tatiana 7 or 9
441 AliBitPacking::PackWord(word,baseWord,0, 3); // status
443 AliBitPacking::PackWord(word,baseWord,4, 15); // MBZ
445 AliBitPacking::PackWord(word,baseWord,16,27); // event counter
447 AliBitPacking::PackWord(word,baseWord,28,31); // chain number
449 fBuffer[fIndex] = baseWord;
455 //_____________________________________________________________________________
457 void AliT0RawData::WriteDataHeader(Bool_t dummy, Bool_t compressed)
459 //Write a (dummy or real) DDL data header,
460 //set the compression bit if compressed
462 AliRawDataHeaderSim header;
465 //if size=0 it means that this data header is a dummy data header
466 fDataHeaderPos = fFile->Tellp();
467 fFile->WriteBuffer((char*)(&header), sizeof(header));
469 UInt_t currentFilePos = fFile->Tellp();
470 fFile->Seekp(fDataHeaderPos);
471 header.fSize = currentFilePos-fDataHeaderPos;
472 header.SetAttribute(0); // valid data
473 if (compressed) header.SetAttribute(1);
474 fFile->WriteBuffer((char*)(&header), sizeof(header));
475 fFile->Seekp(currentFilePos);
480 //___ __________________________________________________________________________
483 void AliT0RawData::WriteTrailer(UInt_t slot, Int_t word1, UInt_t word2, UInt_t word3)
485 //Write a (dummy or real) DDL Chain data trailer
490 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
492 AliBitPacking::PackWord(word,baseWord,4, 15); // CRC ?
494 AliBitPacking::PackWord(word,baseWord,16,27); // event counter
496 AliBitPacking::PackWord(word,baseWord,28,31); // marks trailer
498 fBuffer[fIndex] = baseWord;
505 //---------------------------------------------------------------------------------------
506 //---------------------------------------------------------------------------------------
507 void AliT0RawData::FillTime(Int_t ch, Int_t iTDC, Int_t time)
509 // put all time fields thother in 1 word
515 AliBitPacking::PackWord(word,baseWord, 0, 20); // Time
518 AliBitPacking::PackWord(word,baseWord, 21, 23); // number of channel
520 AliBitPacking::PackWord(word,baseWord, 24, 27); // TDC ID
523 AliBitPacking::PackWord(word,baseWord, 28, 28); // E = 0 in simulation
525 AliBitPacking::PackWord(word,baseWord, 29, 30); // PS bit data 00
527 AliBitPacking::PackWord(word,baseWord, 31, 31); // 1
529 fBuffer[fIndex]=baseWord;
534 //---------------------------------------------------------------------------------------
536 Int_t AliT0RawData::RawDataT0(AliT0digit *fDigits)
537 //Int_t AliT0RawData::RawDataT0(*fDigits)
539 //This method creates the Raw data files for T0 detector
542 // const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector()
543 //max number of digits per DDL file times 2
544 // UInt_t fBuffer[kSize];
551 WriteDataHeader(kTRUE, kFALSE);
553 //write packing digits
556 fFile->WriteBuffer((char*) fBuffer,((fIndex+1)*sizeof(UInt_t)));
557 //write real data header on its place
558 WriteDataHeader(kFALSE, kFALSE);