2 Author: Constantin Loizides <mailto: loizides@ikf.physik.uni-frankfurt.de>
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
97 cout << " counter " << counter << endl;
99 cerr << "Error: " << ltime << " - " << htime << endl;
103 //don't store sequence if it doesn't fit into packet
104 if(pcounter+seqlength>=ALTRO_SIZE) break;
106 //store charges of sequence
107 for(UShort_t k=0;k<seqlength;k++){
108 altromem[--counter]=charges_per_pad[t];
113 altromem[--counter]=htime; //store abs. time of sequence
115 altromem[--counter]=seqlength+2; //store length of sequence
123 void AliL3AltroMemHandler::AddTrailer()
125 UShort_t savepcounter=pcounter;
127 while(pcounter%4!=0){
128 altromem[--counter]=0x2AA;
131 altromem[--counter]=0x2AA;
132 altromem[--counter]=savepcounter;
133 altromem[--counter]=lpad;
134 altromem[--counter]=lrow;
137 void AliL3AltroMemHandler::Write()
139 if(counter==ALTRO_SIZE) return;
141 //save packets (reversed) to file
142 UShort_t *ptr=altromem+counter;
143 for (int i=counter;i<ALTRO_SIZE;i++) {
146 if (*ptr==0xFFFF) continue; //no return for end of packet
147 fwrite(ptr,sizeof(UShort_t),1,fOutBinary);
149 if (*ptr==0xFFFF) fprintf(fOutBinary,"\n");
150 else fprintf(fOutBinary,"%X ",*ptr);
157 void AliL3AltroMemHandler::WriteFinal()
165 Bool_t AliL3AltroMemHandler::Read(UShort_t &row, UChar_t &pad, UShort_t &time, UShort_t &charge)
168 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::Read","File Open")<<"Binary not supported!"<<ENDLOG;
173 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::Read","File Open")<<"End of File!"<<ENDLOG;
177 unsigned int dummy,dummy1;
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);
192 LOG(AliL3Log::kError,"AliL3AltroMemHandler::Read","Trailer not found!")<<ENDLOG;
197 while(dummy1 % 4 != 0) {
198 fscanf(fInBinary,"%x",&dummy);
203 fscanf(fInBinary,"%x",&dummy);
204 scounter=(UShort_t)dummy-2;
205 fscanf(fInBinary,"%x",&dummy);
206 rtime=(UShort_t)dummy;
209 fscanf(fInBinary,"%x",&dummy);
214 charge=(UShort_t)dummy;
222 Bool_t AliL3AltroMemHandler::ReadSequence(UShort_t &row, UChar_t &pad, UShort_t &time, UChar_t &n, UShort_t **charges)
225 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::ReadSequence","File Open")<<"Binary not supported!"<<ENDLOG;
230 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::ReadSequence","File Open")<<"End of File!"<<ENDLOG;
234 unsigned int dummy,dummy1,dummy2;
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);
249 LOG(AliL3Log::kError,"AliL3AltroMemHandler::ReadSequence","Format") <<"Trailer not found!"<<ENDLOG;
254 while(dummy1 % 4 != 0) {
255 fscanf(fInBinary,"%x",&dummy);
260 fscanf(fInBinary,"%x",&dummy);
261 scounter=(UShort_t)dummy-2;
262 fscanf(fInBinary,"%x",&dummy);
263 rtime=(UShort_t)dummy;
267 if(*charges) delete[] *charges;
268 *charges=new UShort_t[scounter];
272 while(dummy2<scounter){
273 fscanf(fInBinary,"%x",&dummy);
274 (*charges)[dummy2]=(UShort_t)dummy;
286 Bool_t AliL3AltroMemHandler::SetBinaryInput(FILE *file)
290 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
298 Bool_t AliL3AltroMemHandler::SetASCIIInput(FILE *file)
302 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
310 Bool_t AliL3AltroMemHandler::SetBinaryOutput(FILE *file){
313 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
321 Bool_t AliL3AltroMemHandler::SetASCIIOutput(FILE *file){
324 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;