9 #include <rtsSystems.h>
11 #include <DAQ_READER/daq_dta.h>
13 #include <DAQ_ITPC/itpcCore.h>
14 #include <DAQ_ITPC/itpc_rowlen.h>
15 #include <DAQ_ITPC/itpcPed.h>
26 static const char *hwicap_version(u_int v) ;
27 static u_int get_ifee_mask(
int sec1,
int rdo1) ;
30 static inline u_int sw16(u_int d)
32 d = ((d>>16)&0xFFFF)|(d<<16) ;
37 inline u_int itpc23::set_rdo(
int sec,
int rdo)
44 fee_mask = get_ifee_mask(sector1,rdo1) ;
51 int itpc23::from22to23(
char *c_dta,
int words)
54 u_int *
data = (u_int *)c_dta ;
56 u_int *d_use = (u_int *)malloc(words*4+1024) ;
58 u_int *data_end = data + words ;
59 u_int *data_start = data ;
64 fee_mask = get_ifee_mask(sector1,rdo1) ;
68 int w_cou = (words<16)?words:16 ;
70 for(
int i=0;i<w_cou;i++) {
71 if((data[i]==0xCCCC001C)||(data[i]==0x001CCCCC)) {
77 w_cou = data_end - data ;
79 int need_swapping = 0 ;
80 if(data[0]==0xCCCC001C) {
83 for(
int i=0;i<w_cou;i++) {
84 data[i] = sw16(data[i]) ;
95 if((data[0]&0xFFFF000F) != 0x98000004) {
97 if(mode || (online && run_errors<10)) {
98 LOG(ERR,
"start 0 0x98 = 0x%08X",data[0]) ;
117 data_end = data_end - 1 - 2 - 1 - 6 - 1 ;
126 if((data_end[0]&0xFF000000) != 0x58000000) {
127 LOG(ERR,
"data_end 0 0x58 = 0x%08X",data_end[0]) ;
133 for(
int i=0;i<16;i++) {
136 if((data_end[-i]&0xFF000000)==0x58000000) {
137 data_end = data_end - i ;
146 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: can't find data_end!",rdo1) ;
154 while(data_end>data) {
155 if((*data_end & 0xFF000000)==0x98000000) {
167 if(mode || (online && (run_errors<10))) {
168 LOG(ERR,
"%d: data_end 0x98 not found = 0x%08X",rdo1,data_end[0]) ;
172 n_words = data_end - data ;
174 u_int *d = data + 2 ;
182 memset(fee_p,0,
sizeof(fee_p)) ;
187 if((d[0]&0xFF000000)==0x80000000) {
188 int port = d[4]&0xF ;
191 l_fee_mask |= (1<<port) ;
202 if(l_fee_mask != fee_mask) {
205 if(online && run_errors<10) LOG(ERR,
"%d: FEE mask 0x%X, expect 0x%X, words %d/%d",rdo1,l_fee_mask,fee_mask,words,n_words) ;
212 fee_mask = l_fee_mask ;
216 for(
int i=0;i<5;i++) d_use[i] = data_start[i] ;
218 d_use[5] = 0x20000000 ;
221 d_use[8] = fee_mask<<16 ;
224 d_use[11] = 0xF0000000 | fee_mask ;
226 u_int *d_fee = d_use + 12 ;
229 for(
int i=0;i<16;i++) {
230 u_int *p = fee_p[i] ;
234 d_fee[ix] = p[0] & 0xFFFF0000 ;
240 while((p[0]&0xF0000000)!=0xB0000000) {
249 while((p[0]&0xF0000000)!=0x40000000) {
250 if((p[0]&0xF0000000)==0xA0000000) {
261 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: words %d, ix %d",rdo1,n_words,ix) ;
275 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: words %d, ix %d",rdo1,n_words,ix) ;
284 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: n_words %d",rdo1,n_words) ;
291 d_use[n_words-1] = 0xDEADC0DE ;
292 d_use[n_words-2] = 0xFEEDC0FE ;
293 d_use[n_words-3] = 0x0 ;
294 d_use[n_words-4] = 0xFFFFFFFF ;
302 memcpy(c_dta,d_use,n_words*4) ;
314 int itpc23::init(
daq_dta *gain)
316 if(gain==0)
return -1 ;
318 while(gain->iterate()) {
324 for(u_int p=0;p<gain->ncontent;p++) {
328 LOG(TERR,
"gains: S%02d, rp %d:%d = %.1f",s,r,p,gp[p].gain) ;
337 u_int *itpc23::ch_scan(u_int *start)
347 w[0] = (d[0]>>20)&0x3FF ;
348 w[1] = (d[0]>>10)&0x3FF ;
349 w[2] = (d[0]>>00)&0x3FF ;
351 w[3] = (d[1]>>20)&0x3FF ;
352 w[4] = (d[1]>>10)&0x3FF ;
353 w[5] = (d[1]>>00)&0x3FF ;
355 int pkt = (w[0]>>7)&0x7 ;
356 int sampa_ch = (w[2]>>4)&0x1F ;
357 int sampa_id = w[2]&0xF ;
362 if(log_level>=1) LOG(TERR,
"%d: words10 %d:%d (SAMPA %d,%d): words10 %d",rdo1,fee_ix,ch_ix,sampa_id,sampa_ch,words10) ;
364 if(unlikely(words10==1023)) {
366 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: ch_scan %d:%d: SAMPA%d:%d -- prog-full",rdo1,fee_ix,ch_ix,sampa_id,sampa_ch) ;
372 if(unlikely(pkt!=4 || sampa_ch>31 || words10>512)) {
376 if(mode || (online && run_errors<20)) {
377 LOG(ERR,
"%d: ch_scan %d:%d:%d: pkt %d, sampa %d:%d, words10 %d [0x%08X: 0x%08X 0x%08X], err 0x%X",rdo1,fee_ix,lane_ix,
379 pkt,sampa_id,sampa_ch,words10,
380 d[0],d[-1],d[1],err) ;
399 if(mode || online) LOG(ERR,
"Can't fix -- giving up") ;
404 if(mode || (online && run_errors<20)) LOG(WARN,
"Recovered %d:%d, words10 %d",sampa_id,sampa_ch,words10) ;
409 int bx = ((w[4]&0x1FF)<<17)|(w[3]<<1)|((w[2]>>9)&1) ;
411 if(unlikely(bx_count<0)) {
415 if(unlikely(bx != bx_count)) {
416 if(abs(bx-bx_count)>1) {
419 if(mode || (online && run_errors<10)) {
420 LOG(ERR,
"%d: ch_scan %d:%d: bx %d, expect %d",rdo1,fee_ix,ch_ix,bx,bx_count) ;
427 int words10_start = words10 ;
429 while(words10%3) words10++ ;
431 int words = words10/3 ;
442 u_short *d_start = s1_dta + last_ix ;
443 struct seq_t *seq = 0 ;
444 u_short *dd = s1_dta + last_ix ;
445 u_short *dd_save = dd ;
450 int id = (fee_pp<<1)|(sampa_id&1) ;
451 int flags = flags_row_pad(
id, sampa_ch, row, pad) ;
454 LOG(TERR,
"... %d: fee_ix %d, fee_pp %d: sampa_id %d, sampa_ch %d: row %d, pad %d, flags 0x%X",rdo1,fee_ix,fee_pp,
455 sampa_id,sampa_ch,row,pad,flags) ;
468 seq = s1[row][pad].seq ;
470 if(log_level>=2) LOG(TERR,
"Here %p, words %d, %p",seq,words,dd) ;
474 for(
int i=0;likely(i<words);i++) {
475 w[0] = (d[i]>>20)&0x3FF ;
476 w[1] = (d[i]>>10)&0x3FF ;
477 w[2] = (d[i]>>00)&0x3FF ;
482 if(unlikely(d[i]&0xC0000000)) {
484 if(mode || (online && run_errors<10)) {
485 LOG(ERR,
"%d: ch_scan %d:%d: SAMPA %d:%d: bad word 0x%08X",rdo1,fee_ix,ch_ix,
486 sampa_id,sampa_ch,d[i]) ;
490 if(log_level>=2) LOG(TERR,
"FEE %d:%d -- %d = 0x%08X",fee_ix,ch_ix,i,d[i]) ;
493 for(
int j=0;likely(j<3);j++) {
500 if(log_level>=100) LOG(TERR,
" tb_cou %d %p",tb_cou,dd) ;
504 if(log_level>=100) LOG(TERR,
" tb_cou %d",tb_cou) ;
506 if(unlikely(tb_cou>500)) {
508 if(mode || (online && run_errors<10)) {
509 LOG(ERR,
"%d: rp %d:%d: tb_cou %d [0x%08X,%d]",rdo1,row,pad,tb_cou,d[i],i) ;
518 if(seq_ix>=(SEQ_MAX-1)) {
519 if(mode || online) LOG(ERR,
"too many seqs %d",seq_ix) ;
528 seq[seq_ix].t_lo = tb_start ;
529 seq[seq_ix].t_hi = tb_start + tb_cou - 1 ;
530 seq[seq_ix].dta_p = (dd-d_start) ;
531 seq[seq_ix].blob_id = 0 ;
536 if(unlikely(log_level>=100)) LOG(TERR,
" tb_start %d",tb_start) ;
538 if(unlikely(tb_start<=tb_last)) {
540 if(mode || (online && run_errors<10))LOG(ERR,
"%d: rp %d:%d: tb_start %d, tb_last %d",rdo1,row,pad,tb_start,tb_last) ;
545 tb_last = tb_start + tb_cou ;
546 if(unlikely(tb_last>500)) {
548 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: rp %d:%d: tb_last %d [0x%08X,%d]",rdo1,row,pad,tb_last,d[i],i) ;
557 if(log_level>=100) LOG(TERR,
" adc %d, %d",w[j],a_ix) ;
564 if(unlikely(a_ix==tb_cou)) {
568 if(w10==words10_start)
goto done_ch ;
574 if(log_level>=2) LOG(TERR,
"Here %d",__LINE__) ;
583 sequence_cou += seq_ix ;
584 seq[seq_ix].t_hi = -1 ;
585 s1[row][pad].ix = last_ix ;
591 u_short *dd = dd_save ;
594 int ch = ii*32 + sampa_ch ;
597 LOG(TERR,
"fee_pp %d, fee_ix %d, lane_ix %d, sampa_ch %d, ch %d",
598 fee_pp,fee_ix,lane_ix,sampa_ch,ch) ;
603 data_c->sector = sector1 -1 ;
604 data_c->rdo = rdo1-1 ;
605 data_c->port = fee_ix ;
606 data_c->fee_id = fee_pp ;
608 data_c->ch_start(ch) ;
611 for(
int i=0;i<seq_ix;i++) {
613 int t_len = seq[i].t_hi - seq[i].t_lo + 1 ;
618 for(
int j=0;j<t_len;j++) {
620 int tb = seq[i].t_lo + ii ;
622 data_c->accum(sector1-1,rdo1-1,fee_ix,fee_pp,ch,tb,adc) ;
631 u_short *dd = dd_save ;
632 for(
int i=0;i<seq_ix;i++) {
634 int t_len = seq[i].t_hi - seq[i].t_lo + 1 ;
636 printf(
"RP %d:%d, seq %d: t_lo %d, t_hi %d\n",row,pad,i,seq[i].t_lo,seq[i].t_hi) ;
639 for(
int j=0;j<t_len;j++) {
641 int tb = seq[i].t_lo + ii ;
643 printf(
" tb %3d = %3d ADC\n",tb,adc);
653 last_ix += dd-d_start ;
662 u_int *itpc23::lane_scan(u_int *start)
668 if(log_level>=1) LOG(TERR,
"%d: lane scan %d: 0x%08X",rdo1,lane_ix,d[0]) ;
671 if((d[0]&0xF0000000)!=0xB0000000) {
672 if((online && run_errors<10) || mode) {
673 LOG(ERR,
"%d: lane_scan %d:%d: unknown start 0x%08X [0x%08X 0x%08X]",rdo1,fee_ix,lane_ix,d[0],d[-1],d[1]) ;
677 if(mode || (online && run_errors<10)) {
678 LOG(WARN,
"%d: lane_scan %d:%d: retrying fix",rdo1,fee_ix,lane_ix) ;
688 else if((d[0]>>26)&0x3) {
690 if(online || mode) LOG(ERR,
"%d: lane_scan %d:%d: SAMPA FIFO overwritten 0x%08X",rdo1,fee_ix,lane_ix,d[0]) ;
695 if(log_level>=1) LOG(TERR,
"%d: lane scan %d: 0x%08X",rdo1,lane_ix,d[0]) ;
697 for(
int i=0;i<16;i++) {
703 if((d[0]&0xF0000000)!=0x70000000) {
706 if((online && run_errors<20)|| mode) LOG(ERR,
"%d: lane_scan %d:%d: unknown end 0x%08X",rdo1,fee_ix,lane_ix,d[0]) ;
714 u_int *itpc23::fee_non_trgd(u_int *start)
720 if(fee_evt_type != 0x02) {
721 if(online || mode) LOG(ERR,
"%d: fee_non_trgd %d: evt_type 0x%02X",rdo1,fee_ix,fee_evt_type) ;
725 if((d[0]&0xF0000000)==0x40000000) {
733 LOG(NOTE,
"fee_scan %d: evt_type 0x%02X, words %d",fee_ix,fee_evt_type,fee_words) ;
736 for(
int i=0;i<16;i++) {
737 LOG(NOTE,
"%d = 0x%08X",i,d[i]) ;
749 int rdo_port = d[1]&0xFFFF ;
750 int fee_id = d[2]&0xFFFF ;
754 u_short sampa_stat[2] ;
756 sampa_stat[0] = d[0]&0xFFFF ;
757 sampa_stat[1] = d[1]&0xFFFF ;
765 u_int v_all = d[0]&0xFFFF ;
766 v_all |= (d[1]&0xFFFF)<<16 ;
768 u_int v_bit = d[2]&0xFFFF ;
769 v_bit |= (d[3]&0xFFFF)<<16 ;
771 unsigned long wire1 = d[4]&0xFFFF ;
772 wire1 |= (long)(d[5]&0xFFFF)<<16 ;
773 wire1 |= (long)(d[6]&0xFFFF)<<32 ;
774 wire1 |= (long)(d[7]&0xFFFF)<<48 ;
777 wire1 &= 0xFFFFFFFF ;
779 u_int temp = d[8]&0xFFFF ;
780 temp |= (d[9]&0xFFFF)<<16 ;
784 reg[0] = d[10]&0xFFFF ;
785 reg[0] |= (d[11]&0xFFFF)<<16 ;
786 reg[1] = d[12]&0xFFFF ;
787 reg[1] |= (d[13]&0xFFFF)<<16 ;
790 strcpy(s_all,hwicap_version(v_all)) ;
792 LOG(INFO,
"%d: FEE %2d[%02d,%d]: v_all 0x%08X[%s], v_bit 0x%08X[%s], wire1 0x%08llX, padplane %02d",rdo1,fee_ix,rdo_port,fee_id,
793 v_all,s_all,v_bit,hwicap_version(v_bit),wire1,fee_pp) ;
796 if(fee_ix!=rdo_port || fee_pp!=fee_id) {
797 LOG(ERR,
"%d: fee_ix %d but read %d (fee_pp expect %d, read %d)",rdo1,fee_ix,rdo_port,fee_pp,fee_id) ;
800 LOG(NOTE,
" regs 0x%08X 0x%08X",reg[0],reg[1]) ;
802 if(sampa_stat[0]||sampa_stat[1]) {
803 LOG(ERR,
" SAMPA stat: 0x%04X 0x%04X",sampa_stat[0],sampa_stat[1]) ;
808 if((d[0]&0xF0000000)==0x40000000) break ;
818 u_int *itpc23::fee_scan(u_int *start)
821 u_int *d_save = start ;
828 if(d_save>=trl)
return start ;
831 if((d[0]&0xF0000000)!=0x80000000) {
833 if(online || mode) LOG(ERR,
"%d: fee_scan %d: not start-of-FEE 0x%08X",rdo1,fee_ix,d[0]) ;
836 if(d[0]&0x00800000) {
838 if(online || mode) LOG(ERR,
"%d: fee_scan %d: SAMPA overrun 0x%08X",rdo1,fee_ix,d[0]) ;
840 if(d[0]&0x00400000) {
845 fee_evt_type = d[0] & 0xFF ;
846 fee_pp = (d[0]>>16)&0xFF ;
848 LOG(DBG,
"FEE %d = 0x%08X",fee_ix,d[0]) ;
850 if(log_level>=2) LOG(TERR,
"%d: FEE %d (0x%08X) fee_padplane %d, fee_evt_type 0x%02X",rdo1,fee_ix,d[0],fee_pp,fee_evt_type) ;
855 if(fee_evt_type==0xF0) {
856 for(
int i=0;i<4;i++) {
862 LOG(WARN,
"%d: non-physics fee_ix %d, padplane %d",rdo1,fee_ix,fee_pp) ;
863 d = fee_non_trgd(d) ;
867 if((d[0]&0xF0000000)!=0x40000000) {
869 if(online || mode) LOG(ERR,
"%d: fee_scan %d: not end-of-FEE 0x%08X",rdo1,fee_ix,d[0]) ;
872 if(d[0]&0x00800000) {
874 if(online || mode) LOG(ERR,
"fee_scan %d: SAMPA overrun 0x%08X",fee_ix,d[0]) ;
876 if(d[0]&0x00400000) {
885 for(
int i=0;i<(d-d_save);i++) {
886 printf(
"fee_ix %2d: %d = 0x%08X\n",fee_ix,i,d_save[i]) ;
894 int itpc23::rdo_scan(
char *c_addr,
int iwords)
900 u_int *d = (u_int *)c_addr ;
917 if(d[0]==0xCCCC001C || d[0]==0x001CCCCC) ;
919 LOG(ERR,
"%d: evt %d: bad header 0x%08X, words %d",rdo1,evt,d[0],words) ;
920 for(
int i=-4;i<=2;i++) {
921 LOG(ERR,
" %d = 0x%08X",i,d[i]) ;
934 trg_cmd = (d[2]>>0)&0xF ;
935 daq_cmd = (d[2]>>4)&0xF ;
940 u_short t_hi = (d[2]>>8)&0xF ;
941 u_short t_mid = (d[2]>>12)&0xF ;
942 u_short t_lo = (d[2]>>16)&0xF ;
944 token = (t_hi<<8)|(t_mid<<4)|t_lo ;
948 if(log_level>=1) LOG(TERR,
"%d: T %d(%d,%d)",rdo1,token,trg_cmd,daq_cmd) ;
951 for(
int i=0;i<8;i++) {
952 LOG(TERR,
"rdo_scan %d/%d = 0x%08X",i,words,d[i]) ;
956 u_int mhz_start = d[3] ;
957 u_int fee_synced = d[4]>>16 ;
958 u_int fee_overrun = d[4]&0xFFFF ;
959 u_int fee_xoff = d[5]>>16 ;
960 u_int rdo_stuff = d[5]&0xFFFF ;
961 u_int fee_empty = d[6]&0xFFFF ;
965 for(
int i=7;i<15;i++) {
966 if((d[i]&0xFFFF0000)==0xF0000000) {
967 l_fee_mask = d[i]&0xFFFF ;
973 LOG(ERR,
"%d: no local FEE mask, expecting 0x%04X",rdo1,fee_mask) ;
984 fee_mask = l_fee_mask ;
990 if((fee_synced&fee_mask)!=fee_mask) {
991 if(mode || (online)) LOG(ERR,
"%d: evt %d: fee sync error 0x%04X, expect 0x%04X",rdo1,evt,fee_synced,fee_mask) ;
996 if(fee_overrun&fee_mask) {
998 LOG(ERR,
"%d: %d: RDOs fee FIFO overrun 0x%04X: words %d: 0x%04X 0x%04X 0x%04X 0x%04X",
999 rdo1,evt,fee_overrun&fee_mask,words,
1000 fee_mask,l_fee_mask,fee_xoff,fee_empty) ;
1006 if((fee_xoff&fee_mask) != 0) {
1011 if(rdo_stuff & 0xF000) {
1012 LOG(NOTE,
"%d: rdo_stuff 0x%04X",rdo1,rdo_stuff) ;
1017 if((fee_empty&fee_mask)==fee_mask) ;
1025 for(
int i=0;i>-35;i--) {
1028 if(trl[i]==0xDEADC0DE) got_it |=1 ;
1029 else if(got_it && (trl[i]==0xFEEDC0FE)) {
1037 if(mode || online) {
1038 LOG(ERR,
"%d: evt %d: no trailer (0x%08X), %d, words %d",rdo1,evt,trl[0],got_it,words) ;
1050 u_int evt_status = trl[0] ;
1051 u_int mhz_end = trl[1] ;
1055 if(evt_status==0x0EEDC0DE) {
1056 for(
int i=-8;i<=8;i++) {
1057 if(online || mode) LOG(ERR,
"%d: %d = 0x%08X",rdo1,i,trl[i]) ;
1063 u_int evt_type = (d[1]>>28)&0xF ;
1079 LOG(ERR,
"%d: %d: unknown event type %d: 0x%08X",rdo1,evt,evt_type,d[1]) ;
1087 for(
int i=0;i<16;i++) {
1088 if(fee_mask & (1<<i)) ;
1091 u_int st = (evt_status>>(i*2)) & 0x3 ;
1095 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: %d: FEE %2d: timeout 0x%X [0x%08X]",rdo1,evt,i,st,evt_status) ;
1101 while((*d>>28)==0x4) {
1107 LOG(WARN,
"Lots of triggers %d",trg_cou) ;
1110 if(log_level>=1) LOG(TERR,
"%d: evt %d: fee_mask expected 0x%04X",rdo1,evt,fee_mask) ;
1115 if(((*d>>28)!=0xF)||((*d&0xFFFF)!=fee_mask)) {
1116 if(mode || (online && run_errors<10)) LOG(ERR,
"%d: evt %d: Bad FEE_START 0x%08X, expect 0x%08X",rdo1,evt,*d,0xF0000000|fee_mask) ;
1125 if(fee_words)
goto done ;
1128 printf(
"==== trg_evts %d\n",trgd_evt) ;
1129 for(
int i=0;i<(trl-d);i++) {
1130 printf(
"%d = 0x%08X\n",i,d[i]) ;
1139 if(log_level>=2) LOG(TERR,
"here") ;
1143 for(
int i=0;i<16;i++) {
1144 if(fee_mask & (1<<i)) ;
1152 if(log_level>=2) LOG(TERR,
"here2") ;
1164 if(err||prog_fulls) {
1165 if(online || mode) LOG(ERR,
"%d: evt %d/%d: T %d,%d,%d: error 0x%08X, prog_fulls %d: words %d, %d us",rdo1,evt_trgd,evt,
1166 token,trg_cmd,daq_cmd,
1169 words,mhz_end-mhz_start) ;
1171 else if(token==4096) {
1172 LOG(DBG,
"%d/%d: T %d,%d,%d: error 0x%06X, prog_fulls %d, rdo_stuff 0x%04X: words %d, %d us",evt_trgd,evt,
1173 token,trg_cmd,daq_cmd,
1175 prog_fulls,rdo_stuff,
1176 words,mhz_end-mhz_start) ;
1178 else if((evt_trgd%1000)==1) {
1180 LOG(TERR,
"%d/%d: T %d,%d,%d: error 0x%06X, prog_fulls %d, rdo_stuff 0x%04X: words %d, %d us",evt_trgd,evt,
1181 token,trg_cmd,daq_cmd,
1183 prog_fulls,rdo_stuff,
1184 words,mhz_end-mhz_start) ;
1189 LOG(NOTE,
"%d/%d: T %d,%d,%d: error 0x%06X, prog_fulls %d, rdo_stuff 0x%04X: words %d, %d us",evt_trgd,evt,
1190 token,trg_cmd,daq_cmd,
1192 prog_fulls,rdo_stuff,
1193 words,mhz_end-mhz_start) ;
1203 u_int itpc23::get_token_s(
char *c_addr,
int words)
1205 u_int *d = (u_int *)c_addr ;
1217 u_int sig, trg_w,sub ;
1220 if(d[4]==0xCCCC001C && fmt<23) {
1222 trg_w = sw16(d[6]) ;
1233 if((sig&0xFF000000)==0x98000000) {
1246 u_short t_hi = (trg_w>>8)&0xF ;
1247 u_short t_mid = (trg_w>>12)&0xF ;
1248 u_short t_lo = (trg_w>>16)&0xF ;
1250 t = (t_hi<<8)|(t_mid<<4)|t_lo ;
1253 trg = (trg_w>>0)&0xF ;
1254 daq = (trg_w>>4)&0xF ;
1256 evt_type = (sig>>28)&0xF ;
1271 for(
int i=0;i<16;i++) {
1272 if(d[i] == 0xCCCC001C || d[i]==0x001CCCCC) {
1286 int rdo_version = 0 ;
1288 if(sig==0x98000004) rdo_version = 0 ;
1289 else if((sig&0xFF00000F)==0x98000004) rdo_version = (sig>>4)&0xFF ;
1291 LOG(WARN,
"%d: fmt 22: not triggered: ds 0x%08X, words",rdo1,sig,words) ;
1308 t = ((trg_w>>8)&0xF)<<8 ;
1309 t |= ((trg_w>>12)&0xF) << 4 ;
1310 t |= ((trg_w>>16)&0xF) ;
1313 daq = (trg_w>>4) & 0xF ;
1333 return (trg<<16)|(daq<<12)|t ;
1343 if(rp_gain_itpc==0) {
1344 rp_gain_itpc = (row_pad_t (*)[ROW_MAX+1][PAD_MAX+1]) malloc(
sizeof(row_pad_t)*24*(ROW_MAX+1)*(PAD_MAX+1)) ;
1348 for(
int s=0;s<24;s++) {
1349 for(
int r=0;r<=ROW_MAX;r++) {
1350 for(
int p=0;p<=PAD_MAX;p++) {
1351 rp_gain_itpc[s][r][p].gain = 1.0 ;
1352 rp_gain_itpc[s][r][p].t0 = 0.0 ;
1353 rp_gain_itpc[s][r][p].flags = 0 ;
1359 rp_gain = rp_gain_itpc ;
1368 for(
int row=1;row<=40;row++) rowlen[row] = itpc_rowlen[row] ;
1384 u_char itpc23::flags_row_pad(
int asic,
int channel,
int &row,
int &pad)
1391 itpc_sampa_to_rowpad(
id,sampa,channel,row,pad) ;
1392 if(row==0 || row==255)
return 0xFF ;
1393 if(pad==0 || pad==255)
return 0xFF ;
1396 return rp_gain[sector1-1][row][pad].flags ;
1400 static const char *hwicap_version(u_int v)
1402 static char ascii[64] ;
1405 int m = (v>>6)&0x3F ;
1406 int h = (v>>12)&0x1F ;
1407 int y = ((v>>17)&0x3F) ;
1408 int mo = (v>>23)&0xF ;
1409 int d = (v>>27)&0x1F ;
1412 sprintf(ascii,
"%02d-%02d-%02d %02d:%02d:%02d",
1420 static int itpc_fee_map[24][4][16] = {
1422 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1423 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1424 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1425 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1428 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1429 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1432 { 7, 1, 0,12,24,17,13, 8,28, 2,19,20,29,25,21, 3},
1433 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1436 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1437 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1438 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1439 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1443 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1444 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1445 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1446 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1450 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1451 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1452 { 7, 1,17,12,24,19,13, 8,28, 2, 3,20,29,25,21, 0},
1453 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1457 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1458 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1459 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1460 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1464 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1465 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1466 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1467 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1471 {49,52,46, 0, 0, 54,0,47, 0,50,48,55, 0, 0,51,53},
1472 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1473 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1474 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1478 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1479 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1480 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1481 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1485 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1486 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1487 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1488 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1493 {49,52,46,47, 0, 54,0, 0, 0,50, 0,55,48, 0,51,53},
1494 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1495 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1496 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1500 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1501 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1502 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1503 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1507 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1508 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1509 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1510 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1513 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1514 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1515 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1516 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1519 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1520 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1521 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1522 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1525 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1526 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1527 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1528 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1532 {49,52, 0, 0,46, 54,0,47, 0,50, 0,55,48, 0,51,53},
1533 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1534 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1535 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1538 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1539 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1540 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1541 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1544 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1545 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1546 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1547 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1550 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1551 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1552 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1553 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1557 {49,52,46, 0, 0,54,47, 0, 0,50, 0,55,48, 0,51,53},
1558 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1559 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1560 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1563 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1564 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1565 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1566 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1569 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1570 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1571 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1572 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1575 {49,52,46, 0, 0, 54,0,47, 0,50, 0,55,48, 0,51,53},
1576 {36,32,40,43,37,33, 0,41, 0,44,38,34,42,45,39,35},
1577 { 7, 1,17,12,24,19,13, 8,28, 2, 0,20,29,25,21, 3},
1578 { 9, 4,26,14,15,10,30,22,27, 5,31,23,18,16,11, 6}
1584 static u_int get_ifee_mask(
int sec1,
int rdo1)
1588 for(
int i=0;i<16;i++) {
1589 if(itpc_fee_map[sec1-1][rdo1-1][i]) mask |= (1<<i) ;
1595 void itpc23::itpc_fee_kill(
int s0,
int r0,
int p0)
1597 itpc_fee_map[s0][r0][p0] = 0 ;