3 // Author: Constantin Loizides <mailto: loizides@ikf.uni-frankfurt.de>
4 // *-- Copyright & copy ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3AltroMemHandler.h"
9 #include "AliL3Logging.h"
11 /** \class AliL3AltroMemHandler
13 //--------------------------------------------------------------------
14 // AliL3AltroMemHandler
16 // Converts digits in memory into a backlinked ALTRO like data format.
17 // Its output file is used as input to the various VHDL testbenches.
18 // The file misc/read.cxx shows how to use this class.
22 ClassImp(AliL3AltroMemHandler)
24 AliL3AltroMemHandler::AliL3AltroMemHandler(){
29 void AliL3AltroMemHandler::Clear(){
30 memset(altromem,0,ALTRO_SIZE);
31 memset(times_per_pad,0,1024);
32 memset(charges_per_pad,0,1024);
40 void AliL3AltroMemHandler::ClearRead(){
48 void AliL3AltroMemHandler::Write(UShort_t row, UChar_t pad, UShort_t time, UShort_t charge)
53 } else if((lrow!=row) || (lpad!=pad)){
54 MakeAltroPackets(); //make packets
55 Write(); //write packets
56 Clear(); //clear up for next pad
65 void AliL3AltroMemHandler::Add(UShort_t charge, UShort_t time)
67 times_per_pad[tcounter]=time;
68 charges_per_pad[tcounter]=charge;
72 void AliL3AltroMemHandler::MakeAltroPackets()
75 UShort_t t=0,seqlength;
80 altromem[--counter]=0xFFFF; //mark return
83 while((pcounter<ALTRO_SIZE) && (t<tcounter)){
87 ltime=times_per_pad[t];
89 while((i+1<tcounter)&&(times_per_pad[i+1]==ltime+j+1)){
93 seqlength=j+1; //number of consecutive times
94 htime=times_per_pad[i]; //abs. time for sequence
96 //don't store sequence if it doesn't fit into packet
97 if(pcounter+seqlength>=ALTRO_SIZE) break;
99 //store charges of sequence
100 for(UShort_t k=0;k<seqlength;k++){
101 altromem[--counter]=charges_per_pad[t];
106 altromem[--counter]=htime; //store abs. time of sequence
108 altromem[--counter]=seqlength+2; //store length of sequence
116 void AliL3AltroMemHandler::AddTrailer()
118 UShort_t savepcounter=pcounter;
120 while(pcounter%4!=0){
121 altromem[--counter]=0x2AA;
124 altromem[--counter]=0x2AA;
125 altromem[--counter]=savepcounter;
126 altromem[--counter]=lpad;
127 altromem[--counter]=lrow;
130 void AliL3AltroMemHandler::Write()
132 if(counter==ALTRO_SIZE) return;
134 //save packets (reversed) to file
135 UShort_t *ptr=altromem+counter;
136 for (int i=counter;i<ALTRO_SIZE;i++) {
139 if (*ptr==0xFFFF) continue; //no return for end of packet
140 fwrite(ptr,sizeof(UShort_t),1,fOutBinary);
142 if (*ptr==0xFFFF) fprintf(fOutBinary,"\n");
143 else fprintf(fOutBinary,"%X ",*ptr);
150 void AliL3AltroMemHandler::WriteFinal()
158 Bool_t AliL3AltroMemHandler::Read(UShort_t &row, UChar_t &pad, UShort_t &time, UShort_t &charge)
161 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::Read","File Open")<<"Binary not supported!"<<ENDLOG;
166 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::Read","File Open")<<"End of File!"<<ENDLOG;
170 unsigned int dummy,dummy1;
173 fscanf(fInBinary,"%x",&dummy);
174 rrow=(UShort_t)dummy;
175 fscanf(fInBinary,"%x",&dummy);
176 rpad=(UShort_t)dummy;
177 fscanf(fInBinary,"%x",&dummy);
178 rcounter=(UShort_t)dummy;
179 fscanf(fInBinary,"%x",&dummy);
185 LOG(AliL3Log::kError,"AliL3AltroMemHandler::Read","Trailer not found!")<<ENDLOG;
190 while(dummy1 % 4 != 0) {
191 fscanf(fInBinary,"%x",&dummy);
196 fscanf(fInBinary,"%x",&dummy);
197 scounter=(UShort_t)dummy-2;
198 fscanf(fInBinary,"%x",&dummy);
199 rtime=(UShort_t)dummy;
202 fscanf(fInBinary,"%x",&dummy);
207 charge=(UShort_t)dummy;
215 Bool_t AliL3AltroMemHandler::ReadSequence(UShort_t &row, UChar_t &pad, UShort_t &time, UChar_t &n, UShort_t **charges)
218 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::ReadSequence","File Open")<<"Binary not supported!"<<ENDLOG;
223 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::ReadSequence","File Open")<<"End of File!"<<ENDLOG;
227 unsigned int dummy,dummy1,dummy2;
230 fscanf(fInBinary,"%x",&dummy);
231 rrow=(UShort_t)dummy;
232 fscanf(fInBinary,"%x",&dummy);
233 rpad=(UShort_t)dummy;
234 fscanf(fInBinary,"%x",&dummy);
235 rcounter=(UShort_t)dummy;
236 fscanf(fInBinary,"%x",&dummy);
242 LOG(AliL3Log::kError,"AliL3AltroMemHandler::ReadSequence","Format") <<"Trailer not found!"<<ENDLOG;
247 while(dummy1 % 4 != 0) {
248 fscanf(fInBinary,"%x",&dummy);
253 fscanf(fInBinary,"%x",&dummy);
254 scounter=(UShort_t)dummy-2;
255 fscanf(fInBinary,"%x",&dummy);
256 rtime=(UShort_t)dummy;
260 if(*charges) delete[] *charges;
261 *charges=new UShort_t[scounter];
265 while(dummy2<scounter){
266 fscanf(fInBinary,"%x",&dummy);
267 (*charges)[dummy2]=(UShort_t)dummy;
279 Bool_t AliL3AltroMemHandler::SetBinaryInput(FILE *file)
283 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
291 Bool_t AliL3AltroMemHandler::SetASCIIInput(FILE *file)
295 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
303 Bool_t AliL3AltroMemHandler::SetBinaryOutput(FILE *file){
306 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
314 Bool_t AliL3AltroMemHandler::SetASCIIOutput(FILE *file){
317 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;