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 // Class to handle the test beam data of 2007 //
23 // Sylwester Radomski (radomski@physi.uni-heidelberg.de) //
24 // Anton Andronic (A.Andronic@gsi.de) //
26 ////////////////////////////////////////////////////////////////////////////
30 //#include <sys/types.h>
31 //#include <sys/stat.h>
35 #include "AliTRDrawStream.h"
36 #include "AliRawReaderMemory.h"
37 #include "AliTRDtestBeam.h"
39 ClassImp(AliTRDtestBeam)
41 const Long_t AliTRDtestBeam::fgkFileHeadSize = 544; // ?
42 const Long_t AliTRDtestBeam::fgkEventHeadSize = 68; //?
43 const Long_t AliTRDtestBeam::fgkLdcHeadSize = 68; //?
44 const Long_t AliTRDtestBeam::fgkEquipHeadSize = 28; //
45 const Int_t AliTRDtestBeam::fgkVmeIn =1; //VME event in
46 const Int_t AliTRDtestBeam::fgkSimIn =1; //Si-strips in
51 const Int_t AliTRDtestBeam::fgkPosRun = 20; //run nr. (in file and event header)
52 const Int_t AliTRDtestBeam::fgkPosLength = 0; //event/equip. length
53 const Int_t AliTRDtestBeam::fgkEqId = 8; //equipment id.
54 const Int_t AliTRDtestBeam::fgkPosSiOff = 12; //Si data size offset (3 extra words!!!)
58 //____________________________________________________________________________
59 AliTRDtestBeam::AliTRDtestBeam() :
78 // Standard construction
82 //____________________________________________________________________________
83 AliTRDtestBeam::AliTRDtestBeam(const char *filename) :
102 // AliTRDtestBeam constructor
105 fDataStream = new ifstream(filename, ifstream::in | ifstream::binary );
106 cout << fDataStream->is_open() << endl;
107 //fHeaderIsRead = kTRUE;
108 fHeaderIsRead = kTRUE;
110 fFileHeader = new Char_t[fgkFileHeadSize];
111 fEventHeader = new Char_t[fgkEventHeadSize];
112 fEventData = new Char_t[fLimit];
116 //____________________________________________________________________________
117 AliTRDtestBeam::AliTRDtestBeam(const AliTRDtestBeam &tb)
142 //____________________________________________________________________________
143 AliTRDtestBeam::~AliTRDtestBeam()
149 if (fDataStream) delete fDataStream;
150 if (fEventHeader) delete fEventHeader;
151 if (fFileHeader) delete fFileHeader;
152 if (fEventData) delete fEventData;
156 //____________________________________________________________________________
157 Int_t AliTRDtestBeam::NextEvent()
160 // Read the next event
163 Long_t dataSize=0,ldcOff; //,ldc_id,ldc2_id;
164 Long_t ldcSize,eqId; //,ev_l2;
168 if ( !fHeaderIsRead ) {
169 fDataStream->read(fFileHeader, fgkFileHeadSize);
170 if(fDataStream->fail()) {
171 cerr << "Error reading file header! " << endl;
174 cout << " Run nr. " << Int(fgkPosRun, fFileHeader) << endl;
178 fDataStream->read(fEventHeader, fgkEventHeadSize);
179 if(fDataStream->fail()) {
180 cerr << "End of file, Event " << fEventCount << endl;
184 dataSize = Int(fgkPosLength, fEventHeader)-fgkEventHeadSize; //?
185 eventNr = Int((4+fgkPosRun), fEventHeader); //ev.nr.
186 //cout << " Event " << eventNr <<" size "<< dataSize <<endl;
188 if (eventNr <= fEventCount-1) { //watch-out ...event counter starts at 1?
189 cout << fEventCount << " End of file?, Event " << fEventCount << endl;
192 //cout << "Run " << Int(fgkPosRun, header)<< " , Event " <<eventNr <<endl;
194 // enough space for data?
195 if (fLimit < dataSize) {
197 fEventData = new Char_t[dataSize];
201 fDataStream->read(fEventData, dataSize);
203 if(fDataStream->fail()) {
204 cerr << "End of file, Event " << fEventCount; // << endl;
208 //cout << " ...IDs (size) : ";
210 ldcOff=0; // size of data from one DDL link
212 for ( size_t k = 0; k < 2; k++ ) { // 2 LDCs (DDL & VME)
214 ldcSize = Int(ldcOff+fgkPosLength, fEventData); //
215 //ldcSize1=(ldcSize-fgkLdcHeadSize);
216 eqId = Int(ldcOff+fgkLdcHeadSize+fgkEqId, fEventData);
217 //cout << eqId <<" ("<<ldcSize<<") ";
219 evL1 = Int((4+ldcOff+fgkPosRun), fEventData); //ev.nr.
220 if ( evL1 != eventNr ){
221 //cerr << "eqId " <<eqId<<" event nr. mismatch? " << eventNr <<" / "<< evL1 <<" ...LDC data size (header:68) " <<ldcSize<<endl;
224 if (eqId == 1024) { //DDL data
225 fDdlOff = ldcOff; //+fgkLdcHeadSize+fgkEquipHeadSize + 32;
229 if (eqId == 550) { //Si-strip data (+QDC)
230 //cout << "550" << endl;
231 fSiOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
232 word = Int(fSiOff, fEventData);
233 Short_t lenSi1 = (word >> 16) & 0xffff;
234 Short_t lenSi2 = word & 0xffff;
235 fQdcOff=fSiOff+4*(lenSi1+lenSi2+1)+fgkEquipHeadSize+4;
237 else if (eqId == 1182) { //QDC first...
238 //cout << "1182" << endl;
239 fQdcOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
240 fSiOff=fQdcOff+fgkEquipHeadSize+4;
248 //cout << "DDL = " << fDdlOff << endl;
249 // cout << "Si = " << fSiOff << endl;
250 //cout << "QDC = " << fQdcOff << endl;
254 fEventCount++; //event counter
258 //____________________________________________________________________________
259 Int_t AliTRDtestBeam::DecodeSi()
262 // Decode the silicon detector
265 if (fSiOff < 0) return 0;
267 // cout << "decoding Si data" << endl;
271 word=Int(fSiOff, fEventData);
272 fNSi1 = (word >> 16) & 0xffff;
273 fNSi2 = word & 0xffff;
276 for (int i = 0; i < fNSi1; i++) {
277 fSi1Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
278 fSi1Charge[i] = Int(cSi, fEventData) & 0xfff;
282 for (int i = 0; i < fNSi2; i++) { //1,for Date!
283 fSi2Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
284 fSi2Charge[i] = Int(cSi, fEventData) & 0xfff;
297 Int_t qclX=0,qclY=0, nclX=0,nclY=0, nstX=0,nstY=0;
298 const Int_t kThr = 20;
308 for( int i = 0; i < GetNSi1(); i++ ) {
310 if (fSi1Address[i] == 0) continue; // noise
317 if ( i > 0 && i < (GetNSi1()-1) ) {
319 if ( (a-fSi1Address[i+1]) == -1 &&
320 (a-fSi1Address[i-1]) == 1)
324 qclX = q+fSi1Charge[i+1]+fSi1Charge[i-1];
330 qclY = q+fSi1Charge[i+1]+fSi1Charge[i-1];
337 else if ( (a-fSi1Address[i-1]) == 1)
341 qclX = q+fSi1Charge[i-1];
347 qclY = q+fSi1Charge[i-1];
353 else if ( (a-fSi1Address[i+1]) == -1)
357 qclX = q+fSi1Charge[i+1];
363 qclY = q+fSi1Charge[i+1];
373 if (nst1==2 && nstX<4 && nstY<4 ) {
374 fX[0] = (float)(amaxX*0.05); // [mm]
375 fY[0] = (float)((amaxY-aLenSiX)*0.05);
376 fQx[0] = (float)qclX;
377 fQy[0] = (float)qclY;
396 for( int i = 0; i < GetNSi2(); i++ ) {
398 if (fSi2Address[i] == 1279) continue; // noise
399 if (fSi2Address[i] == 0) continue; // noise
404 if ( q > kThr/2 ) //...as Si2 has 1/2 gain!
406 if ( i > 0 && i < (GetNSi2()-1) ) {
408 if ( (a-fSi2Address[i+1]) == -1 &&
409 (a-fSi2Address[i-1]) == 1)
413 qclX = q+fSi2Charge[i+1]+fSi2Charge[i-1];
419 qclY = q+fSi2Charge[i+1]+fSi2Charge[i-1];
426 else if ( (a-fSi2Address[i-1]) == 1)
430 qclX = q+fSi2Charge[i-1];
436 qclY = q+fSi2Charge[i-1];
442 else if ( (a-fSi2Address[i+1]) == -1)
446 qclX = q+fSi2Charge[i+1];
452 qclY = q+fSi2Charge[i+1];
463 if (nst2==2 && nstX<4 && nstY<4 ) {
464 fX[1] = (float)(amaxX*0.05); // [mm]
465 fY[1] = (float)((amaxY-aLenSiX)*0.05);
466 fQx[1] = (float)qclX;
467 fQy[1] = (float)qclY;
476 if (fQdcOff < 0) return 0;
478 word=Int(fQdcOff, fEventData);
479 fPb = (Double_t)((word >> 16) & 0xFFF);
480 fCher = (Double_t)((word ) & 0xFFF);
482 //cout << fCher << " " << fPb << endl;
486 //____________________________________________________________________________
487 AliTRDrawStream *AliTRDtestBeam::GetTRDrawStream()
490 // Get the TRD raw stream
493 // needs AliTRDrawStream
494 //cout << "Chamber reader:" << (Int_t)(fEventData+fDdlOff) << " " << fDdlSize << endl;
495 //int ifout = open("dump.dat", O_WRONLY | O_TRUNC | O_CREAT);
496 //write(ifout, (void*)(fEventData+fDdlOff+16), fDdlSize);
499 AliRawReaderMemory *reader = new AliRawReaderMemory((UChar_t*)(fEventData+fDdlOff), (UInt_t)fDdlSize);
500 reader->SetEquipmentID(1024);
501 reader->ReadHeader();
502 //AliTRDrawStream::RawBufferMissAligned(kTRUE);
504 AliTRDrawStream::SetNoErrorWarning();
505 AliTRDrawStream::SetExtraWordsFix();
506 AliTRDrawStream::AllowCorruptedData();
508 AliTRDrawStream *tb = new AliTRDrawStream(reader);
514 AliEawReaderMemory *rmem = data->GetRawReader();
517 AliTRDrawStream tb(rmem);
519 AliTRDrawStream::SupressWarnings(kTRUE);
524 //____________________________________________________________________________
525 Int_t AliTRDtestBeam::Int(Int_t i, Char_t *start) const
534 char *q=(char*)(start+i);
535 char p[] = {q[3], q[2], q[1], q[0]};
537 } else return *((int*)(start+i));
541 //____________________________________________________________________________