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