Changes needed on HP and Alpha
[u/mrichter/AliRoot.git] / ITS / AliITSspdTestBeam.cxx
CommitLineData
37c3bb97 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/*
17 $Id$
18*/
888c388d 19
20// A set of classes/routines that can read the SPD test beam data of 2002
21// and create AliITSdigits. The posibility to use these routines to do the
22// same for later and other detectors has yet to be demonstrated. At present
23// there remains a bug in that the TreeE of event headders isn't created
24// properly. See the macro AliITSspdTestBeam2Digits.C. The geometry from
25// the class AliITSvSPD002 must be read in, one way or the other, so that
26// the Geometry transoformation class AliITSgeom will prpoerly be inilized.
27
dd9692e9 28#include <stdlib.h>
37c3bb97 29#include <stddef.h>
30#include <iomanip>
31#include <Riostream.h>
32#include <fstream>
dd9692e9 33#include <TArrayI.h>
37c3bb97 34
35#include "AliITSspdTestBeam.h"
36
37ClassImp(AliITSspdTestBeam)
38
39//----------------------------------------------------------------------
40AliITSspdTestBeam::AliITSspdTestBeam(){
41 // Default Constructor for the Task AliITSspdTestBeam.
42 // Inputs:
43 // none.
44 // Outputs:
45 // none.
46 // Return:
47 // A default constructed AliITSspdTestBeam class
48
5590a2e3 49 fRH = 0;
50 fRT = 0;
37c3bb97 51 fNBrst = 0;
52 fBrstSize = 0;
53 fBrst = 0;
54 fNData = 0;
55 fData = 0;
56 fHData = 0;
57 fTData = 0;
58 SetTerminationWord();
59 fNEvents = 0;
60 fBuffSize = 0;
61 fBuff = 0;
37c3bb97 62 fITS = 0;
63 fNfiles = 0;
64 fMaxFiles = 0;
65 fFiles = 0;
66 fNeventsStart = 0;
67 fNeventsEnd = 0;
68}
69//----------------------------------------------------------------------
70AliITSspdTestBeam::AliITSspdTestBeam(const Char_t *filename,const Char_t *opt,
71 AliITS *its){
72 // Standard Constructor for the Task AliITSspdTestBeam.
73 // Inputs:
74 // const Char_t *filename File where to read in the SPD test beam data
75 // const Char_t *opt Option, 2002 => 2002 test beam data.
76 // Outputs:
77 // none.
78 // Return:
79 // A default constructed AliITSspdTestBeam class
80
5590a2e3 81 fRH = 0;
82 fRT = 0;
37c3bb97 83 fNBrst = 0;
84 fBrstSize = 0;
85 fBrst = 0;
86 fNData = 0;
87 fData = 0;
88 fHData = 0;
89 fTData = 0;
90 SetTerminationWord();
91 fNEvents = 0;
92 fBuffSize = 0;
93 fBuff = 0;
37c3bb97 94 fITS = 0;
95 fNfiles = 0;
96 fMaxFiles = 0;
97 fFiles = 0;
98 fNeventsStart = 0;
99 fNeventsEnd = 0;
100 //
101 fITS = its;
102 fNfiles = 0;
103 OpenInputFile(filename,0,-1);
104 if(strcmp(opt,"2002")) cout << "2002 assumed" << endl;
105}
106
107//----------------------------------------------------------------------
108AliITSspdTestBeam::~AliITSspdTestBeam(){
109 // Destructor. Frees up any memory allocated or closes any files opened.
110 // Inputs:
111 // none.
112 // Outputs:
113 // none.
114 // Return:
115 // nothing.
5590a2e3 116 Int_t i,np;
37c3bb97 117
5590a2e3 118 np = GetNumberOfPilots();
119 fRH = 0; // Just a Pointer into fBuff.
120 fRT = 0; // Just a Pointer into fBuff.
121 if(fBrst){delete[] fBrst; fBrst = 0;}
122 if(fNData)for(i=0;i<np;i++){
123 if(fNData[i]) delete[] fNData[i];
37c3bb97 124 } // end if
5590a2e3 125 if(fNData) {delete[] fNData; fNData = 0;}
126 if(fData)for(i=0;i<np;i++){
127 if(fData[i]) delete[] fData[i];
37c3bb97 128 } // end if
5590a2e3 129 if(fData) delete[] fData;
130 fData = 0;
131 if(fHData)for(i=0;i<np;i++){
132 if(fHData[i]) delete[] fHData[i];
37c3bb97 133 } // end if
5590a2e3 134 if(fHData) delete[] fHData;
135 fHData = 0;
136 if(fTData)for(i=0;i<np;i++){
137 if(fTData[i]) delete[] fTData[i];
37c3bb97 138 } // end if
5590a2e3 139 if(fTData) delete[] fTData;
140 fTData = 0;
141 for(i=0;i<fMaxFiles;i++){
142 if(fFiles[i]!=0) delete fFiles[i];
143 } // end for i
144 if(fBrstSize)for(i=0;i<np;i++){
145 if(fBrstSize[i]) delete[] fBrstSize[i];
37c3bb97 146 } // end if
5590a2e3 147 if(fBrstSize) {delete[] fBrstSize; fBrstSize = 0;}
148 delete[] fBuff;
149 fITS = 0; //delete fITS;
150 delete[] fFiles;
151 delete[] fNeventsStart;
152 delete[] fNeventsEnd;
37c3bb97 153}
154//----------------------------------------------------------------------
155Int_t AliITSspdTestBeam::OpenInputFile(const Char_t *filename,Int_t start,Int_t end){
156 // Opens input file for reading spd test beam data.
157 // Inputs:
158 // const Char_t *filename file name to read data from
159 // Outputs:
160 // none.
161 // Return:
162 // An error number. 0=success, -1=failure.
163 Int_t stat = 0,i;
164
165 if(fMaxFiles==0) {
166 fMaxFiles = 5;
167 fFiles = new ifstream*[fMaxFiles];
37c3bb97 168 fNeventsStart = new Int_t[fMaxFiles];
169 fNeventsEnd = new Int_t[fMaxFiles];
170 } // end if
171 if(fNfiles==fMaxFiles){// Need to expand array of open files.
dd9692e9 172 ifstream **tmp = new ifstream*[fMaxFiles];
173 TArrayI st(fMaxFiles);
174 TArrayI en(fMaxFiles);
37c3bb97 175 for(i=0;i<fMaxFiles;i++) { // copy pointers into tmp
176 tmp[i] = fFiles[i];
177 fFiles[i] = 0;
178 st[i] = fNeventsStart[i];
179 en[i] = fNeventsEnd[i];
180 } // end for i
181 delete fFiles;
182 fMaxFiles += 5; // expand by 5.
183 fFiles = new ifstream*[fMaxFiles];
184 fNeventsStart = new Int_t[fMaxFiles];
185 fNeventsEnd = new Int_t[fMaxFiles];
186 for(i=0;i<fMaxFiles;i++) { // copy pointers back into fFiles
187 fFiles[i] = 0; // and zero rest.
188 fNeventsStart[i] = 0;
189 fNeventsEnd[i] = 0;
190 if(i<fNfiles) {
191 fFiles[i] = tmp[i];
192 tmp[i] = 0;
193 fNeventsStart[i] = st[i];
194 fNeventsEnd[i] = en[i];
195 } // end if i<fNfiles
196 } // end for i
197 // the array of pointers tmp is deleted automatically.
dd9692e9 198 delete [] tmp;
37c3bb97 199 } // end if
200 // Open file
f65ac70b 201#ifndef __DECCXX
37c3bb97 202 fFiles[fNfiles] = new ifstream(filename,ios::in|ios::binary);
f65ac70b 203#else
204 fFiles[fNfiles] = new ifstream(filename,ios::in);
205#endif
37c3bb97 206 if(fFiles[fNfiles]==0){// file open error
207 cout << "Error opening input file " << filename << endl;
208 stat = -1;
209 return stat;
210 } // end if
211 fNeventsStart[fNfiles] = start;
212 fNeventsEnd[fNfiles] = end;
213 fNfiles++;
214 return stat;
215}
216//----------------------------------------------------------------------
217Int_t AliITSspdTestBeam::Read(Int_t i){
218 // Read in one buffer's worth of the file.
219 // Inputs:
220 // Int_t i Which file from the array of files to be read in.
221 // Outputs:
222 // none.
223 // Return:
224 // size of file.
225 Int_t filesize=0;
226
227 fFiles[i]->seekg(0,ios::end);
228 filesize = fFiles[i]->tellg();
229 fFiles[i]->seekg(0,ios::beg);
230 if(fBuff) delete[] fBuff;
231 fBuffSize = filesize;
232 fBuff = new UChar_t[fBuffSize];
233 fFiles[i]->read((Char_t*)fBuff,fBuffSize);
234 fFiles[i] ->close();
235 return filesize;
236}
237//----------------------------------------------------------------------
238Int_t AliITSspdTestBeam::Decode(){
239 // Decode the fBuff read in.
240 // Inputs:
241 // none.
242 // Outputs:
243 // none.
244 // Return:
245 // sets up the array fData fRH, and fRT
246 Int_t stat=0;
247 UInt_t *tr;
248 union {
249 UInt_t *wd;
250 UChar_t *bt;
251 }u; // end union
252 Int_t size;
253 Int_t *ivnt,iburst,ip,np,i,j;
254 AliITSspdTestBeamData *d;
255 AliITSspdTestBeamBurst *b;
256
257 np = GetNumberOfPilots();
37c3bb97 258 ivnt = new Int_t[np];
259 for(i=0;i<np;i++) ivnt[i] = 0;
5590a2e3 260 fRH = (AliITSspdTestBeamHeader*) &(fBuff[0]); // Sets up the Run Header.
261 fRT = (AliITSspdTestBeamTail*)&(fBuff[fBuffSize-fRT->SizeOf()]);
37c3bb97 262 // Check termination
5590a2e3 263 tr = (UInt_t*) &(fBuff[fBuffSize-(fRT->SizeOf())-sizeof(UInt_t)]);
37c3bb97 264 if(!(*tr==fTermination)){
5590a2e3 265 cout << "Error Termination word not found at "<<tr<<endl;
37c3bb97 266 exit(-1);
267 } // end if
5590a2e3 268 if(fNData)for(i=0;i<np;i++){
269 if(fNData[i]) delete[] fNData[i];
270 } // end if
271 if(fNData) {delete[] fNData; fNData = 0;}
272 if(fData)for(i=0;i<np;i++){
273 if(fData[i]) delete[] fData[i];
274 } // end if
275 if(fData) {delete[] fData; fData = 0;}
276 if(fHData)for(i=0;i<np;i++){
277 if(fHData[i]) delete[] fHData[i];
278 } // end if
279 if(fHData) {delete[] fHData; fHData = 0;}
280 if(fTData)for(i=0;i<np;i++){
281 if(fTData[i]) delete[] fTData[i];
282 } // end if
283 if(fTData) {delete[] fTData; fTData = 0;}
284 if(fBrstSize)for(i=0;i<np;i++){
285 if(fBrstSize[i]) delete[] fBrstSize[i];
286 } // end if
287 if(fBrstSize) {delete[] fBrstSize; fBrstSize = 0;}
288 fNEvents = fRH->GetNumberOfEvents();
289 fNBrst = fNEvents/fRH->GetBurstSize();
37c3bb97 290 fBrst = new AliITSspdTestBeamBurst*[fNBrst];
291 fBrstSize = new Int_t*[np];
292 fNData = new Int_t*[np];
293 fData = new AliITSspdTestBeamData**[np];
294 fHData = new AliITSspdTestBeamData**[np];
295 fTData = new AliITSspdTestBeamData**[np];
296 for(i=0;i<np;i++){
297 fBrstSize[i] = new Int_t[fNBrst];
298 fNData[i] = new Int_t[fNEvents];
299 fData[i] = new AliITSspdTestBeamData*[fNEvents];
300 fHData[i] = new AliITSspdTestBeamData*[fNEvents];
301 fTData[i] = new AliITSspdTestBeamData*[fNEvents];
302 for(j=0;j<fNEvents;j++){
303 fNData[i][j] = 0;
304 fData[i][j] = 0;
305 fHData[i][j] = 0;
306 fTData[i][j] = 0;
307 } // end for j
308 } // end for i
5590a2e3 309 if(fBrst){delete[] fBrst; fBrst = 0;}
310 size = fRH->SizeOf();
37c3bb97 311 u.bt = &fBuff[size];
312 //
5590a2e3 313 for(iburst=0;(*(u.wd) != fTermination)&&(u.wd<tr);iburst++){ // loop over Bursts
314 b = (AliITSspdTestBeamBurst *) u.wd;
37c3bb97 315 fBrst[iburst] = b;
316 u.bt += b->SizeOf(); // increment wd byte wise
317 for(ip=0;ip<np;ip++){ // loop over pilots
318 // Get size of data stored for this pilot.
5590a2e3 319 fBrstSize[ip][iburst] = (UInt_t) u.wd;
37c3bb97 320 u.bt += sizeof(UInt_t); // increment wd byte wise
321 for(i=0;i<fBrstSize[ip][iburst];i++){ // loop over data
5590a2e3 322 d = (AliITSspdTestBeamData *) u.wd;
37c3bb97 323 switch (d->Mode()){
324 case AliITSTestBeamData::kData :
325 fNData[ip][ivnt[ip]]++;
326 // set pointer to first data member
5590a2e3 327 if(fData[ip][ivnt[ip]] == 0 ) fData[ip][ivnt[ip]] = d;
37c3bb97 328 break;
329 case AliITSTestBeamData::kHead :
37c3bb97 330 fNData[ip][ivnt[ip]] = 0;
331 fData[ip][ivnt[ip]] = 0;
5590a2e3 332 fHData[ip][ivnt[ip]++] = d;
37c3bb97 333 break;
334 case AliITSTestBeamData::kTail :
335 case AliITSTestBeamData::kAbort :
5590a2e3 336 fTData[ip][ivnt[ip]] = d;
37c3bb97 337 break;
338 default:
339 cout << "Unknown Data Type: wd="<<hex<<*(u.wd)<<dec<<endl;
340 break;
341 } // end switch
342 u.bt += d->SizeOf(); // increment wd byte wise
343 } // end for i (next data word).
344 } // end for loop over pilots (ip).
345 } // end for loop over bursts
346 delete[] ivnt;
347 return stat;
348}
37c3bb97 349//============================================================================
888c388d 350void AliITSspdTestBeamHeader::Print(ostream *os)const{
37c3bb97 351 // print out the header information
352 // Inputs:
353 // ostream *os Pointer to the output stream.
354 // Outputs:
355 // none.
356 // Return:
357 // none.
358/*
359#if defined __GNUC__
360#if __GNUC__ > 2
361 ios::fmtflags fmt;
362#else
363 Int_t fmt;
364#endif
365#else
366#if defined __ICC || defined __ECC
367 ios::fmtflags fmt;
368#else
369 Int_t fmt;
370#endif
371#endif
372*/
5590a2e3 373 *os<<"Version: "<<fUnion.fHead.fVersion<<" Written: "<<fUnion.fHead.fDate;
374 *os<<" " << fUnion.fHead.fTime << endl;
375 *os<<"Buffer Size [0], [1], [2]: " << fUnion.fHead.fBuffSize[0] << ",";
376 *os<<fUnion.fHead.fBuffSize[1]<<"," <<fUnion.fHead.fBuffSize[2] << endl;
377 *os<<"Test Pulse: " << fUnion.fHead.fTestPulse << endl;
378 *os<<"Trigger Mode General, [0], [1], [2]: " << fUnion.fHead.fTriggerMode;
379 *os<<","<<fUnion.fHead.fTrigger[0]<<","<<fUnion.fHead.fTrigger[1]<< ",";
380 *os<<fUnion.fHead.fTrigger[2] << endl;
381 *os<<"Number of Events: " << fUnion.fHead.fNEvents << " Burst Size: ";
382 *os<<fUnion.fHead.fBurstSize << endl;
37c3bb97 383 return;
384}
385//----------------------------------------------------------------------
386ostream &operator<<(ostream &os,AliITSspdTestBeamHeader &p){
387 // Standard output operator. See Print
388 // Inputs:
389 // ostream &os the output stream.
390 // AliITSspdTestBeamHeader &p the data to be printed out.
391 // Outputs:
392 // none.
393 // Return:
394 // ostream &os pointing now to the end of the present stream.
395
396 p.Print(&os);
397 return os;
398}
399//============================================================================
888c388d 400void AliITSspdTestBeamTail::Print(ostream *os)const{
37c3bb97 401 // print out the Tail information
402 // Inputs:
403 // ostream *os Pointer to the output stream.
404 // Outputs:
405 // none.
406 // Return:
407 // none.
408/*
409#if defined __GNUC__
410#if __GNUC__ > 2
411 ios::fmtflags fmt;
412#else
413 Int_t fmt;
414#endif
415#else
416#if defined __ICC || defined __ECC
417 ios::fmtflags fmt;
418#else
419 Int_t fmt;
420#endif
421#endif
422*/
5590a2e3 423 *os << "Number of Events: "<< fUnion.fTail.fEvents << " Written: "
424 << fUnion.fTail.fDate;
425 *os << " " << fUnion.fTail.fTime << endl;
426 *os <<"Termination Flag: " << fUnion.fTail.fTermMode << endl;
37c3bb97 427 return;
428}
429//----------------------------------------------------------------------
430ostream &operator<<(ostream &os,AliITSspdTestBeamTail &p){
431 // Standard output operator. See Print
432 // Inputs:
433 // ostream &os the output stream.
434 // AliITSspdTestBeamHeader &p the data to be printed out.
435 // Outputs:
436 // none.
437 // Return:
438 // ostream &os pointing now to the end of the present stream.
439
440 p.Print(&os);
441 return os;
442}
443//============================================================================
888c388d 444void AliITSspdTestBeamBurst::Print(ostream *os)const{
37c3bb97 445 // print out the Burst information
446 // Inputs:
447 // ostream *os Pointer to the output stream.
448 // Outputs:
449 // none.
450 // Return:
451 // none.
452/*
453#if defined __GNUC__
454#if __GNUC__ > 2
455 ios::fmtflags fmt;
456#else
457 Int_t fmt;
458#endif
459#else
460#if defined __ICC || defined __ECC
461 ios::fmtflags fmt;
462#else
463 Int_t fmt;
464#endif
465#endif
466*/
5590a2e3 467 *os << "Burst Number: "<< fUnion.fBrst.fNumber << " Transfers: "
468 << fUnion.fBrst.fTransfers << endl;
37c3bb97 469 return;
470}
471//----------------------------------------------------------------------
472ostream &operator<<(ostream &os,AliITSspdTestBeamBurst &p){
473 // Standard output operator. See Print
474 // Inputs:
475 // ostream &os the output stream.
476 // AliITSspdTestBeamHeader &p the data to be printed out.
477 // Outputs:
478 // none.
479 // Return:
480 // ostream &os pointing now to the end of the present stream.
481
482 p.Print(&os);
483 return os;
484}
485//======================================================================
888c388d 486void AliITSspdTestBeamData::Print(ostream *os)const{
37c3bb97 487 // print out the the Test Beam Data information
488 // Inputs:
489 // ostream *os Pointer to the output stream.
490 // Outputs:
491 // none.
492 // Return:
493 // none.
494/*
495#if defined __GNUC__
496#if __GNUC__ > 2
497 ios::fmtflags fmt;
498#else
499 Int_t fmt;
500#endif
501#else
502#if defined __ICC || defined __ECC
503 ios::fmtflags fmt;
504#else
505 Int_t fmt;
506#endif
507#endif
508*/
5590a2e3 509 *os << "Word=" << hex << fUnion.fBuf[0] << hex << fUnion.fBuf[1]
510 << hex << fUnion.fBuf[2] << hex << fUnion.fBuf[3] << dec;
511 switch (this->Mode()){
37c3bb97 512 case AliITSTestBeamData::kData :
5590a2e3 513 *os << " kData chip=" << setw(3) << fUnion.fDataD.fChip;
514 *os << " Row=" << setw(3) << fUnion.fDataD.fRow;
515 *os << " Column=" << setw(3) << fUnion.fDataD.fColm;
37c3bb97 516 break;
517 case AliITSTestBeamData::kHead :
5590a2e3 518 *os << " kHead Event Sync =" << fUnion.fDataH.fEventSync;
37c3bb97 519 break;
520 case AliITSTestBeamData::kTail :
5590a2e3 521 *os << " kTail Transmitted word count =" << fUnion.fDataT.fTrans;
37c3bb97 522 break;
523 case AliITSTestBeamData::kAbort :
5590a2e3 524 *os << " kAbort Transmitted word count =" << fUnion.fDataA.fTrans;
37c3bb97 525 break;
526 default:
527 *os << " Unknown Data Type";
528 break;
529 } // end switch
530 *os << endl;
531 return;
532}
533//----------------------------------------------------------------------
534ostream &operator<<(ostream &os,AliITSspdTestBeamData &p){
535 // Standard output operator. See Print
536 // Inputs:
537 // ostream &os the output stream.
538 // AliITSspdTestBeamHeader &p the data to be printed out.
539 // Outputs:
540 // none.
541 // Return:
542 // ostream &os pointing now to the end of the present stream.
543
5590a2e3 544 p.Print(&os);
37c3bb97 545 return os;
546}