00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <arpa/inet.h>
00004
00005 #include <rtsLog.h>
00006 #include <rts.h>
00007
00008 #include <rtsSystems.h>
00009
00010
00011
00012
00013 #define TRG_VERSION 0x32
00014 #include <daqFormats.h>
00015
00016
00017
00018 #include "daq_trg.h"
00019
00020
00021
00022
00023
00024 static unsigned char ctbMap[240] = {
00025 7, 6, 5, 4, 3, 23, 22, 21, 20, 19,
00026 2, 1, 0, 15, 14, 18, 17, 16, 31, 30,
00027 13, 12, 11, 10, 9, 29, 28, 27, 26, 25,
00028 39, 38, 37, 36, 35, 55, 54, 53, 52, 51,
00029 34, 33, 32, 47, 46, 50, 49, 48, 63, 62,
00030 45, 44, 43, 42, 41, 61, 60, 59, 58, 57,
00031 71, 70, 69, 68, 67, 87, 86, 85, 84, 83,
00032 66, 65, 64, 79, 78, 82, 81, 80, 95, 94,
00033 77, 76, 75, 74, 73, 93, 92, 91, 90, 89,
00034 103, 102, 101, 100, 99, 119, 118, 117, 116, 115,
00035 98, 97, 96, 111, 110, 114, 113, 112, 127, 126,
00036 109, 108, 107, 106, 105, 125, 124, 123, 122, 121,
00037 135, 134, 133, 132, 131, 151, 150, 149, 148, 147,
00038 130, 129, 128, 143, 142, 146, 145, 144, 159, 158,
00039 141, 140, 139, 138, 137, 157, 156, 155, 154, 153,
00040 167, 166, 165, 164, 163, 183, 182, 181, 180, 179,
00041 162, 161, 160, 175, 174, 178, 177, 176, 191, 190,
00042 173, 172, 171, 170, 169, 189, 188, 187, 186, 185,
00043 199, 198, 197, 196, 195, 215, 214, 213, 212, 211,
00044 194, 193, 192, 207, 206, 210, 209, 208, 223, 222,
00045 205, 204, 203, 202, 201, 221, 220, 219, 218, 217,
00046 231, 230, 229, 228, 227, 247, 246, 245, 244, 243,
00047 226, 225, 224, 239, 238, 242, 241, 240, 255, 254,
00048 237, 236, 235, 234, 233, 253, 252, 251, 250, 249,
00049 } ;
00050
00051 static TrgSumData trg_sum ;
00052
00053
00054 int trgReader32(char *arg, int bytes, int swap, struct trg_t *trg)
00055 {
00056 int i ;
00057 int sdes, ssum, sraw ;
00058
00059 EvtDescData *desc = (EvtDescData *)arg;
00060 TrgSumData *sum = (TrgSumData *)(arg + sizeof(EvtDescData));
00061
00062
00063 sdes = sizeof(EvtDescData) ;
00064 ssum = sdes + sizeof(TrgSumData) ;
00065
00066 if(bytes < ssum + 4) {
00067 LOG(NOTE,"No TRG Summaries, or Raw...",0,0,0,0,0) ;
00068 return 0 ;
00069 }
00070
00071 RawTrgDet *raw = (RawTrgDet *)(arg + sizeof(EvtDescData) + sizeof(TrgSumData));
00072 int rdb = swap ? swap16(raw[0].RawDetBytes) : raw[0].RawDetBytes;
00073
00074 sraw = ssum + rdb;
00075
00076 int minsize = sizeof(EvtDescData) + sizeof(TrgSumData) + 1772;
00077
00078
00079 if(sraw < minsize) {
00080 LOG(NOTE, "Trigger bank size smaller than minimum %d vs %d", sraw, minsize);
00081 return 0;
00082 }
00083
00084 if(bytes < sraw) {
00085 LOG(NOTE,"Trigger Bank too small %d vs %d",bytes,sraw);
00086 return 0 ;
00087 }
00088
00089
00090
00091
00092 LOG(DBG,"evt desc bytes %d, sum bytes %d, raw bytes %d",sizeof(EvtDescData),sizeof(TrgSumData),rdb,0) ;
00093
00094
00095 trg->npre = swap ? swap16(desc->npre) : desc->npre ;
00096 trg->npost = swap ? swap16(desc->npost) : desc->npost ;
00097
00098 trg->xing_lo = swap ? swap32(desc->bunchXing_lo) : desc->bunchXing_lo ;
00099 trg->xing_hi = swap ? swap32(desc->bunchXing_hi) : desc->bunchXing_hi ;
00100
00101 trg->phys_word = swap ? swap16(desc->physicsWord) : desc->physicsWord ;
00102 trg->trg_word = swap ? swap16(desc->TriggerWord) : desc->TriggerWord ;
00103
00104
00105
00106
00107 unsigned int trg_length = bytes;
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 if(trg_length > sizeof(TrgDataType)) {
00123 LOG(ERR, "Trigger data is too large: %d bytes more than max of %d",trg_length,sizeof(TrgDataType));
00124 }
00125
00126 if(trg_length < sizeof(EvtDescData) + sizeof(TrgSumData)) {
00127 LOG(ERR, "Trigger data is too small: %d bytes less than min of %d",trg_length,(sizeof(EvtDescData) +sizeof(TrgSumData)));
00128 }
00129
00130
00131 trg->tcubits = swap ? swap16(desc->DSMInput) : desc->DSMInput;
00132 trg->detlive = swap ? swap16(desc->externalBusy) : desc->externalBusy ;
00133
00134
00135 LOG(DBG,"TrgDataFmtVer 0x%X, 0x%04X %c %c", desc->TrgDataFmtVer,
00136 sum->TrgSumHeader,
00137 raw[0].CTBdataHeader[0],
00138 raw[0].CTBdataHeader[1],0) ;
00139
00140 LOG(DBG,"TrgSumBytes %d, 0x%04X %c %c", sum->TrgSumBytes,
00141 sum->L0SumHeader,
00142 raw[0].RawDetHeader[0],
00143 raw[0].RawDetHeader[1],0) ;
00144
00145
00146
00147
00148
00149
00150 trg->trg_sum = (void *) &trg_sum ;
00151 memset(&trg_sum,0,sizeof(trg_sum)) ;
00152
00153 for(i=0;i<2;i++) {
00154 trg_sum.L1Sum[i] = swap ? swap32(sum->L1Sum[i]) : sum->L1Sum[i] ;
00155 trg_sum.L2Sum[i] = swap ? swap32(sum->L2Sum[i]) : sum->L2Sum[i] ;
00156 }
00157
00158
00159
00160 #define REAL_BAD_HACK(x) trg_sum.DSMdata.x = (swap ? swap16(sum->DSMdata.x) : sum->DSMdata.x)
00161
00162 for(i=0;i<8;i++) REAL_BAD_HACK(MTD[i]);
00163 for(i=0;i<8;i++) REAL_BAD_HACK(VPD[i]);
00164 for(i=0;i<16;i++) REAL_BAD_HACK(CPA[i]);
00165 for(i=0;i<8;i++) REAL_BAD_HACK(CTB[i]);
00166 for(i=0;i<8;i++) REAL_BAD_HACK(lastDSM[i]);
00167 for(i=0;i<8;i++) REAL_BAD_HACK(VTX[i]);
00168 for(i=0;i<8;i++) REAL_BAD_HACK(EMC[i]);
00169 for(i=0;i<16;i++) REAL_BAD_HACK(BCdata[i]);
00170 for(i=0;i<8;i++) REAL_BAD_HACK(specialTriggers[i]);
00171 for(i=0;i<8;i++) REAL_BAD_HACK(FPD[i]);
00172
00173 #undef REAL_BAD_HACK
00174
00175
00176
00177 for(i=0;i<240;i++) {
00178 trg->CTB[i] = raw[0].CTB[ctbMap[i]] ;
00179 }
00180
00181
00182
00183
00184
00185 memset(trg->MWC, 0, sizeof(trg->MWC));
00186
00187 for(i=0;i<32;i++) trg->MTD[i] = raw[0].MTD[i];
00188 for(i=0;i<64;i++) trg->VPD[i] = raw[0].VPD[i];
00189 if(desc->TrgDataFmtVer >= 0x32) {
00190 for(i=0;i<32;i++) {
00191 trg->P2P[i] = raw[0].P2P[i];
00192 }
00193 }
00194 else {
00195 memset(trg->P2P, 0, sizeof(trg->P2P));
00196 }
00197 for(i=0;i<16;i++) trg->TOF[i] = raw[0].TOF[i];
00198
00199
00200 for(i=0;i<240;i++) {
00201 trg->BEMC[0][i] = raw[0].BEMCEast[i] ;
00202 }
00203
00204 for(i=0;i<240;i++) {
00205 trg->BEMC[1][i] = raw[0].BEMCWest[i] ;
00206 }
00207
00208 for(i=0;i<48;i++) {
00209 trg->BEMC_l1[i] = swap ? swap16(raw[0].BEMClayer1[i]) : raw[0].BEMClayer1[i] ;
00210 }
00211
00212
00213
00214 for(i=0;i<144;i++) {
00215 trg->EEMC[i] = raw[0].EEMC[i] ;
00216 }
00217 for(i=0;i<16;i++) {
00218 trg->EEMC_l1[i] = swap ? swap16(raw[0].EEMClayer1[i]) : raw[0].EEMClayer1[i];
00219 }
00220
00221
00222
00223
00224
00225 for(i=0;i<112;i++) {
00226 trg->FPD[0][0][i] = raw[0].FPDEastNSLayer0[i] ;
00227 }
00228 for(i=0;i<8;i++) {
00229 trg->FPD_l1[0][0][i] = swap ? swap16(raw[0].FPDEastNSLayer1[i]) : raw[0].FPDEastNSLayer1[i] ;
00230 }
00231
00232 for(i=0;i<64;i++) {
00233 trg->FPD[0][1][i] = raw[0].FPDEastTBLayer0[i] ;
00234 }
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 for(i=0;i<256;i++) trg->FPDW[i] = raw[0].FPDW[i];
00257
00258
00259
00260 for(i=0;i<(int)sizeof(raw[0].BBC)/(int)sizeof(raw[0].BBC[0]);i++) {
00261 trg->BBC[i] = raw[0].BBC[i] ;
00262 }
00263
00264 for(i=0;i<16;i++) {
00265 trg->BBC_l1[i] = swap ? swap16(raw[0].BBClayer1[i]) : raw[0].BBClayer1[i] ;
00266 }
00267
00268 for(i=0;i<16;i++) {
00269 trg->ZDC[i] = raw[0].ZDC[i] ;
00270 }
00271 for(i=0;i<8;i++) {
00272 trg->ZDC_l1[i] = swap ? swap16(raw[0].ZDClayer1[i]) : raw[0].ZDClayer1[i];
00273 }
00274
00275 for(i=0;i<32;i++) {
00276 trg->ZDCSMD[i] = raw[0].ZDCSMD[i] ;
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 trg->QQTdataBytes = swap ? swap16(raw[0].QQTdataBytes) : raw[0].QQTdataBytes;
00292 if(trg->QQTdataBytes/4 <= 1600){
00293 for(i=0; i<trg->QQTdataBytes/4; i++){
00294 trg->QQTdata[i] = swap ? swap32(raw[0].QQTdata[i]) : raw[0].QQTdata[i];
00295 }
00296 }
00297
00298 return bytes ;
00299 }