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(const AliTRDtestBeam &tb)
136 //____________________________________________________________________________
137 AliTRDtestBeam::~AliTRDtestBeam()
143 if (fDataStream) delete fDataStream;
144 if (fEventHeader) delete fEventHeader;
145 if (fFileHeader) delete fFileHeader;
146 if (fEventData) delete fEventData;
150 //____________________________________________________________________________
151 Int_t AliTRDtestBeam::NextEvent()
154 // Read the next event
157 Long_t dataSize=0,ldcOff; //,ldc_id,ldc2_id;
158 Long_t ldcSize,eqId; //,ev_l2;
162 if ( !fHeaderIsRead ) {
163 fDataStream->read(fFileHeader, fgkFileHeadSize);
164 if(fDataStream->fail()) {
165 cerr << "Error reading file header! " << endl;
168 cout << " Run nr. " << Int(fgkPosRun, fFileHeader) << endl;
172 fDataStream->read(fEventHeader, fgkEventHeadSize);
173 if(fDataStream->fail()) {
174 cerr << "End of file, Event " << fEventCount << endl;
178 dataSize = Int(fgkPosLength, fEventHeader)-fgkEventHeadSize; //?
179 eventNr = Int((4+fgkPosRun), fEventHeader); //ev.nr.
180 //cout << " Event " << eventNr <<" size "<< dataSize <<endl;
182 if (eventNr <= fEventCount-1) { //watch-out ...event counter starts at 1?
183 cout << fEventCount << " End of file?, Event " << fEventCount << endl;
186 //cout << "Run " << Int(fgkPosRun, header)<< " , Event " <<eventNr <<endl;
188 // enough space for data?
189 if (fLimit < dataSize) {
191 fEventData = new Char_t[dataSize];
195 fDataStream->read(fEventData, dataSize);
197 if(fDataStream->fail()) {
198 cerr << "End of file, Event " << fEventCount; // << endl;
202 //cout << " ...IDs (size) : ";
204 ldcOff=0; // size of data from one DDL link
206 for ( size_t k = 0; k < 2; k++ ) { // 2 LDCs (DDL & VME)
208 ldcSize = Int(ldcOff+fgkPosLength, fEventData); //
209 //ldcSize1=(ldcSize-fgkLdcHeadSize);
210 eqId = Int(ldcOff+fgkLdcHeadSize+fgkEqId, fEventData);
211 //cout << eqId <<" ("<<ldcSize<<") ";
213 evL1 = Int((4+ldcOff+fgkPosRun), fEventData); //ev.nr.
214 if ( evL1 != eventNr ){
215 //cerr << "eqId " <<eqId<<" event nr. mismatch? " << eventNr <<" / "<< evL1 <<" ...LDC data size (header:68) " <<ldcSize<<endl;
218 if (eqId == 1024) { //DDL data
219 fDdlOff = ldcOff; //+fgkLdcHeadSize+fgkEquipHeadSize + 32;
223 if (eqId == 550) { //Si-strip data (+QDC)
224 //cout << "550" << endl;
225 fSiOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
226 word = Int(fSiOff, fEventData);
227 Short_t lenSi1 = (word >> 16) & 0xffff;
228 Short_t lenSi2 = word & 0xffff;
229 fQdcOff=fSiOff+4*(lenSi1+lenSi2+1)+fgkEquipHeadSize+4;
231 else if (eqId == 1182) { //QDC first...
232 //cout << "1182" << endl;
233 fQdcOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
234 fSiOff=fQdcOff+fgkEquipHeadSize+4;
242 //cout << "DDL = " << fDdlOff << endl;
243 // cout << "Si = " << fSiOff << endl;
244 //cout << "QDC = " << fQdcOff << endl;
248 fEventCount++; //event counter
252 //____________________________________________________________________________
253 Int_t AliTRDtestBeam::DecodeSi()
256 // Decode the silicon detector
259 if (fSiOff < 0) return 0;
261 // cout << "decoding Si data" << endl;
265 word=Int(fSiOff, fEventData);
266 fNSi1 = (word >> 16) & 0xffff;
267 fNSi2 = word & 0xffff;
270 for (int i = 0; i < fNSi1; i++) {
271 fSi1Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
272 fSi1Charge[i] = Int(cSi, fEventData) & 0xfff;
276 for (int i = 0; i < fNSi2; i++) { //1,for Date!
277 fSi2Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
278 fSi2Charge[i] = Int(cSi, fEventData) & 0xfff;
291 Int_t QclX=0,QclY=0, NclX=0,NclY=0, NstX=0,NstY=0;
292 const Int_t Thr = 20;
302 for( int i = 0; i < GetNSi1(); i++ ) {
304 if (fSi1Address[i] == 0) continue; // noise
311 if ( i > 0 && i < (GetNSi1()-1) ) {
313 if ( (a-fSi1Address[i+1]) == -1 &&
314 (a-fSi1Address[i-1]) == 1)
318 QclX = q+fSi1Charge[i+1]+fSi1Charge[i-1];
324 QclY = q+fSi1Charge[i+1]+fSi1Charge[i-1];
331 else if ( (a-fSi1Address[i-1]) == 1)
335 QclX = q+fSi1Charge[i-1];
341 QclY = q+fSi1Charge[i-1];
347 else if ( (a-fSi1Address[i+1]) == -1)
351 QclX = q+fSi1Charge[i+1];
357 QclY = q+fSi1Charge[i+1];
367 if (Nst1==2 && NstX<4 && NstY<4 ) {
368 fX[0] = (float)(amaxX*0.05); // [mm]
369 fY[0] = (float)((amaxY-aLenSiX)*0.05);
370 fQx[0] = (float)QclX;
371 fQy[0] = (float)QclY;
390 for( int i = 0; i < GetNSi2(); i++ ) {
392 if (fSi2Address[i] == 1279) continue; // noise
393 if (fSi2Address[i] == 0) continue; // noise
398 if ( q > Thr/2 ) //...as Si2 has 1/2 gain!
400 if ( i > 0 && i < (GetNSi2()-1) ) {
402 if ( (a-fSi2Address[i+1]) == -1 &&
403 (a-fSi2Address[i-1]) == 1)
407 QclX = q+fSi2Charge[i+1]+fSi2Charge[i-1];
413 QclY = q+fSi2Charge[i+1]+fSi2Charge[i-1];
420 else if ( (a-fSi2Address[i-1]) == 1)
424 QclX = q+fSi2Charge[i-1];
430 QclY = q+fSi2Charge[i-1];
436 else if ( (a-fSi2Address[i+1]) == -1)
440 QclX = q+fSi2Charge[i+1];
446 QclY = q+fSi2Charge[i+1];
457 if (Nst2==2 && NstX<4 && NstY<4 ) {
458 fX[1] = (float)(amaxX*0.05); // [mm]
459 fY[1] = (float)((amaxY-aLenSiX)*0.05);
460 fQx[1] = (float)QclX;
461 fQy[1] = (float)QclY;
470 if (fQdcOff < 0) return 0;
472 word=Int(fQdcOff, fEventData);
473 fPb = (Double_t)((word >> 16) & 0xFFF);
474 fCher = (Double_t)((word ) & 0xFFF);
476 //cout << fCher << " " << fPb << endl;
480 //____________________________________________________________________________
481 AliTRDRawStreamTB *AliTRDtestBeam::GetTRDrawStream()
484 // Get the TRD raw stream
487 // needs AliTRDRawStreamTB
488 //cout << "Chamber reader:" << (Int_t)(fEventData+fDdlOff) << " " << fDdlSize << endl;
489 //int ifout = open("dump.dat", O_WRONLY | O_TRUNC | O_CREAT);
490 //write(ifout, (void*)(fEventData+fDdlOff+16), fDdlSize);
493 AliRawReaderMemory *reader = new AliRawReaderMemory((UChar_t*)(fEventData+fDdlOff), (UInt_t)fDdlSize);
494 reader->SetEquipmentID(1024);
495 reader->ReadHeader();
496 AliTRDRawStreamTB::RawBufferMissAligned(kTRUE);
497 AliTRDRawStreamTB::SupressWarnings(kTRUE);
499 AliTRDRawStreamTB *tb = new AliTRDRawStreamTB(reader);
505 AliRawReaderMemory *rmem = data->GetRawReader();
508 AliTRDRawStreamTB tb(rmem);
510 AliTRDRawStreamTB::SupressWarnings(kTRUE);
515 //____________________________________________________________________________
516 Int_t AliTRDtestBeam::Int(Int_t i, Char_t *start)
525 char *q=(char*)(start+i);
526 char p[] = {q[3], q[2], q[1], q[0]};
528 } else return *((int*)(start+i));
532 //____________________________________________________________________________