00001 #include "EMC_SmdReader.hh"
00002 #include "StMessMgr.h"
00003 #include <assert.h>
00004 #define MAX_ADC 0xFFF
00005 #include <time.h>
00006 #include <stdlib.h>
00007 #include <Stiostream.h>
00008 #include <stdio.h>
00009
00010 using namespace OLDEVP;
00011
00013 EMC_SmdReader::EMC_SmdReader(EventReader* er,Bank_EMCP *pEMCP): pBankEMCP(pEMCP),ercpy(er)
00014 {
00015 mNSMD = 8;
00016
00017 EventInfo info=er->getEventInfo();
00018 unsigned int UnixTime=info.UnixTime;
00019 struct tm *time=gmtime((time_t*) &UnixTime);
00020 int year=1900+time->tm_year;
00021 int month=1+time->tm_mon;
00022 int day=time->tm_mday;
00023 int hour1=time->tm_hour;
00024 int min=time->tm_min;
00025 int sec=time->tm_sec;
00026 char text1[80],text2[80];
00027 sprintf(text1,"%04d%02d%02d",year,month,day);
00028 sprintf(text2,"%02d%02d%02d",hour1,min,sec);
00029 unsigned int date=atoi(text1);
00030 unsigned int hour=atoi(text2);
00031 decoder = new StEmcDecoder(date,hour);
00032
00033 if(date>20041201)
00034 mNSMD = 12;
00035 LOG_INFO<<"EMC_SMDreader** Event time (Unix time) = "<<UnixTime<<" NSMD = "<<mNSMD<<endm;
00036 Initialize();
00037 }
00039 EMC_SmdReader::~EMC_SmdReader()
00040 {
00041 if(decoder)
00042 delete decoder;
00043 }
00045
00046 void EMC_SmdReader::Initialize()
00047 {
00048 mTheSmdAdcR.NSmdHits = 0;
00049 for(int RDO=0;RDO<12;RDO++)
00050 mTheSmdAdcR.TimeBin[RDO]=999;
00051 for(int RDO=0;RDO<12;RDO++)
00052 mTheSmdAdcR.HasData[RDO]=0;
00053
00054
00055 for(int i = 0 ; i <120 ; i++)
00056 {
00057 for(int j = 0 ; j < 150; j++)
00058 mTheSmdAdcR.SmdE_ADCMatrix[i][j] = 0;
00059 for(int j = 0 ; j < 10; j++)
00060 for(int k = 0;k < 15; k++)
00061 mTheSmdAdcR.SmdP_ADCMatrix[i][j][k] = 0;
00062 }
00063 }
00065 Bank_EMCSECP* EMC_SmdReader::getBarrelSmdSection(const Bank_EMCP* pBankEMCP,int section)
00066 {
00067 if((!pBankEMCP->EMCSecPointer[section].offset) || (!pBankEMCP->EMCSecPointer[section].length))
00068 {
00069 char str0[40];
00070 sprintf(str0,"getBarrelsection(hs %d)",section);
00071 ercpy->fprintError(INFO_MISSING_BANK,__FILE__,__LINE__,str0);
00072 LOG_WARN<<" SmdReader::getBarrelSection** , no offset or length for section**"<<section<<endm;
00073 return NULL;
00074 }
00075
00076 Bank_EMCSECP * ptr=(Bank_EMCSECP*)(((INT32 *)pBankEMCP)+pBankEMCP->EMCSecPointer[section].offset);
00077
00078
00079 if(strncmp(ptr->header.BankType,"EMCSECP",7))
00080 {
00081 char str0[40];
00082 LOG_WARN<<" error in header name**"<<endm;
00083 sprintf(str0,"getBarrelSection(hs %d)",section);
00084 ercpy->fprintError(ERR_BAD_HEADER,__FILE__,__LINE__, str0);
00085 return NULL;
00086 }
00087 if(!ptr->test_CRC())
00088 {
00089 char str0[40];
00090 LOG_WARN<<"error in CRC**"<<endm;
00091 sprintf(str0,"getBarrelsection(hs %d)",section);
00092 ercpy->fprintError(ERR_CRC,__FILE__,__LINE__,str0);
00093 return NULL;
00094 }
00095 printf("Byte order of header for EMCSECP Before swap**: %x\n",ptr->header.ByteOrder);
00096 if(ptr->swap() < 0)
00097 {
00098 char str0[40];
00099 LOG_WARN<<"error in swap**"<<endm;
00100 sprintf(str0,"getBarrelsection(hs %d)",section);
00101 ercpy->fprintError(ERR_SWAP,__FILE__,__LINE__,str0);
00102 return NULL;
00103 }
00104 ptr->header.CRC = 0;
00105 return ptr;
00106 }
00108 Bank_EMCRBP* EMC_SmdReader::getBarrelSmdFiber(Bank_EMCSECP* secp,int section)
00109 {
00110 if((!secp->FiberPointer[section].offset) || (!secp->FiberPointer[section].length))
00111 {
00112 char str0[40];
00113 sprintf(str0,"getBarrelSmdFiber(hs %d)",section);
00114 ercpy->fprintError(INFO_MISSING_BANK,__FILE__,__LINE__,str0);
00115
00116 return NULL;
00117 }
00118
00119
00120 Bank_EMCRBP* ptr =(Bank_EMCRBP*)(((INT32 *)secp)+secp->FiberPointer[section].offset);
00121
00122
00123
00124 if(strncmp(ptr->header.BankType,"EMCRBP",6))
00125 {
00126 char str0[40];
00127 LOG_WARN<<" error in header name**"<<endm;
00128 sprintf(str0,"getBarrelSmdfiber(hs %d)",section);
00129 ercpy->fprintError(ERR_BAD_HEADER,__FILE__,__LINE__, str0);
00130 return NULL;
00131 }
00132 if(!ptr->test_CRC())
00133 {
00134 char str0[40];
00135 LOG_WARN<<"error in CRC**"<<endm;
00136 sprintf(str0,"getBarrelSmdfiber(hs %d)",section);
00137 ercpy->fprintError(ERR_CRC,__FILE__,__LINE__,str0);
00138 return NULL;
00139 }
00140 if(ptr->swap() < 0)
00141 {
00142 char str0[40];
00143 LOG_WARN<<"error in swap**"<<endm;
00144 sprintf(str0,"getBarrelSmdFiber(hs %d)",section);
00145 ercpy->fprintError(ERR_SWAP,__FILE__,__LINE__,str0);
00146 return NULL;
00147 }
00148 ptr->header.CRC = 0;
00149 return ptr;
00150 }
00152 Bank_SMDADCR* EMC_SmdReader::getSmdADC(Bank_EMCRBP* rbp)
00153 {
00154 if((!rbp->EMCADCR.offset) || (!rbp->EMCADCR.length))
00155 {
00156 char str0[40];
00157 sprintf(str0,"getSmdADC(hs )");
00158 ercpy->fprintError(INFO_MISSING_BANK,__FILE__,__LINE__,str0);
00159 LOG_WARN<<" getBarrelADC** , no offset or length for ADCR**"<<endm;
00160 return NULL;
00161 }
00162 Bank_SMDADCR* pADCR =(Bank_SMDADCR*)(((INT32 *)rbp)+rbp->EMCADCR.offset);
00163
00164
00165
00166 if(strncmp(pADCR->header.BankType,"EMCADCR",7))
00167 {
00168 char str0[40];
00169 LOG_WARN<<" error in header name**"<<endm;
00170 sprintf(str0,"getSmdADC(hs)");
00171 ercpy->fprintError(ERR_BAD_HEADER,__FILE__,__LINE__, str0);
00172 return NULL;
00173 }
00174 if(!pADCR->test_CRC())
00175 {
00176 char str0[40];
00177 LOG_WARN<<"error in CRC**"<<endm;
00178 sprintf(str0,"getSmdADC(hs)");
00179 ercpy->fprintError(ERR_CRC,__FILE__,__LINE__,str0);
00180 return NULL;
00181 }
00182 if(pADCR->swap() < 0)
00183 {
00184 char str0[40];
00185 LOG_WARN<<"error in swap**"<<endm;
00186 sprintf(str0,"getBankSVTSECP(hs)");
00187 ercpy->fprintError(ERR_SWAP,__FILE__,__LINE__,str0);
00188 return NULL;
00189 }
00190 pADCR->header.CRC = 0;
00191 return pADCR;
00192 }
00194 int EMC_SmdReader::FillBarrelSmd(Bank_SMDADCR* pADCR,int RDO)
00195 {
00196
00197
00198
00199
00200
00201
00202 mTheSmdAdcR.EventNumber=pADCR->header.Token;
00203 mTheSmdAdcR.PedFlag=0;
00204 mTheSmdAdcR.SMDErrorFlag=0;
00205 mTheSmdAdcR.TimeBin[RDO]=pADCR->fiberHeader[32];
00206 LOG_DEBUG <<"SMD Time bin for RDO "<<RDO<<" = "<<mTheSmdAdcR.TimeBin[RDO]<<endm;
00207 for(int i=0;i<128;i++)
00208 mTheSmdAdcR.SmdHeader[RDO][i]=pADCR->fiberHeader[i];
00209 int sum =0;
00210
00211
00212 for(int i=0;i<4800;i++)
00213 {
00214 int index=i;
00215
00216 int det=0,mod=0,eta=0,sub=0;
00217
00218 mTheSmdAdcR.SMDADCArray[RDO][i]=pADCR->fiberData[index];
00219 sum+=mTheSmdAdcR.SMDADCArray[RDO][i];
00220 mTheSmdAdcR.BankType="BSMDADCR\n";
00221 if(RDO<8)
00222 {
00223 if(pADCR->fiberData[index]>0)
00224 mTheSmdAdcR.NSmdHits++;
00225 int binstat=decoder->GetSmdCoord(RDO,index,det,mod,eta,sub);
00226
00227 if(binstat)
00228 {
00229
00230 mTheSmdAdcR.DetFlag=det;
00231
00232 if(det==3)
00233 mTheSmdAdcR.SmdE_ADCMatrix[mod-1][eta-1]=pADCR->fiberData[index];
00234
00235 if(det==4)
00236 mTheSmdAdcR.SmdP_ADCMatrix[mod-1][eta-1][sub-1]=pADCR->fiberData[index];
00237 }
00238 }
00239 }
00240 if(sum>0)
00241 mTheSmdAdcR.HasData[RDO] = 1;
00242 return 1;
00243 }
00245 int EMC_SmdReader::ProcessBarrelSmd(const Bank_EMCP* EmcPTR)
00246 {
00247
00248 Bank_EMCSECP* barrelsmd=getBarrelSmdSection(EmcPTR,1);
00249
00250 if(barrelsmd)
00251 {
00252 for(int RDO=0;RDO<mNSMD;RDO++)
00253 {
00254 LOG_DEBUG<<" taking SMDfiber RDO *** "<<RDO<<endm;
00255 Bank_EMCRBP* smdfiber=getBarrelSmdFiber(barrelsmd,RDO);
00256 if(smdfiber)
00257 {
00258
00259 Bank_SMDADCR* smdadc=getSmdADC(smdfiber);
00260
00261 if(smdadc)
00262 {
00263 int fillstat= FillBarrelSmd(smdadc,RDO);
00264 if(!fillstat)
00265 LOG_WARN<<" Error on SMD Filling "<<endm;
00266 }
00267 else
00268 {
00269 LOG_WARN<<" ADCR absent"<<endm;
00270 }
00271 if(smdadc)
00272 smdadc=0;
00273 if(smdfiber)
00274 smdfiber=0;
00275 }
00276 }
00277 }
00278 else
00279 {
00280 LOG_WARN<<" BANK_EMCSECP for SMD absent**"<<endm;
00281 return 0;
00282 }
00283 return 1;
00284 }
00286 Bank_BSMDADCR& EMC_SmdReader::getBSMDADCR()
00287 {
00288 return mTheSmdAdcR;
00289 }