Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 56 | f9daq | 1 | /*CMZ : 23/02/2008 09.47.19 by Samo Korpar*/ |
| 2 | /*CMZ : 0.02/00 04/07/2001 00.38.08 by Samo Korpar*/ |
||
| 3 | /*CMZ : 0.01/00 30/11/99 16.50.35 by Samo Korpar*/ |
||
| 4 | /*-- Author : Samo Korpar 18/10/99*/ |
||
| 5 | #include <stdlib.h> |
||
| 6 | #include <stdio.h> |
||
| 7 | #include <stdint.h> |
||
| 8 | #include <string.h> |
||
| 9 | #include <time.h> |
||
| 10 | |||
| 11 | |||
| 12 | /*KEEP,evdp,T=C++.*/ |
||
| 13 | #include "evdp.h" |
||
| 14 | /*KEND.*/ |
||
| 15 | |||
| 16 | #define swap_4(x) swap_long((int32_t *) x) |
||
| 17 | #define swap_2(x) swap_short((short *) x) |
||
| 18 | |||
| 19 | |||
| 20 | int isLE, isLOG; |
||
| 21 | char datafilename[300]; |
||
| 22 | |||
| 23 | EVT_DATA evdata; |
||
| 24 | #define EVT_DATA_SIZE (sizeof(EVT_DATA)) |
||
| 25 | LOG_header logh; |
||
| 26 | EVT_header evh; |
||
| 27 | EVT_trailer evt; |
||
| 28 | FILE *evfid; |
||
| 29 | FILE *oldfid; |
||
| 30 | |||
| 31 | int is_little_endian() |
||
| 32 | { |
||
| 33 | int test=1; |
||
| 34 | |||
| 35 | isLE = (int) *((char *) &test); |
||
| 36 | return isLE; |
||
| 37 | } |
||
| 38 | |||
| 39 | void swap_short(short *shtosw) |
||
| 40 | { |
||
| 41 | short stmp; |
||
| 42 | char *b1 = (char *) shtosw, *b2 = (char *) &stmp; |
||
| 43 | |||
| 44 | stmp=*shtosw; |
||
| 45 | b1[0]=b2[1]; |
||
| 46 | b1[1]=b2[0]; |
||
| 47 | return; |
||
| 48 | } |
||
| 49 | |||
| 50 | void swap_long(int32_t *lotosw) |
||
| 51 | { |
||
| 52 | int32_t ltmp; |
||
| 53 | char *b1 = (char *) lotosw, *b2 = (char *) <mp; |
||
| 54 | |||
| 55 | ltmp=*lotosw; |
||
| 56 | b1[0]=b2[3]; |
||
| 57 | b1[1]=b2[2]; |
||
| 58 | b1[2]=b2[1]; |
||
| 59 | b1[3]=b2[0]; |
||
| 60 | return; |
||
| 61 | } |
||
| 62 | |||
| 63 | int open_data_file(char *dfn) |
||
| 64 | { |
||
| 65 | if (dfn != NULL) |
||
| 66 | { |
||
| 67 | strcpy(datafilename, dfn); |
||
| 68 | isLOG=0; |
||
| 69 | if (strstr(datafilename, ".daq")!=NULL) isLOG=1; |
||
| 70 | } |
||
| 71 | |||
| 72 | if ((evfid=fopen(datafilename, "r"))==NULL) return 1; |
||
| 73 | return 0; |
||
| 74 | } |
||
| 75 | |||
| 76 | int close_data_file() |
||
| 77 | { |
||
| 78 | if (fclose(evfid)==EOF) return 1; |
||
| 79 | return 0; |
||
| 80 | } |
||
| 81 | |||
| 82 | int reopen_data_file() |
||
| 83 | { |
||
| 84 | { |
||
| 85 | oldfid=evfid; |
||
| 86 | } |
||
| 87 | if (open_data_file((char *) NULL)) return 1; |
||
| 88 | return 0; |
||
| 89 | } |
||
| 90 | |||
| 91 | int reclose_data_file() |
||
| 92 | { |
||
| 93 | if (close_data_file()) return 1; |
||
| 94 | { |
||
| 95 | evfid=oldfid; |
||
| 96 | } |
||
| 97 | return 0; |
||
| 98 | } |
||
| 99 | |||
| 100 | int next_buf(int len, void *to) |
||
| 101 | { |
||
| 102 | if (fread( to, 1, len, evfid) != len) return -1; |
||
| 103 | return len; |
||
| 104 | } |
||
| 105 | |||
| 106 | int skip_buf(int len) |
||
| 107 | { |
||
| 108 | if (fseek(evfid, len, SEEK_CUR)) return -1; |
||
| 109 | return len; |
||
| 110 | } |
||
| 111 | |||
| 112 | int goto_event(int evgoto) |
||
| 113 | { |
||
| 114 | int pos, fpos, bc; |
||
| 115 | |||
| 116 | pos=0; |
||
| 117 | rewind(evfid); |
||
| 118 | while ( ++pos != evgoto ) |
||
| 119 | { |
||
| 120 | if (fread((void *) &bc, 1, 4, evfid) == 4) |
||
| 121 | { |
||
| 122 | if (isLE) swap_4(&bc); |
||
| 123 | if (fseek(evfid, bc-4, SEEK_CUR)) return pos-1; |
||
| 124 | } |
||
| 125 | } |
||
| 126 | return pos; |
||
| 127 | } |
||
| 128 | |||
| 129 | int get_nextev(FED_record *fdrp, unsigned short cid, int prmes) |
||
| 130 | { |
||
| 131 | int nr,i; |
||
| 132 | |||
| 133 | SLB_header slbh; |
||
| 134 | SLB_trailer slbt; |
||
| 135 | |||
| 136 | nr=0; |
||
| 137 | if (isLOG) |
||
| 138 | { |
||
| 139 | if (next_buf(20, (void *) &logh) != 20) return 0; |
||
| 140 | if (isLE) |
||
| 141 | { |
||
| 142 | swap_4(&logh.bc); |
||
| 143 | swap_4(&logh.exp); |
||
| 144 | swap_4(&logh.run); |
||
| 145 | swap_4(&logh.evt); |
||
| 146 | swap_4(&logh.dtm); |
||
| 147 | } |
||
| 148 | } |
||
| 149 | if (next_buf(20, (void *) &evh) != 20) return 0; |
||
| 150 | if (isLE) |
||
| 151 | { |
||
| 152 | swap_4(&evh.bc); |
||
| 153 | swap_2(&evh.recid); |
||
| 154 | swap_2(&evh.sp); |
||
| 155 | swap_4(&evh.slt); |
||
| 156 | swap_4(&evh.cm); |
||
| 157 | swap_4(&evh.em); |
||
| 158 | } |
||
| 159 | if (prmes) |
||
| 160 | printf("EVT: bc=%u, recid=0x%X, sp=0x%X, slt=%u, cm=0x%X, em=0x%X\n", |
||
| 161 | evh.bc, evh.recid, evh.sp, evh.slt, evh.cm, evh.em); |
||
| 162 | evh.bc-=20; |
||
| 163 | while (evh.bc>4) |
||
| 164 | { |
||
| 165 | if (next_buf(16, (void *) &slbh) != 16) return 0; |
||
| 166 | if (isLE) |
||
| 167 | { |
||
| 168 | swap_4(&slbh.bc); |
||
| 169 | swap_2(&slbh.recid); |
||
| 170 | swap_2(&slbh.fltev); |
||
| 171 | swap_2(&slbh.compid); |
||
| 172 | swap_2(&slbh.slbn); |
||
| 173 | swap_4(&slbh.dest); |
||
| 174 | } |
||
| 175 | if (prmes) |
||
| 176 | printf(" >SLB bc=%u, recid=0x%X, fltev=%d," |
||
| 177 | " compid=0x%X, slbn=%d, dest=0x%X\n", slbh.bc, slbh.recid, |
||
| 178 | slbh.fltev, slbh.compid, slbh.slbn, slbh.dest); |
||
| 179 | evh.bc-=slbh.bc; |
||
| 180 | slbh.bc-=16; |
||
| 181 | |||
| 182 | if (slbh.compid==0) |
||
| 183 | { |
||
| 184 | if (next_buf(EVT_DATA_SIZE, (void *) &evdata) != EVT_DATA_SIZE) return 0; |
||
| 185 | slbh.bc-=EVT_DATA_SIZE; |
||
| 186 | if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0; |
||
| 187 | if (isLE) |
||
| 188 | { |
||
| 189 | swap_4(&evdata.run_number); |
||
| 190 | swap_4(&evdata.event_time); |
||
| 191 | swap_4(&evdata.event_status); |
||
| 192 | swap_4(&evdata.flt_status); |
||
| 193 | swap_4(&evdata.slp_node); |
||
| 194 | swap_4(&evdata.slt_status); |
||
| 195 | swap_4(&evdata.exp_number); |
||
| 196 | swap_4(&evdata.farm_node); |
||
| 197 | swap_4(&evdata.BX_long); |
||
| 198 | swap_2(&evdata.BX_upper); |
||
| 199 | swap_2(&evdata.FCS_tcode); |
||
| 200 | swap_2(&evdata.physBX); |
||
| 201 | swap_2(&evdata.FLT_BX); |
||
| 202 | swap_2(&evdata.fltevt); |
||
| 203 | } |
||
| 204 | } |
||
| 205 | else if (slbh.compid==cid) |
||
| 206 | { |
||
| 207 | while (slbh.bc>4) |
||
| 208 | { |
||
| 209 | if (next_buf(8, (void *) fdrp) != 8) return 0; |
||
| 210 | if (isLE) |
||
| 211 | { |
||
| 212 | swap_2(&fdrp->bc); |
||
| 213 | swap_2(&fdrp->fedid); |
||
| 214 | swap_2(&fdrp->recid); |
||
| 215 | swap_2(&fdrp->bxn); |
||
| 216 | } |
||
| 217 | if (prmes) |
||
| 218 | printf(" >FED bc=%d, fedid=0x%X, recid=0x%X, bxn=%d\n", |
||
| 219 | fdrp->bc, fdrp->fedid, fdrp->recid, fdrp->bxn); |
||
| 220 | slbh.bc-=fdrp->bc; |
||
| 221 | fdrp->bc-=8; |
||
| 222 | if (0x8000&fdrp->recid) |
||
| 223 | { |
||
| 224 | if (skip_buf(fdrp->bc) != fdrp->bc) return 0; |
||
| 225 | } |
||
| 226 | else |
||
| 227 | { |
||
| 228 | if (next_buf(fdrp->bc, (void *) fdrp->data) != fdrp->bc) return 0; |
||
| 229 | nr++; |
||
| 230 | fdrp++; |
||
| 231 | } |
||
| 232 | |||
| 233 | /* fdrp->bc-=8; |
||
| 234 | switch (fdrp->recid) |
||
| 235 | { |
||
| 236 | case 0x1002: |
||
| 237 | if (next_buf(128, (void *) fdrp->data) != 128) return 0; |
||
| 238 | nr++; |
||
| 239 | fdrp++; |
||
| 240 | break; |
||
| 241 | case 0x100a: |
||
| 242 | if (next_buf(fdrp->bc, (void *) fdr.data) != fdrp->bc) return 0; |
||
| 243 | memset((void *) fdrp->data, 0xff, 128); |
||
| 244 | for (i=0;i<fdrp->bc;i+=2) |
||
| 245 | fdrp->data[fdr.data[i]]=fdr.data[i+1]; |
||
| 246 | nr++; |
||
| 247 | fdrp++; |
||
| 248 | break; |
||
| 249 | default: |
||
| 250 | if (skip_buf(fdrp->bc) != fdrp->bc) return 0; |
||
| 251 | } |
||
| 252 | */ |
||
| 253 | } |
||
| 254 | } |
||
| 255 | else if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0; |
||
| 256 | |||
| 257 | /* |
||
| 258 | else if (cid==0x400) |
||
| 259 | { |
||
| 260 | if (prmes) |
||
| 261 | { |
||
| 262 | while (slbh.bc>4) |
||
| 263 | { |
||
| 264 | if (next_buf(8, (void *) &fdr) != 8) return 0; |
||
| 265 | if (isLE) |
||
| 266 | { |
||
| 267 | swap_2(&fdr.bc); |
||
| 268 | swap_2(&fdr.fedid); |
||
| 269 | swap_2(&fdr.recid); |
||
| 270 | swap_2(&fdr.bxn); |
||
| 271 | } |
||
| 272 | otfid[nf]=fdr.fedid; |
||
| 273 | printf(" >FED%d bc=%d, fedid=0x%X, recid=0x%X, bxn=%d", |
||
| 274 | ++nf, fdr.bc, fdr.fedid, fdr.recid, fdr.bxn); |
||
| 275 | slbh.bc-=fdr.bc; |
||
| 276 | fdr.bc-=8; |
||
| 277 | if (next_buf(fdr.bc, (void *) fdr.data) != fdr.bc) return 0; |
||
| 278 | for (i=0;i<fdr.bc;i+=4) |
||
| 279 | { |
||
| 280 | if (! (i%16)) printf("\n"); |
||
| 281 | printf("0x%02X 0x%02X 0x%02X 0x%02X ", |
||
| 282 | fdr.data[i], fdr.data[i+1], fdr.data[i+2], fdr.data[i+3]); |
||
| 283 | } |
||
| 284 | printf("\n"); |
||
| 285 | } |
||
| 286 | } |
||
| 287 | else |
||
| 288 | { |
||
| 289 | if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0; |
||
| 290 | } |
||
| 291 | } |
||
| 292 | else if (cid==0x600) |
||
| 293 | { |
||
| 294 | if (prmes) |
||
| 295 | { |
||
| 296 | while (slbh.bc>4) |
||
| 297 | { |
||
| 298 | if (next_buf(8, (void *) &fdr) != 8) return 0; |
||
| 299 | if (isLE) |
||
| 300 | { |
||
| 301 | swap_2(&fdr.bc); |
||
| 302 | swap_2(&fdr.fedid); |
||
| 303 | swap_2(&fdr.recid); |
||
| 304 | swap_2(&fdr.bxn); |
||
| 305 | } |
||
| 306 | printf(" >FED bc=%d, fedid=0x%X, recid=0x%X, bxn=%d\n", |
||
| 307 | fdr.bc, fdr.fedid, fdr.recid, fdr.bxn); |
||
| 308 | slbh.bc-=fdr.bc; |
||
| 309 | fdr.bc-=8; |
||
| 310 | if (skip_buf(fdr.bc) != fdr.bc ) return 0; |
||
| 311 | } |
||
| 312 | } |
||
| 313 | else |
||
| 314 | { |
||
| 315 | if (skip_buf(slbh.bc-4) != slbh.bc-4 ) return 0; |
||
| 316 | } |
||
| 317 | */ |
||
| 318 | |||
| 319 | if (next_buf( 4, (void *) &slbt) != 4) return 0; |
||
| 320 | if (isLE) |
||
| 321 | { |
||
| 322 | swap_2(&slbt.recid); |
||
| 323 | swap_2(&slbt.fltev); |
||
| 324 | } |
||
| 325 | if (prmes) |
||
| 326 | printf(" >SLB recid=0x%X, fltev=%d\n", slbt.recid, slbt.fltev); |
||
| 327 | } |
||
| 328 | if (next_buf( 4, (void *) &evt) != 4) return 0; |
||
| 329 | if (isLE) swap_4(&evt.slt); |
||
| 330 | if (prmes) |
||
| 331 | { |
||
| 332 | printf("EVT: slt=%u, tcode=0x%x, flt_status=0x%x\n", |
||
| 333 | evh.slt, evdata.FCS_tcode, evdata.flt_status); |
||
| 334 | } |
||
| 335 | if (prmes && isLOG) |
||
| 336 | printf("LOG: bc=%u, exp=%u, run=%u, evt=%u, dtm=%s", |
||
| 337 | logh.bc, logh.exp, logh.run, logh.evt, ctime((time_t *)&logh.dtm)); |
||
| 338 | return nr; |
||
| 339 | } |
||
| 340 | |||
| 341 | int dump_cmp(FILE *fout, unsigned short cid) |
||
| 342 | { |
||
| 343 | int pos; |
||
| 344 | int evbc, slbbc, compid; |
||
| 345 | char evbf[10000]; |
||
| 346 | |||
| 347 | LOG_header *loghb; |
||
| 348 | EVT_header *evhb; |
||
| 349 | |||
| 350 | SLB_header *slbh; |
||
| 351 | |||
| 352 | |||
| 353 | if (isLOG) |
||
| 354 | { |
||
| 355 | if (skip_buf(20) != 20) return 0; |
||
| 356 | } |
||
| 357 | |||
| 358 | pos=0; |
||
| 359 | evhb=(EVT_header *) &evbf[pos]; |
||
| 360 | if (next_buf(20, (void *) evhb) != 20) return 0; |
||
| 361 | pos+=20; |
||
| 362 | evbc=evhb->bc; |
||
| 363 | if (isLE) swap_4(&evbc); |
||
| 364 | evbc-=20; |
||
| 365 | |||
| 366 | while (evbc>4) |
||
| 367 | { |
||
| 368 | slbh=(SLB_header *) &evbf[pos]; |
||
| 369 | if (next_buf(16, (void *) slbh) != 16) return 0; |
||
| 370 | slbbc=slbh->bc; |
||
| 371 | compid=slbh->compid; |
||
| 372 | if (isLE) |
||
| 373 | { |
||
| 374 | swap_4(&slbbc); |
||
| 375 | swap_2(&compid); |
||
| 376 | } |
||
| 377 | evbc-=slbbc; |
||
| 378 | slbbc-=16; |
||
| 379 | |||
| 380 | if ((compid==cid)||(compid==0x0)) |
||
| 381 | { |
||
| 382 | pos+=16; |
||
| 383 | if (next_buf(slbbc, (void *) &evbf[pos]) != slbbc) return 0; |
||
| 384 | pos+=slbbc; |
||
| 385 | } |
||
| 386 | else |
||
| 387 | { |
||
| 388 | if (skip_buf(slbbc) != slbbc) return 0; |
||
| 389 | } |
||
| 390 | } |
||
| 391 | |||
| 392 | if (next_buf( 4, (void *) &evbf[pos]) != 4) return 0; |
||
| 393 | pos+=4; |
||
| 394 | evhb->bc=pos; |
||
| 395 | if (isLE) swap_4(&evhb->bc); |
||
| 396 | if (fwrite((void *) evbf, 1, pos, fout) != pos) return 0; |
||
| 397 | return 1; |
||
| 398 | } |