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 #include "AliTRDtestBeam.h"
20 #include "AliTRDRawStreamTB.h"
21 #include "AliRawReaderMemory.h"
27 #include <sys/types.h>
33 ClassImp(AliTRDtestBeam)
35 const Long_t AliTRDtestBeam::fgkFileHeadSize = 544; // ?
36 const Long_t AliTRDtestBeam::fgkEventHeadSize = 68; //?
37 const Long_t AliTRDtestBeam::fgkLdcHeadSize = 68; //?
38 const Long_t AliTRDtestBeam::fgkEquipHeadSize = 28; //
39 const Int_t AliTRDtestBeam::fgkVmeIn =1; //VME event in
40 const Int_t AliTRDtestBeam::fgkSimIn =1; //Si-strips in
45 const Int_t AliTRDtestBeam::fgkPosRun = 20; //run nr. (in file and event header)
46 const Int_t AliTRDtestBeam::fgkPosLength = 0; //event/equip. length
47 const Int_t AliTRDtestBeam::fgkEqId = 8; //equipment id.
48 const Int_t AliTRDtestBeam::fgkPosSiOff = 12; //Si data size offset (3 extra words!!!)
52 //____________________________________________________________________________
53 AliTRDtestBeam::AliTRDtestBeam() :
72 // Standard construction
76 //____________________________________________________________________________
77 AliTRDtestBeam::AliTRDtestBeam(const char *filename) :
96 // AliTRDtestBeam constructor
99 fDataStream = new ifstream(filename, ifstream::in | ifstream::binary );
100 cout << fDataStream->is_open() << endl;
101 //fHeaderIsRead = kTRUE;
102 fHeaderIsRead = kTRUE;
104 fFileHeader = new Char_t[fgkFileHeadSize];
105 fEventHeader = new Char_t[fgkEventHeadSize];
106 fEventData = new Char_t[fLimit];
110 //____________________________________________________________________________
111 AliTRDtestBeam::~AliTRDtestBeam()
117 if (fDataStream) delete fDataStream;
118 if (fEventHeader) delete fEventHeader;
119 if (fFileHeader) delete fFileHeader;
120 if (fEventData) delete fEventData;
124 //____________________________________________________________________________
125 Int_t AliTRDtestBeam::NextEvent()
128 // Read the next event
131 Long_t dataSize=0,ldcOff; //,ldc_id,ldc2_id;
132 Long_t ldcSize,eqId; //,ev_l2;
136 if ( !fHeaderIsRead ) {
137 fDataStream->read(fFileHeader, fgkFileHeadSize);
138 if(fDataStream->fail()) {
139 cerr << "Error reading file header! " << endl;
142 cout << " Run nr. " << Int(fgkPosRun, fFileHeader) << endl;
146 fDataStream->read(fEventHeader, fgkEventHeadSize);
147 if(fDataStream->fail()) {
148 cerr << "End of file, Event " << fEventCount << endl;
152 dataSize = Int(fgkPosLength, fEventHeader)-fgkEventHeadSize; //?
153 eventNr = Int((4+fgkPosRun), fEventHeader); //ev.nr.
154 //cout << " Event " << eventNr <<" size "<< dataSize <<endl;
156 if (eventNr <= fEventCount-1) { //watch-out ...event counter starts at 1?
157 cout << fEventCount << " End of file?, Event " << fEventCount << endl;
160 //cout << "Run " << Int(fgkPosRun, header)<< " , Event " <<eventNr <<endl;
162 // enough space for data?
163 if (fLimit < dataSize) {
165 fEventData = new Char_t[dataSize];
169 fDataStream->read(fEventData, dataSize);
171 if(fDataStream->fail()) {
172 cerr << "End of file, Event " << fEventCount; // << endl;
176 //cout << " ...IDs (size) : ";
178 ldcOff=0; // size of data from one DDL link
180 for ( size_t k = 0; k < 2; k++ ) { // 2 LDCs (DDL & VME)
182 ldcSize = Int(ldcOff+fgkPosLength, fEventData); //
183 //ldcSize1=(ldcSize-fgkLdcHeadSize);
184 eqId = Int(ldcOff+fgkLdcHeadSize+fgkEqId, fEventData);
185 //cout << eqId <<" ("<<ldcSize<<") ";
187 evL1 = Int((4+ldcOff+fgkPosRun), fEventData); //ev.nr.
188 if ( evL1 != eventNr ){
189 //cerr << "eqId " <<eqId<<" event nr. mismatch? " << eventNr <<" / "<< evL1 <<" ...LDC data size (header:68) " <<ldcSize<<endl;
192 if (eqId == 1024) { //DDL data
193 fDdlOff = ldcOff; //+fgkLdcHeadSize+fgkEquipHeadSize + 32;
197 if (eqId == 550) { //Si-strip data (+QDC)
198 //cout << "550" << endl;
199 fSiOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
200 word = Int(fSiOff, fEventData);
201 Short_t lenSi1 = (word >> 16) & 0xffff;
202 Short_t lenSi2 = word & 0xffff;
203 fQdcOff=fSiOff+4*(lenSi1+lenSi2+1)+fgkEquipHeadSize+4;
205 else if (eqId == 1182) { //QDC first...
206 //cout << "1182" << endl;
207 fQdcOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
208 fSiOff=fQdcOff+fgkEquipHeadSize+4;
216 //cout << "DDL = " << fDdlOff << endl;
217 // cout << "Si = " << fSiOff << endl;
218 //cout << "QDC = " << fQdcOff << endl;
222 fEventCount++; //event counter
226 //____________________________________________________________________________
227 Int_t AliTRDtestBeam::DecodeSi()
230 // Decode the silicon detector
233 if (fSiOff < 0) return 0;
235 // cout << "decoding Si data" << endl;
239 word=Int(fSiOff, fEventData);
240 fNSi1 = (word >> 16) & 0xffff;
241 fNSi2 = word & 0xffff;
244 for (int i = 0; i < fNSi1; i++) {
245 fSi1Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
246 fSi1Charge[i] = Int(cSi, fEventData) & 0xfff;
250 for (int i = 0; i < fNSi2; i++) { //1,for Date!
251 fSi2Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
252 fSi2Charge[i] = Int(cSi, fEventData) & 0xfff;
260 int qmaxX; int amaxX;
261 int qmaxY; int amaxY;
268 for( int i = 0; i < GetNSi1(); i++ ) {
270 if (fSi1Address[i] == 0) continue; // noise
272 if (fSi1Address[i] < aLenSiX ) {
273 if( fSi1Charge[i] > qmaxX ) {
274 qmaxX = fSi1Charge[i];
275 amaxX = fSi1Address[i];
278 if( fSi1Charge[i] > qmaxY ) {
279 qmaxY = fSi1Charge[i];
280 amaxY = fSi1Address[i];
285 fX[0] = (float)(amaxX*0.05); // [mm]
286 fY[0] = (float)((amaxY-aLenSiX)*0.05);
287 fQx[0] = (float)qmaxX;
288 fQy[0] = (float)qmaxY;
296 for( int i = 0; i < GetNSi2(); i++ ) {
298 if (fSi2Address[i] == 1279) continue; // noise
299 if (fSi2Address[i] == 0) continue; // noise
301 if(fSi2Address[i] < aLenSiX) {
302 if( fSi2Charge[i] > qmaxX ) {
303 qmaxX = fSi2Charge[i];
304 amaxX = fSi2Address[i];
307 if( fSi2Charge[i] > qmaxY ) {
308 //if (fSi2Charge[i] > 50) cout << fSi2Charge[i] << " " << i << " " << fSi2Address[i] << endl;
309 qmaxY = fSi2Charge[i];
310 amaxY = fSi2Address[i];
315 fX[1] = (float)(amaxX*0.05); // [mm]
316 fY[1] = (float)((amaxY-aLenSiX)*0.05);
317 fQx[1] = (float)qmaxX;
318 fQy[1] = (float)qmaxY;
320 if (fQdcOff < 0) return 0;
322 word=Int(fQdcOff, fEventData);
323 fPb = (Double_t)((word >> 16) & 0xFFF);
324 fCher = (Double_t)((word ) & 0xFFF);
326 //cout << fCher << " " << fPb << endl;
330 //____________________________________________________________________________
331 AliTRDRawStreamTB *AliTRDtestBeam::GetTRDrawStream()
334 // Get the TRD raw stream
337 // needs AliTRDRawStreamTB
338 //cout << "Chamber reader:" << (Int_t)(fEventData+fDdlOff) << " " << fDdlSize << endl;
339 //int ifout = open("dump.dat", O_WRONLY | O_TRUNC | O_CREAT);
340 //write(ifout, (void*)(fEventData+fDdlOff+16), fDdlSize);
343 AliRawReaderMemory *reader = new AliRawReaderMemory((UChar_t*)(fEventData+fDdlOff), (UInt_t)fDdlSize);
344 reader->SetEquipmentID(1024);
345 reader->ReadHeader();
346 AliTRDRawStreamTB::RawBufferMissAligned(kTRUE);
347 AliTRDRawStreamTB::SupressWarnings(kTRUE);
349 AliTRDRawStreamTB *tb = new AliTRDRawStreamTB(reader);
355 AliRawReaderMemory *rmem = data->GetRawReader();
358 AliTRDRawStreamTB tb(rmem);
360 AliTRDRawStreamTB::SupressWarnings(kTRUE);
365 //____________________________________________________________________________
366 Int_t AliTRDtestBeam::Int(Int_t i, Char_t *start)
375 char *q=(char*)(start+i);
376 char p[] = {q[3], q[2], q[1], q[0]};
378 } else return *((int*)(start+i));
382 //____________________________________________________________________________