72e3bf0c9441db29891b8ffea44a3132d7916545
[u/mrichter/AliRoot.git] / ITS / AliITSspdTestBeam.h
1 #include <Rtypes.h>
2 //======================================================================
3 #ifndef ALIITSTESTBEAMDATA_H
4 #define ALIITSTESTBEAMDATA_H
5
6 /* Copyright (c) 1998-2001, ALICE Experiment at CERN, All rights reserved *
7  * See cxx source for full Copyright notice                               */
8
9 /*
10   $Id$
11  */
12
13 // Pure virtual class, no data
14 class AliITSTestBeamData{
15   public:
16     AliITSTestBeamData(){};
17     virtual ~AliITSTestBeamData(){};
18     virtual Int_t SizeOf(){return 0;}
19     virtual Double_t Swap(Double_t a){union{Double_t b;UChar_t c[8];}d;d.b=a;
20                                       Swapit(8,d.c);return d.b;};
21     virtual UInt_t Swap(UInt_t a){union{UInt_t b;UChar_t c[4];}d;d.b=a;
22                                   Swapit(4,d.c);return d.b;};
23     static void Swapit(Int_t i,UChar_t *a);
24     enum {kData,kHead,kTail,kAbort,kFail};
25   private:
26 };
27
28 #endif
29 //======================================================================
30 #ifndef ALIITSSPDTESTBEAMHEADER_H
31 #define ALIITSSPDTESTBEAMHEADER_H
32
33 //class ostream;
34
35 /* Copyright (c) 1998-2001, ALICE Experiment at CERN, All rights reserved *
36  * See cxx source for full Copyright notice                               */
37
38 class AliITSspdTestBeamHeader : public AliITSTestBeamData{
39   public:
40     AliITSspdTestBeamHeader(){fUnion=0;};
41     AliITSspdTestBeamHeader(UChar_t *f){SetBuffer(f);}
42     virtual ~AliITSspdTestBeamHeader(){fUnion=0;};
43     virtual void Print(ostream *os);
44     virtual Int_t GetNumberOfEvents(){return Swap(fUnion->fHead.fNEvents);};
45     virtual Int_t GetBuffSize(Int_t i=0){
46         return Swap(fUnion->fHead.fBuffSize[i]);};
47     virtual Int_t GetTestPulse(){return Swap(fUnion->fHead.fTestPulse);};
48     virtual Int_t GetTrigger(Int_t i=0){
49         return Swap(fUnion->fHead.fTrigger[i]);};
50     virtual Int_t GetTriggerMode(){return Swap(fUnion->fHead.fTriggerMode);};
51     virtual Int_t GetBurstSize(){return Swap(fUnion->fHead.fBurstSize);};
52     virtual Double_t GetVersion(){return Swap(fUnion->fHead.fVersion);}
53     virtual Int_t SizeOf(){return sizeof(union headder);};
54     virtual void SetBuffer(UChar_t *f){
55                             fUnion=(AliITSspdTestBeamHeader::headder*)f;}
56     virtual UChar_t *GetBuffer(){return fUnion->fBuf;}
57     virtual Char_t *GetDate(){return fUnion->fHead.fDate;}
58     virtual Char_t *GetTime(){return fUnion->fHead.fTime;}
59   private:
60     union headder{
61          struct {
62             // Double_t must be 8 bytes long, Char_t 1 byte long,
63             // Int_t 4 bytes long. 8*1+4*26+1*(2*12+3*20+3*44+3*8192)=24904 by
64             Double_t fVersion; // Version number
65             Char_t   fDate[12];// Date Field
66             Char_t   fTime[12];// Time Field
67             UInt_t   fBuffSize[3]; // Buffer Sizes
68             UInt_t   fTestPulse;   // Test Pulse flag
69             UInt_t   fTrigger[3];  // Array of triggers
70             UInt_t   fTriggerMode; // Trigger mode flag
71             UInt_t   fBurstSize;   // Burst Size
72             UInt_t   fNEvents;     // Number of event to write
73             UInt_t   fRes[16];            //
74             UChar_t  fMBDACS[3][20];      //
75             UChar_t  fA1DACS[3][44];      //
76             UChar_t  fA12Matrix[3][8192]; //
77         } fHead;
78         UChar_t fBuf[24904];
79     } *fUnion;
80 };
81 ostream &operator<<(ostream &os,AliITSspdTestBeamHeader &source);
82 #endif
83 //----------------------------------------------------------------------
84 #ifndef ALIITSSPDTESTBEAMTAIL_H
85 #define ALIITSSPDTESTBEAMTAIL_H
86
87 /* Copyright (c) 1998-2001, ALICE Experiment at CERN, All rights reserved *
88  * See cxx source for full Copyright notice                               */
89 //class ostream;
90
91 class AliITSspdTestBeamTail : public AliITSTestBeamData{
92   public:
93     AliITSspdTestBeamTail(){fUnion=0;};
94     AliITSspdTestBeamTail(UChar_t *f){SetBuffer(f);}
95     virtual ~AliITSspdTestBeamTail(){fUnion=0;};
96     virtual Int_t GetNumberOfEvents(){return Swap(fUnion->fTail.fEvents);};
97     virtual Int_t GetTermMode(){return Swap(fUnion->fTail.fTermMode);};
98     virtual Int_t SizeOf(){return sizeof(union tail);}
99     virtual void Print(ostream *os);
100     virtual void SetBuffer(UChar_t *f){fUnion=(AliITSspdTestBeamTail::tail*)f;}
101   private:
102     union tail{
103         struct {
104             // Char_t 1 byte long,
105             // UInt_t 4 bytes long. size = 4+4+12*1+12*1 = 32 bytes
106             UInt_t   fEvents;  // number of events written
107             UInt_t   fTermMode;// Termination flag
108             Char_t   fDate[12];// Date Field
109             Char_t   fTime[12];// Time Field
110         } fTail;
111         UChar_t fBuf[32];
112     } *fUnion;
113 };
114 ostream &operator<<(ostream &os,AliITSspdTestBeamTail &source);
115 #endif
116 //----------------------------------------------------------------------
117 #ifndef ALIITSSPDTESTBEAMBURST_H
118 #define ALIITSSPDTESTBEAMBURST_H
119
120 /* Copyright (c) 1998-2001, ALICE Experiment at CERN, All rights reserved *
121  * See cxx source for full Copyright notice                               */
122 //class ostream;
123
124 class AliITSspdTestBeamBurst : public AliITSTestBeamData{
125   public:
126     AliITSspdTestBeamBurst(){fUnion=0;};
127     AliITSspdTestBeamBurst(UChar_t *f){SetBuffer(f);}
128     virtual ~AliITSspdTestBeamBurst(){fUnion=0;};
129     virtual Int_t GetEventNumber(){return Swap(fUnion->fBrst.fNumber);};
130     virtual Int_t GetTransfers(){return Swap(fUnion->fBrst.fTransfers);};
131     virtual Int_t SizeOf(){return sizeof(union tail);}
132     virtual void Print(ostream *os);
133     virtual void SetBuffer(UChar_t *f){
134                                   fUnion=(AliITSspdTestBeamBurst::tail*)f;}
135   private:
136     union tail{
137         struct {
138             // UInt_t 4 bytes long.
139             UInt_t   fNumber;   // Burst Number
140             UInt_t   fTransfers;// Number of Transfers
141         } fBrst;
142         ULong64_t fBuf;  // a strictly 64 bit long unsinged int
143     } *fUnion;
144 };
145 ostream &operator<<(ostream &os,AliITSspdTestBeamBurst &source);
146 #endif
147 //----------------------------------------------------------------------
148 #ifndef ALIITSSPDTESTBEAMDATA_H
149 #define ALIITSSPDTESTBEAMDATA_H
150
151 /* Copyright (c) 1998-2001, ALICE Experiment at CERN, All rights reserved *
152  * See cxx source for full Copyright notice                               */
153 //class ostream;
154
155 class AliITSspdTestBeamData : public AliITSTestBeamData {
156   public:
157     //
158     AliITSspdTestBeamData(){fUnion=0;};
159     AliITSspdTestBeamData(UChar_t *f){SetBuffer(f);}
160     virtual Int_t SizeOf(){return sizeof(union data);}
161     virtual ~AliITSspdTestBeamData(){};
162     //
163     virtual Bool_t IsHeader(Int_t i=0){return ((fUnion+i)->fDataH.fFlag==2||
164                                       (fUnion+i)->fDataH.fFlag==3);}
165     virtual Bool_t IsData(Int_t i=0){return ((fUnion+i)->fDataD.fFlag>3)&&
166                                    ((fUnion+i)->fDataD.fFlag<8);}
167     virtual Bool_t IsTrailer(Int_t i=0){return ((fUnion+i)->fDataT.fFlag==0);}
168     virtual Bool_t IsAbort(Int_t i=0){return ((fUnion+i)->fDataA.fFlag==1);}
169     virtual Int_t  Mode(Int_t i=0){if(IsData(i)) return kData;
170                           else if(IsHeader(i)) return kHead;
171                           else if(IsTrailer(i)) return kTail;
172                           else if(IsAbort(i)) return kAbort;
173                           else return kFail;}
174     virtual Int_t  TransWordCount(){if(IsTrailer()||IsAbort()) 
175                                     return fUnion->fDataT.fTrans;
176                                     else return -1;}
177     virtual Int_t  EventCounter(){
178         if(IsHeader()) return fUnion->fDataH.fEventSync;else return -1;}
179     virtual Int_t Chip(Int_t i=0){if(IsData()) 
180         return (fUnion+i)->fDataD.fChip; else return -1;}
181     virtual Int_t Row(Int_t i=0) {if(IsData()) 
182         return (fUnion+i)->fDataD.fRow; else return -1;}
183     virtual Int_t Colm(Int_t i=0){if(IsData()) 
184         return (fUnion+i)->fDataD.fColm;else return -1;}
185     virtual void  Data(Int_t &ch,Int_t &rw,Int_t &cl,Int_t i=0){
186         ch=Chip(i);rw=Row(i);cl=Colm(i);}
187     virtual void Print(ostream *os,Int_t i=0);
188     virtual void SetBuffer(UChar_t *f){fUnion=(AliITSspdTestBeamData::data*)f;}
189   private:
190     union data{
191         struct { // Definingthe fDataH bit field
192             unsigned fDate:11;    // Not Used
193             unsigned fEventSync:6;// Event syncronization counter
194             unsigned fFlag:3;     // =2or3 Header
195             unsigned fPadding:12; // Not used
196         } fDataH;
197         struct { // Definingthe fDataD bit field
198             unsigned fColm:5;     // Pixel (Hit) Column Address
199             unsigned fRow:8;      // Pixel Row Adress
200             unsigned fChip:4;     // Pixel Chip Address
201             unsigned fFlag:3;     // =4or5or6or7 Data
202             unsigned fPadding:12; // Not used
203         } fDataD;
204         struct { // Definingthe fDataT bit field
205             unsigned fTrans:17;   // Transmitted word count
206             unsigned fFlag:3;     // =0 Trialer
207             unsigned fPadding:12; // Not used
208         } fDataT;
209         struct { // Definingthe fDataA bit field
210             unsigned fTrans:17;   // Transmitted word count
211             unsigned fFlag:3;     // =1 Abort
212             unsigned fPadding:12; // Not used
213         } fDataA;
214         UChar_t fBuf[4];
215         UInt_t  fIBuff;
216     } *fUnion;
217 };
218 ostream &operator<<(ostream &os,AliITSspdTestBeamData &source);
219 #endif
220 //======================================================================
221 #ifndef ALIITSSPDTESTBEAM_H
222 #define ALIITSSPDTESTBEAM_H
223
224 /* Copyright (c) 1998-2001, ALICE Experiment at CERN, All rights reserved *
225  * See cxx source for full Copyright notice                               */
226
227 #include <TTask.h>
228
229 //class ostream;
230 class AliITS;
231 class AliITSspdTestBeamHeader;
232 class AliITSspdTestBeamTail;
233 class AliITSspdTestBeamBurst;
234 class AliITSspdTestBeamData;
235 class AliLoader;
236
237 class AliITSspdTestBeam : public TTask{
238   public:
239     AliITSspdTestBeam();
240     AliITSspdTestBeam(const Char_t *filename,const Char_t *opt="2002",
241                       AliITS *its=0);
242     virtual ~AliITSspdTestBeam();
243     //
244     virtual Int_t OpenInputFile(const Char_t *filename,Int_t start=0,
245                                 Int_t end=-1);
246     virtual Int_t Read(Int_t i=0);
247     virtual Int_t Decode();
248     virtual Int_t DecodeModule(Int_t pilot,Int_t Chip);
249     virtual Int_t DecodeColumn(Int_t pilot,Int_t Chip,Int_t Colm);
250     virtual void Digitize(Int_t evnt);
251     virtual void SetLoader(AliLoader *loader) {fLoader = loader;}
252     virtual void SetITS(AliITS *its) {fITS = its;}
253     virtual Int_t GetNumberOfPilots(){return 3;}
254     virtual Int_t GetNumberOfEvents(){return fNEvents;}
255     virtual void PrintHeadder(ostream *os = &cout);
256     virtual void PrintTrailer(ostream *os = &cout);
257     virtual void PrintBurstInfo(Int_t i,ostream *os=&cout);
258     virtual void PrintEventData(Int_t i,ostream *os=&cout);
259     virtual void PrintEventHead(Int_t i,ostream *os=&cout);
260     virtual void PrintEventTail(Int_t i,ostream *os=&cout);
261   private:
262     void SetTerminationWord(){fTermination=0xf0d8ffff;}
263     void DeletefBrst();
264     void DeletefNData();
265     void DeletefData();
266     void DeletefHData();
267     void DeletefTData();
268     void DeletefFiles();
269     void DeletefBrstSize();
270     void DeletefBuff(){delete[] fBuff;};
271     void DeletefITS(){fITS=0;}
272     void DeletefNeventsStart(){delete[] fNeventsStart;}
273     void DeletefNeventsEnd(){delete[] fNeventsEnd;}
274     //
275     AliITSspdTestBeamHeader   fRH;    //! Run Header
276     AliITSspdTestBeamTail     fRT;    //! Run Trailer
277     Int_t                     fNBrst; //! Number of burts (size of array).
278     Int_t                   **fBrstSize; //! Size of each burst for each pilot
279     AliITSspdTestBeamBurst  **fBrst;  //! Array of bursts.
280     Int_t                   **fNData; //! array of the number of data points
281     AliITSspdTestBeamData  ***fData;  //! Data
282     AliITSspdTestBeamData  ***fHData; //! pointer to headers
283     AliITSspdTestBeamData  ***fTData; //! pointer to Tail and Aborts
284     UInt_t     fTermination;  //! Termination word
285     Int_t      fNEvents;      // Number of events in file
286     Int_t      fBuffSize;     // Read Buffere Size
287     UChar_t   *fBuff;         // Read buffer
288     Int_t      fVersion;      // Test Beam Version number
289     AliITS    *fITS;          // Pointer to the ITS.
290     AliLoader *fLoader;       //! Pointer to AliITSLoader.
291     Int_t      fNfiles;       // Number of input files to read from
292     Int_t      fMaxFiles;     // The size of the pointer array fFiles.
293     ifstream **fFiles;        //! Array of Pointer to the input streams
294     Int_t     *fNeventsStart; // Starting event number for each file
295     Int_t     *fNeventsEnd;   // Ending number of events for each file.
296     ClassDef(AliITSspdTestBeam,1) // Task to read SPD test beam data
297 };
298 #endif