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 ClassImp(AliT0RawData)
39 //_____________________________________________________________________________
40 AliT0RawData::AliT0RawData():TObject()
43 - 48 channels (2 words each as in TOF DDL) for :
44 word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
45 and the same but for amplified signal. Now I wrote the same time because
46 CDF are not ready and differences didn't measured yet.
48 - 48 channel for amplitude: very preliminary, QTC features are not
49 known now, preliminary i put as T1 time signal for this PMT in first
50 channel and T1+A in second, where A=Log(Amplitude);
51 and the same for amplified but A=Log(10*Amplitude).
53 - T0-A and T0-C 2 channels
54 - T0A-T0C vertex information
55 - Time Meaner where T0C TOF increase to the T0A TOF distance
56 - 6 multiplicity signals the same way as amplitude and with the same
63 fTimeCFD = new TArrayI(24);
64 fADC1 = new TArrayI(24);
65 fTimeLED = new TArrayI(24);
66 fADC0 = new TArrayI(24);
69 fDRMDataHeaderPos = 0;
70 memset(fBuffer,0,512*sizeof(UInt_t));
72 //open the output file
74 sprintf(fileName,"T0_%d.ddl", 0xd00);
75 fFile = new AliFstream(fileName);
77 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
79 fEventNumber = runloader->GetEventNumber();
83 //_____________________________________________________________________________
84 AliT0RawData::AliT0RawData(const AliT0RawData &r):TObject()
87 // AliT0rawData copy constructor
90 ((AliT0RawData &) r).Copy(*this);
94 //_____________________________________________________________________________
95 AliT0RawData::~AliT0RawData()
110 //_____________________________________________________________________________
111 AliT0RawData &AliT0RawData::operator=(const AliT0RawData &r)
114 // Assignment operator
117 if (this != &r) ((AliT0RawData &) r).Copy(*this);
122 //_____________________________________________________________________________
123 void AliT0RawData::GetDigits(AliT0digit *fDigits)
126 //This method packs the T0 digits in a proper 32 bits structure
128 //read T0 digits and fill TDC and ADC arrays
132 Int_t time, positionOfTRMHeader;
134 // Get the digits array
136 fDigits->GetTime(*fTimeCFD);
137 fDigits->GetADC(*fADC1);
138 fDigits->GetTimeAmp(*fTimeLED);
139 fDigits->GetADCAmp(*fADC0);
140 Int_t meantime = fDigits->MeanTime();
141 Int_t timediff = fDigits->TimeDiff();
142 Int_t mult0=fDigits->SumMult();
143 Int_t mult1=fDigits->SumMult();
144 Int_t timeA = fDigits->BestTimeLeft();
145 Int_t timeC = fDigits->BestTimeRight();
148 TArrayI *allData = new TArrayI(107);
150 for (i=0; i<24; i++) {
151 allData->AddAt(fTimeLED->At(i),i);
152 allData->AddAt(fTimeCFD->At(i),i+24);
153 allData->AddAt(fADC0->At(i),i+54);
154 allData->AddAt(fADC1->At(i),i+78);
156 allData->AddAt(meantime,48);
157 allData->AddAt(timediff,49);
158 allData->AddAt(timediff,102); //trigger vertex
159 allData->AddAt(timeA,50);
160 allData->AddAt(timeA,103); //trigger T0A
161 allData->AddAt(timeC,51);
162 allData->AddAt(timeC,104); //trigger T0C
163 allData->AddAt(mult0,52);
164 allData->AddAt(mult1,105); //trigger central
165 allData->AddAt(mult1,53);
166 allData->AddAt(mult1,106); //trigger semi-central
167 //space for DRM header
170 //space for 1st TRM header
172 positionOfTRMHeader= fIndex;
174 //space for chain header
177 // Loop through all PMT
182 Int_t fWordsIn1stTRM=0;
184 for (Int_t det = 0; det < 54; det++) {
185 time = allData->At(det);
188 FillTime(channel, iTDC, time);
191 if (channel < 6) channel +=2;
195 if (iTDC>15) { chain++; iTDC=0;}
199 WriteTrailer(0,0,fEventNumber,1); // 1st chain trailer
200 WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
201 fWordsIn1stTRM = trm1words + 4;
202 WriteTRMDataHeader(3, trm1words , positionOfTRMHeader);
205 //space for 2st TRM header
207 positionOfTRMHeader= fIndex;
209 //space for chain header
217 for (Int_t det = 54; det < 107; det++) {
218 time = allData->At(det);
221 FillTime(channel, iTDC, time);
223 if (channel < 6) channel +=2;
227 if (iTDC>15) { chain++; iTDC=0;}
231 WriteTrailer(0,0,fEventNumber,1); // 1st chain trailer
232 WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
233 WriteTRMDataHeader(5,trm2words,positionOfTRMHeader);
235 WriteTrailer(1,fEventNumber,0,5); //DRM trailer
236 WriteDRMDataHeader();
239 //------------------------------------------------------------------------------
240 void AliT0RawData::PackWord(UInt_t &BaseWord, UInt_t Word, Int_t StartBit, Int_t StopBit)
244 Int_t len=StopBit-StartBit+1;
246 for(Int_t jb=0; jb<len; mask|=1<<jb++);
249 Error("PackWord", "Word to be filled is not within desired length\n"
250 "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
253 BaseWord=(BaseWord&~(mask<<StartBit))|Word<<StartBit;
258 //_____________________________________________________________________________
260 void AliT0RawData::WriteDRMDataHeader()
262 //Write a (dummy or real) DDL DRM data header,
263 //set the compression bit if compressed
264 // UInt_t drmheader[4];
270 PackWord(baseWord,word,0, 3); // 0001
273 PackWord(baseWord,word,4, 20); // event words
275 PackWord(baseWord,word,21,27); // DRM ID for T0 - 124
277 PackWord(baseWord,word,28,31); // 0100 marks header
278 fBuffer[0]= baseWord;
280 //DRM status header 1
282 PackWord(baseWord,word,0, 3); // 0001
284 PackWord(baseWord,word,4, 14); // slotID now 0000000001
286 PackWord(baseWord,word,15, 15); //if 1 LHC clock is coorectly recieved from CPDM
288 PackWord(baseWord,word,16,27); // reserve for future use
290 PackWord(baseWord,word,28,31); // 0100 marks header
291 fBuffer[1] = baseWord;
296 //DRM status header 2
298 PackWord(baseWord,word, 0, 3); // 0001
300 PackWord(baseWord,word, 4, 14); //enable slotID now 00000000011
302 PackWord(baseWord,word, 15, 15); // something
304 PackWord(baseWord,word, 16, 27); // fault ID for simulation 0
306 PackWord(baseWord,word,28,31); // 0100 marks header
307 fBuffer[2]= baseWord;
312 //DRM status header 3
314 PackWord(baseWord,word,0, 3); // 0001
316 PackWord(baseWord,word,4, 27); // TTC event counter
318 PackWord(baseWord,word,28,31); // 0100 marks header
319 fBuffer[3]= baseWord;
327 //_____________________________________________________________________________
329 void AliT0RawData::WriteTRMDataHeader(UInt_t slotID, Int_t nWordsInTRM,
330 Int_t positionOfTRMHeader)
332 //Write a (dummy or real) DDL TRM data header,
333 //set the compression bit if compressed
340 PackWord(baseWord,word,0, 3); // slotID
342 //+this word - DRM header
344 PackWord(baseWord,word,4, 16); // event words
346 PackWord(baseWord,word,17,18); // ACQ
348 PackWord(baseWord,word,19,19); // L SEY inside LUT
350 PackWord(baseWord,word,20,27); // MBZ
352 PackWord(baseWord,word,28,31); // 0100 marks header
353 fBuffer[positionOfTRMHeader] = baseWord;
360 //_____________________________________________________________________________
362 void AliT0RawData::WriteChainDataHeader(UInt_t chainNumber,UInt_t slotID)
364 //Write a (dummy or real) DDL Chain data header,
365 //set the compression bit if compressed
366 // chainNumber 00 or 10
371 word = slotID; // ask Tatiana 7 or 9
372 PackWord(baseWord,word,0, 3); // slotID
374 PackWord(baseWord,word,4, 15); // bunchID
376 PackWord(baseWord,word,16,23); // PB24 temperature
378 PackWord(baseWord,word,24,26); // PB24 ID
380 PackWord(baseWord,word,27,27); // TS
382 PackWord(baseWord,word,28,31); // 0100 marks header
383 fBuffer[4] = baseWord;
389 //_____________________________________________________________________________
391 void AliT0RawData::WriteDataHeader(Bool_t dummy, Bool_t compressed)
393 //Write a (dummy or real) DDL data header,
394 //set the compression bit if compressed
396 AliRawDataHeaderSim header;
399 //if size=0 it means that this data header is a dummy data header
400 fDataHeaderPos = fFile->Tellp();
401 fFile->WriteBuffer((char*)(&header), sizeof(header));
403 UInt_t currentFilePos = fFile->Tellp();
404 fFile->Seekp(fDataHeaderPos);
405 header.fSize = currentFilePos-fDataHeaderPos;
406 header.SetAttribute(0); // valid data
407 if (compressed) header.SetAttribute(1);
408 fFile->WriteBuffer((char*)(&header), sizeof(header));
409 fFile->Seekp(currentFilePos);
414 //___ __________________________________________________________________________
417 void AliT0RawData::WriteTrailer(UInt_t slot, Int_t word1, UInt_t word2, UInt_t word3)
423 PackWord(baseWord,word,0, 3); // 0001
425 PackWord(baseWord,word,4, 15); // CRC ?
427 PackWord(baseWord,word,16,27); // event counter
429 PackWord(baseWord,word,28,31); // marks trailer
431 fBuffer[fIndex] = baseWord;
438 //---------------------------------------------------------------------------------------
439 //---------------------------------------------------------------------------------------
440 void AliT0RawData::FillTime(Int_t ch, Int_t iTDC, Int_t time)
446 PackWord(baseWord,word, 0, 20); // Time
449 PackWord(baseWord,word, 21, 23); // number of channel
451 PackWord(baseWord,word, 24, 27); // TDC ID
454 PackWord(baseWord,word, 28, 28); // E = 0 in simulation
456 PackWord(baseWord,word, 29, 30); // PS bit data 00
458 PackWord(baseWord,word, 31, 31); // 1
460 fBuffer[fIndex]=baseWord;
465 //---------------------------------------------------------------------------------------
467 Int_t AliT0RawData::RawDataT0(AliT0digit *fDigits)
469 //This method creates the Raw data files for T0 detector
472 // const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector()
473 //max number of digits per DDL file times 2
474 // UInt_t fBuffer[kSize];
480 AliRawDataHeaderSim header;
481 //loop over TOF DDL files
482 //write Dummy DATA HEADER
483 WriteDataHeader(kTRUE, kFALSE);
485 //write packing digits
486 fFile->WriteBuffer((char*) fBuffer,((fIndex+1)*sizeof(UInt_t)));
487 //write real data header on its place
488 WriteDataHeader(kFALSE, kFALSE);