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