00001 #include <cassert>
00002 #include <string.h>
00003 #include "EEdims.h"
00004
00005 #include "EEfeeDataBlock.h"
00006
00007 ClassImp(EEfeeDataBlock)
00008
00009 const int EEfeeDataBlock::DefaultMaxHead=4;
00010 const int EEfeeDataBlock::DefaultMaxData=192;
00011
00012
00013
00014
00015
00016
00017 EEfeeDataBlock :: EEfeeDataBlock() {
00018 MaxHead = DefaultMaxHead;
00019 MaxData = 0 ;
00020 head = new UShort_t[MaxHead];
00021 data = NULL;
00022 sanity=0xff;
00023 }
00024
00025
00026 EEfeeDataBlock::EEfeeDataBlock(const EEfeeDataBlock *b) {
00027 MaxData = b->getDataLen();
00028 MaxHead = b->getHeadLen();
00029 head=0;
00030 if(MaxHead>0) head = new UShort_t[MaxHead];
00031 data=0;
00032 if(MaxData>0) data = new UShort_t[MaxData];
00033 set(b);
00034 }
00035
00036
00037
00038
00039
00040
00041
00042 EEfeeDataBlock :: ~EEfeeDataBlock() {
00043 if(head) delete [] head;
00044 if(data) delete [] data;
00045 }
00046
00047
00048
00049
00050
00051 void EEfeeDataBlock :: print(int flag){
00052 printf("feeDataBlock Head: 0x%04hx 0x%04hx 0x%04hx 0x%04hx ",head[0],head[1],head[2],head[3]);
00053 printf("\n --> token=0x%2x crateID=0x%x trigComm=0x%x lenCount=0x%x errFlag=0x%x\n NpositiveData=%d sanity=0x%02x\n",
00054 getToken(),getCrateID(),getTrigComm(),getLenCount(),getErrFlag(),getNData(0),sanity);
00055
00056 if(flag<=0) return;
00057
00058 int nd=getDataLen();
00059 printf("Data[%3d]:",nd);
00060 for(int i=0;i<nd;i++) {
00061 if( i%8 == 0 ) printf("\n");
00062 printf("0x%04hx ",data[i]);
00063
00064 }
00065 printf("\n");
00066
00067 }
00068
00069
00070
00071
00072
00073
00074 void
00075 EEfeeDataBlock :: set(const EEfeeDataBlock *b) {
00076 setHead(b->getHead());
00077 setDataArray(b->getData(),b->getDataLen());
00078 }
00079
00080
00081
00082
00083
00084 void EEfeeDataBlock ::setHead(const UShort_t *h) {
00085 if(h)
00086 memcpy(head,h,sizeof(head[0])*MaxHead);
00087 else
00088 memset(head,0,sizeof(head[0])*MaxHead);
00089
00090 }
00091
00092
00093
00094
00095
00096 int EEfeeDataBlock ::getNData(int thres) const {
00097 int n=0;
00098 int i;
00099 const int nd=getValidDataLen();
00100 for(i=0;i<nd;i++) if(data[i]>thres) n++;
00101 return n;
00102 }
00103
00104
00105
00106
00107
00108 void EEfeeDataBlock ::setDataArray(const UShort_t *dIn, int size) {
00109 const UShort_t x=0,*d=&x;
00110 if(dIn) {
00111 d=dIn;
00112 } else {
00113 size =1;
00114 }
00115
00116 if(size!=MaxData) {
00117 if(data) delete [] data;
00118 MaxData = size;
00119 data = new UShort_t[MaxData];
00120 } else {
00121 memset(data,0x0,sizeof(data[0])*MaxData);
00122 }
00123 memcpy(data,d,size*sizeof(data[0]));
00124 }
00125
00126
00127
00128
00129
00130
00131 void EEfeeDataBlock ::setData(int chan, UShort_t d){
00132 assert(chan>=0);
00133 if(chan>=MaxData) {
00134 Int_t newsize = MaxData + DefaultMaxData;
00135 UShort_t *newdata = new UShort_t[newsize];
00136 if(data) {
00137 memcpy(newdata,data,MaxData);
00138 delete [] data;
00139 }
00140 data = newdata;
00141 MaxData = newsize;
00142 }
00143 data[chan]=d;
00144 }
00145
00146
00147
00148
00149
00150
00151 void EEfeeDataBlock :: clear(){
00152 if(head) memset(head,0,sizeof(head[0])*MaxHead);
00153 if(data) memset(data,0,sizeof(data[0])*MaxData);
00154 sanity=0xff;
00155 }
00156
00157
00158
00159
00160
00161 UChar_t EEfeeDataBlock
00162 ::isHeadValid(int token, int crId, int len, int trigComm, int errFlag){
00163
00164 unsigned char ret=0;
00165 ret|=(getCrateID()!=crId)<<0;
00166 ret|=(getToken()!=token)<<1;
00167 ret|=(getLenCount()!=len)<<2;
00168 ret|=(getTrigComm()!=trigComm)<<3;
00169 ret|=(getErrFlag()!=errFlag)<<4;
00170 sanity=ret;
00171
00172 #if 0
00173 printf("\nask/0x: %x %x %x %x %x\n", token,crId,len,trigComm,errFlag);
00174 print(0);
00175 printf("getCrateID()/0x = %x %x\n",getCrateID(),crId);
00176 printf("getToken()/0x = %x %x\n",getToken(),token);
00177 printf("getLenCount()/0x = %x %x\n",getLenCount(),len);
00178 printf("getTrigComm()/0x = %x %x\n",getTrigComm(),trigComm);
00179 printf("getErrFlag()/0x = %x %x\n",getErrFlag(),errFlag);
00180 #endif
00181
00182
00183 return ret;
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227