3 // Author: Constantin Loizides <mailto: loizides@ikf.physik.uni-frankfurt.de>
4 // *-- Copyright & copy CL
9 #include "AliL3AltroMemHandler.h"
10 #include "AliL3Logging.h"
12 /** \class AliL3AltroMemHandler
14 //--------------------------------------------------------------------
15 // AliL3AltroMemHandler
17 // Converts digits in memory into a backlinked ALTRO like data format.
18 // Its output file is used as input to the various VHDL testbenches.
19 // The file misc/read.cxx shows how to use this class.
23 ClassImp(AliL3AltroMemHandler)
25 AliL3AltroMemHandler::AliL3AltroMemHandler(){
30 void AliL3AltroMemHandler::Clear(){
31 memset(altromem,0,ALTRO_SIZE);
32 memset(times_per_pad,0,1024);
33 memset(charges_per_pad,0,1024);
41 void AliL3AltroMemHandler::ClearRead(){
49 void AliL3AltroMemHandler::Write(UShort_t row, UChar_t pad, UShort_t time, UShort_t charge)
54 } else if((lrow!=row) || (lpad!=pad)){
55 MakeAltroPackets(); //make packets
56 Write(); //write packets
57 Clear(); //clear up for next pad
66 void AliL3AltroMemHandler::Add(UShort_t charge, UShort_t time)
68 times_per_pad[tcounter]=time;
69 charges_per_pad[tcounter]=charge;
73 void AliL3AltroMemHandler::MakeAltroPackets()
76 UShort_t t=0,seqlength;
81 altromem[--counter]=0xFFFF; //mark return
84 while((pcounter<ALTRO_SIZE) && (t<tcounter)){
88 ltime=times_per_pad[t];
90 while((i+1<tcounter)&&(times_per_pad[i+1]==ltime+j+1)){
94 seqlength=j+1; //number of consecutive times
95 htime=times_per_pad[i]; //abs. time for sequence
98 cout << " counter " << counter << endl;
100 cerr << "Error: " << ltime << " - " << htime << endl;
104 //don't store sequence if it doesn't fit into packet
105 if(pcounter+seqlength>=ALTRO_SIZE) break;
107 //store charges of sequence
108 for(UShort_t k=0;k<seqlength;k++){
109 altromem[--counter]=charges_per_pad[t];
114 altromem[--counter]=htime; //store abs. time of sequence
116 altromem[--counter]=seqlength+2; //store length of sequence
124 void AliL3AltroMemHandler::AddTrailer()
126 UShort_t savepcounter=pcounter;
128 while(pcounter%4!=0){
129 altromem[--counter]=0x2AA;
132 altromem[--counter]=0x2AA;
133 altromem[--counter]=savepcounter;
134 altromem[--counter]=lpad;
135 altromem[--counter]=lrow;
138 void AliL3AltroMemHandler::Write()
140 if(counter==ALTRO_SIZE) return;
142 //save packets (reversed) to file
143 UShort_t *ptr=altromem+counter;
144 for (int i=counter;i<ALTRO_SIZE;i++) {
147 if (*ptr==0xFFFF) continue; //no return for end of packet
148 fwrite(ptr,sizeof(UShort_t),1,fOutBinary);
150 if (*ptr==0xFFFF) fprintf(fOutBinary,"\n");
151 else fprintf(fOutBinary,"%X ",*ptr);
158 void AliL3AltroMemHandler::WriteFinal()
166 Bool_t AliL3AltroMemHandler::Read(UShort_t &row, UChar_t &pad, UShort_t &time, UShort_t &charge)
169 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::Read","File Open")<<"Binary not supported!"<<ENDLOG;
174 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::Read","File Open")<<"End of File!"<<ENDLOG;
178 unsigned int dummy,dummy1;
181 fscanf(fInBinary,"%x",&dummy);
182 rrow=(UShort_t)dummy;
183 fscanf(fInBinary,"%x",&dummy);
184 rpad=(UShort_t)dummy;
185 fscanf(fInBinary,"%x",&dummy);
186 rcounter=(UShort_t)dummy;
187 fscanf(fInBinary,"%x",&dummy);
193 LOG(AliL3Log::kError,"AliL3AltroMemHandler::Read","Trailer not found!")<<ENDLOG;
198 while(dummy1 % 4 != 0) {
199 fscanf(fInBinary,"%x",&dummy);
204 fscanf(fInBinary,"%x",&dummy);
205 scounter=(UShort_t)dummy-2;
206 fscanf(fInBinary,"%x",&dummy);
207 rtime=(UShort_t)dummy;
210 fscanf(fInBinary,"%x",&dummy);
215 charge=(UShort_t)dummy;
223 Bool_t AliL3AltroMemHandler::ReadSequence(UShort_t &row, UChar_t &pad, UShort_t &time, UChar_t &n, UShort_t **charges)
226 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::ReadSequence","File Open")<<"Binary not supported!"<<ENDLOG;
231 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::ReadSequence","File Open")<<"End of File!"<<ENDLOG;
235 unsigned int dummy,dummy1,dummy2;
238 fscanf(fInBinary,"%x",&dummy);
239 rrow=(UShort_t)dummy;
240 fscanf(fInBinary,"%x",&dummy);
241 rpad=(UShort_t)dummy;
242 fscanf(fInBinary,"%x",&dummy);
243 rcounter=(UShort_t)dummy;
244 fscanf(fInBinary,"%x",&dummy);
250 LOG(AliL3Log::kError,"AliL3AltroMemHandler::ReadSequence","Format") <<"Trailer not found!"<<ENDLOG;
255 while(dummy1 % 4 != 0) {
256 fscanf(fInBinary,"%x",&dummy);
261 fscanf(fInBinary,"%x",&dummy);
262 scounter=(UShort_t)dummy-2;
263 fscanf(fInBinary,"%x",&dummy);
264 rtime=(UShort_t)dummy;
268 if(*charges) delete[] *charges;
269 *charges=new UShort_t[scounter];
273 while(dummy2<scounter){
274 fscanf(fInBinary,"%x",&dummy);
275 (*charges)[dummy2]=(UShort_t)dummy;
287 Bool_t AliL3AltroMemHandler::SetBinaryInput(FILE *file)
291 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
299 Bool_t AliL3AltroMemHandler::SetASCIIInput(FILE *file)
303 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
311 Bool_t AliL3AltroMemHandler::SetBinaryOutput(FILE *file){
314 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
322 Bool_t AliL3AltroMemHandler::SetASCIIOutput(FILE *file){
325 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;