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 "AliTRDrawStreamOld.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
81 for (Int_t i = 0; i < 1270; i++) {
88 for (Int_t j = 0; j < 2; j++) {
96 //____________________________________________________________________________
97 AliTRDtestBeam::AliTRDtestBeam(const char *filename) :
116 // AliTRDtestBeam constructor
119 fDataStream = new ifstream(filename, ifstream::in | ifstream::binary );
120 cout << fDataStream->is_open() << endl;
121 //fHeaderIsRead = kTRUE;
122 fHeaderIsRead = kTRUE;
124 fFileHeader = new Char_t[fgkFileHeadSize];
125 fEventHeader = new Char_t[fgkEventHeadSize];
126 fEventData = new Char_t[fLimit];
130 //____________________________________________________________________________
131 AliTRDtestBeam::AliTRDtestBeam(const AliTRDtestBeam &tb)
156 //____________________________________________________________________________
157 AliTRDtestBeam::~AliTRDtestBeam()
163 if (fDataStream) delete fDataStream;
164 if (fEventHeader) delete fEventHeader;
165 if (fFileHeader) delete fFileHeader;
166 if (fEventData) delete fEventData;
170 //____________________________________________________________________________
171 Int_t AliTRDtestBeam::NextEvent()
174 // Read the next event
177 Long_t dataSize=0,ldcOff; //,ldc_id,ldc2_id;
178 Long_t ldcSize,eqId; //,ev_l2;
182 if ( !fHeaderIsRead ) {
183 fDataStream->read(fFileHeader, fgkFileHeadSize);
184 if(fDataStream->fail()) {
185 cerr << "Error reading file header! " << endl;
188 cout << " Run nr. " << Int(fgkPosRun, fFileHeader) << endl;
192 fDataStream->read(fEventHeader, fgkEventHeadSize);
193 if(fDataStream->fail()) {
194 cerr << "End of file, Event " << fEventCount << endl;
198 dataSize = Int(fgkPosLength, fEventHeader)-fgkEventHeadSize; //?
199 eventNr = Int((4+fgkPosRun), fEventHeader); //ev.nr.
200 //cout << " Event " << eventNr <<" size "<< dataSize <<endl;
202 if (eventNr <= fEventCount-1) { //watch-out ...event counter starts at 1?
203 cout << fEventCount << " End of file?, Event " << fEventCount << endl;
206 //cout << "Run " << Int(fgkPosRun, header)<< " , Event " <<eventNr <<endl;
208 // enough space for data?
209 if (fLimit < dataSize) {
211 fEventData = new Char_t[dataSize];
215 fDataStream->read(fEventData, dataSize);
217 if(fDataStream->fail()) {
218 cerr << "End of file, Event " << fEventCount; // << endl;
222 //cout << " ...IDs (size) : ";
224 ldcOff=0; // size of data from one DDL link
226 for ( size_t k = 0; k < 2; k++ ) { // 2 LDCs (DDL & VME)
228 ldcSize = Int(ldcOff+fgkPosLength, fEventData); //
229 //ldcSize1=(ldcSize-fgkLdcHeadSize);
230 eqId = Int(ldcOff+fgkLdcHeadSize+fgkEqId, fEventData);
231 //cout << eqId <<" ("<<ldcSize<<") ";
233 evL1 = Int((4+ldcOff+fgkPosRun), fEventData); //ev.nr.
234 if ( evL1 != eventNr ){
235 //cerr << "eqId " <<eqId<<" event nr. mismatch? " << eventNr <<" / "<< evL1 <<" ...LDC data size (header:68) " <<ldcSize<<endl;
238 if (eqId == 1024) { //DDL data
239 fDdlOff = ldcOff; //+fgkLdcHeadSize+fgkEquipHeadSize + 32;
243 if (eqId == 550) { //Si-strip data (+QDC)
244 //cout << "550" << endl;
245 fSiOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
246 word = Int(fSiOff, fEventData);
247 Short_t lenSi1 = (word >> 16) & 0xffff;
248 Short_t lenSi2 = word & 0xffff;
249 fQdcOff=fSiOff+4*(lenSi1+lenSi2+1)+fgkEquipHeadSize+4;
251 else if (eqId == 1182) { //QDC first...
252 //cout << "1182" << endl;
253 fQdcOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
254 fSiOff=fQdcOff+fgkEquipHeadSize+4;
262 //cout << "DDL = " << fDdlOff << endl;
263 // cout << "Si = " << fSiOff << endl;
264 //cout << "QDC = " << fQdcOff << endl;
268 fEventCount++; //event counter
272 //____________________________________________________________________________
273 Int_t AliTRDtestBeam::DecodeSi()
276 // Decode the silicon detector
279 if (fSiOff < 0) return 0;
281 // cout << "decoding Si data" << endl;
285 word=Int(fSiOff, fEventData);
286 fNSi1 = (word >> 16) & 0xffff;
287 fNSi2 = word & 0xffff;
290 for (int i = 0; i < fNSi1; i++) {
291 fSi1Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
292 fSi1Charge[i] = Int(cSi, fEventData) & 0xfff;
296 for (int i = 0; i < fNSi2; i++) { //1,for Date!
297 fSi2Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
298 fSi2Charge[i] = Int(cSi, fEventData) & 0xfff;
311 Int_t qclX=0,qclY=0, nclX=0,nclY=0, nstX=0,nstY=0;
312 const Int_t kThr = 20;
322 for( int i = 0; i < GetNSi1(); i++ ) {
324 if (fSi1Address[i] == 0) continue; // noise
331 if ( i > 0 && i < (GetNSi1()-1) ) {
333 if ( (a-fSi1Address[i+1]) == -1 &&
334 (a-fSi1Address[i-1]) == 1)
338 qclX = q+fSi1Charge[i+1]+fSi1Charge[i-1];
344 qclY = q+fSi1Charge[i+1]+fSi1Charge[i-1];
351 else if ( (a-fSi1Address[i-1]) == 1)
355 qclX = q+fSi1Charge[i-1];
361 qclY = q+fSi1Charge[i-1];
367 else if ( (a-fSi1Address[i+1]) == -1)
371 qclX = q+fSi1Charge[i+1];
377 qclY = q+fSi1Charge[i+1];
387 if (nst1==2 && nstX<4 && nstY<4 ) {
388 fX[0] = (float)(amaxX*0.05); // [mm]
389 fY[0] = (float)((amaxY-aLenSiX)*0.05);
390 fQx[0] = (float)qclX;
391 fQy[0] = (float)qclY;
410 for( int i = 0; i < GetNSi2(); i++ ) {
412 if (fSi2Address[i] == 1279) continue; // noise
413 if (fSi2Address[i] == 0) continue; // noise
418 if ( q > kThr/2 ) //...as Si2 has 1/2 gain!
420 if ( i > 0 && i < (GetNSi2()-1) ) {
422 if ( (a-fSi2Address[i+1]) == -1 &&
423 (a-fSi2Address[i-1]) == 1)
427 qclX = q+fSi2Charge[i+1]+fSi2Charge[i-1];
433 qclY = q+fSi2Charge[i+1]+fSi2Charge[i-1];
440 else if ( (a-fSi2Address[i-1]) == 1)
444 qclX = q+fSi2Charge[i-1];
450 qclY = q+fSi2Charge[i-1];
456 else if ( (a-fSi2Address[i+1]) == -1)
460 qclX = q+fSi2Charge[i+1];
466 qclY = q+fSi2Charge[i+1];
477 if (nst2==2 && nstX<4 && nstY<4 ) {
478 fX[1] = (float)(amaxX*0.05); // [mm]
479 fY[1] = (float)((amaxY-aLenSiX)*0.05);
480 fQx[1] = (float)qclX;
481 fQy[1] = (float)qclY;
490 if (fQdcOff < 0) return 0;
492 word=Int(fQdcOff, fEventData);
493 fPb = (Double_t)((word >> 16) & 0xFFF);
494 fCher = (Double_t)((word ) & 0xFFF);
496 //cout << fCher << " " << fPb << endl;
500 //____________________________________________________________________________
501 AliTRDrawStreamOld *AliTRDtestBeam::GetTRDrawStream()
504 // Get the TRD raw stream
507 // needs AliTRDrawStream
508 //cout << "Chamber reader:" << (Int_t)(fEventData+fDdlOff) << " " << fDdlSize << endl;
509 //int ifout = open("dump.dat", O_WRONLY | O_TRUNC | O_CREAT);
510 //write(ifout, (void*)(fEventData+fDdlOff+16), fDdlSize);
513 AliRawReaderMemory *reader = new AliRawReaderMemory((UChar_t*)(fEventData+fDdlOff), (UInt_t)fDdlSize);
514 reader->SetEquipmentID(1024);
515 reader->ReadHeader();
516 //AliTRDrawStream::RawBufferMissAligned(kTRUE);
518 AliTRDrawStreamOld::SetExtraWordsFix();
519 AliTRDrawStreamOld::AllowCorruptedData();
521 AliTRDrawStreamOld *tb = new AliTRDrawStreamOld(reader);
522 tb->SetNoErrorWarning();
528 AliEawReaderMemory *rmem = data->GetRawReader();
531 AliTRDrawStream tb(rmem);
533 AliTRDrawStream::SupressWarnings(kTRUE);
538 //____________________________________________________________________________
539 Int_t AliTRDtestBeam::Int(Int_t i, const Char_t * const start) const
548 char *q=(char*)(start+i);
549 char p[] = {q[3], q[2], q[1], q[0]};
551 } else return *((int*)(start+i));
555 //____________________________________________________________________________