]> git.uio.no Git - u/mrichter/AliRoot.git/blame - START/AliSTARTRawData.cxx
Calibration parameters for ideal calibration, decalibration and inverse calibration...
[u/mrichter/AliRoot.git] / START / AliSTARTRawData.cxx
CommitLineData
e4da63c2 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// START raw data conversion class //
21// //
22///////////////////////////////////////////////////////////////////////////////
23
24#include <Riostream.h>
460b4363 25#include <TTree.h>
e4da63c2 26
27#include "AliSTART.h"
28#include "AliSTARTRawData.h"
29#include "AliSTARTdigit.h"
460b4363 30#include "AliBitPacking.h"
19edf72f 31#include "AliRawDataHeader.h"
460b4363 32#include "AliBitPacking.h"
e4da63c2 33
34ClassImp(AliSTARTRawData)
35
36//_____________________________________________________________________________
37AliSTARTRawData::AliSTARTRawData():TObject()
38{
06fb27f4 39 /*
40- 48 channels (2 words each as in TOF DDL) for :
41word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
42and the same but for amplified signal. Now I wrote the same time because
43CDF are not ready and differences didn't measured yet.
44
460b4363 45- 48 channel for amplitude: very preliminary, QTC features are not
06fb27f4 46known now, preliminary i put as T1 time signal for this PMT in first
47channel and T1+A in second, where A=Log(Amplitude);
48and the same for amplified but A=Log(10*Amplitude).
49
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
54uncertances
55 */
e4da63c2 56
57 fIndex=-1;
58 fDigits = NULL;
db173afc 59
460b4363 60 fTimeCFD = new TArrayI(24);
db173afc 61 fADC = new TArrayI(24);
460b4363 62 fTimeLED = new TArrayI(24);
63 fADC0 = new TArrayI(24);
db173afc 64 // this->Dump();
e4da63c2 65
66}
67
68//_____________________________________________________________________________
69AliSTARTRawData::AliSTARTRawData(const AliSTARTRawData &r):TObject()
70{
71 //
72 // AliSTARTrawData copy constructor
73 //
74
75 ((AliSTARTRawData &) r).Copy(*this);
76
77}
78
79//_____________________________________________________________________________
80AliSTARTRawData::~AliSTARTRawData()
81{
82 //
83 // Destructor
84 //
e4da63c2 85 if (fDigits) {
86 delete fDigits;
87 fDigits = NULL;
e4da63c2 88 }
460b4363 89 delete fTimeCFD;
db173afc 90 delete fADC;
460b4363 91 delete fTimeLED;
92 delete fADC0;
e4da63c2 93}
94
95//_____________________________________________________________________________
96AliSTARTRawData &AliSTARTRawData::operator=(const AliSTARTRawData &r)
97{
98 //
99 // Assignment operator
100 //
101
102 if (this != &r) ((AliSTARTRawData &) r).Copy(*this);
103 return *this;
104
105}
106
107//_____________________________________________________________________________
108void AliSTARTRawData::GetDigits(AliSTARTdigit *fDigits, UInt_t *buf)
109{
110
111 //This method packs the START digits in a proper 32 bits structure
112
113 //read START digits and fill TDC and ADC arrays
114
db173afc 115
e4da63c2 116 UInt_t word;
117 UInt_t baseWord=0;
118 Int_t error=0;
4c7da157 119
db173afc 120 // Get the digits array
e4da63c2 121
460b4363 122 fDigits->GetTime(*fTimeCFD);
db173afc 123 fDigits->GetADC(*fADC);
460b4363 124 fDigits->GetTimeAmp(*fTimeLED);
125 fDigits->GetADCAmp(*fADC0);
e4da63c2 126
127 // Loop through all PMT
128
e4da63c2 129 for (Int_t det = 0; det < 24; det++) {
460b4363 130 Int_t timeLED=fTimeLED->At(det);
0cd34ffa 131 // if( timeLED > 0){
132 // DDL 1 0-5 -#PMT, 6-31 - empty
133 //LED
134 word=det;;
135 PackWord(baseWord,word, 0, 8);
136 fIndex++;
137 buf[fIndex]=baseWord;
138
139 word=0;
140 baseWord=0;
141 word=error;
142 PackWord(baseWord,word,0, 7); // Error flag
143 word=timeLED;
144 PackWord(baseWord,word,8,31); // time-of-flight
145 fIndex++;
146 buf[fIndex]=baseWord;
147 word=0;
148 baseWord=0;
149 // }
460b4363 150 }
460b4363 151 for (Int_t det = 0; det < 24; det++) {
152 //CDF
0cd34ffa 153 Int_t timeCFD=fTimeCFD->At(det);
154 // if ( timeCFD >0 ) {
155 // DDL2 2 0-5 -#PMT, 6-31 - empty
156 word=0;
157 baseWord=0;
158 word=det+24;
159 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
160 fIndex++;
161 buf[fIndex]=baseWord;
162 word=0;
163 baseWord=0;
164 word=error;
165 PackWord(baseWord,word,0, 7); // Error flag
166 word=timeCFD;
167 PackWord(baseWord,word,8,31); // time-of-flight
168 fIndex++;
169 buf[fIndex]=baseWord;
170 word=0;
171 baseWord=0;
172 // }
460b4363 173 }
460b4363 174 for (Int_t det = 0; det < 24; det++) {
175 //conver ADC to time (preliminary algorithm)
176 Int_t qtc=fADC->At(det);
0cd34ffa 177 // if ( qtc > 0 )
178 // {
179 word=det+48;
180 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
181 fIndex++;
182 buf[fIndex]=baseWord;
183 baseWord=0;
184 word=error;
185 PackWord(baseWord,word,0, 7); // Error flag
186 word=qtc;
187 PackWord(baseWord,word,8,31); // Q->Time
188 fIndex++;
189 buf[fIndex]=baseWord;
190 word=0;
191 baseWord=0;
192 // }
460b4363 193 }
460b4363 194
195 for (Int_t det = 0; det < 24; det++) {
196 Int_t qtcAmp=fADC0->At(det);
197
198 // DDL 4 amplified QTC charge * 10
199
200 //Amplified ADC -> TDC
201
202 word=det+72;
4c7da157 203 PackWord(baseWord,word, 0, 8); // number of PMT on the right side
460b4363 204 fIndex++;
205 buf[fIndex]=baseWord;
206 baseWord=0;
207 word=error;
4c7da157 208 PackWord(baseWord,word,0, 7); // Error flag
460b4363 209 word=qtcAmp;
4c7da157 210 PackWord(baseWord,word,8,31); // Q->T amplified
460b4363 211 fIndex++;
212 buf[fIndex]=baseWord;
213
214 word=0;
215 baseWord=0;
216 }
e4da63c2 217
db173afc 218
460b4363 219 word=0;
220 baseWord=0;
221 fIndex++;
222 word=97;
4c7da157 223 PackWord(baseWord,word, 0, 8); // ?????????????????
460b4363 224 buf[fIndex]=baseWord;
225 baseWord=0;
226 word=error;
4c7da157 227 PackWord(baseWord,word,0, 7); // Error flag
460b4363 228 word=fDigits->MeanTime();
4c7da157 229 PackWord(baseWord,word,8,31); // MEANER
0cd34ffa 230
460b4363 231 fIndex++;
232 buf[fIndex]=baseWord;
e4da63c2 233
db173afc 234
460b4363 235 // besttime right & left
236 word=98;
4c7da157 237 PackWord(baseWord,word, 0, 8); // T0-A sign
460b4363 238 fIndex++;
239 buf[fIndex]=baseWord;
e4da63c2 240
460b4363 241 baseWord=0;
242 word=error;
4c7da157 243 PackWord(baseWord,word,0, 7); // Error flag
460b4363 244 word=fDigits->BestTimeRight();
4c7da157 245 PackWord(baseWord,word,8,31); // time-of-flight T0-A
460b4363 246 fIndex++;
247 buf[fIndex]=baseWord;
db173afc 248
460b4363 249 word=99;
4c7da157 250 PackWord(baseWord,word, 0, 8); // T0-C sign
460b4363 251 fIndex++;
252 buf[fIndex]=baseWord;
db173afc 253
460b4363 254 baseWord=0;
460b4363 255 word=error;
4c7da157 256 PackWord(baseWord,word,0, 7); // Error flag
460b4363 257 word=fDigits->BestTimeLeft();
4c7da157 258 PackWord(baseWord,word,8,31); // time-of-flight T0-C
460b4363 259 fIndex++;
260 buf[fIndex]=baseWord;
2e57e601 261
460b4363 262 // time difference
263 word=100;
4c7da157 264 PackWord(baseWord,word, 0, 8); // TVDS sign
460b4363 265 fIndex++;
266 buf[fIndex]=baseWord;
db173afc 267
db173afc 268 baseWord=0;
460b4363 269
270 word=error;
4c7da157 271 PackWord(baseWord,word,0, 7); // Error flag
460b4363 272 word=fDigits->TimeDiff();
4c7da157 273 PackWord(baseWord,word,8,31); // T0verex
e4da63c2 274 fIndex++;
e4da63c2 275 buf[fIndex]=baseWord;
db173afc 276
0cd34ffa 277
460b4363 278 // multiplicity
279
4c7da157 280 Int_t mult=fDigits->SumMult();
0cd34ffa 281 word=101;
4c7da157 282 PackWord(baseWord,word, 0, 8);
460b4363 283 fIndex++;
284 buf[fIndex]=baseWord;
285
e4da63c2 286 baseWord=0;
e4da63c2 287 word=error;
4c7da157 288 PackWord(baseWord,word,0, 7); // Error flag
460b4363 289 word=mult;
4c7da157 290 PackWord(baseWord,word,8,31); // time amplitude
e4da63c2 291 fIndex++;
292 buf[fIndex]=baseWord;
460b4363 293
0cd34ffa 294
460b4363 295 // trigger channels
296 // besttime right & left
0cd34ffa 297 word=102;
4c7da157 298 PackWord(baseWord,word, 0, 8); // T0-A sign
e4da63c2 299 fIndex++;
300 buf[fIndex]=baseWord;
db173afc 301
e4da63c2 302 baseWord=0;
e4da63c2 303 word=error;
4c7da157 304 PackWord(baseWord,word,0, 7); // Error flag
db173afc 305 word=fDigits->BestTimeRight();
4c7da157 306 PackWord(baseWord,word,8,31); // time-of-flight T0-A
e4da63c2 307 fIndex++;
308 buf[fIndex]=baseWord;
4c7da157 309
0cd34ffa 310 word=103;
4c7da157 311 PackWord(baseWord,word, 0, 8); // T0-C sign
e4da63c2 312 fIndex++;
313 buf[fIndex]=baseWord;
db173afc 314
e4da63c2 315 baseWord=0;
db173afc 316
e4da63c2 317 word=error;
4c7da157 318 PackWord(baseWord,word,0, 7); // Error flag
db173afc 319 word=fDigits->BestTimeLeft();
4c7da157 320 PackWord(baseWord,word,8,31); // time-of-flight T0-C
e4da63c2 321 fIndex++;
322 buf[fIndex]=baseWord;
db173afc 323
324 // time difference
0cd34ffa 325 word=104;
4c7da157 326 PackWord(baseWord,word, 0, 8); // TVDS sign
db173afc 327 fIndex++;
328 buf[fIndex]=baseWord;
329
e4da63c2 330 baseWord=0;
db173afc 331
332 word=error;
4c7da157 333 PackWord(baseWord,word,0, 7); // Error flag
db173afc 334 word=fDigits->TimeDiff();
4c7da157 335 PackWord(baseWord,word,8,31); // T0verex
db173afc 336 fIndex++;
337 buf[fIndex]=baseWord;
338
339 // multiplicity
460b4363 340
4c7da157 341 mult=fDigits->SumMult();
0cd34ffa 342 word=105;
4c7da157 343 PackWord(baseWord,word, 0, 8);
460b4363 344 fIndex++;
345 buf[fIndex]=baseWord;
346
347 baseWord=0;
348 word=error;
66425afd 349 PackWord(baseWord,word,0, 7); // Error flag
460b4363 350 word=mult;
66425afd 351 PackWord(baseWord,word,8,31); // time amplitude
460b4363 352 fIndex++;
353 buf[fIndex]=baseWord;
354
355 // multiplicity
356
66425afd 357 mult=fDigits->SumMult();
0cd34ffa 358 word=106;
4c7da157 359 PackWord(baseWord,word, 0, 8);
460b4363 360 fIndex++;
361 buf[fIndex]=baseWord;
362
363 baseWord=0;
364 word=error;
4c7da157 365 PackWord(baseWord,word,0, 7); // Error flag
460b4363 366 word=mult;
4c7da157 367 PackWord(baseWord,word,8,31); // time amplitude
460b4363 368 fIndex++;
369 buf[fIndex]=baseWord;
2e57e601 370
e4da63c2 371}
372
4c7da157 373//-----------------------------------------------------------------------------------
374
e4da63c2 375void AliSTARTRawData::PackWord(UInt_t &BaseWord, UInt_t Word, Int_t StartBit, Int_t StopBit)
376{
2e57e601 377
378 // Build mask
379 Int_t len=StopBit-StartBit+1;
380 UInt_t mask=0;
381 for(Int_t jb=0; jb<len; mask|=1<<jb++);
382 // Check consistency
383 if(Word > mask){
e4da63c2 384 Error("PackWord", "Word to be filled is not within desired length\n"
4c7da157 385 "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
e4da63c2 386 return;
387 }
2e57e601 388 BaseWord=(BaseWord&~(mask<<StartBit))|Word<<StartBit;
389
e4da63c2 390}
4c7da157 391
e4da63c2 392//---------------------------------------------------------------------------------------
393
06fb27f4 394Int_t AliSTARTRawData::RawDataSTART(AliSTARTdigit *fDigits)
395{
396 //This method creates the Raw data files for START detector
397
398
e4da63c2 399 const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector()
400 //max number of digits per DDL file times 2
401 UInt_t buf[kSize];
402 UInt_t baseWord;
403 UInt_t word;
404
405 fIndex=-1;
406
407 char fileName[15];
408 ofstream outfile; // logical name of the output file
409 AliRawDataHeader header;
e4da63c2 410 //loop over TOF DDL files
db173afc 411 sprintf(fileName,"START_%d.ddl", 0xd00);
412 // sprintf(fileName,"START_0xd00.ddl"); //The name of the output file
e4da63c2 413#ifndef __DECCXX
414 outfile.open(fileName,ios::binary);
415#else
416 outfile.open(fileName);
417#endif
418 //write Dummy DATA HEADER
419 UInt_t dataHeaderPosition=outfile.tellp();
420 outfile.write((char*)(&header),sizeof(header));
421
422 baseWord=0;
423 word=0;
66425afd 424 PackWord(baseWord,word,0, 31); // Number of DDL file
e4da63c2 425
426 fIndex++;
427 buf[fIndex]=baseWord;
e4da63c2 428 GetDigits(fDigits,buf);
db173afc 429
430 outfile.write((char *)buf,((fIndex+1)*sizeof(UInt_t)));
e4da63c2 431 for(Int_t ii=0;ii<(fIndex+1);ii++) buf[ii]=0;
db173afc 432 fIndex=-1;
e4da63c2 433
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));
440 outfile.close();
441
442 //end for
443
444 return 0;
445
446}