00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "RICH_Reader.hh"
00021 #include "RichEventReader.hh"
00022 #define MAX_ADC 0xFFF
00023
00024 using namespace OLDEVP;
00025 using namespace RICH_READER;
00026
00027 void RICH_Reader::ProcessEvent(const Bank_RICP * RichPTR)
00028 {
00029 int cramBlock, cramBank, dataDWord ;
00030 unsigned int *secPTR;
00031 RICCRAMP * RicCramP;
00032 RICDATAD * RicDataD;
00033 unsigned short channelNum,ADC, Token, SeqWc1, SeqWc2, BankId;
00034
00035 Token = RichPTR->header.Token;
00036 if (Token==0){
00037 cout<<"hack: do not know how to deal with token==0"<<endl;
00038 return;
00039 }
00040 BankId=RICH_CRAM_BANKS;
00041 mTheRichArray.NumOfChannels=0;
00042 mTheRichArray.EventNumber = Token;
00043 for (cramBlock = 0; cramBlock < 2 * RICH_NUM_CRAMS ; cramBlock++) {
00044
00045 if(RichPTR->CramPTR[cramBlock].len > 0)
00046 {
00047 RicCramP = (RICCRAMP *)( (unsigned long *)RichPTR + RichPTR->CramPTR[cramBlock].off);
00048
00049 RicCramP->swap();
00050
00051 for(cramBank=0; cramBank < RICH_CRAM_BANKS ; cramBank++) {
00052
00053 if(RicCramP->banks[cramBank].len > 0)
00054 {
00055 RicDataD = (RICDATAD *)((unsigned long *)RicCramP+RicCramP->banks[cramBank].off);
00056 RicDataD->swap();
00057 if (BankId==RICH_CRAM_BANKS){
00058 BankId=RicDataD->header.BankId;
00059 }
00060 else{
00061 if(BankId!=RicDataD->header.BankId){
00062 printf("Mismatch BankType or more than one BankType Present!\n");
00063 return;
00064 }
00065 }
00066 mTheRichArray.BankType = name2str(RicDataD->header.BankType);
00067 if (RicDataD->header.Token!=Token){
00068 mTheRichArray.EventNumber=0;
00069 printf("Token mismatch: RICP %d !=RICD %d\n",Token, RicDataD->header.Token);
00070 }
00071
00072
00073 secPTR = &(RicDataD->chanADC[0]);
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 SeqWc1=RicDataD->header.BankLength - (INT32)sizeof(Bank_Header)/4 ;
00084 SeqWc2=0;
00085 mTheRichArray.NumOfChannels +=SeqWc1;
00086 for (dataDWord = 0; (INT32)dataDWord < SeqWc1; dataDWord++)
00087 {
00088 channelNum = (secPTR[ dataDWord ] >> 16) & 0x3ff;
00089 ADC = secPTR[ dataDWord ] & MAX_ADC;
00090 if (channelNum>MAX_CHANNEL_NUM||ADC>MAX_ADC){
00091 printf("Wrong Data Word: %x\n",secPTR[dataDWord]);
00092 }
00093 else{
00094 if(mTheRichArray.RichMatrix[ channelNum / 6 ][ cramBlock * 6 + channelNum % 6] ==0){
00095 mTheRichArray.RichMatrix[ channelNum / 6 ][ cramBlock * 6 + channelNum % 6] = ADC ;
00096 SeqWc2++;
00097 }
00098 else
00099 printf("Channel =%d of block %d has been occupied\n",channelNum, cramBlock);
00100 }
00101
00102
00103 }
00104 if (SeqWc1!=SeqWc2) {
00105 printf("Mismatch Word Counts %d !=%d\n",SeqWc1, SeqWc2);
00106 }
00107 }
00108 }
00109 }
00110 }
00111 }
00112
00113
00114
00115 RICH_Reader::RICH_Reader(EventReader *er, Bank_RICP *pRICP)
00116 {
00117
00118 pBankRICP = pRICP;
00119 ercpy = er;
00120 if (!pBankRICP->test_CRC()) {
00121 printf("CRC error in RICP: %s %d\n",__FILE__,__LINE__) ;
00122 }
00123
00124 if (pBankRICP->swap() < 0) {
00125 printf("swap error in RICP: %s %d\n",__FILE__,__LINE__) ;
00126 }
00127
00128 pBankRICP->header.CRC = 0;
00129
00130 int Token = pBankRICP->header.Token;
00131 Bank_DATAP *dp = (Bank_DATAP *)ercpy->getDATAP();
00132 if(Token !=dp->header.Token){
00133 printf("Token mismatch between global %d and RICH %d\n",dp->header.Token,Token);
00134 }
00135
00136
00137
00138
00139 for(int i = 0 ; i <RICH_PAD ; i++)
00140 for(int j = 0 ; j < RICH_ROW; j++)
00141 mTheRichArray.RichMatrix[i][j] = 0;
00142
00143
00144 mTheRichArray.ByteSwapped = 0x04030201;
00145
00146
00147 ProcessEvent(pBankRICP);
00148
00149 }
00150
00151 RICH_Reader::RICH_Reader(RichEventReader *er, Bank_RICP *pRICP)
00152 {
00153
00154 pBankRICP = pRICP;
00155 if (!pBankRICP->test_CRC()) {
00156 printf("CRC error in RICP: %s %d\n",__FILE__,__LINE__) ;
00157 }
00158
00159 if (pBankRICP->swap() < 0) {
00160 printf("swap error in RICP: %s %d\n",__FILE__,__LINE__) ;
00161 }
00162
00163 pBankRICP->header.CRC = 0;
00164
00165
00166
00167
00168
00169 for(int i = 0 ; i <RICH_PAD ; i++)
00170 for(int j = 0 ; j < RICH_ROW; j++)
00171 mTheRichArray.RichMatrix[i][j] = 0;
00172
00173
00174 mTheRichArray.ByteSwapped = 0x04030201;
00175
00176
00177 ProcessEvent(pBankRICP);
00178
00179 }
00180
00181 unsigned short RICH_Reader::GetADCFromCoord(int x,int y)
00182 {
00183 return mTheRichArray.RichMatrix[x][RICH_ROW-y-1];
00184 }
00185
00186 unsigned short RICH_Reader::GetADCFromCramChannel(int cramBlock,int channelNum){
00187 return mTheRichArray.RichMatrix[ channelNum / 6 ][ cramBlock * 6 + channelNum % 6 ];}
00188
00189 unsigned int RICH_Reader::GetEventNumber(){
00190 return mTheRichArray.EventNumber ;}
00191
00192 unsigned int RICH_Reader::GetNumOfChannels(){
00193 return mTheRichArray.NumOfChannels ;}
00194
00195 const char * RICH_Reader::GetBankType(){
00196 return mTheRichArray.BankType;}
00197
00198 int RICH_Reader::IsByteSwapped(){
00199 return mTheRichArray.ByteSwapped; }
00200