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