correct calibration of short runs
[u/mrichter/AliRoot.git] / T0 / AliT0RawData.cxx
CommitLineData
dc7ca31d 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// T0 raw data conversion class //
21// //
22///////////////////////////////////////////////////////////////////////////////
23
94249139 24//#include <Riostream.h>
25//#include <TTree.h>
29d3e0eb 26#include <TMap.h>
dc7ca31d 27#include "AliT0.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"
c41ceaac 36#include "AliDAQ.h"
29d3e0eb 37#include "AliT0LookUpValue.h"
94249139 38#include "AliT0LookUpKey.h"
dc7ca31d 39
40ClassImp(AliT0RawData)
41
42//_____________________________________________________________________________
c41ceaac 43 AliT0RawData::AliT0RawData():TObject(),
29d3e0eb 44 fVerbose(0),
45 fIndex(-1) ,
46 fEventNumber(0),
47 fTimeCFD(new TArrayI(24)),
48 fADC1( new TArrayI(24)),
49 fTimeLED( new TArrayI(24)),
50 fADC0( new TArrayI(24)),
51 fFile(0x0),
52 fDataHeaderPos(0),
53 fDRMDataHeaderPos(0),
54 fTRMDataHeaderPos(0),
29d3e0eb 55 fParam(0),
56 fLookUp(0)
57
c41ceaac 58
dc7ca31d 59{
60 /*
61- 48 channels (2 words each as in TOF DDL) for :
62word 1 :0-5bit number of PMT; word 2: 0-7 error sign, 8-31 TDC
63and the same but for amplified signal. Now I wrote the same time because
64CDF are not ready and differences didn't measured yet.
65
66- 48 channel for amplitude: very preliminary, QTC features are not
67known now, preliminary i put as T1 time signal for this PMT in first
68channel and T1+A in second, where A=Log(Amplitude);
69and the same for amplified but A=Log(10*Amplitude).
70
71- T0-A and T0-C 2 channels
72- T0A-T0C vertex information
73- Time Meaner where T0C TOF increase to the T0A TOF distance
74- 6 multiplicity signals the same way as amplitude and with the same
75uncertances
76 */
77
dc7ca31d 78 //open the output file
3611bfe6 79 // char fileName[15];
80 // strcpy(fileName,AliDAQ::DdlFileName("T0",0)); //The name of the output file
81 TString fileName = Form("%s",AliDAQ::DdlFileName("T0",0));
82 fFile = new AliFstream(fileName.Data());
c41ceaac 83 memset(fBuffer,0,512*sizeof(UInt_t));
84
dc7ca31d 85 //get event number
33c3c91a 86 AliRunLoader *runloader = AliRunLoader::Instance();
dc7ca31d 87 if (runloader) {
88 fEventNumber = runloader->GetEventNumber();
89 }
29d3e0eb 90
91 // Inverse lookup table for simulation
92
93 fParam = AliT0Parameters::Instance();
94 fParam->Init();
36cde487 95 AliT0LookUpKey* lookkey;//= new AliT0LookUpKey();
96 AliT0LookUpValue* lookvalue;//= new AliT0LookUpValue();
29d3e0eb 97 TMap *lookup = fParam->GetMapLookup();
69776907 98 TMapIter iter(lookup);
29d3e0eb 99
100 for( Int_t iline=0; iline<106; iline++)
101 {
69776907 102 lookvalue = ( AliT0LookUpValue*) iter.Next();
256d4943 103 lookkey = (AliT0LookUpKey*) lookup->GetValue(lookvalue);
104 fLookUp.Add(lookkey, lookvalue);
36cde487 105 //lookkey= new AliT0LookUpKey();
106 //lookvalue= new AliT0LookUpValue();
29d3e0eb 107 }
256d4943 108
dc7ca31d 109}
110
111//_____________________________________________________________________________
c41ceaac 112
113AliT0RawData::AliT0RawData(const AliT0RawData &r):TObject(),
29d3e0eb 114 fVerbose(0),
115 fIndex(-1) ,
116 fEventNumber(0),
117 fTimeCFD(new TArrayI(24)),
118 fADC1( new TArrayI(24)),
119 fTimeLED( new TArrayI(24)),
120 fADC0( new TArrayI(24)),
121 fFile(0x0),
122 fDataHeaderPos(0),
123 fDRMDataHeaderPos(0),
124 fTRMDataHeaderPos(0),
29d3e0eb 125 fParam(0),
126 fLookUp(0)
c41ceaac 127
dc7ca31d 128{
129 //
130 // AliT0rawData copy constructor
131 //
132
133 ((AliT0RawData &) r).Copy(*this);
134
135}
136
137//_____________________________________________________________________________
138AliT0RawData::~AliT0RawData()
139{
140 //
141 // Destructor
142 //
dc7ca31d 143 delete fTimeCFD;
144 delete fADC1;
145 delete fTimeLED;
146 delete fADC0;
8ab584c1 147 delete fFile;
dc7ca31d 148}
149
150//_____________________________________________________________________________
151AliT0RawData &AliT0RawData::operator=(const AliT0RawData &r)
152{
153 //
154 // Assignment operator
155 //
156
157 if (this != &r) ((AliT0RawData &) r).Copy(*this);
158 return *this;
159
160}
161
162//_____________________________________________________________________________
163void AliT0RawData::GetDigits(AliT0digit *fDigits)
5bf55199 164//void AliT0RawData::GetDigits(fDigits)
dc7ca31d 165{
166
167 //This method packs the T0 digits in a proper 32 bits structure
168
169 //read T0 digits and fill TDC and ADC arrays
170
171
172 // Int_t error=0;
173 Int_t time, positionOfTRMHeader;
088c40b6 174
175 // Get the digits array
176
c41ceaac 177 fDigits->GetTimeCFD(*fTimeCFD);
178 fDigits->GetQT0(*fADC1);
179 fDigits->GetTimeLED(*fTimeLED);
180 fDigits->GetQT1(*fADC0);
dc7ca31d 181 Int_t meantime = fDigits->MeanTime();
182 Int_t timediff = fDigits->TimeDiff();
183 Int_t mult0=fDigits->SumMult();
184 Int_t mult1=fDigits->SumMult();
c41ceaac 185 Int_t timeA = fDigits->BestTimeC();
186 Int_t timeC = fDigits->BestTimeA();
088c40b6 187
188
d0bcd1fb 189 // TArrayI *allData = new TArrayI(110);
190 Int_t allData[110][1];
191 for (Int_t i=0; i<110; i++) allData[i][0] = 0;
192
193 allData[0][0]=0;
194 for (Int_t i=1; i<13; i++) {
195 allData[i][0] = fTimeCFD->At(i-1);
196 allData[i+12][0] = fTimeLED->At(i-1);
197 allData[i+56][0] = fTimeCFD->At(i-1+12);
198 allData[i+68][0] = fTimeLED->At(i-1+12);
199 }
200
201 for (Int_t iii=0; iii<12; iii++) {
202 allData[2*iii+25][0] = fADC1->At(iii);
203 allData[2*iii+26][0] = fADC0->At(iii);
dc7ca31d 204 }
d0bcd1fb 205 for (Int_t ii=12; ii<24; ii++) {
206 allData[2*ii+57][0] = fADC1->At(ii);
207 allData[2*ii+58][0] = fADC0->At(ii);
208 }
209
210 allData[49][0] = meantime;
211 allData[50][0] = timediff;
212 allData[51][0] = timeA;
213 allData[52][0] = timeC;
214 allData[53][0] = mult0;
215 allData[54][0] = mult1;
216 allData[55][0] = mult0;
217 allData[56][0] = mult1;
218
219 // cout.setf( ios_base::hex, ios_base::basefield );
dc7ca31d 220 //space for DRM header
5325480c 221 fIndex += 6;
dc7ca31d 222
29d3e0eb 223
5325480c 224 Int_t startTRM=fIndex;
dc7ca31d 225 //space for 1st TRM header
226 fIndex ++;
227 positionOfTRMHeader= fIndex;
dc7ca31d 228 //space for chain header
229 fIndex ++;
d8079a1a 230 WriteChainDataHeader(1, 1); //
231
232 // fIndex++;
dc7ca31d 233 // Loop through all PMT
234 Int_t chain=0;
235 Int_t iTDC = 0;
236 Int_t channel=0;
237 Int_t trm1words=0;
d8079a1a 238 Int_t itrm=7;
239 Int_t inside =0;
53111f83 240 Int_t isData = 0;
256d4943 241 AliT0LookUpKey * lookkey = new AliT0LookUpKey();
242 AliT0LookUpValue * lookvalue ;//= new AliT0LookUpValue(trm,tdc,chain,channel);
29d3e0eb 243 for (Int_t det = 0; det < 105; det++) {
d0bcd1fb 244 time = allData[det][0];
21bbda77 245 if (time >0 && time !=99999) {
29d3e0eb 246 lookkey->SetKey(det);
247 lookvalue = (AliT0LookUpValue*) fLookUp.GetValue((TObject*)lookkey);
248 if (lookvalue )
249 {
53111f83 250 isData++;
29d3e0eb 251 itrm= lookvalue->GetTRM();
d0bcd1fb 252 if (det >56 &&inside == 0) {
29d3e0eb 253 WriteChainDataTrailer(1); // 1st chain trailer
254 fIndex++;
d8079a1a 255 WriteChainDataHeader(2, 1);
256 // fIndex++;
257 inside++;
29d3e0eb 258 }
259 chain = lookvalue->GetChain();
260 iTDC = lookvalue->GetTDC();
261 channel = lookvalue->GetChannel();
29d3e0eb 262 FillTime(channel, iTDC, time);
d0bcd1fb 263 AliDebug(1,Form("look %i itrm %i , chain %i , iTDC %i, channel %i time %i", det,itrm,chain,iTDC,channel, time));
29d3e0eb 264 }
265 else
266 {
267 cout<<" no lookup value for key "<<det<<endl;
268 // break;
269 }
dc7ca31d 270 }
29d3e0eb 271
dc7ca31d 272 }
53111f83 273 if (inside==0) {
274 WriteChainDataTrailer(1); // 1st chain trailer
275 fIndex++;
276 WriteChainDataHeader(2, 1);
277 }
d8079a1a 278 // WriteChainDataHeader(2, 1); //
5325480c 279 WriteChainDataTrailer(3); // 2st chain trailer
dc7ca31d 280 WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
29d3e0eb 281
282
256d4943 283 trm1words = fIndex - startTRM;
dc7ca31d 284 //space for 2st TRM header
29d3e0eb 285
d8079a1a 286 WriteTRMDataHeader(itrm, trm1words , positionOfTRMHeader);
29d3e0eb 287
288 //DRM trailer
d8079a1a 289 WriteTrailer(1,0,fEventNumber,5);
5325480c 290
291 WriteDRMDataHeader();
29d3e0eb 292
dc7ca31d 293}
dc7ca31d 294
295//_____________________________________________________________________________
296
297void AliT0RawData::WriteDRMDataHeader()
298{
299//Write a (dummy or real) DDL DRM data header,
300//set the compression bit if compressed
301// UInt_t drmheader[4];
302 UInt_t word;
303 UInt_t baseWord=0;
304 //fill DRM headers
305 //DRM Global Header
306 word = 1;
62b80e9d 307 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
dc7ca31d 308 word = fIndex ;
309
62b80e9d 310 AliBitPacking::PackWord(word,baseWord,4, 20); // event words
dc7ca31d 311 word=124;
62b80e9d 312 AliBitPacking::PackWord(word,baseWord, 21, 27); // event words
dc7ca31d 313 word=4;
62b80e9d 314 AliBitPacking::PackWord(word,baseWord,28, 31);// 0100 marks header
dc7ca31d 315 fBuffer[0]= baseWord;
316
5325480c 317
dc7ca31d 318 //DRM status header 1
319 word = 1;
62b80e9d 320 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
dc7ca31d 321 word = 1;
62b80e9d 322 AliBitPacking::PackWord(word,baseWord,4, 14); // slotID now 0000000001
dc7ca31d 323 word = 1;
62b80e9d 324 AliBitPacking::PackWord(word,baseWord,15, 15); //if 1 LHC clock is coorectly recieved from CPDM
dc7ca31d 325 word=0;
62b80e9d 326 AliBitPacking::PackWord(word,baseWord,16,27); // reserve for future use
dc7ca31d 327 word=4;
62b80e9d 328 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
329 fBuffer[1] = baseWord;
330
5325480c 331 word=0;
332 baseWord=0;
62b80e9d 333
334 //DRM status header 2
335 word = 1;
336 AliBitPacking::PackWord(word,baseWord, 0, 3); // 0001
337 word = 3;
338 AliBitPacking::PackWord(word,baseWord, 4, 14); //enable slotID now 00000000011
339 word = 0;
340 AliBitPacking::PackWord(word,baseWord, 15, 15); // something
341 word=0;
342 AliBitPacking::PackWord(word,baseWord, 16, 27); // fault ID for simulation 0
343 word=4;
344 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
345 fBuffer[2]= baseWord;
346
347 word=0;
348 baseWord=0;
349 //DRM status header 3
350 word = 1;
351 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
dc7ca31d 352 word = 0;
62b80e9d 353 AliBitPacking::PackWord(word,baseWord,4, 27); // TTC event counter
dc7ca31d 354 word=4;
62b80e9d 355 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
dc7ca31d 356 fBuffer[3]= baseWord;
357
5325480c 358 // new DRM format
359 fBuffer[4]= baseWord;
360 fBuffer[5]= baseWord;
62b80e9d 361
dc7ca31d 362 word=0;
363 baseWord=0;
364
365}
366
367//_____________________________________________________________________________
368
369void AliT0RawData::WriteTRMDataHeader(UInt_t slotID, Int_t nWordsInTRM,
370 Int_t positionOfTRMHeader)
371{
372//Write a (dummy or real) DDL TRM data header,
373//set the compression bit if compressed
374// UInt_t trmheader;
375 UInt_t word;
376 UInt_t baseWord=0;
377 //fill TRM headers
378 //TRM Global Header
379 word = slotID;
62b80e9d 380 AliBitPacking::PackWord(word,baseWord,0, 3); // slotID
dc7ca31d 381 word = nWordsInTRM;
382 //+this word - DRM header
383
62b80e9d 384 AliBitPacking::PackWord(word,baseWord,4, 16); // event words
dc7ca31d 385 word=0;
62b80e9d 386 AliBitPacking::PackWord(word,baseWord,17,18); // ACQ
dc7ca31d 387 word=0;
62b80e9d 388 AliBitPacking::PackWord(word,baseWord,19,19); // L SEY inside LUT
dc7ca31d 389 word=0;
62b80e9d 390 AliBitPacking::PackWord(word,baseWord,20,27); // MBZ
dc7ca31d 391 word=4;
62b80e9d 392 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
dc7ca31d 393 fBuffer[positionOfTRMHeader] = baseWord;
62b80e9d 394
dc7ca31d 395 word=0;
396 baseWord=0;
397
398}
399
400//_____________________________________________________________________________
401
402void AliT0RawData::WriteChainDataHeader(UInt_t chainNumber,UInt_t slotID)
403{
404//Write a (dummy or real) DDL Chain data header,
405//set the compression bit if compressed
406// chainNumber 00 or 10
407 UInt_t word;
408 UInt_t baseWord=0;
409 //fill TRM headers
410 //TRM Global Header
411 word = slotID; // ask Tatiana 7 or 9
62b80e9d 412 AliBitPacking::PackWord(word,baseWord,0, 3); // slotID
dc7ca31d 413 word = 0;
62b80e9d 414 AliBitPacking::PackWord(word,baseWord,4, 15); // bunchID
dc7ca31d 415 word=0;
62b80e9d 416 AliBitPacking::PackWord(word,baseWord,16,23); // PB24 temperature
dc7ca31d 417 word=0;
62b80e9d 418 AliBitPacking::PackWord(word,baseWord,24,26); // PB24 ID
dc7ca31d 419 word=0;
62b80e9d 420 AliBitPacking::PackWord(word,baseWord,27,27); // TS
dc7ca31d 421 word=chainNumber;
62b80e9d 422 AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
5325480c 423 fBuffer[fIndex] = baseWord;
d8079a1a 424 //cout<<" chain header "<<baseWord<<" number "<<chainNumber<<endl;
5325480c 425 word=0;
426 baseWord=0;
427
428}
429//_____________________________________________________________________________
430
431void AliT0RawData::WriteChainDataTrailer(UInt_t chainNumber )
432{
433//Write a (dummy or real) DDL Chain data trailer
434//set the compression bit if compressed
435// chainNumber 00 or 10
436 UInt_t word;
437 UInt_t baseWord=0;
438 word = 0; // ask Tatiana 7 or 9
62b80e9d 439 AliBitPacking::PackWord(word,baseWord,0, 3); // status
5325480c 440 word = 0;
62b80e9d 441 AliBitPacking::PackWord(word,baseWord,4, 15); // MBZ
5325480c 442 word=fEventNumber;
62b80e9d 443 AliBitPacking::PackWord(word,baseWord,16,27); // event counter
5325480c 444 word=chainNumber;
62b80e9d 445 AliBitPacking::PackWord(word,baseWord,28,31); // chain number
5325480c 446 fIndex++;
447 fBuffer[fIndex] = baseWord;
62b80e9d 448
dc7ca31d 449 word=0;
450 baseWord=0;
451
452}
453//_____________________________________________________________________________
454
455void AliT0RawData::WriteDataHeader(Bool_t dummy, Bool_t compressed)
456{
457//Write a (dummy or real) DDL data header,
458//set the compression bit if compressed
459
460 AliRawDataHeaderSim header;
461
462 if (dummy) {
463 //if size=0 it means that this data header is a dummy data header
464 fDataHeaderPos = fFile->Tellp();
465 fFile->WriteBuffer((char*)(&header), sizeof(header));
466 } else {
467 UInt_t currentFilePos = fFile->Tellp();
468 fFile->Seekp(fDataHeaderPos);
469 header.fSize = currentFilePos-fDataHeaderPos;
470 header.SetAttribute(0); // valid data
471 if (compressed) header.SetAttribute(1);
472 fFile->WriteBuffer((char*)(&header), sizeof(header));
473 fFile->Seekp(currentFilePos);
474 }
475
476}
477
478//___ __________________________________________________________________________
479
480
481void AliT0RawData::WriteTrailer(UInt_t slot, Int_t word1, UInt_t word2, UInt_t word3)
482{
94249139 483//Write a (dummy or real) DDL Chain data trailer
dc7ca31d 484
485 UInt_t word;
486 UInt_t baseWord=0;
487 word = slot;
62b80e9d 488 AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
dc7ca31d 489 word=word1;
62b80e9d 490 AliBitPacking::PackWord(word,baseWord,4, 15); // CRC ?
dc7ca31d 491 word = word2;
62b80e9d 492 AliBitPacking::PackWord(word,baseWord,16,27); // event counter
dc7ca31d 493 word=word3;
62b80e9d 494 AliBitPacking::PackWord(word,baseWord,28,31); // marks trailer
dc7ca31d 495 fIndex++;
496 fBuffer[fIndex] = baseWord;
62b80e9d 497
dc7ca31d 498 word=0;
499 baseWord=0;
500
501}
502
503//---------------------------------------------------------------------------------------
504//---------------------------------------------------------------------------------------
505void AliT0RawData::FillTime(Int_t ch, Int_t iTDC, Int_t time)
506{
94249139 507 // put all time fields thother in 1 word
508
dc7ca31d 509 UInt_t word;
510 UInt_t baseWord=0;
511
512 word=time;
62b80e9d 513 AliBitPacking::PackWord(word,baseWord, 0, 20); // Time
dc7ca31d 514
515 word=ch;
62b80e9d 516 AliBitPacking::PackWord(word,baseWord, 21, 23); // number of channel
dc7ca31d 517 word=iTDC;
62b80e9d 518 AliBitPacking::PackWord(word,baseWord, 24, 27); // TDC ID
dc7ca31d 519
520 word=0;
62b80e9d 521 AliBitPacking::PackWord(word,baseWord, 28, 28); // E = 0 in simulation
dc7ca31d 522 word=0;
62b80e9d 523 AliBitPacking::PackWord(word,baseWord, 29, 30); // PS bit data 00
dc7ca31d 524 word=1;
62b80e9d 525 AliBitPacking::PackWord(word,baseWord, 31, 31); // 1
dc7ca31d 526 fIndex++;
527 fBuffer[fIndex]=baseWord;
62b80e9d 528
529 word=0;
dc7ca31d 530 baseWord=0;
dc7ca31d 531}
532//---------------------------------------------------------------------------------------
533
534Int_t AliT0RawData::RawDataT0(AliT0digit *fDigits)
5bf55199 535 //Int_t AliT0RawData::RawDataT0(*fDigits)
dc7ca31d 536{
537 //This method creates the Raw data files for T0 detector
538
539
540 // const Int_t kSize=512; //2*AliTOFGeometry::NpadXSector()
541 //max number of digits per DDL file times 2
542 // UInt_t fBuffer[kSize];
543 // UInt_t baseWord;
544 // UInt_t word;
545
546 fIndex=-1;
547
94c27e4f 548
dc7ca31d 549 WriteDataHeader(kTRUE, kFALSE);
550 GetDigits(fDigits);
551 //write packing digits
c41ceaac 552
553
dc7ca31d 554 fFile->WriteBuffer((char*) fBuffer,((fIndex+1)*sizeof(UInt_t)));
555 //write real data header on its place
556 WriteDataHeader(kFALSE, kFALSE);
557
558
559 //end for
560
561 return 0;
562
563}