00001 #include "EMC_BarrelReader.hh"
00002 #include <assert.h>
00003 #define MAX_ADC 0xFFF
00004 #include "Stiostream.h"
00005 #include <time.h>
00006 #include <stdlib.h>
00007 #include <Stiostream.h>
00008 #include <stdio.h>
00009 #include "StMessMgr.h"
00010 #include "StRTSClient/include/rts.h"
00011
00012 using namespace OLDEVP;
00013
00014 EMC_BarrelReader::EMC_BarrelReader(EventReader *er,Bank_EMCP *pEMCP):pBankEMCP(pEMCP),ercpy(er)
00015 {
00016 EventInfo info=er->getEventInfo();
00017 unsigned int UnixTime=info.UnixTime;
00018 struct tm *time=gmtime((time_t*) &UnixTime);
00019 int year=1900+time->tm_year;
00020 int month=1+time->tm_mon;
00021 int day=time->tm_mday;
00022 int hour1=time->tm_hour;
00023 int min=time->tm_min;
00024 int sec=time->tm_sec;
00025 char text1[80],text2[80];
00026 sprintf(text1,"%04d%02d%02d",year,month,day);
00027 sprintf(text2,"%02d%02d%02d",hour1,min,sec);
00028 unsigned int date=atoi(text1);
00029 unsigned int hour=atoi(text2);
00030 decoder=new StEmcDecoder(date,hour);
00031 cout<<"EMC_Barrelreader** Event time (Unix time) = "<<UnixTime<<endl;
00032 Initialize();
00033 }
00034 EMC_BarrelReader::~EMC_BarrelReader()
00035 {
00036 if(decoder)
00037 delete decoder;
00038 }
00040 void EMC_BarrelReader::Initialize()
00041 {
00042 mTheTowerAdcR.NTowerHits=0;
00043 for(int i=0;i<4800;i++)
00044 {
00045 mTheTowerAdcR.TowerADCArray[i]=0;
00046 mTheTowerAdcD.TowerADCArray[i]=0;
00047 mTheTowerPedR.TowerADCArray[i]=0;
00048 mTheTowerRMSR.TowerADCArray[i]=0;
00049 }
00050 for(int i=0;i<120;i++)
00051 {
00052 mTheTowerAdcR.TDCHeader[i]=0;
00053 mTheTowerAdcD.TDCHeader[i]=0;
00054 mTheTowerPedR.TDCHeader[i]=0;
00055 mTheTowerRMSR.TDCHeader[i]=0;
00056 }
00057
00058
00059 for(int i = 0 ; i <120 ; i++)
00060 for(int j = 0 ; j < 20; j++)
00061 for(int k = 0 ; k < 2; k++)
00062 {
00063 mTheTowerAdcR.TowerMatrix[i][j][k] = 0;
00064 mTheTowerAdcD.TowerMatrix[i][j][k] = 0;
00065 mTheTowerPedR.TowerMatrix[i][j][k] = 0;
00066 mTheTowerRMSR.TowerMatrix[i][j][k] = 0;
00067 }
00068 }
00069
00070 Bank_EMCSECP* EMC_BarrelReader::getBarrelSection(const Bank_EMCP* pBankEMCP,int section)
00071 {
00072
00073 if((!pBankEMCP->EMCSecPointer[section].offset) || (!pBankEMCP->EMCSecPointer[section].length))
00074 {
00075 char str0[40];
00076 sprintf(str0,"getBarrelSection(hs %d)",section);
00077 ercpy->fprintError(INFO_MISSING_BANK,__FILE__,__LINE__,str0);
00078 cout<<" getBarrelSection** , no offset or length for section**"<<section<<endl;
00079 return NULL;
00080 }
00081
00082 Bank_EMCSECP * ptr=(Bank_EMCSECP*)(((INT32 *)pBankEMCP)+pBankEMCP->EMCSecPointer[0].offset);
00083
00084
00085 if(strncmp(ptr->header.BankType,"EMCSECP",7))
00086 {
00087 char str0[40];
00088 cout<<" error in header name**"<<endl;
00089 sprintf(str0,"getBarrelsection(hs )");
00090 ercpy->fprintError(ERR_BAD_HEADER,__FILE__,__LINE__, str0);
00091 return NULL;
00092 }
00093 if(!ptr->test_CRC())
00094 {
00095 char str0[40];
00096 cout<<"error in CRC**"<<endl;
00097 sprintf(str0,"getBarrelsection(hs )");
00098 ercpy->fprintError(ERR_CRC,__FILE__,__LINE__,str0);
00099 return NULL;
00100 }
00101 printf("Byte order of header for EMCSECP Before swap**: %x\n",ptr->header.ByteOrder);
00102 if(ptr->swap() < 0)
00103 {
00104 char str0[40];
00105 cout<<"error in swap**"<<endl;
00106 sprintf(str0,"getBarrelsection(hs)");
00107 ercpy->fprintError(ERR_SWAP,__FILE__,__LINE__,str0);
00108 return NULL;
00109 }
00110
00111 ptr->header.CRC = 0;
00112 return ptr;
00113 }
00115 Bank_EMCRBP* EMC_BarrelReader::getBarrelTowerFiber(Bank_EMCSECP* secp,int section)
00116 {
00117 if((!secp->FiberPointer[section].offset) || (!secp->FiberPointer[section].length))
00118 {
00119 char str0[40];
00120 sprintf(str0,"getBarrelTowerFiber(hs %d)",section);
00121 ercpy->fprintError(INFO_MISSING_BANK,__FILE__,__LINE__,str0);
00122 cout<<" getBarrelSection** , no offset or length for section**"<<section<<endl;
00123 return NULL;
00124 }
00125
00126 Bank_EMCRBP* ptr =(Bank_EMCRBP*)(((INT32 *)secp)+secp->FiberPointer[section].offset);
00127
00128
00129
00130 if(strncmp(ptr->header.BankType,"EMCRBP",6))
00131 {
00132 char str0[40];
00133 cout<<" error in header name**"<<endl;
00134 sprintf(str0,"getBarrelTowerFiber(hs %d)",section);
00135 ercpy->fprintError(ERR_BAD_HEADER,__FILE__,__LINE__, str0);
00136 return NULL;
00137 }
00138 if(!ptr->test_CRC())
00139 {
00140 char str0[40];
00141 cout<<"error in CRC**"<<endl;
00142 sprintf(str0,"getBarrelTowerFiber(hs %d)",section);
00143 ercpy->fprintError(ERR_CRC,__FILE__,__LINE__,str0);
00144 return NULL;
00145 }
00146 if(ptr->swap() < 0)
00147 {
00148 char str0[40];
00149 cout<<"error in swap**"<<endl;
00150 sprintf(str0,"getBarrelTowerFiber(hs %d)",section);
00151 ercpy->fprintError(ERR_SWAP,__FILE__,__LINE__,str0);
00152 return NULL;
00153 }
00154 ptr->header.CRC = 0;
00155 return ptr;
00156 }
00158 Bank_TOWERADCR* EMC_BarrelReader::getBarrelADC(Bank_EMCRBP* rbp)
00159 {
00160 if((!rbp->EMCADCR.offset) || (!rbp->EMCADCR.length))
00161 {
00162 char str0[40];
00163 sprintf(str0,"getBarrelADC(hs)");
00164 ercpy->fprintError(INFO_MISSING_BANK,__FILE__,__LINE__,str0);
00165 cout<<" getBarrelADC** , no offset or length for ADCR**"<<endl;
00166 return NULL;
00167 }
00168 Bank_TOWERADCR* pADCR =(Bank_TOWERADCR*)(((INT32 *)rbp)+rbp->EMCADCR.offset);
00169
00170
00171
00172 if(strncmp(pADCR->header.BankType,"EMCADCR",7))
00173 {
00174 char str0[40];
00175 cout<<" error in header name**"<<endl;
00176 sprintf(str0,"getBarrelADC(hs)");
00177 ercpy->fprintError(ERR_BAD_HEADER,__FILE__,__LINE__, str0);
00178 return NULL;
00179 }
00180 if(!pADCR->test_CRC())
00181 {
00182 char str0[40];
00183 cout<<"error in CRC**"<<endl;
00184 sprintf(str0,"getBarrelADC(hs)");
00185 ercpy->fprintError(ERR_CRC,__FILE__,__LINE__,str0);
00186 return NULL;
00187 }
00188 if(pADCR->swap() < 0)
00189 {
00190 char str0[40];
00191 cout<<"error in swap**"<<endl;
00192 sprintf(str0,"getBarrelADC(hs)");
00193 ercpy->fprintError(ERR_SWAP,__FILE__,__LINE__,str0);
00194 return NULL;
00195 }
00196
00197 pADCR->header.CRC = 0;
00198 return pADCR;
00199 }
00201 int EMC_BarrelReader::FillBarrelTower(Bank_TOWERADCR* pADCR)
00202 {
00203 mTheTowerAdcR.BankType="TOWRADCR\n";
00204 mTheTowerAdcR.DetFlag=1;
00205 mTheTowerAdcR.EventNumber=pADCR->header.Token;
00206 mTheTowerAdcR.PedFlag=0;
00207 mTheTowerAdcR.TDCErrorFlag=1;
00208 mTheTowerAdcR.NTDCChannels=0;
00209
00210 for(int TDC=0;TDC<120;TDC++)
00211 mTheTowerAdcR.TDCHeader[TDC] = pADCR->TDCHeader[TDC];
00212
00213 for(int TDC=0;TDC<30;TDC++)
00214 {
00215 mTheTowerAdcR.TDCCount[TDC]=pADCR->TDCHeader[TDC];
00216 mTheTowerAdcR.TDCError[TDC]=pADCR->TDCHeader[TDC+30];
00217 mTheTowerAdcR.TDCToken[TDC]=pADCR->TDCHeader[TDC+60];
00218 mTheTowerAdcR.TDCTrigger[TDC]=(pADCR->TDCHeader[TDC+90] & 0xF00) >> 8;
00219 mTheTowerAdcR.TDCCrateId[TDC]=(pADCR->TDCHeader[TDC+90] & 0x0FF);
00220
00221
00222
00223
00224
00225
00226 int CId = 0;
00227 decoder->GetTowerCrateFromTDC(TDC,CId);
00228
00229
00230
00231
00232 {
00233 mTheTowerAdcR.TDCErrorFlag=0;
00234 mTheTowerAdcR.NTDCChannels++;
00235
00236 for(int i=0;i<160;i++)
00237 {
00238 int index=i*30+TDC;
00239
00240 mTheTowerAdcR.TDCData[TDC][i]=pADCR->fiberData[index];
00241
00242
00243 mTheTowerAdcR.TowerADCArray[index]=pADCR->fiberData[index];
00244
00245
00246 mTheTowerAdcR.NTowerHits++;
00247
00248 int index_jose=-1;
00249 int stat_index=decoder->GetTowerIdFromDaqId(index,index_jose);
00250
00251
00252
00253 int m=0,e=0,s=0;
00254 if(index_jose!=-1)
00255 {
00256 if(stat_index)
00257 {
00258 int binstat=decoder->GetTowerBin(index_jose,m,e,s);
00259
00260
00261 if(!binstat)
00262 cout<<" problem in bin conversion "<<index<<endl;
00263 else
00264 mTheTowerAdcR.TowerMatrix[m-1][e-1][s-1]=pADCR->fiberData[index];
00265 }
00266 }
00267 }
00268 }
00269 }
00270
00271 return 1;
00272 }
00274 int EMC_BarrelReader::ProcessBarrelTower(const Bank_EMCP* EmcPTR, const Bank_TRGP* TrgPTR)
00275 {
00276
00277 if (TrgPTR) {
00278 bool swap = TrgPTR->header.ByteOrder != 0x04030201;
00279 int offset = TrgPTR->theData.offset;
00280 if (swap) offset = swap32(offset);
00281 char* cTTT = (char*)TrgPTR + offset * 4 + sizeof(TrgPTR->header);
00282 if (cTTT) {
00283 TrgTowerTrnfer2008* TTT = (TrgTowerTrnfer2008*)cTTT;
00284 int byteCount_Version = TTT->byteCount_Version;
00285 if (swap) byteCount_Version = swap32(TTT->byteCount_Version);
00286 if ((byteCount_Version & 0xff) == 0x10) {
00287 int offset = TTT->OffsetBlock[y8TRG_INDEX].offset;
00288 if (swap) offset = swap32(offset);
00289 char trg_version = cTTT[offset + 3];
00290 if (trg_version == 0x32) {
00291 int offset = TTT->OffsetBlock[y8BTOW_INDEX].offset;
00292 int length = TTT->OffsetBlock[y8BTOW_INDEX].length;
00293
00294 if (swap) {
00295 offset = swap32(offset);
00296 length = swap32(length);
00297 }
00298
00299 if (length != y8BTOW_LEN) {
00300 LOG_ERROR << "Bad BTOW length found in TrgTowerTrnfer block" << endm;
00301 return 0;
00302 }
00303
00304 Bank_TOWERADCR* fakeADCRptr = (Bank_TOWERADCR*)((char*)TTT + offset - sizeof(Bank_Header));
00305
00306 return FillBarrelTower(fakeADCRptr);
00307 }
00308 }
00309 }
00310 }
00311
00312 if (!EmcPTR) return 0;
00313
00314
00315 Bank_EMCSECP* barreltower=getBarrelSection(EmcPTR,0);
00316 if(barreltower) {
00317 Bank_EMCRBP* towerfiber=getBarrelTowerFiber(barreltower,0);
00318 if(towerfiber) {
00319 Bank_TOWERADCR* toweradc=getBarrelADC(towerfiber);
00320
00321 if(toweradc) {
00322 FillBarrelTower(toweradc);
00323 return 1;
00324 }
00325 else { LOG_INFO <<" ADCR absent , looking for ADCD"<<endm; }
00326
00327 toweradc=0;
00328 }
00329 else { LOG_INFO <<" BANK_EMRBP absent**"<<endm; }
00330 }
00331 else { LOG_INFO <<" BANK_EMCSECP absent**"<<endm; }
00332
00333 return 0;
00334 }
00336 void EMC_BarrelReader::PrintTowerArray()
00337 {
00338
00339 cout<<"BankType **"<<mTheTowerAdcR.BankType<<endl;
00340 cout<<"Det flag **"<<mTheTowerAdcR.DetFlag<<endl;
00341 cout<<"Event no**"<<mTheTowerAdcR.EventNumber<<endl;
00342 cout<<"Pedflag**"<<mTheTowerAdcR.PedFlag<<endl;
00343 cout<<"TDCERR **"<<mTheTowerAdcR.TDCErrorFlag<<endl;
00344 for(int i=0;i<120;i++)
00345 for(int j=0;j<20;j++)
00346 for(int k=0;k<2;k++)
00347 if(mTheTowerAdcR.TowerMatrix[i][j][k]>0)
00348 cout<<"ADCDATA** mod"<<i+1<<"eta "<<j+1<<"phi "<<k+1<<"ADC "<<mTheTowerAdcR.TowerMatrix[i][j][k]<<endl;
00349 }
00351 Bank_BTOWERADCR& EMC_BarrelReader::getBTOWERADCR()
00352 {
00353 return mTheTowerAdcR;
00354 }