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"
26 #include <sys/types.h>
33 ClassImp(AliTRDtestBeam)
35 const Long_t AliTRDtestBeam::file_head_size = 544; // ?
36 const Long_t AliTRDtestBeam::event_head_size = 68; //?
37 const Long_t AliTRDtestBeam::ldc_head_size = 68; //?
38 const Long_t AliTRDtestBeam::equip_head_size = 28; //
39 const Int_t AliTRDtestBeam::vme_in =1; //VME event in
40 const Int_t AliTRDtestBeam::sim_in =1; //Si-strips in
45 const Int_t AliTRDtestBeam::pos_run = 20; //run nr. (in file and event header)
46 const Int_t AliTRDtestBeam::pos_length = 0; //event/equip. length
47 const Int_t AliTRDtestBeam::pos_eqid = 8; //equipment id.
48 const Int_t AliTRDtestBeam::pos_sioff = 12; //Si data size offset (3 extra words!!!)
52 //____________________________________________________________________________
53 AliTRDtestBeam::AliTRDtestBeam() :
73 //____________________________________________________________________________
74 AliTRDtestBeam::AliTRDtestBeam(const char *filename) :
93 fDataStream = new ifstream(filename, ifstream::in | ifstream::binary );
94 cout << fDataStream->is_open() << endl;
95 //fHeaderIsRead = kTRUE;
96 fHeaderIsRead = kTRUE;
98 fFileHeader = new Char_t[file_head_size];
99 fEventHeader = new Char_t[event_head_size];
100 fEventData = new Char_t[fLimit];
103 //____________________________________________________________________________
105 Int_t AliTRDtestBeam::NextEvent() {
107 Long_t data_size=0,ldc_off; //,ldc_id,ldc2_id;
108 Long_t ldc_size,eq_id; //,ev_l2;
109 Long_t event_nr,ev_l1;
112 if ( !fHeaderIsRead ) {
113 fDataStream->read(fFileHeader, file_head_size);
114 if(fDataStream->fail()) {
115 cerr << "Error reading file header! " << endl;
118 cout << " Run nr. " << Int(pos_run, fFileHeader) << endl;
122 fDataStream->read(fEventHeader, event_head_size);
123 if(fDataStream->fail()) {
124 cerr << "End of file, Event " << fEventCount << endl;
128 data_size = Int(pos_length, fEventHeader)-event_head_size; //?
129 event_nr = Int((4+pos_run), fEventHeader); //ev.nr.
130 //cout << " Event " << event_nr <<" size "<< data_size <<endl;
132 if (event_nr <= fEventCount-1) { //watch-out ...event counter starts at 1?
133 cout << fEventCount << " End of file?, Event " << fEventCount << endl;
136 //cout << "Run " << Int(pos_run, header)<< " , Event " <<event_nr <<endl;
138 // enough space for data?
139 if (fLimit < data_size) {
141 fEventData = new Char_t[data_size];
145 fDataStream->read(fEventData, data_size);
147 if(fDataStream->fail()) {
148 cerr << "End of file, Event " << fEventCount; // << endl;
152 //cout << " ...IDs (size) : ";
154 ldc_off=0; // size of data from one DDL link
156 for ( size_t k = 0; k < 2; k++ ) { // 2 LDCs (DDL & VME)
158 ldc_size = Int(ldc_off+pos_length, fEventData); //
159 //ldc_size1=(ldc_size-ldc_head_size);
160 eq_id = Int(ldc_off+ldc_head_size+pos_eqid, fEventData);
161 //cout << eq_id <<" ("<<ldc_size<<") ";
163 ev_l1 = Int((4+ldc_off+pos_run), fEventData); //ev.nr.
164 if ( ev_l1 != event_nr ){
165 //cerr << "Eq_id " <<eq_id<<" event nr. mismatch? " << event_nr <<" / "<< ev_l1 <<" ...LDC data size (header:68) " <<ldc_size<<endl;
168 if (eq_id == 1024) { //DDL data
169 fDdlOff = ldc_off; //+ldc_head_size+equip_head_size + 32;
173 if (eq_id == 550) { //Si-strip data (+QDC)
174 //cout << "550" << endl;
175 fSiOff=ldc_off+ldc_head_size+equip_head_size+pos_sioff;
176 word = Int(fSiOff, fEventData);
177 Short_t LenSi1 = (word >> 16) & 0xffff;
178 Short_t LenSi2 = word & 0xffff;
179 fQdcOff=fSiOff+4*(LenSi1+LenSi2+1)+equip_head_size+4;
181 else if (eq_id == 1182) { //QDC first...
182 //cout << "1182" << endl;
183 fQdcOff=ldc_off+ldc_head_size+equip_head_size+pos_sioff;
184 fSiOff=fQdcOff+equip_head_size+4;
192 //cout << "DDL = " << fDdlOff << endl;
193 // cout << "Si = " << fSiOff << endl;
194 //cout << "QDC = " << fQdcOff << endl;
198 fEventCount++; //event counter
201 //____________________________________________________________________________
202 Int_t AliTRDtestBeam::DecodeSi() {
204 if (fSiOff < 0) return 0;
206 // cout << "decoding Si data" << endl;
210 word=Int(fSiOff, fEventData);
211 fNSi1 = (word >> 16) & 0xffff;
212 fNSi2 = word & 0xffff;
215 for (int i = 0; i < fNSi1; i++) {
216 fSi1Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
217 fSi1Charge[i] = Int(cSi, fEventData) & 0xfff;
221 for (int i = 0; i < fNSi2; i++) { //1,for Date!
222 fSi2Address[i] = ( Int(cSi, fEventData) >> 12 ) & 0x7ff;
223 fSi2Charge[i] = Int(cSi, fEventData) & 0xfff;
231 int qmaxX; int amaxX;
232 int qmaxY; int amaxY;
239 for( int i = 0; i < GetNSi1(); i++ ) {
241 if (fSi1Address[i] == 0) continue; // noise
243 if (fSi1Address[i] < LenSiX ) {
244 if( fSi1Charge[i] > qmaxX ) {
245 qmaxX = fSi1Charge[i];
246 amaxX = fSi1Address[i];
249 if( fSi1Charge[i] > qmaxY ) {
250 qmaxY = fSi1Charge[i];
251 amaxY = fSi1Address[i];
256 fX[0] = (float)(amaxX*0.05); // [mm]
257 fY[0] = (float)((amaxY-LenSiX)*0.05);
258 fQx[0] = (float)qmaxX;
259 fQy[0] = (float)qmaxY;
267 for( int i = 0; i < GetNSi2(); i++ ) {
269 if (fSi2Address[i] == 1279) continue; // noise
270 if (fSi2Address[i] == 0) continue; // noise
272 if(fSi2Address[i] < LenSiX) {
273 if( fSi2Charge[i] > qmaxX ) {
274 qmaxX = fSi2Charge[i];
275 amaxX = fSi2Address[i];
278 if( fSi2Charge[i] > qmaxY ) {
279 //if (fSi2Charge[i] > 50) cout << fSi2Charge[i] << " " << i << " " << fSi2Address[i] << endl;
280 qmaxY = fSi2Charge[i];
281 amaxY = fSi2Address[i];
286 fX[1] = (float)(amaxX*0.05); // [mm]
287 fY[1] = (float)((amaxY-LenSiX)*0.05);
288 fQx[1] = (float)qmaxX;
289 fQy[1] = (float)qmaxY;
291 if (fQdcOff < 0) return 0;
293 word=Int(fQdcOff, fEventData);
294 fPb = (Double_t)((word >> 16) & 0xFFF);
295 fCher = (Double_t)((word ) & 0xFFF);
297 //cout << fCher << " " << fPb << endl;
300 //____________________________________________________________________________
302 AliTRDRawStreamTB *AliTRDtestBeam::GetTRDrawStream() {
304 // needs AliTRDRawStreamTB
305 //cout << "Chamber reader:" << (Int_t)(fEventData+fDdlOff) << " " << fDdlSize << endl;
306 //int ifout = open("dump.dat", O_WRONLY | O_TRUNC | O_CREAT);
307 //write(ifout, (void*)(fEventData+fDdlOff+16), fDdlSize);
310 AliRawReaderMemory *reader = new AliRawReaderMemory((UChar_t*)(fEventData+fDdlOff), (UInt_t)fDdlSize);
311 reader->SetEquipmentID(1024);
312 reader->ReadHeader();
313 AliTRDRawStreamTB::RawBufferMissAligned(kTRUE);
314 AliTRDRawStreamTB::SupressWarnings(kTRUE);
316 AliTRDRawStreamTB *tb = new AliTRDRawStreamTB(reader);
322 AliRawReaderMemory *rmem = data->GetRawReader();
325 AliTRDRawStreamTB tb(rmem);
327 AliTRDRawStreamTB::SupressWarnings(kTRUE);
332 //____________________________________________________________________________
334 Int_t AliTRDtestBeam::Int(Int_t i, Char_t *start) {
339 char *q=(char*)(start+i);
340 char p[] = {q[3], q[2], q[1], q[0]};
342 } else return *((int*)(start+i));
345 //____________________________________________________________________________