3 // Author: Constantin Loizides <mailto: loizides@ikf.uni-frankfurt.de>
4 // *-- Copyright & copy ALICE HLT Group
5 /** \class AliL3AltroMemHandler
7 //--------------------------------------------------------------------
8 // AliL3AltroMemHandler
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.
16 #include "AliL3StandardIncludes.h"
18 #include "AliL3AltroMemHandler.h"
19 #include "AliL3Logging.h"
21 ClassImp(AliL3AltroMemHandler)
23 AliL3AltroMemHandler::AliL3AltroMemHandler(){
24 // default constructor
29 void AliL3AltroMemHandler::Clear(){
31 memset(fAltroMem,0,ALTRO_SIZE);
32 memset(fTimesPerPad,0,1024);
33 memset(fChargesPerPad,0,1024);
41 void AliL3AltroMemHandler::ClearRead(){
50 void AliL3AltroMemHandler::Write(UShort_t row, UChar_t pad, UShort_t time, UShort_t charge)
56 } else if((fLRow!=row) || (fLPad!=pad)){
57 MakeAltroPackets(); //make packets
58 Write(); //write packets
59 Clear(); //clear up for next pad
68 void AliL3AltroMemHandler::Add(UShort_t charge, UShort_t time)
70 // adds new time and charge
71 fTimesPerPad[fTCounter]=time;
72 fChargesPerPad[fTCounter]=charge;
76 void AliL3AltroMemHandler::MakeAltroPackets()
78 // makes Altro packets
80 UShort_t t=0,seqlength;
85 fAltroMem[--fCounter]=0xFFFF; //mark return
88 while((fPCounter<ALTRO_SIZE) && (t<fTCounter)){
92 ltime=fTimesPerPad[t];
94 while((i+1<fTCounter)&&(fTimesPerPad[i+1]==ltime+j+1)){
98 seqlength=j+1; //number of consecutive times
99 htime=fTimesPerPad[i]; //abs. time for sequence
101 //don't store sequence if it doesn't fit into packet
102 if(fPCounter+seqlength>=ALTRO_SIZE) break;
104 //store charges of sequence
105 for(UShort_t k=0;k<seqlength;k++){
106 fAltroMem[--fCounter]=fChargesPerPad[t];
111 fAltroMem[--fCounter]=htime; //store abs. time of sequence
113 fAltroMem[--fCounter]=seqlength+2; //store length of sequence
121 void AliL3AltroMemHandler::AddTrailer()
124 UShort_t savepcounter=fPCounter;
126 while(fPCounter%4!=0){
127 fAltroMem[--fCounter]=0x2AA;
130 fAltroMem[--fCounter]=0x2AA;
131 fAltroMem[--fCounter]=savepcounter;
132 fAltroMem[--fCounter]=fLPad;
133 fAltroMem[--fCounter]=fLRow;
136 void AliL3AltroMemHandler::Write()
138 // default form of Write
139 if(fCounter==ALTRO_SIZE) return;
141 //save packets (reversed) to file
142 UShort_t *ptr=fAltroMem+fCounter;
143 for (int i=fCounter;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()
159 // makes Altro packets and writes them
166 Bool_t AliL3AltroMemHandler::Read(UShort_t &row, UChar_t &pad, UShort_t &time, UShort_t &charge)
170 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::Read","File Open")<<"Binary not supported!"<<ENDLOG;
175 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::Read","File Open")<<"End of File!"<<ENDLOG;
179 unsigned int dummy,dummy1;
182 fscanf(fInBinary,"%x",&dummy);
183 fRRow=(UShort_t)dummy;
184 fscanf(fInBinary,"%x",&dummy);
185 fRPad=(UShort_t)dummy;
186 fscanf(fInBinary,"%x",&dummy);
187 fRCounter=(UShort_t)dummy;
188 fscanf(fInBinary,"%x",&dummy);
194 LOG(AliL3Log::kError,"AliL3AltroMemHandler::Read","Trailer not found!")<<ENDLOG;
199 while(dummy1 % 4 != 0) {
200 fscanf(fInBinary,"%x",&dummy);
205 fscanf(fInBinary,"%x",&dummy);
206 fSCounter=(UShort_t)dummy-2;
207 fscanf(fInBinary,"%x",&dummy);
208 fRTime=(UShort_t)dummy;
211 fscanf(fInBinary,"%x",&dummy);
216 charge=(UShort_t)dummy;
224 Bool_t AliL3AltroMemHandler::ReadSequence(UShort_t &row, UChar_t &pad, UShort_t &time, UChar_t &n, UShort_t **charges)
228 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::ReadSequence","File Open")<<"Binary not supported!"<<ENDLOG;
233 LOG(AliL3Log::kDebug,"AliL3AltroMemHandler::ReadSequence","File Open")<<"End of File!"<<ENDLOG;
237 unsigned int dummy,dummy1,dummy2;
240 fscanf(fInBinary,"%x",&dummy);
241 fRRow=(UShort_t)dummy;
242 fscanf(fInBinary,"%x",&dummy);
243 fRPad=(UShort_t)dummy;
244 fscanf(fInBinary,"%x",&dummy);
245 fRCounter=(UShort_t)dummy;
246 fscanf(fInBinary,"%x",&dummy);
252 LOG(AliL3Log::kError,"AliL3AltroMemHandler::ReadSequence","Format") <<"Trailer not found!"<<ENDLOG;
257 while(dummy1 % 4 != 0) {
258 fscanf(fInBinary,"%x",&dummy);
263 fscanf(fInBinary,"%x",&dummy);
264 fSCounter=(UShort_t)dummy-2;
265 fscanf(fInBinary,"%x",&dummy);
266 fRTime=(UShort_t)dummy;
270 if(*charges) delete[] *charges;
271 *charges=new UShort_t[fSCounter];
275 while(dummy2<fSCounter){
276 fscanf(fInBinary,"%x",&dummy);
277 (*charges)[dummy2]=(UShort_t)dummy;
289 Bool_t AliL3AltroMemHandler::SetBinaryInput(FILE *file)
294 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
302 Bool_t AliL3AltroMemHandler::SetASCIIInput(FILE *file)
307 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
315 Bool_t AliL3AltroMemHandler::SetBinaryOutput(FILE *file){
316 // sets binary output
319 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
327 Bool_t AliL3AltroMemHandler::SetASCIIOutput(FILE *file){
331 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;