2 Author: Constantin Loizides <mailto: loizides@ikf.physik.uni-frankfurt.de>
8 #include "AliL3AltroMemHandler.h"
10 /** \class AliL3AltroMemHandler
11 // Converts digits in memory into a backlinked ALTRO like data format.
12 // Its output file is used as input to the various VHDL testbenches.
13 // The file misc/read.cxx shows how to use this class.
16 ClassImp(AliL3AltroMemHandler)
18 AliL3AltroMemHandler::AliL3AltroMemHandler(){
22 void AliL3AltroMemHandler::Clear(){
23 memset(altromem,0,ALTRO_SIZE);
24 memset(times_per_pad,0,1024);
25 memset(charges_per_pad,0,1024);
33 void AliL3AltroMemHandler::Write(UShort_t row, UChar_t pad, UShort_t charge, UShort_t time)
38 } else if((lrow!=row) || (lpad!=pad)){
39 MakeAltroPackets(); //make packets
40 Write(); //write packets
41 Clear(); //clear up for next pad
50 void AliL3AltroMemHandler::Add(UShort_t charge, UShort_t time)
52 times_per_pad[tcounter]=time;
53 charges_per_pad[tcounter]=charge;
57 void AliL3AltroMemHandler::MakeAltroPackets()
60 UShort_t t=0,seqlength;
65 altromem[--counter]=0xFFFF; //mark return
68 while((pcounter<ALTRO_SIZE) && (t<tcounter)){
72 ltime=times_per_pad[t];
74 while((i+1<tcounter)&&(times_per_pad[i+1]==ltime+j+1)){
78 seqlength=j+1; //number of consecutive times
79 htime=times_per_pad[i]; //abs. time for sequence
81 cout << " counter " << counter << endl;
83 cerr << "Error: " << ltime << " - " << htime << endl;
87 //store charges of sequence
88 for(UShort_t k=0;k<seqlength;k++){
89 altromem[--counter]=charges_per_pad[t];
94 altromem[--counter]=htime; //store abs. time of sequence
96 altromem[--counter]=seqlength+2; //store length of sequence
104 void AliL3AltroMemHandler::AddTrailer()
106 UShort_t savepcounter=pcounter;
108 while(pcounter%4!=0){
109 altromem[--counter]=0x2AA;
112 altromem[--counter]=0x2AA;
113 altromem[--counter]=savepcounter;
114 altromem[--counter]=lpad;
115 altromem[--counter]=lrow;
118 void AliL3AltroMemHandler::Write()
120 if(counter==ALTRO_SIZE) return;
122 //save packets (reversed) to file
123 UShort_t *ptr=altromem+counter;
124 for (int i=counter;i<ALTRO_SIZE;i++) {
127 if (*ptr==0xFFFF) continue; //no return for end of packet
128 fwrite(ptr,sizeof(UShort_t),1,fOutBinary);
130 if (*ptr==0xFFFF) fprintf(fOutBinary,"\n");
131 else fprintf(fOutBinary,"%X ",*ptr);
138 void AliL3AltroMemHandler::WriteFinal()
147 Bool_t AliL3AltroMemHandler::SetBinaryInput(FILE *file){
150 //LOG(AliL3Log::kWarning,"AliL3AltroMem::SetBinaryInput","File Open")<<"Pointer to File = 0x0 "<<ENDLOG;
157 Bool_t AliL3AltroMemHandler::SetBinaryOutput(FILE *file){
160 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetBinaryOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;
167 Bool_t AliL3AltroMemHandler::SetASCIIOutput(FILE *file){
170 LOG(AliL3Log::kWarning,"AliL3AltroMemHandler::SetASCIIOutput","File Open") <<"Pointer to File = 0x0 "<<ENDLOG;