]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/misc/AliL3AltroMemHandler.cxx
Coding conventions
[u/mrichter/AliRoot.git] / HLT / misc / AliL3AltroMemHandler.cxx
1 // @(#) $Id$
2
3 // Author: Constantin Loizides <mailto: loizides@ikf.uni-frankfurt.de>
4 // *-- Copyright & copy ALICE HLT Group
5 /** \class AliL3AltroMemHandler
6 <pre>
7 //--------------------------------------------------------------------
8 // AliL3AltroMemHandler
9 //
10 // Converts digits in memory into a backlinked ALTRO like data format.
11 // Its output file is used as input to the various VHDL testbenches.
12 // The file misc/read.cxx shows how to use this class.
13 </pre>
14 */
15
16 #include "AliL3StandardIncludes.h"
17
18 #include "AliL3AltroMemHandler.h"
19 #include "AliL3Logging.h"
20
21 ClassImp(AliL3AltroMemHandler)
22
23 AliL3AltroMemHandler::AliL3AltroMemHandler(){
24   // default constructor
25   Clear();
26   ClearRead();
27 };
28
29 void AliL3AltroMemHandler::Clear(){
30   // clear everything
31   memset(fAltroMem,0,ALTRO_SIZE);
32   memset(fTimesPerPad,0,1024);
33   memset(fChargesPerPad,0,1024);
34   fCounter=ALTRO_SIZE;
35   fTCounter=0;
36   fLPad=0;
37   fLRow=0;
38   fFlag=kFALSE;
39 };
40
41 void AliL3AltroMemHandler::ClearRead(){
42   // clears the reading
43   fRCounter=0;
44   fSCounter=0;
45   fRPad=0;
46   fRRow=0;
47   fRTime=0;
48 }
49
50 void AliL3AltroMemHandler::Write(UShort_t row, UChar_t pad, UShort_t time, UShort_t charge)
51 {
52   // writes packets
53   if(fTCounter==0){
54     fLRow=row;
55     fLPad=pad;
56   } else if((fLRow!=row) || (fLPad!=pad)){
57     MakeAltroPackets(); //make packets
58     Write();            //write packets
59     Clear();            //clear up for next pad
60
61     fLRow=row;
62     fLPad=pad;
63   }
64
65   Add(charge,time);
66 }
67
68 void AliL3AltroMemHandler::Add(UShort_t charge, UShort_t time)
69 {
70   // adds new time and charge
71   fTimesPerPad[fTCounter]=time;
72   fChargesPerPad[fTCounter]=charge;
73   fTCounter++;
74 }
75
76 void AliL3AltroMemHandler::MakeAltroPackets()
77 {
78   // makes Altro packets
79   UShort_t i=0,j=0;
80   UShort_t t=0,seqlength;
81   UShort_t htime,ltime;
82
83   while(t<fTCounter){
84     fPCounter=0;
85     fAltroMem[--fCounter]=0xFFFF; //mark return
86
87     //make packets
88     while((fPCounter<ALTRO_SIZE) && (t<fTCounter)){
89
90       //find sequence
91       i=t;
92       ltime=fTimesPerPad[t];
93       j=0;
94       while((i+1<fTCounter)&&(fTimesPerPad[i+1]==ltime+j+1)){
95         i++;
96         j++;
97       }
98       seqlength=j+1; //number of consecutive times   
99       htime=fTimesPerPad[i]; //abs. time for sequence
100
101       //don't store sequence if it doesn't fit into packet
102       if(fPCounter+seqlength>=ALTRO_SIZE) break;
103
104       //store charges of sequence
105       for(UShort_t k=0;k<seqlength;k++){
106         fAltroMem[--fCounter]=fChargesPerPad[t];
107         fPCounter++;
108         t++;
109       }
110
111       fAltroMem[--fCounter]=htime;       //store abs. time of sequence
112       fPCounter++;
113       fAltroMem[--fCounter]=seqlength+2; //store length of sequence
114       fPCounter++;
115     }
116
117     AddTrailer();
118   }
119 }
120
121 void AliL3AltroMemHandler::AddTrailer()
122 {
123   // adds data trailer
124   UShort_t savepcounter=fPCounter;
125
126   while(fPCounter%4!=0){
127     fAltroMem[--fCounter]=0x2AA;
128     fPCounter++;
129   } 
130   fAltroMem[--fCounter]=0x2AA;
131   fAltroMem[--fCounter]=savepcounter;
132   fAltroMem[--fCounter]=fLPad;
133   fAltroMem[--fCounter]=fLRow;
134 }
135
136 void AliL3AltroMemHandler::Write()
137 {
138   // default form of Write
139   if(fCounter==ALTRO_SIZE) return;
140
141   //save packets (reversed) to file
142   UShort_t *ptr=fAltroMem+fCounter;
143   for (int i=fCounter;i<ALTRO_SIZE;i++) {
144
145     if(fFlag==kTRUE){
146       if (*ptr==0xFFFF) continue; //no return for end of packet
147       fwrite(ptr,sizeof(UShort_t),1,fOutBinary);
148     } else {
149       if (*ptr==0xFFFF) fprintf(fOutBinary,"\n");
150       else fprintf(fOutBinary,"%X ",*ptr);
151     }
152
153     ptr++;
154   }
155 }
156
157 void AliL3AltroMemHandler::WriteFinal()
158 {
159   // makes Altro packets and writes them
160   if(fTCounter>0){
161     MakeAltroPackets();
162     Write();
163   }
164 }
165
166 Bool_t AliL3AltroMemHandler::Read(UShort_t &row, UChar_t &pad, UShort_t &time, UShort_t &charge)
167 {
168   // reads the packets
169   if(fFlag==kTRUE) {
170     LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::Read","File Open")<<"Binary not supported!"<<ENDLOG;
171     return kFALSE;
172   }
173   
174   if(feof(fInBinary)){
175     LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::Read","File Open")<<"End of File!"<<ENDLOG;
176     return kFALSE;
177   }
178
179   unsigned int dummy,dummy1;
180
181   if(fRCounter==0){
182     fscanf(fInBinary,"%x",&dummy);
183     fRRow=(UShort_t)dummy;
184     fscanf(fInBinary,"%x",&dummy);
185     fRPad=(UShort_t)dummy;
186     fscanf(fInBinary,"%x",&dummy);
187     fRCounter=(UShort_t)dummy;
188     fscanf(fInBinary,"%x",&dummy);
189     if(dummy!=682){
190       if(feof(fInBinary)){
191         ClearRead();
192         return kFALSE;
193       } else {
194         LOG(AliL3Log::kError,"AliL3AltroMemHandler::Read","Trailer not found!")<<ENDLOG;
195         return kFALSE;
196       }
197     }
198     dummy1 = fRCounter;
199     while(dummy1 % 4 != 0) {
200       fscanf(fInBinary,"%x",&dummy);
201       dummy1++;
202     } 
203   } 
204   if(fSCounter==0){
205     fscanf(fInBinary,"%x",&dummy);
206     fSCounter=(UShort_t)dummy-2;
207     fscanf(fInBinary,"%x",&dummy);
208     fRTime=(UShort_t)dummy;
209     fRCounter-=2;
210   }
211   fscanf(fInBinary,"%x",&dummy);
212
213   row=fRRow;
214   pad=fRPad;
215   time=fRTime;
216   charge=(UShort_t)dummy;
217
218   fSCounter--;
219   fRCounter--;
220   fRTime--;
221   return kTRUE;
222 }
223
224 Bool_t AliL3AltroMemHandler::ReadSequence(UShort_t &row, UChar_t &pad, UShort_t &time, UChar_t &n, UShort_t **charges)
225 {
226   // reads sequence
227   if(fFlag==kTRUE) {
228     LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::ReadSequence","File Open")<<"Binary not supported!"<<ENDLOG;
229     return kFALSE;
230   }
231   
232   if(feof(fInBinary)){
233     LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::ReadSequence","File Open")<<"End of File!"<<ENDLOG;
234     return kFALSE;
235   }
236
237   unsigned int dummy,dummy1,dummy2;
238
239   if(fRCounter==0){
240     fscanf(fInBinary,"%x",&dummy);
241     fRRow=(UShort_t)dummy;
242     fscanf(fInBinary,"%x",&dummy);
243     fRPad=(UShort_t)dummy;
244     fscanf(fInBinary,"%x",&dummy);
245     fRCounter=(UShort_t)dummy;
246     fscanf(fInBinary,"%x",&dummy);
247     if(dummy!=682){
248       if(feof(fInBinary)){
249         ClearRead();
250         return kFALSE;
251       } else {
252         LOG(AliL3Log::kError,"AliL3AltroMemHandler::ReadSequence","Format") <<"Trailer not found!"<<ENDLOG;
253         return kFALSE;
254       }
255     }
256     dummy1 = fRCounter;
257     while(dummy1 % 4 != 0) {
258       fscanf(fInBinary,"%x",&dummy);
259       dummy1++;
260     } 
261   } 
262
263   fscanf(fInBinary,"%x",&dummy);
264   fSCounter=(UShort_t)dummy-2;
265   fscanf(fInBinary,"%x",&dummy);
266   fRTime=(UShort_t)dummy;
267   fRCounter-=2;
268
269   if(n<fSCounter){
270     if(*charges) delete[] *charges;
271     *charges=new UShort_t[fSCounter];
272   }
273
274   dummy2=0;
275   while(dummy2<fSCounter){
276     fscanf(fInBinary,"%x",&dummy);
277     (*charges)[dummy2]=(UShort_t)dummy;
278     dummy2++;
279     fRCounter--;
280   }
281
282   row=fRRow;
283   pad=fRPad;
284   time=fRTime;
285   n=fSCounter;
286   return kTRUE;
287 }
288
289 Bool_t AliL3AltroMemHandler::SetBinaryInput(FILE *file)
290 {
291   // sets binary input
292   fInBinary = file;
293   if(!fInBinary){
294     LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
295     return kFALSE;
296   }
297   ClearRead();
298   fFlag=kTRUE;
299   return kTRUE;
300 }
301
302 Bool_t AliL3AltroMemHandler::SetASCIIInput(FILE *file)
303 {
304   // sets ASCII input
305   fInBinary = file;
306   if(!fInBinary){
307     LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
308     return kFALSE;
309   }
310   ClearRead();
311   fFlag=kFALSE;
312   return kTRUE;
313 }
314
315 Bool_t AliL3AltroMemHandler::SetBinaryOutput(FILE *file){
316   // sets binary output
317   fOutBinary = file;
318   if(!fOutBinary){
319     LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
320     return kFALSE;
321   }
322   Clear();
323   fFlag=kTRUE;
324   return kTRUE;
325 }
326
327 Bool_t AliL3AltroMemHandler::SetASCIIOutput(FILE *file){
328   // sets ASCII output
329   fOutBinary = file;
330   if(!fOutBinary){
331     LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
332     return kFALSE;
333   }
334   Clear();
335   fFlag=kFALSE;
336   return kTRUE;
337 }
338