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];
128 for (Int_t i = 0; i < 1270; i++) {
135 for (Int_t j = 0; j < 2; j++) {
144 //____________________________________________________________________________
145 AliTRDtestBeam::AliTRDtestBeam(const AliTRDtestBeam &tb)
168 for (Int_t i = 0; i < 1270; i++) {
175 for (Int_t j = 0; j < 2; j++) {
184 //____________________________________________________________________________
185 AliTRDtestBeam::~AliTRDtestBeam()
191 if (fDataStream) delete fDataStream;
192 if (fEventHeader) delete fEventHeader;
193 if (fFileHeader) delete fFileHeader;
194 if (fEventData) delete fEventData;
198 //____________________________________________________________________________
199 Int_t AliTRDtestBeam::NextEvent()
202 // Read the next event
205 Long_t dataSize=0,ldcOff; //,ldc_id,ldc2_id;
206 Long_t ldcSize,eqId; //,ev_l2;
210 if ( !fHeaderIsRead ) {
211 fDataStream->read(fFileHeader, fgkFileHeadSize);
212 if(fDataStream->fail()) {
213 cerr << "Error reading file header! " << endl;
216 cout << " Run nr. " << Int(fgkPosRun, fFileHeader) << endl;
220 fDataStream->read(fEventHeader, fgkEventHeadSize);
221 if(fDataStream->fail()) {
222 cerr << "End of file, Event " << fEventCount << endl;
226 dataSize = Int(fgkPosLength, fEventHeader)-fgkEventHeadSize; //?
227 eventNr = Int((4+fgkPosRun), fEventHeader); //ev.nr.
228 //cout << " Event " << eventNr <<" size "<< dataSize <<endl;
230 if (eventNr <= fEventCount-1) { //watch-out ...event counter starts at 1?
231 cout << fEventCount << " End of file?, Event " << fEventCount << endl;
234 //cout << "Run " << Int(fgkPosRun, header)<< " , Event " <<eventNr <<endl;
236 // enough space for data?
237 if (fLimit < dataSize) {
239 fEventData = new Char_t[dataSize];
243 fDataStream->read(fEventData, dataSize);
245 if(fDataStream->fail()) {
246 cerr << "End of file, Event " << fEventCount; // << endl;
250 //cout << " ...IDs (size) : ";
252 ldcOff=0; // size of data from one DDL link
254 for ( size_t k = 0; k < 2; k++ ) { // 2 LDCs (DDL & VME)
256 ldcSize = Int(ldcOff+fgkPosLength, fEventData); //
257 //ldcSize1=(ldcSize-fgkLdcHeadSize);
258 eqId = Int(ldcOff+fgkLdcHeadSize+fgkEqId, fEventData);
259 //cout << eqId <<" ("<<ldcSize<<") ";
261 evL1 = Int((4+ldcOff+fgkPosRun), fEventData); //ev.nr.
262 if ( evL1 != eventNr ){
263 //cerr << "eqId " <<eqId<<" event nr. mismatch? " << eventNr <<" / "<< evL1 <<" ...LDC data size (header:68) " <<ldcSize<<endl;
266 if (eqId == 1024) { //DDL data
267 fDdlOff = ldcOff; //+fgkLdcHeadSize+fgkEquipHeadSize + 32;
271 if (eqId == 550) { //Si-strip data (+QDC)
272 //cout << "550" << endl;
273 fSiOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
274 word = Int(fSiOff, fEventData);
275 Short_t lenSi1 = (word >> 16) & 0xffff;
276 Short_t lenSi2 = word & 0xffff;
277 fQdcOff=fSiOff+4*(lenSi1+lenSi2+1)+fgkEquipHeadSize+4;
279 else if (eqId == 1182) { //QDC first...
280 //cout << "1182" << endl;
281 fQdcOff=ldcOff+fgkLdcHeadSize+fgkEquipHeadSize+fgkPosSiOff;
282 fSiOff=fQdcOff+fgkEquipHeadSize+4;
290 //cout << "DDL = " << fDdlOff << endl;
291 // cout << "Si = " << fSiOff << endl;
292 //cout << "QDC = " << fQdcOff << endl;
296 fEventCount++; //event counter
300 //____________________________________________________________________________
301 Int_t AliTRDtestBeam::DecodeSi()
304 // Decode the silicon detector
307 if (fSiOff < 0) return 0;
309 // cout << "decoding Si data" << endl;
313 word=Int(fSiOff, fEventData);
314 fNSi1 = (word >> 16) & 0xffff;
315 fNSi2 = word & 0xffff;
318 for (int i = 0; i < fNSi1; i++) {
319 fSi1Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
320 fSi1Charge[i] = Int(cSi, fEventData) & 0xfff;
324 for (int i = 0; i < fNSi2; i++) { //1,for Date!
325 fSi2Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
326 fSi2Charge[i] = Int(cSi, fEventData) & 0xfff;
339 Int_t qclX=0,qclY=0, nclX=0,nclY=0, nstX=0,nstY=0;
340 const Int_t kThr = 20;
350 for( int i = 0; i < GetNSi1(); i++ ) {
352 if (fSi1Address[i] == 0) continue; // noise
359 if ( i > 0 && i < (GetNSi1()-1) ) {
361 if ( (a-fSi1Address[i+1]) == -1 &&
362 (a-fSi1Address[i-1]) == 1)
366 qclX = q+fSi1Charge[i+1]+fSi1Charge[i-1];
372 qclY = q+fSi1Charge[i+1]+fSi1Charge[i-1];
379 else if ( (a-fSi1Address[i-1]) == 1)
383 qclX = q+fSi1Charge[i-1];
389 qclY = q+fSi1Charge[i-1];
395 else if ( (a-fSi1Address[i+1]) == -1)
399 qclX = q+fSi1Charge[i+1];
405 qclY = q+fSi1Charge[i+1];
415 if (nst1==2 && nstX<4 && nstY<4 ) {
416 fX[0] = (float)(amaxX*0.05); // [mm]
417 fY[0] = (float)((amaxY-aLenSiX)*0.05);
418 fQx[0] = (float)qclX;
419 fQy[0] = (float)qclY;
438 for( int i = 0; i < GetNSi2(); i++ ) {
440 if (fSi2Address[i] == 1279) continue; // noise
441 if (fSi2Address[i] == 0) continue; // noise
446 if ( q > kThr/2 ) //...as Si2 has 1/2 gain!
448 if ( i > 0 && i < (GetNSi2()-1) ) {
450 if ( (a-fSi2Address[i+1]) == -1 &&
451 (a-fSi2Address[i-1]) == 1)
455 qclX = q+fSi2Charge[i+1]+fSi2Charge[i-1];
461 qclY = q+fSi2Charge[i+1]+fSi2Charge[i-1];
468 else if ( (a-fSi2Address[i-1]) == 1)
472 qclX = q+fSi2Charge[i-1];
478 qclY = q+fSi2Charge[i-1];
484 else if ( (a-fSi2Address[i+1]) == -1)
488 qclX = q+fSi2Charge[i+1];
494 qclY = q+fSi2Charge[i+1];
505 if (nst2==2 && nstX<4 && nstY<4 ) {
506 fX[1] = (float)(amaxX*0.05); // [mm]
507 fY[1] = (float)((amaxY-aLenSiX)*0.05);
508 fQx[1] = (float)qclX;
509 fQy[1] = (float)qclY;
518 if (fQdcOff < 0) return 0;
520 word=Int(fQdcOff, fEventData);
521 fPb = (Double_t)((word >> 16) & 0xFFF);
522 fCher = (Double_t)((word ) & 0xFFF);
524 //cout << fCher << " " << fPb << endl;
528 //____________________________________________________________________________
529 AliTRDrawStreamOld *AliTRDtestBeam::GetTRDrawStream()
532 // Get the TRD raw stream
535 // needs AliTRDrawStream
536 //cout << "Chamber reader:" << (Int_t)(fEventData+fDdlOff) << " " << fDdlSize << endl;
537 //int ifout = open("dump.dat", O_WRONLY | O_TRUNC | O_CREAT);
538 //write(ifout, (void*)(fEventData+fDdlOff+16), fDdlSize);
541 AliRawReaderMemory *reader = new AliRawReaderMemory((UChar_t*)(fEventData+fDdlOff), (UInt_t)fDdlSize);
542 reader->SetEquipmentID(1024);
543 reader->ReadHeader();
544 //AliTRDrawStream::RawBufferMissAligned(kTRUE);
546 AliTRDrawStreamOld::SetExtraWordsFix();
547 AliTRDrawStreamOld::AllowCorruptedData();
549 AliTRDrawStreamOld *tb = new AliTRDrawStreamOld(reader);
550 tb->SetNoErrorWarning();
556 AliEawReaderMemory *rmem = data->GetRawReader();
559 AliTRDrawStream tb(rmem);
561 AliTRDrawStream::SupressWarnings(kTRUE);
566 //____________________________________________________________________________
567 Int_t AliTRDtestBeam::Int(Int_t i, const Char_t * const start) const
576 char *q=(char*)(start+i);
577 char p[] = {q[3], q[2], q[1], q[0]};
579 } else return *((int*)(start+i));
583 //____________________________________________________________________________