00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <arpa/inet.h>
00004 #include <assert.h>
00005
00006 #include <rtsLog.h>
00007 #include <rtsSystems.h>
00008 #include <rts.h>
00009
00010 #define TRG_VERSION 0x32
00011 #include <daqFormats.h>
00012 #include <trgStructures.h>
00013
00014 #include "daq_emc.h"
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 static int readBTOW(u_short *_data, int token);
00026 static int readETOW(u_short *_data, int token);
00027
00028 static emc_t *emc_p ;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 static struct emc_describe_t {
00063 int id ;
00064
00065 char *p ;
00066 char *secp ;
00067 char *rbp ;
00068 char *adcr ;
00069 char *adcd ;
00070 int trg_index ;
00071 int type ;
00072 int sub ;
00073 } emc_describe[4] = {
00074 { BTOW_ID, CHAR_EMCP, CHAR_EMCSECP, CHAR_EMCRBP, CHAR_EMCADCR, CHAR_EMCADCD, BTOW_INDEX, 0, 0 },
00075 { BSMD_ID, CHAR_EMCP, CHAR_EMCSECP, CHAR_EMCRBP, CHAR_EMCADCR, CHAR_EMCADCD, -1 , 0, 1},
00076 { ETOW_ID, CHAR_EECP, CHAR_EECSECP, CHAR_EECRBP, CHAR_EECADCR, CHAR_EECADCD, ETOW_INDEX, 1, 0 },
00077 { ESMD_ID, CHAR_EECP, CHAR_EECSECP, CHAR_EECRBP, CHAR_EECADCR, CHAR_EECADCD, -1, 1, 1 },
00078 } ;
00079
00080
00081 int emc_reader(char *m, struct emc_t *emc, u_int driver, int rts_id, char *ptrs[12], int f_bytes[12])
00082 {
00083 #if 1
00084 return 0 ;
00085 #else
00086 struct DATAP *datap = (struct DATAP *)m ;
00087 struct DATAPX *datapx ;
00088 struct EMCP *emcp;
00089 struct EMCSECP *emcsecp ;
00090 struct EMCRBP *emcrbp ;
00091 struct DUMMYDATA *dummy ;
00092 int len, off ;
00093 int err ;
00094
00095 int swapdatap = 0;
00096 int swapdatapx = 0;
00097 int swapemcp = 0;
00098
00099
00100 if(datap == 0) return 0 ;
00101 if(f_bytes) memset(f_bytes,0,sizeof(f_bytes)) ;
00102
00103 emc_p = emc ;
00104 u_char emc_wanted[4] ;
00105
00106 if(emc_p == 0) {
00107 for(int i=0;i<4;i++) {
00108 if(emc_describe[i].id == rts_id) {
00109 emc_wanted[i] = 1 ;
00110 }
00111 else {
00112 emc_wanted[i] = 0 ;
00113 }
00114 }
00115 }
00116 else {
00117 memset(emc,0,sizeof(emc_t)) ;
00118
00119 emc_p->btow_max_ch = BTOW_MAXFEE*BTOW_DATSIZE ;
00120 emc_p->bsmd_max_ch = 12*4800 ;
00121 emc_p->etow_max_ch = ETOW_MAXFEE*ETOW_DATSIZE ;
00122 emc_p->esmd_max_ch = ESMD_MAXFEE*ESMD_DATSIZE ;
00123
00124 memset(emc_wanted,0x1,sizeof(emc_wanted)) ;
00125 }
00126
00127 err = 0 ;
00128 int found = -1 ;
00129
00130 for(int i=0;i<4;i++) {
00131
00132 if(emc_wanted[i] == 0) continue ;
00133
00134 char *dta_ptr = 0 ;
00135 int bytes = 0 ;
00136
00137
00138 dta_ptr = getEmcTrgData((char *)datap, emc_describe[i].trg_index, &bytes);
00139
00140
00141 if(dta_ptr) {
00142 f_bytes[0] = bytes ;
00143 ptrs[0] = dta_ptr ;
00144 found = 1 ;
00145 goto found_specific_emc ;
00146 }
00147
00148
00149
00150
00151 if(emc_describe[i].type==0) {
00152 int id = BTOW_ID ;
00153
00154 len = qswap32(swapdatap, datap->det[id].len) * 4 ;
00155 off = qswap32(swapdatap, datap->det[id].off) ;
00156 if((len == 0) || (off == 0)) {
00157 continue;
00158 }
00159 }
00160 else {
00161 int id = ETOW_ID ;
00162
00163
00164 len = qswap32(swapdatap, datap->det[EXT_ID].len) ;
00165 off = qswap32(swapdatap, datap->det[EXT_ID].off) ;
00166
00167 LOG(DBG, "Checking for datapx: len=%d off=%d",len,off);
00168
00169 if((len == 0) || (off == 0)) {
00170 continue;
00171 }
00172
00173 datapx = (struct DATAPX *)(m + off*4) ;
00174
00175
00176 if(checkBank(datapx->bh.bank_type, CHAR_DATAPX) < 0) {
00177 err = 1 ;
00178 continue ;
00179 }
00180
00181 if(datapx->bh.byte_order != DAQ_RAW_FORMAT_ORDER) swapdatapx = 1;
00182
00183 len = qswap32(swapdatapx, datapx->det[id-10].len) * 4 ;
00184 off = qswap32(swapdatapx, datapx->det[id-10].off) ;
00185
00186 LOG(DBG, "Checking for EEC: len=%d off=%d",len,off);
00187
00188 if((len == 0) || (off == 0)) {
00189 continue;
00190 }
00191
00192
00193 m = (char *)datapx ;
00194 }
00195
00196
00197 emcp = (struct EMCP *)((u_int *)m + off) ;
00198
00199 if(checkBank(emcp->bh.bank_type,emc_describe[i].p) < 0) {
00200 err = 1 ;
00201 continue ;
00202 }
00203
00204 if(emcp->bh.byte_order != DAQ_RAW_FORMAT_ORDER) swapemcp = 1;
00205
00206 int token = qswap32(swapemcp, emcp->bh.token) ;
00207
00208 char *name = rts2name(emc_describe[i].id) ;
00209 int sub = emc_describe[i].sub ;
00210
00211
00212
00213
00214 len = qswap32(swapemcp, emcp->sec[sub].len) ;
00215 off = qswap32(swapemcp, emcp->sec[sub].off) ;
00216
00217 if(!len || !off) continue ;
00218
00219 emcsecp = (struct EMCSECP *)((u_int *)emcp + off) ;
00220
00221 if(checkBank(emcsecp->bh.bank_type,emc_describe[i].secp) <= 0) {
00222 err = 1 ;
00223 continue ;
00224 }
00225
00226 int fibers = (b2h32(emcsecp->bh.length) - 10) / 2 ;
00227
00228 if(fibers > 12) {
00229 LOG(ERR,"%s: too many fibers %d > %d",name,fibers,12) ;
00230 err = 1 ;
00231 continue ;
00232 }
00233
00234 LOG(DBG,"EMC %s: %d fibers possible",name,fibers) ;
00235
00236 for(int j=0;j<fibers;j++) {
00237 len = b2h32(emcsecp->fiber[j].len) ;
00238 off = b2h32(emcsecp->fiber[j].off) ;
00239
00240 if(!len || !off) continue ;
00241
00242 emcrbp = (struct EMCRBP *)((u_int *)emcsecp + off) ;
00243
00244 if(checkBank(emcrbp->bh.bank_type,emc_describe[i].rbp) <= 0) {
00245 err = 1 ;
00246 continue ;
00247 }
00248
00249 found = i ;
00250
00251 int banks = (b2h32(emcrbp->bh.length) - 10) /2 ;
00252
00253 if(banks > 3) {
00254 LOG(ERR,"%s: fiber %d: too many banks %d > %d",name,j,banks,3) ;
00255 err = 1 ;
00256 continue ;
00257 }
00258
00259 LOG(DBG,"EMC %s: fiber %d: %d banks used",name,j,banks) ;
00260
00261
00262
00263
00264
00265
00266 char *b_ptrs[3] ;
00267 int b_bytes[3] ;
00268
00269 memset(b_ptrs,0,sizeof(b_ptrs)) ;
00270 memset(b_bytes,0,sizeof(b_bytes)) ;
00271
00272 for(int k=0;k<banks;k++) {
00273 len = b2h32(emcrbp->banks[k].len) ;
00274 off = b2h32(emcrbp->banks[k].off) ;
00275
00276 if(!len || !off) continue ;
00277
00278 bytes = len *4 ;
00279 dta_ptr = 40 + (char *)emcrbp + off*4 ;
00280
00281 dummy = (DUMMYDATA *) ((u_int *)emcrbp + off) ;
00282
00283 b_bytes[k] = bytes ;
00284 b_ptrs[k] = dta_ptr ;
00285
00286
00287 switch(k) {
00288 case 0 :
00289 if(checkBank(dummy->bh.bank_type, emc_describe[i].adcr)<0) {
00290 err = 1 ;
00291 continue ;
00292 }
00293
00294 break ;
00295 case 1 :
00296 if(checkBank(dummy->bh.bank_type, "EMCADCD")<0) {
00297 err = 1 ;
00298 continue ;
00299 }
00300
00301 break ;
00302 case 2 :
00303 if(checkBank(dummy->bh.bank_type, "EMCPEDR")<0) {
00304 err = 1 ;
00305 continue ;
00306 }
00307
00308 break ;
00309 default :
00310 LOG(ERR,"%s: fiber %d: unknown bank at %d",name,j,k) ;
00311 err = 1 ;
00312 continue ;
00313 }
00314
00315 }
00316
00317
00318 if(asdasd & (1<<2)) {
00319 f_bytes[j] = b_bytes[1] ;
00320 ptrs[j] = b_ptrs[1] ;
00321 }
00322 else if(b_bytes[2]) {
00323 f_bytes[j] = b_bytes[2] ;
00324 ptrs[j] = b_ptrs[1] ;
00325 }
00326 else {
00327 f_bytes[j] = b_bytes[0] ;
00328 ptrs[j] = b_ptrs[0] ;
00329 }
00330
00331 }
00332
00333
00334 found_specific_emc:
00335
00336 if(found <0) continue ;
00337
00338
00339 if(emc==0) {
00340 if(err) return -1 ;
00341
00342 return 1 ;
00343 }
00344
00345
00346 if(err) continue ;
00347
00348
00349
00350
00351 }
00352
00353 if(err) return -1 ;
00354 if(found<0) return 0 ;
00355
00356
00357 #if 0
00358
00359 emcadcr = NULL ;
00360
00361
00362 emcadcd = NULL ;
00363
00364 switch(k) {
00365 case 0 :
00366 emcadcr = (struct DUMMYDATA *)((u_int *)emcrbp + off) ;
00367 if(checkBank(emcadcr->bh.bank_type,adcr) < 0) {
00368 continue ;
00369 }
00370
00371 break ;
00372 case 1 :
00373 emcadcd = (struct DUMMYDATA *)((u_int *)emcrbp + off) ;
00374 if(checkBank(emcadcd->bh.bank_type,adcd) < 0) {
00375 continue ;
00376 }
00377
00378 break ;
00379 default :
00380 LOG(ERR,"Unknown subbank %d in EMCRBP!",k,0,0,0,0) ;
00381 continue ;
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394 if((type==0) && (i == EMC_B_TOW)) {
00395 if(trg_btow_data) {
00396 LOG(ERR, "Reading BTOW data from DAQ banks but already read it from trigger banks");
00397 }
00398
00399
00400 if((rts_id == BTOW_ID) && (emc==0)) {
00401 ptrs[0] = (char *) emcadcr + 40 ;
00402 f_bytes[0] = l2h32(emcadcr->bh.length)*4 - 40 ;
00403 return 1 ;
00404 }
00405
00406 readBTOW((u_short *)((u_int)emcadcr + 40), token);
00407
00408 }
00409 else if((type==0) && (i == EMC_B_SMD)) {
00410 u_short *data ;
00411 int l ;
00412
00413 emc_p->bsmd_in = 1;
00414
00415
00416 if(emcadcr) {
00417
00418
00419
00420
00421 data = (u_short *) ((u_int) emcadcr + 40 + 4 + 256) ;
00422
00423
00424 emc_p->bsmd_cap[j] = *(u_char *)((u_int)emcadcr + 40 + 4 + 4*16) ;
00425 if(adcd_found) {
00426 emc_p->bsmd_raw_in = 1 ;
00427 for(l=0;l<4800;l++) {
00428 emc_p->bsmd_raw[j][l] = l2h16(*data++) ;
00429 }
00430 }
00431 else {
00432 for(l=0;l<4800;l++) {
00433 emc_p->bsmd[j][l] = l2h16(*data++) ;
00434 if(emc_p->bsmd[j][l] > 0) emc_p->bsmd_ch++ ;
00435
00436 }
00437 }
00438
00439 LOG(DBG,"BSMD raw data present. Sent to the bsmd_raw bank? -- %s",(emc_p->bsmd_raw_in?"Yes":"No")) ;
00440 }
00441
00442 if(emcadcd) {
00443
00444 int datums = b2h32(emcadcd->bh.length)-10-1 ;
00445
00446 LOG(DBG,"BSMD ZS data present, %d hits",datums) ;
00447
00448 data = (u_short *) ((uint) emcadcd + 40) ;
00449 LOG(DBG,"local fiber %d, channels %d [== %d]",b2h16(data[0]),b2h16(data[1]),datums) ;
00450 data += 2 ;
00451
00452 for(l=0;l<datums;l++) {
00453 int ch = b2h16(*data++) ;
00454 int adc = b2h16(*data++) ;
00455
00456 emc_p->bsmd[j][ch] = adc ;
00457
00458
00459
00460
00461
00462 }
00463
00464 emc_p->bsmd_ch += datums ;
00465 }
00466
00467 }
00468 else if((type==1) && (i == EMC_B_TOW)) {
00469
00470 if(trg_etow_data) {
00471 LOG(ERR, "Reading ETOW data in the DAQ banks, but already read it from the trigger banks.");
00472 }
00473
00474
00475
00476 if((rts_id == ETOW_ID) && (emc == 0)) {
00477 ptrs[0] = (char *) emcadcr + 40 ;
00478 f_bytes[0] = l2h32(emcadcr->bh.length)*4 - 40 ;
00479 return 1 ;
00480 }
00481
00482 readETOW((u_short *)((u_int)emcadcr + 40), token);
00483
00484 }
00485 else if((type==1) && (i == EMC_B_SMD)) {
00486
00487 u_short *data ;
00488 u_int tlo, thi ;
00489 int l, m ;
00490
00491 emc_p->esmd_in = 1;
00492
00493
00494
00495
00496 data = (u_short *) ((u_int) emcadcr + 40 + 4 + 4) ;
00497 thi = l2h16(*data) ;
00498 data = (u_short *) ((u_int) emcadcr + 40 + 4 + 6) ;
00499 tlo = l2h16(*data) ;
00500
00501 local_token = thi * 256 + tlo ;
00502
00503 if(token != local_token) {
00504 LOG(ERR,"ESMD: Token in bank %d different from token in data %d",token,local_token,0,0,0) ;
00505 }
00506
00507 ptrs[0] = (char *) emcadcr + 40 ;
00508 f_bytes[0] = l2h32(emcadcr->bh.length)*4 - 40 ;
00509 if((rts_id == ESMD_ID) && (emc == 0)) return 1 ;
00510
00511
00512 data = (u_short *) ((u_int) emcadcr + 40 + 4 + 128) ;
00513
00514 emc_p->esmd_raw = data ;
00515
00516
00517 if(l2h32(emcadcr->bh.length) < 3000) {
00518 emc_p->esmd_max_fee = 30 ;
00519 }
00520 else {
00521 emc_p->esmd_max_fee = 48 ;
00522 }
00523
00524 emc_p->esmd_max_ch = emc_p->esmd_max_fee*ETOW_DATSIZE ;
00525
00526
00527
00528 for(m=0;m<ESMD_PRESIZE;m++) {
00529 for(l=0;l<emc_p->esmd_max_fee;l++) {
00530 emc_p->esmd_pre[l][m] = l2h16(*data++) ;
00531 }
00532 }
00533
00534 for(m=0;m<ESMD_DATSIZE;m++) {
00535 for(l=0;l<emc_p->esmd_max_fee;l++) {
00536 emc_p->esmd[l][m] = l2h16(*data++) ;
00537 if(emc_p->esmd[l][m] > 0) emc_p->esmd_ch++ ;
00538 }
00539 }
00540 }
00541 }
00542 }
00543 }
00544 }
00545
00546
00547 return bytes ;
00548 #endif
00549 #endif
00550
00551 }
00552
00553
00554
00555
00556
00557
00558 int readBTOW(u_short *_data, int token)
00559 {
00560 u_short *data ;
00561 int l, m ;
00562 int thi, tlo, local_token;
00563
00564 emc_p->btow_in = 1;
00565
00566 data = (u_short *)((char *)_data + 4 + 4);
00567 thi = l2h16(*data);
00568 data = (u_short *)((char *)_data + 4 + 6);
00569 tlo = l2h16(*data);
00570 data = (u_short *)((char *)_data + 4 + 128);
00571
00572 local_token = thi * 256 + tlo ;
00573
00574 if(token != local_token) {
00575 LOG(ERR,"BTOW: Event token different from token in BTOW data %d vs %d (%d,%d)",token,local_token,thi,tlo,0) ;
00576 }
00577
00578
00579 data = (u_short *)((char *)_data + 4 + 128);
00580 emc_p->btow_raw = data ;
00581
00582
00583 for(m=0;m<BTOW_PRESIZE;m++) {
00584 for(l=0;l<BTOW_MAXFEE;l++) {
00585 emc_p->btow_pre[l][m] = l2h16(*data++) ;;
00586 }
00587 }
00588
00589 for(m=0;m<BTOW_DATSIZE;m++) {
00590 for(l=0;l<BTOW_MAXFEE;l++) {
00591 emc_p->btow_new[l][m] = l2h16(*data++) ;
00592 }
00593 }
00594
00595
00596 data = emc_p->btow_raw ;
00597 data += 120 ;
00598
00599 for(l=0;l<4800;l++) {
00600 emc_p->btow[l] = l2h16(*data++) ;
00601 if(emc_p->btow[l] > 0) emc_p->btow_ch++ ;
00602 }
00603
00604 return 0;
00605 }
00606
00607
00608
00609
00610
00611
00612
00613
00614 int readETOW(u_short *_data, int token) {
00615 u_short *data ;
00616 u_int tlo, thi ;
00617 int local_token;
00618
00619 int l,m ;
00620
00621 emc_p->etow_in = 1;
00622
00623
00624
00625
00626
00627 data = (u_short *)((char *)_data + 4 + 4);
00628 thi = l2h16(*data);
00629 data = (u_short *)((char *)_data + 4 + 6);
00630 tlo = l2h16(*data);
00631 data = (u_short *)((char *)_data + 4 + 128);
00632
00633 local_token = thi * 256 + tlo ;
00634
00635 if(token != local_token) {
00636 LOG(ERR,"ETOW: Event token different from token in ETOW data %d vs %d (%d,%d)",token,local_token,thi,tlo,0) ;
00637 }
00638
00639 emc_p->etow_raw = data ;
00640
00641
00642 for(m=0;m<ETOW_PRESIZE;m++) {
00643 for(l=0;l<ETOW_MAXFEE;l++) {
00644 emc_p->etow_pre[l][m] = l2h16(*data++) ;;
00645 }
00646 }
00647
00648
00649 for(m=0;m<ETOW_DATSIZE;m++) {
00650 for(l=0;l<ETOW_MAXFEE;l++) {
00651 emc_p->etow[l][m] = l2h16(*data++) ;
00652 if(emc_p->etow[l][m] > 0) emc_p->etow_ch++ ;
00653 }
00654 }
00655
00656
00657
00658
00659 return 0;
00660 }
00661
00662 char *getEmcTrgData(char *input, int idx, int *bytes)
00663 {
00664 DATAP *datap = (DATAP *) input ;
00665 struct TRGP *trgp ;
00666 struct TRGD *trgd ;
00667 UINT32 *ptr;
00668
00669 int len, off ;
00670
00671 *bytes = 0 ;
00672 if(idx < 0) return 0 ;
00673 if(datap == 0) return 0 ;
00674
00675 int swapdatap=0;
00676 int swaptrgp=0;
00677 int swaptrgd=0;
00678
00679
00680 LOG(DBG, "Starting getEmcTrgData 0x%x",datap);
00681
00682 if(datap->bh.byte_order != DAQ_RAW_FORMAT_ORDER)
00683 swapdatap = 1;
00684
00685 len = qswap32(swapdatap, datap->det[TRG_ID].len);
00686 if(len == 0) return NULL;
00687 len *= 4 ;
00688
00689 off = qswap32(swapdatap, datap->det[TRG_ID].off);
00690 if(off == 0) return NULL;
00691
00692
00693 ptr = (UINT32 *)datap;
00694 trgp = (struct TRGP *)(ptr + off) ;
00695 if(checkBank(trgp->bh.bank_type,"TRGP") < 0) {
00696 return NULL;
00697 }
00698
00699 if(trgp->bh.byte_order != DAQ_RAW_FORMAT_ORDER)
00700 swaptrgp = 1;
00701
00702 if(trgp->bh.token == 0) {
00703 LOG(DBG,"Token 0 - skipping...",0,0,0,0,0) ;
00704 return NULL;
00705 }
00706
00707 if(trgp->trgData.len == 0) return NULL;
00708 if(trgp->trgData.off == 0) return NULL;
00709
00710 off = qswap32(swaptrgp, trgp->trgData.off);
00711 ptr = (u_int *)trgp;
00712 trgd = (struct TRGD *)(ptr + off) ;
00713
00714 if(trgd->bh.byte_order != DAQ_RAW_FORMAT_ORDER) swaptrgd = 1;
00715
00716
00717 if(checkBank(trgd->bh.bank_type,"TRGD") < 0) {
00718 return NULL;
00719 }
00720
00721 LOG(DBG,"TRGD len %d",
00722 qswap32(swaptrgd, trgd->bh.length),0,0,0) ;
00723
00724 if(qswap32(swaptrgd, trgd->bh.length) == 10) return NULL;
00725
00726
00727 u_char trg_version = trgd->desc.TrgDataFmtVer ;
00728 char *cptr;
00729 TrgTowerTrnfer *trgtowertrnfer;
00730
00731 switch(trg_version) {
00732 case 0x10 :
00733
00734 LOG(NOTE, "TRG transverse version 0x%02x, EMC data supported", trg_version);
00735
00736
00737 cptr = (char *)trgd;
00738 cptr += sizeof(bankHeader);
00739
00740 trgtowertrnfer = (TrgTowerTrnfer *)cptr;
00741
00742 off = qswap32(swaptrgd, trgtowertrnfer->OffsetBlock[idx].offset);
00743 len = qswap32(swaptrgd, trgtowertrnfer->OffsetBlock[idx].length);
00744
00745
00746
00747 LOG(NOTE, "IDX = %d offset = %d length = %d",
00748 idx, off, len);
00749
00750 if(off && len) {
00751 if(idx == BTOW_INDEX) {
00752
00753 if(len != (64 + 2 + 30*164)*2) {
00754 LOG(ERR, "Have BTOW in event, but data length incorrect: len=%d not %d, ignoring data...",
00755 len, (64 + 2 + 30 * 164) * 2);
00756 return NULL;
00757 }
00758
00759 LOG(NOTE, "Have BTOW data in trigger banks: off=%d, len=%d", off, len);
00760 }
00761 else if (idx == ETOW_INDEX) {
00762
00763 if(len != (64 + 2 + 6*164)*2) {
00764 LOG(ERR, "Have ETOW in event, but data length incorrect: len=%d not %d. Ignoring data...",len,
00765 (64+2+6*164)*2);
00766 return NULL;
00767 }
00768
00769 LOG(NOTE, "Have ETOW data in trigger banks: off=%d, len=%d", off, len);
00770 }
00771
00772 cptr += off;
00773 *bytes = len ;
00774 return cptr;
00775 }
00776 break;
00777
00778 default :
00779 LOG(NOTE, "Trigger transfer version 0x%x... no EMC data in trigger banks.", trg_version);
00780 }
00781
00782
00783 return NULL;
00784 }