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"
34 ClassImp(AliSTARTRawData)
36 //_____________________________________________________________________________
37 AliSTARTRawData::AliSTARTRawData():TObject()
40 - 48 channels (2 words each as in TOF DDL) for :
41 word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
42 and the same but for amplified signal. Now I wrote the same time because
43 CDF are not ready and differences didn't measured yet.
45 - 48 channel for amplitude: very preliminary, QTC features are not
46 known now, preliminary i put as T1 time signal for this PMT in first
47 channel and T1+A in second, where A=Log(Amplitude);
48 and the same for amplified but A=Log(10*Amplitude).
50 - T0-A and T0-C 2 channels
51 - T0A-T0C vertex information
52 - Time Meaner where T0C TOF increase to the T0A TOF distance
53 - 6 multiplicity signals the same way as amplitude and with the same
60 fTimeCFD = new TArrayI(24);
61 fADC = new TArrayI(24);
62 fTimeLED = new TArrayI(24);
63 fADC0 = new TArrayI(24);
68 //_____________________________________________________________________________
69 AliSTARTRawData::AliSTARTRawData(const AliSTARTRawData &r):TObject()
72 // AliSTARTrawData copy constructor
75 ((AliSTARTRawData &) r).Copy(*this);
79 //_____________________________________________________________________________
80 AliSTARTRawData::~AliSTARTRawData()
95 //_____________________________________________________________________________
96 AliSTARTRawData &AliSTARTRawData::operator=(const AliSTARTRawData &r)
99 // Assignment operator
102 if (this != &r) ((AliSTARTRawData &) r).Copy(*this);
107 //_____________________________________________________________________________
108 void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
111 //This method packs the START digits in a proper 32 bits structure
113 //read START digits and fill TDC and ADC arrays
120 // Get the digits array
122 fDigits->GetTime(*fTimeCFD);
123 fDigits->GetADC(*fADC);
124 fDigits->GetTimeAmp(*fTimeLED);
125 fDigits->GetADCAmp(*fADC0);
127 // Loop through all PMT
129 for (Int_t det = 0; det < 24; det++) {
130 Int_t timeLED=fTimeLED->At(det);
132 // DDL 1 0-5 -#PMT, 6-31 - empty
135 PackWord(baseWord,word, 0, 8);
137 buf[fIndex]=baseWord;
142 PackWord(baseWord,word,0, 7); // Error flag
144 PackWord(baseWord,word,8,31); // time-of-flight
146 buf[fIndex]=baseWord;
151 for (Int_t det = 0; det < 24; det++) {
153 Int_t timeCFD=fTimeCFD->At(det);
154 // if ( timeCFD >0 ) {
155 // DDL2 2 0-5 -#PMT, 6-31 - empty
159 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
161 buf[fIndex]=baseWord;
165 PackWord(baseWord,word,0, 7); // Error flag
167 PackWord(baseWord,word,8,31); // time-of-flight
169 buf[fIndex]=baseWord;
174 for (Int_t det = 0; det < 24; det++) {
175 //conver ADC to time (preliminary algorithm)
176 Int_t qtc=fADC->At(det);
180 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
182 buf[fIndex]=baseWord;
185 PackWord(baseWord,word,0, 7); // Error flag
187 PackWord(baseWord,word,8,31); // Q->Time
189 buf[fIndex]=baseWord;
195 for (Int_t det = 0; det < 24; det++) {
196 Int_t qtcAmp=fADC0->At(det);
198 // DDL 4 amplified QTC charge * 10
200 //Amplified ADC -> TDC
203 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
205 buf[fIndex]=baseWord;
208 PackWord(baseWord,word,0, 7); // Error flag
210 PackWord(baseWord,word,8,31); // Q->T amplified
212 buf[fIndex]=baseWord;
223 PackWord(baseWord,word, 0, 8); // ?????????????????
224 buf[fIndex]=baseWord;
227 PackWord(baseWord,word,0, 7); // Error flag
228 word=fDigits->MeanTime();
229 PackWord(baseWord,word,8,31); // MEANER
232 buf[fIndex]=baseWord;
235 // besttime right & left
237 PackWord(baseWord,word, 0, 8); // T0-A sign
239 buf[fIndex]=baseWord;
243 PackWord(baseWord,word,0, 7); // Error flag
244 word=fDigits->BestTimeRight();
245 PackWord(baseWord,word,8,31); // time-of-flight T0-A
247 buf[fIndex]=baseWord;
250 PackWord(baseWord,word, 0, 8); // T0-C sign
252 buf[fIndex]=baseWord;
256 PackWord(baseWord,word,0, 7); // Error flag
257 word=fDigits->BestTimeLeft();
258 PackWord(baseWord,word,8,31); // time-of-flight T0-C
260 buf[fIndex]=baseWord;
264 PackWord(baseWord,word, 0, 8); // TVDS sign
266 buf[fIndex]=baseWord;
271 PackWord(baseWord,word,0, 7); // Error flag
272 word=fDigits->TimeDiff();
273 PackWord(baseWord,word,8,31); // T0verex
275 buf[fIndex]=baseWord;
280 Int_t mult=fDigits->SumMult();
282 PackWord(baseWord,word, 0, 8);
284 buf[fIndex]=baseWord;
288 PackWord(baseWord,word,0, 7); // Error flag
290 PackWord(baseWord,word,8,31); // time amplitude
292 buf[fIndex]=baseWord;
296 // besttime right & left
298 PackWord(baseWord,word, 0, 8); // T0-A sign
300 buf[fIndex]=baseWord;
304 PackWord(baseWord,word,0, 7); // Error flag
305 word=fDigits->BestTimeRight();
306 PackWord(baseWord,word,8,31); // time-of-flight T0-A
308 buf[fIndex]=baseWord;
311 PackWord(baseWord,word, 0, 8); // T0-C sign
313 buf[fIndex]=baseWord;
318 PackWord(baseWord,word,0, 7); // Error flag
319 word=fDigits->BestTimeLeft();
320 PackWord(baseWord,word,8,31); // time-of-flight T0-C
322 buf[fIndex]=baseWord;
326 PackWord(baseWord,word, 0, 8); // TVDS sign
328 buf[fIndex]=baseWord;
333 PackWord(baseWord,word,0, 7); // Error flag
334 word=fDigits->TimeDiff();
335 PackWord(baseWord,word,8,31); // T0verex
337 buf[fIndex]=baseWord;
341 mult=fDigits->SumMult();
343 PackWord(baseWord,word, 0, 8);
345 buf[fIndex]=baseWord;
349 PackWord(baseWord,word,0, 7); // Error flag
351 PackWord(baseWord,word,8,31); // time amplitude
353 buf[fIndex]=baseWord;
357 mult=fDigits->SumMult();
359 PackWord(baseWord,word, 0, 8);
361 buf[fIndex]=baseWord;
365 PackWord(baseWord,word,0, 7); // Error flag
367 PackWord(baseWord,word,8,31); // time amplitude
369 buf[fIndex]=baseWord;
373 //-----------------------------------------------------------------------------------
375 void AliSTARTRawData::PackWord(UInt_t &BaseWord, UInt_t Word, Int_t StartBit, Int_t StopBit)
379 Int_t len=StopBit-StartBit+1;
381 for(Int_t jb=0; jb<len; mask|=1<<jb++);
384 Error("PackWord", "Word to be filled is not within desired length\n"
385 "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
388 BaseWord=(BaseWord&~(mask<<StartBit))|Word<<StartBit;
392 //---------------------------------------------------------------------------------------
394 Int_t AliSTARTRawData::RawDataSTART(AliSTARTdigit *fDigits)
396 //This method creates the Raw data files for START detector
399 const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector()
400 //max number of digits per DDL file times 2
408 ofstream outfile; // logical name of the output file
409 AliRawDataHeader header;
410 //loop over TOF DDL files
411 sprintf(fileName,"START_%d.ddl", 0xd00);
412 // sprintf(fileName,"START_0xd00.ddl"); //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));