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 // START raw data conversion class //
22 ///////////////////////////////////////////////////////////////////////////////
24 #include <Riostream.h>
28 #include "AliSTARTRawData.h"
29 #include "AliSTARTdigit.h"
30 #include "AliBitPacking.h"
31 #include "AliRawDataHeader.h"
32 #include "AliBitPacking.h"
35 ClassImp(AliSTARTRawData)
37 //_____________________________________________________________________________
38 AliSTARTRawData::AliSTARTRawData():TObject()
41 - 48 channels (2 words each as in TOF DDL) for :
42 word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
43 and the same but for amplified signal. Now I wrote the same time because
44 CDF are not ready and differences didn't measured yet.
46 - 48 channel for amplitude: very preliminary, QTC features are not
47 known now, preliminary i put as T1 time signal for this PMT in first
48 channel and T1+A in second, where A=Log(Amplitude);
49 and the same for amplified but A=Log(10*Amplitude).
51 - T0-A and T0-C 2 channels
52 - T0A-T0C vertex information
53 - Time Meaner where T0C TOF increase to the T0A TOF distance
54 - 6 multiplicity signals the same way as amplitude and with the same
61 fTimeCFD = new TArrayI(24);
62 fADC = new TArrayI(24);
63 fTimeLED = new TArrayI(24);
64 fADC0 = new TArrayI(24);
69 //_____________________________________________________________________________
70 AliSTARTRawData::AliSTARTRawData(const AliSTARTRawData &r):TObject()
73 // AliSTARTrawData copy constructor
76 ((AliSTARTRawData &) r).Copy(*this);
80 //_____________________________________________________________________________
81 AliSTARTRawData::~AliSTARTRawData()
96 //_____________________________________________________________________________
97 AliSTARTRawData &AliSTARTRawData::operator=(const AliSTARTRawData &r)
100 // Assignment operator
103 if (this != &r) ((AliSTARTRawData &) r).Copy(*this);
108 //_____________________________________________________________________________
109 void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
112 //This method packs the START digits in a proper 32 bits structure
114 //read START digits and fill TDC and ADC arrays
121 // Get the digits array
123 fDigits->GetTime(*fTimeCFD);
124 fDigits->GetADC(*fADC);
125 fDigits->GetTimeAmp(*fTimeLED);
126 fDigits->GetADCAmp(*fADC0);
128 // Loop through all PMT
130 for (Int_t det = 0; det < 24; det++) {
131 Int_t timeLED=fTimeLED->At(det);
133 // DDL 1 0-5 -#PMT, 6-31 - empty
136 PackWord(baseWord,word, 0, 8);
138 buf[fIndex]=baseWord;
143 PackWord(baseWord,word,0, 7); // Error flag
145 PackWord(baseWord,word,8,31); // time-of-flight
147 buf[fIndex]=baseWord;
152 for (Int_t det = 0; det < 24; det++) {
154 Int_t timeCFD=fTimeCFD->At(det);
155 // if ( timeCFD >0 ) {
156 // DDL2 2 0-5 -#PMT, 6-31 - empty
160 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
162 buf[fIndex]=baseWord;
166 PackWord(baseWord,word,0, 7); // Error flag
168 PackWord(baseWord,word,8,31); // time-of-flight
170 buf[fIndex]=baseWord;
175 for (Int_t det = 0; det < 24; det++) {
176 //conver ADC to time (preliminary algorithm)
177 Int_t qtc=fADC->At(det);
181 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
183 buf[fIndex]=baseWord;
186 PackWord(baseWord,word,0, 7); // Error flag
188 PackWord(baseWord,word,8,31); // Q->Time
190 buf[fIndex]=baseWord;
196 for (Int_t det = 0; det < 24; det++) {
197 Int_t qtcAmp=fADC0->At(det);
199 // DDL 4 amplified QTC charge * 10
201 //Amplified ADC -> TDC
204 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
206 buf[fIndex]=baseWord;
209 PackWord(baseWord,word,0, 7); // Error flag
211 PackWord(baseWord,word,8,31); // Q->T amplified
213 buf[fIndex]=baseWord;
224 PackWord(baseWord,word, 0, 8); // ?????????????????
225 buf[fIndex]=baseWord;
228 PackWord(baseWord,word,0, 7); // Error flag
229 word=fDigits->MeanTime();
230 PackWord(baseWord,word,8,31); // MEANER
233 buf[fIndex]=baseWord;
236 // besttime right & left
238 PackWord(baseWord,word, 0, 8); // T0-A sign
240 buf[fIndex]=baseWord;
244 PackWord(baseWord,word,0, 7); // Error flag
245 word=fDigits->BestTimeRight();
246 PackWord(baseWord,word,8,31); // time-of-flight T0-A
248 buf[fIndex]=baseWord;
251 PackWord(baseWord,word, 0, 8); // T0-C sign
253 buf[fIndex]=baseWord;
257 PackWord(baseWord,word,0, 7); // Error flag
258 word=fDigits->BestTimeLeft();
259 PackWord(baseWord,word,8,31); // time-of-flight T0-C
261 buf[fIndex]=baseWord;
265 PackWord(baseWord,word, 0, 8); // TVDS sign
267 buf[fIndex]=baseWord;
272 PackWord(baseWord,word,0, 7); // Error flag
273 word=fDigits->TimeDiff();
274 PackWord(baseWord,word,8,31); // T0verex
276 buf[fIndex]=baseWord;
281 Int_t mult=fDigits->SumMult();
283 PackWord(baseWord,word, 0, 8);
285 buf[fIndex]=baseWord;
289 PackWord(baseWord,word,0, 7); // Error flag
291 PackWord(baseWord,word,8,31); // time amplitude
293 buf[fIndex]=baseWord;
297 // besttime right & left
299 PackWord(baseWord,word, 0, 8); // T0-A sign
301 buf[fIndex]=baseWord;
305 PackWord(baseWord,word,0, 7); // Error flag
306 word=fDigits->BestTimeRight();
307 PackWord(baseWord,word,8,31); // time-of-flight T0-A
309 buf[fIndex]=baseWord;
312 PackWord(baseWord,word, 0, 8); // T0-C sign
314 buf[fIndex]=baseWord;
319 PackWord(baseWord,word,0, 7); // Error flag
320 word=fDigits->BestTimeLeft();
321 PackWord(baseWord,word,8,31); // time-of-flight T0-C
323 buf[fIndex]=baseWord;
327 PackWord(baseWord,word, 0, 8); // TVDS sign
329 buf[fIndex]=baseWord;
334 PackWord(baseWord,word,0, 7); // Error flag
335 word=fDigits->TimeDiff();
336 PackWord(baseWord,word,8,31); // T0verex
338 buf[fIndex]=baseWord;
342 mult=fDigits->SumMult();
344 PackWord(baseWord,word, 0, 8);
346 buf[fIndex]=baseWord;
350 PackWord(baseWord,word,0, 7); // Error flag
352 PackWord(baseWord,word,8,31); // time amplitude
354 buf[fIndex]=baseWord;
358 mult=fDigits->SumMult();
360 PackWord(baseWord,word, 0, 8);
362 buf[fIndex]=baseWord;
366 PackWord(baseWord,word,0, 7); // Error flag
368 PackWord(baseWord,word,8,31); // time amplitude
370 buf[fIndex]=baseWord;
374 //-----------------------------------------------------------------------------------
376 void AliSTARTRawData::PackWord(UInt_t &BaseWord, UInt_t Word, Int_t StartBit, Int_t StopBit)
380 Int_t len=StopBit-StartBit+1;
382 for(Int_t jb=0; jb<len; mask|=1<<jb++);
385 Error("PackWord", "Word to be filled is not within desired length\n"
386 "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
389 BaseWord=(BaseWord&~(mask<<StartBit))|Word<<StartBit;
393 //---------------------------------------------------------------------------------------
395 Int_t AliSTARTRawData::RawDataSTART(AliSTARTdigit *fDigits)
397 //This method creates the Raw data files for START detector
400 const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector()
401 //max number of digits per DDL file times 2
409 ofstream outfile; // logical name of the output file
410 AliRawDataHeader header;
411 //loop over TOF DDL files
412 strcpy(fileName,AliDAQ::DdlFileName("START",0)); //The name of the output file
414 outfile.open(fileName,ios::binary);
416 outfile.open(fileName);
418 //write Dummy DATA HEADER
419 UInt_t dataHeaderPosition=outfile.tellp();
420 outfile.write((char*)(&header),sizeof(header));
424 PackWord(baseWord,word,0, 31); // Number of DDL file
427 buf[fIndex]=baseWord;
428 GetDigits(fDigits,buf);
430 outfile.write((char *)buf,((fIndex+1)*sizeof(UInt_t)));
431 for(Int_t ii=0;ii<(fIndex+1);ii++) buf[ii]=0;
434 //Write REAL DATA HEADER
435 UInt_t currentFilePosition=outfile.tellp();
436 outfile.seekp(dataHeaderPosition);
437 header.fSize=currentFilePosition-dataHeaderPosition;
438 header.SetAttribute(0); // valid data
439 outfile.write((char*)(&header),sizeof(header));