00001
00002
00003
00004
00005
00006 #include "EztEmcRawData.h"
00007
00008 ClassImp(EztEmcRawData)
00009
00010
00011 EztEmcRawData::EztEmcRawData()
00012 {
00013 for(int i=0;i<MAXEMCDATABANK;i++) {
00014 mHeader[i].Set(0);
00015 mData[i].Set(0);
00016 setCorruption(i,0xffff);
00017 }
00018 }
00019
00020
00021 EztEmcRawData::EztEmcRawData(const EztEmcRawData& h) : TObject(h)
00022 {
00023 for(int i=0;i<MAXEMCDATABANK;i++) {
00024 if(h.header(i) && h.data(i)) {
00025 createBank(i,h.sizeHeader(i),h.sizeData(i));
00026 setHeader(i,(unsigned short*)h.header(i));
00027 setData(i,(unsigned short*)h.data(i));
00028 }
00029 }
00030 }
00031
00032
00033 EztEmcRawData::~EztEmcRawData()
00034 {
00035 for(int i=0;i<MAXEMCDATABANK;i++) deleteBank(i);
00036 }
00037
00038
00039
00040 void
00041 EztEmcRawData::createBank(int bank,int sizeHeader, int sizeData)
00042 {
00043 deleteBank(bank);
00044 mHeader[bank].Set(sizeHeader);
00045 mData[bank].Set(sizeData);
00046 for(int i = 0;i<sizeHeader;i++) mHeader[bank][i] = 0;
00047 for(int i = 0;i<sizeData;i++) mData[bank][i] = 0;
00048 setCorruption(bank,0xffff);
00049
00050 }
00051
00052
00053 void
00054 EztEmcRawData::deleteBank(int bank)
00055 {
00056 mHeader[bank].Set(0);
00057 mData[bank].Set(0);
00058 setCorruption(bank,0xffff);
00059 }
00060
00061
00062 void
00063 EztEmcRawData::setHeader(int bank,unsigned short* data)
00064 {
00065 if(sizeHeader(bank)==0) return;
00066 mHeader[bank].Set(sizeHeader(bank),(const Short_t*)data);
00067 }
00068
00069
00070 void
00071 EztEmcRawData::setData(int bank,unsigned short* data)
00072 {
00073 if(sizeData(bank)==0) return;
00074 mData[bank].Set(sizeData(bank),(const Short_t*)data);
00075 }
00076
00077
00078
00079 const UShort_t*
00080 EztEmcRawData::header(int bank) const
00081 {
00082 return (UShort_t*)mHeader[bank].GetArray();
00083 }
00084
00085
00086 const UShort_t*
00087 EztEmcRawData::data(int bank) const
00088 {
00089 return (UShort_t*)mData[bank].GetArray();
00090 }
00091
00092
00093 const int
00094 EztEmcRawData::sizeHeader(int bank) const
00095 {
00096 return mHeader[bank].GetSize();
00097 }
00098
00099
00100 const int
00101 EztEmcRawData::sizeData(int bank) const
00102 {
00103 return mData[bank].GetSize();
00104 }
00105
00106
00107 bool
00108 EztEmcRawData::purgeCrateOFF(int ib){
00109 bool isOFF=isCrateOFF(header(ib));
00110 if(isOFF) {
00111 mData[ib].Set(0);
00112 }
00113 return isOFF;
00114 }
00115
00116
00117 void
00118 EztEmcRawData::tagHeadValid( int ib, int token, int crId, int len, int trigComm, int errFlag, int dbg) {
00119 UShort_t ret= isHeadValid(header(ib), token, crId, len, trigComm, errFlag, dbg);
00120 setCorruption(ib,ret);
00121
00122 }
00123
00124
00125 bool
00126 EztEmcRawData::doHeadCorruptionTest(int token, int lenCount, int firstCrId, int errFlag){
00127
00128
00129 int trigComm=0x4;
00130
00131 int nCrIn=0;
00132 int nCrOK=0;
00133 int icr;
00134 for(icr=0;icr<getNBlocks();icr++) {
00135 if(isCrateVoid(icr)) continue;
00136 if(purgeCrateOFF(icr)) continue;
00137 nCrIn++;
00138 int crID=icr+firstCrId;
00139
00140 tagHeadValid(icr,token, crID,lenCount,trigComm,errFlag);
00141 if(getCorruption(icr)) continue;
00142 nCrOK++;
00143 }
00144
00145 return nCrOK!=nCrIn;
00146 }
00147
00148
00149
00150 bool
00151 EztEmcRawData::isCrateOFF( const UShort_t* hd) {
00152 bool a=(hd[0]& 0xFFF)==0xFFF;
00153 bool b=(hd[1]& 0xFFF)==0xFFF;
00154 return a && b;
00155 }
00156
00157
00158 UShort_t
00159 EztEmcRawData::isHeadValid(const UShort_t* hd, int token, int crId, int len, int trigComm, int errFlag, int dbg) {
00160
00161 UShort_t ret=0;
00162 if (getCrateID(hd)!=crId) ret |=bitCrateID;
00163 if (getToken(hd)!=token) ret |=bitToken;
00164 if (getLenCount(hd)!=len) ret |=bitLenCount;
00165 if (getTrigComm(hd)!=trigComm) ret |=bitTrigComm;
00166 if (getErrFlag(hd)!=errFlag) ret |=bitErrFlag;
00167 if (dbg) {
00168 print(hd);
00169 printf("getCrateID()/0x is=%x %x=required\n",getCrateID(hd),crId);
00170 printf("getToken()/0x = %x %x\n",getToken(hd),token);
00171 printf("getLenCount()/0x = %x %x\n",getLenCount(hd),len);
00172 printf("getTrigComm()/0x = %x %x\n",getTrigComm(hd),trigComm);
00173 printf("getErrFlag()/0x = %x %x\n",getErrFlag(hd),errFlag);
00174 printf(" corruption=0x%02x\n",ret);
00175 }
00176 return ret;
00177 }
00178
00179
00180
00181 void
00182 EztEmcRawData::print(int ib, int flag)
00183 {
00184 printf("EztEmcRawData block=%d corruption=0x%04x\n",ib,getCorruption(ib));
00185
00186 if(flag<=0) { print(header(ib)); return; }
00187
00188 print(header(ib),data(ib),sizeData(ib));
00189
00190 }
00191
00192
00193 void
00194 EztEmcRawData::print(int flag)
00195 {
00196 int icr, nb=0;
00197 for(icr=0;icr<getNBlocks();icr++) {
00198 if(sizeHeader(icr)<=0) continue;
00199 print(icr,flag);
00200 nb++;
00201 }
00202 printf("EztEmcRawData total %d of non empty blocks\n\n",nb);
00203
00204 }
00205
00206
00207 void EztEmcRawData::print(const UShort_t* hd, const UShort_t* d, int nd) {
00208 printf("EztEmcRawData Head: 0x%04hx 0x%04hx 0x%04hx 0x%04hx ",hd[0],hd[1],hd[2],hd[3]);
00209 printf("\n --> token=0x%2x crateID=0x%x trigComm=0x%x lenCount=0x%x errFlag=0x%x\n",
00210 getToken(hd),getCrateID(hd),getTrigComm(hd),getLenCount(hd),getErrFlag(hd));
00211 if(d==0) return;
00212 printf("Data[%3d]:",nd);
00213 for(int i=0;i<nd;i++) {
00214 if( i%8 == 0 ) printf("\n");
00215 printf("0x%04hx ",d[i]);
00216 }
00217 printf("\n");
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237