00001 #include <sys/types.h>
00002 #include <errno.h>
00003 #include <assert.h>
00004
00005 #include <rtsLog.h>
00006 #include <rtsSystems.h>
00007
00008
00009 #include <SFS/sfs_index.h>
00010 #include <DAQ_READER/daqReader.h>
00011 #include <DAQ_READER/daq_dta.h>
00012
00013
00014
00015
00016 #include <DAQ_TPC/daq_tpc.h>
00017 #include <TPC/trans_table.hh>
00018 #include <TPC/rowlen.h>
00019
00020 #include <DAQ1000/ddl_struct.h>
00021
00022 #include "daq_tpx.h"
00023 #include "tpxCore.h"
00024 #include "tpxGain.h"
00025 #include "tpxPed.h"
00026 #include "tpxFCF.h"
00027 #include "tpxStat.h"
00028
00029
00030
00031
00032 class daq_det_tpx_factory : public daq_det_factory
00033 {
00034 public:
00035 daq_det_tpx_factory() {
00036 daq_det_factory::det_factories[TPX_ID] = this ;
00037 }
00038
00039 daq_det *create() {
00040 return new daq_tpx ;
00041 }
00042 } ;
00043
00044 static daq_det_tpx_factory tpx_factory ;
00045
00046
00047
00048 const char *daq_tpx::help_string = "\
00049 \n\
00050 ****** TPX Help ******* \n\
00051 \n\
00052 Sector is [1..24]\n\
00053 Rdo is [1..6]\n\
00054 \n\
00055 Supported Banks: \n\
00056 raw (sector,rdo); returns (char *) of start of DDL data\n\
00057 adc (sector,rdo); returns tb_adc data\n\
00058 cld (sector,rdo); returns float cld from data\n\
00059 cld_raw (sector,rdo); returns cld_raw CLD data\n\
00060 \n\
00061 m_Mode:\n\
00062 (1<<0) calc pedestals from data when get(adc) called\n\
00063 (1<<1) calc gain from data when get(adc) called\n\
00064 \n\
00065 Not yet done: \n\
00066 cld_c (sector,rdo); returns float cld calculated from data\n\
00067 gain (sector,rdo,0,char *fname); loads gains from database: \n\
00068 fname == 0 from Offline databases\n\
00069 fname != 0 from file fname\n\
00070 gain_c (sector,rdo); returns calculated gains (see m_Mode) \n\
00071 ped (sector,rdo); returns ped/rms from file\n\
00072 ped_c (sector,rdo); returns calculated ped/rms (see m_Mode) \n\
00073 log\n\
00074 " ;
00075
00076
00077 void daq_tpx::help() const
00078 {
00079 printf("%s\n%s\n",GetCVS(),help_string) ;
00080 } ;
00081
00082 daq_tpx::daq_tpx(daqReader *rts_caller)
00083 {
00084
00085
00086 rts_id = TPX_ID ;
00087 name = rts2name(rts_id) ;
00088 sfs_name = "tpx" ;
00089 caller = rts_caller ;
00090
00091 if(caller) caller->insert(this, rts_id) ;
00092
00093
00094 legacy = new daq_dta ;
00095
00096 LOG(DBG,"legacy %p",legacy) ;
00097
00098 raw = new daq_dta ;
00099 cld_raw = new daq_dta ;
00100 ped_raw = new daq_dta ;
00101
00102 adc = new daq_dta ;
00103
00104 cld = new daq_dta ;
00105
00106 adc_sim = new daq_dta ;
00107 gain = new daq_dta ;
00108 ped = new daq_dta ;
00109
00110 cld_sim = new daq_dta ;
00111
00112 ped_c = new daq_dta ;
00113 gain_c = new daq_dta ;
00114
00115
00116 gain_algo = new tpxGain() ;
00117 stat_algo = 0 ;
00118 ped_algo = 0 ;
00119 for(int i=0;i<=24;i++) {
00120 fcf_algo[i] = 0 ;
00121 }
00122 fcf_tmp_storage = 0 ;
00123
00124 fcf_afterburner_disable = 0 ;
00125 fcf_run_compatibility = 9 ;
00126 fcf_do_cuts = 2 ;
00127
00128 LOG(DBG,"%s: constructor: caller %p",name, caller) ;
00129 return ;
00130 }
00131
00132 daq_tpx::~daq_tpx()
00133 {
00134 LOG(DBG,"%s: DEstructor",name) ;
00135
00136
00137 delete raw ;
00138 delete cld_raw ;
00139 delete ped_raw ;
00140
00141 LOG(DBG,"%s: DEstructor done",name) ;
00142
00143 delete adc ;
00144
00145 LOG(DBG,"%s: DEstructor done",name) ;
00146
00147 delete cld ;
00148
00149 LOG(DBG,"%s: DEstructor done",name) ;
00150
00151 delete adc_sim ;
00152 delete gain ;
00153 delete ped ;
00154
00155 delete cld_sim ;
00156
00157 LOG(DBG,"%s: DEstructor done",name) ;
00158
00159 delete ped_c ;
00160
00161 LOG(DBG,"%s: DEstructor done",name) ;
00162
00163 delete gain_c ;
00164
00165 LOG(DBG,"%s: DEstructor done %p ",name,legacy) ;
00166
00167 delete legacy ;
00168
00169 LOG(DBG,"%s: DEstructor done",name) ;
00170
00171
00172 if(gain_algo) delete gain_algo ;
00173 if(ped_algo) delete ped_algo ;
00174 if(stat_algo) delete stat_algo ;
00175
00176 LOG(DBG,"%s: DEstructor done",name) ;
00177
00178 for(int i=0;i<=24;i++) {
00179 if(fcf_algo[i]) delete fcf_algo[i] ;
00180 }
00181 LOG(DBG,"%s: DEstructor done",name) ;
00182 if(fcf_tmp_storage) free(fcf_tmp_storage) ;
00183
00184 LOG(DBG,"%s: DEstructor done",name) ;
00185 return ;
00186 }
00187
00188
00189 #if 0
00190
00191
00192
00193 int daq_tpx::Make()
00194 {
00195 int pres ;
00196 int mode ;
00197
00198
00199 present = 0 ;
00200
00201 mode = GetMode() ;
00202
00203 pres = presence() ;
00204 if(pres) {
00205 evt_num++ ;
00206 present |= 2 ;
00207 LOG(NOTE,"%s: Make(): presence %d, evt %d: m_Mode 0x%08X, event_mode 0x%08X",name,pres,evt_num,mode,event_mode) ;
00208 }
00209 else {
00210 LOG(DBG,"%s: Make(): not found in this event...",name) ;
00211 return 0 ;
00212 }
00213
00214
00215 if(mode & m_Mode_DAQ_RT) {
00216
00217
00218
00219 tpx_rdo_event rdo ;
00220
00221 char *obuff = out_buffer ;
00222 int max_bytes = out_bytes ;
00223 out_bytes = 0 ;
00224
00225 if((in_buffer == 0) || (in_bytes<=0) || (out_buffer==0) || (max_bytes==0)) {
00226 LOG(ERR,"Bad buffers -- skipping") ;
00227 return -1 ;
00228 }
00229
00230
00231 ret = tpx_get_start(in_buffer, in_bytes/4, &rdo, 0) ;
00232
00233 if(ret < 0) {
00234 LOG(ERR,"Horrible error -- skipping") ;
00235 return -1 ;
00236 }
00237
00238 int do_raw = 0 ;
00239 switch(rdo.type) {
00240 case DDL_TYPE_DTA:
00241 if(event_mode & m_Mode_DAQ_RAW) {
00242 do_raw = 1 ;
00243 }
00244 break ;
00245 case DDL_TYPE_LOG :
00246
00247 do_raw = 1 ;
00248 break ;
00249 default :
00250
00251 do_raw = 1 ;
00252 break ;
00253 }
00254
00255 if(do_raw) {
00256 ret = Raw->Make(&rdo,obuff,max_bytes) ;
00257 obuff += ret ;
00258 max_bytes -= ret ;
00259 }
00260
00261
00262 if(rdo.type != DDL_TYPE_DTA) return 0 ;
00263
00264
00265 Stat->Make(&rdo) ;
00266
00267
00268 if(event_mode & m_Mode_DAQ_GAIN) {
00269 Gain->Make(&rdo) ;
00270 }
00271 else if(event_mode & m_Mode_DAQ_PED) {
00272 Ped->Make(&rdo) ;
00273 }
00274 else if(event_mode & m_Mode_DAQ_FCF_RAW) {
00275 ret = Fcf->Make(&rdo, obuff, max_bytes) ;
00276 obuff += ret ;
00277 max_bytes -= ret ;
00278 }
00279
00280
00281 out_bytes = obuff - out_buffer ;
00282 return 0 ;
00283 }
00284
00285
00286 int min_sec, max_sec ;
00287 int min_rdo, max_rdo ;
00288
00289 if(def_sector <= 0) {
00290 min_sec = 1 ;
00291 max_sec = 24 ;
00292 }
00293 else {
00294 min_sec = max_sec = def_sector ;
00295 }
00296
00297 if(def_rdo <= 0) {
00298 min_rdo = 1 ;
00299 max_rdo = 6 ;
00300 }
00301 else {
00302 min_rdo = max_rdo = def_rdo ;
00303 }
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 return 0 ;
00317 }
00318
00319 #endif
00320
00321 int daq_tpx::InitRun(int run)
00322 {
00323 u_int mode = GetMode() ;
00324
00325 LOG(NOTE,"%s: InitRun(%d), m_Mode 0x%08X",name, run, mode) ;
00326
00327
00328 run_num = run ;
00329 evt_num = 0 ;
00330
00331
00332
00333
00334
00335
00336 if(mode & m_Mode_DAQ_RT) {
00337 LOG(ERR,"Not yet ready for Online!") ;
00338 return -1 ;
00339 }
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 daq_dta *g = get("gain") ;
00351
00352 LOG(DBG,"get(gain) returns %p",g) ;
00353 if(g) {
00354 LOG(NOTE,"Using externally generated gains") ;
00355 gain_algo->init(0) ;
00356 while(g->iterate()) {
00357 LOG(DBG,"\tsec %d, row %d: %d",g->sec,g->row,g->ncontent) ;
00358 int max_pad = tpc_rowlen[g->row] ;
00359 if((int)g->ncontent > max_pad) {
00360 LOG(NOTE,"sector %d, row %d: want %d, have %d",g->sec,g->row,g->ncontent,max_pad) ;
00361 }
00362 else max_pad = g->ncontent ;
00363
00364 for(int pad=1;pad<=max_pad;pad++) {
00365 LOG(DBG,"Gains: %d %d %d %f %f",g->sec,g->row,pad,g->gain[pad].gain,g->gain[pad].t0) ;
00366 gain_algo->set_gains(g->sec,g->row,pad,g->gain[pad].gain,g->gain[pad].t0) ;
00367 }
00368 }
00369 }
00370 else {
00371 gain_algo->from_file("/RTS/conf/tpx/tpx_gains.txt",0) ;
00372 }
00373
00374
00375 if(mode & m_Mode_DAQ_PED) {
00376 if(ped_algo==0) {
00377 ped_algo = new tpxPed ;
00378 }
00379
00380
00381
00382 }
00383
00384 if(mode & m_Mode_DAQ_GAIN) {
00385 gain_algo->init(def_sector) ;
00386 }
00387
00388
00389
00390
00391
00392
00393 return 0 ;
00394 }
00395
00396 int daq_tpx::FinishRun(int old)
00397 {
00398 u_int mode = GetMode() ;
00399
00400 LOG(NOTE,"%s: Run %d finished with %d events, m_Mode 0x%08X",name,run_num,evt_num,mode) ;
00401
00402 if(mode & m_Mode_DAQ_PED) {
00403 LOG(NOTE,"Calculating peds") ;
00404
00405 assert(ped_algo) ;
00406
00407
00408
00409
00410
00411 delete(ped_algo) ;
00412 ped_algo = 0 ;
00413
00414 }
00415
00416 if(mode & m_Mode_DAQ_GAIN) {
00417
00418 LOG(NOTE,"Calculating gains") ;
00419
00420
00421
00422
00423 }
00424
00425
00426
00427 for(int i=0;i<=24;i++) {
00428 if(fcf_algo[i]) {
00429 delete fcf_algo[i] ;
00430 fcf_algo[i] = 0 ;
00431 }
00432 }
00433
00434 if(fcf_tmp_storage) {
00435 free(fcf_tmp_storage) ;
00436 fcf_tmp_storage = 0 ;
00437 }
00438
00439
00440 return 0 ;
00441 }
00442
00443
00444
00445 daq_dta *daq_tpx::get(const char *in_bank, int sec, int row, int pad, void *p1, void *p2)
00446 {
00447 const char *bank ;
00448
00449
00450
00451 if(in_bank==0) {
00452 bank = "cld" ;
00453 }
00454 else {
00455 bank = in_bank ;
00456 }
00457
00458 LOG(DBG,"%s: looking for bank %s",name,bank) ;
00459
00460
00461
00462 if(strcasecmp(bank,"adc_sim")==0) {
00463 if(adc_sim->is_empty()) return 0 ;
00464 adc_sim->rewind() ;
00465 return adc_sim ;
00466 }
00467 else if(strcasecmp(bank,"gain")==0) {
00468 if(gain->is_empty()) return 0 ;
00469 gain->rewind() ;
00470 return gain ;
00471 }
00472 else if(strcasecmp(bank,"cld_sim")==0) {
00473 return handle_cld_sim(sec,row) ;
00474 }
00475
00476
00477
00478 Make() ;
00479 if(!present) return 0 ;
00480 if(caller && (caller->detector_bugs & (1<<TPX_ID))) return 0 ;
00481
00482
00483 if(strcasecmp(bank,"raw")==0) {
00484 return handle_raw(sec,row) ;
00485 }
00486 else if(strcasecmp(bank,"adc")==0) {
00487 return handle_adc(sec,row) ;
00488 }
00489 else if(strcasecmp(bank,"cld_raw")==0) {
00490 return handle_cld_raw(sec,row) ;
00491 }
00492 else if(strcasecmp(bank,"cld")==0) {
00493 return handle_cld(sec,row) ;
00494 }
00495 else if(strcasecmp(bank,"pedrms")==0) {
00496 return handle_ped(sec) ;
00497 }
00498 else if(strcasecmp(bank,"legacy")==0) {
00499 return handle_legacy(sec,row) ;
00500 }
00501 else {
00502 LOG(ERR,"%s: unknown bank type \"%s\"",name,bank) ;
00503 }
00504
00505
00506 return 0 ;
00507 }
00508
00509 daq_dta *daq_tpx::put(const char *in_bank, int sec, int row, int pad, void *p1, void *p2)
00510 {
00511
00512 assert(in_bank) ;
00513
00514 if(strcasecmp(in_bank,"adc_sim")==0) {
00515 if((row<=0)) sim_row_count = 45 ;
00516 else sim_row_count = row ;
00517
00518 sim_tpx_rowlen = (u_char *)p1 ;
00519
00520 LOG(NOTE,"adc_sim: row count %d, rowlen %p",sim_row_count,sim_tpx_rowlen) ;
00521
00522 adc_sim->create(32*1024,(char *)"adc_sim",rts_id,DAQ_DTA_STRUCT(daq_sim_adc_tb)) ;
00523 return adc_sim ;
00524 }
00525 else if(strcasecmp(in_bank,"gain")==0) {
00526 gain->create(32*1024,(char *)"gain",rts_id,DAQ_DTA_STRUCT(daq_det_gain)) ;
00527 return gain ;
00528 }
00529
00530 LOG(ERR,"%s: unknown bank type \"%s\"",name,in_bank) ;
00531 return 0 ;
00532
00533 }
00534
00535 daq_dta *daq_tpx::handle_legacy(int sec, int rdo)
00536 {
00537 const int tpx_tpc_tb_delta = 22 ;
00538 int max_s, min_s ;
00539 daq_dta *dd ;
00540 int found_something = 0 ;
00541
00542 if(sec <= 0) {
00543 min_s = 1 ;
00544 max_s = 24 ;
00545 }
00546 else {
00547 min_s = max_s = sec ;
00548 }
00549
00550 legacy->create(1,"tpx_legacy",rts_id,DAQ_DTA_STRUCT(tpc_t)) ;
00551
00552 for(int s=min_s;s<=max_s;s++) {
00553 struct tpc_t *tpc_p = 0 ;
00554
00555
00556 dd = handle_ped(s) ;
00557 if(dd) {
00558 tpc_p = (struct tpc_t *) legacy->request(1) ;
00559 memset(tpc_p,0,sizeof(tpc_t)) ;
00560
00561
00562
00563
00564 tpc_p->mode = 1 ;
00565
00566 while(dd->iterate()) {
00567 int r = dd->row - 1 ;
00568 int p = dd->pad - 1 ;
00569
00570 if((r<0) || (p<0)) continue ;
00571
00572 found_something = 1 ;
00573
00574
00575 daq_det_pedrms *ped = (daq_det_pedrms *)dd->Void ;
00576
00577 for(int i=0;i<(int)dd->ncontent;i++) {
00578 int tpc_tb, tpc_adc ;
00579
00580
00581
00582 tpc_tb = i - tpx_tpc_tb_delta ;
00583 if(tpc_tb <0) continue ;
00584
00585 tpc_adc = ped[i].ped ;
00586 if(tpc_adc > 255) tpc_adc = 255 ;
00587
00588 int c = tpc_p->counts[r][p] ;
00589 tpc_p->adc[r][p][c] = tpc_adc ;
00590 tpc_p->timebin[r][p][c] = (u_char)(ped[i].rms*16.0) ;
00591
00592 (tpc_p->counts[r][p])++ ;
00593 tpc_p->channels_sector++ ;
00594
00595 }
00596
00597 found_something = 1 ;
00598 }
00599
00600
00601 tpc_p->max_channels_sector = 512 * 5692 ;
00602 tpc_p->max_channels_all = 512 * 5692 * 24 ;
00603
00604 legacy->finalize(1,s,0,0) ;
00605
00606 continue ;
00607 }
00608
00609
00610
00611
00612 dd = handle_adc(s,-1) ;
00613 if(dd) {
00614
00615 tpc_p = (struct tpc_t *) legacy->request(1) ;
00616 memset(tpc_p,0,sizeof(tpc_t)) ;
00617
00618
00619
00620 while(dd->iterate()) {
00621 int r = dd->row - 1 ;
00622 int p = dd->pad - 1 ;
00623
00624 if((r<0) || (p<0)) continue ;
00625
00626 found_something = 1 ;
00627 tpc_p->max_channels_sector = 512 * 5692 ;
00628
00629
00630
00631 for(u_int i=0;i<dd->ncontent;i++) {
00632 int tpc_tb, tpc_adc ;
00633
00634
00635 tpc_tb = dd->adc[i].tb - tpx_tpc_tb_delta ;
00636 if(tpc_tb < 0) continue ;
00637
00638
00639 tpc_adc = log10to8_table[dd->adc[i].adc] ;
00640
00641 if(tpc_adc == 0) continue ;
00642
00643 int c = tpc_p->counts[r][p] ;
00644 tpc_p->adc[r][p][c] = tpc_adc ;
00645 tpc_p->timebin[r][p][c] = tpc_tb ;
00646
00647 (tpc_p->counts[r][p])++ ;
00648 tpc_p->channels_sector++ ;
00649
00650 }
00651
00652 }
00653 }
00654
00655
00656
00657 dd = handle_cld(s,-1) ;
00658 if(dd) {
00659 if(tpc_p == 0) {
00660 tpc_p = (struct tpc_t *) legacy->request(1) ;
00661 memset(tpc_p,0,sizeof(tpc_t)) ;
00662 }
00663
00664 while(dd->iterate()) {
00665 int r = dd->row - 1 ;
00666
00667 if(r < 0) continue ;
00668
00669 tpc_p->has_clusters = 1 ;
00670 found_something = 1 ;
00671
00672 for(u_int i=0;i<dd->ncontent;i++) {
00673 int c = tpc_p->cl_counts[r] ;
00674 if(c >= TPC_READER_MAX_CLUSTERS) break ;
00675
00676
00677 int tpc_t1, tpc_t2 ;
00678 double tpc_t ;
00679
00680 tpc_t1 = (int)dd->cld[i].t1 - tpx_tpc_tb_delta ;
00681 tpc_t2 = (int)dd->cld[i].t2 - tpx_tpc_tb_delta ;
00682 tpc_t = (double)dd->cld[i].tb - tpx_tpc_tb_delta ;
00683
00684
00685 if((tpc_t1<0) || (tpc_t2<0) || (tpc_t<0.0)) continue ;
00686
00687 tpc_p->cl[r][c].t1 = tpc_t1 ;
00688 tpc_p->cl[r][c].t2 = tpc_t2 ;
00689 tpc_p->cl[r][c].t = tpc_t ;
00690
00691 tpc_p->cl[r][c].p1 = dd->cld[i].p1 ;
00692 tpc_p->cl[r][c].p2 = dd->cld[i].p2 ;
00693 tpc_p->cl[r][c].p = dd->cld[i].pad ;
00694
00695 tpc_p->cl[r][c].charge = dd->cld[i].charge ;
00696 tpc_p->cl[r][c].flags = dd->cld[i].flags ;
00697
00698 (tpc_p->cl_counts[r])++ ;
00699 }
00700
00701 }
00702
00703
00704 }
00705
00706 if(tpc_p) {
00707 tpc_p->mode = 0 ;
00708
00709 tpc_p->max_channels_all = 512 * 5692 * 24 ;
00710
00711 legacy->finalize(1,s,0,0) ;
00712 }
00713
00714 }
00715
00716 legacy->rewind() ;
00717
00718 if(found_something) return legacy ;
00719 else return 0 ;
00720
00721 }
00722
00723 daq_dta *daq_tpx::handle_ped(int sec)
00724 {
00725 char str[128] ;
00726 int tot_bytes ;
00727 int min_sec, max_sec ;
00728
00729
00730 if(sec <= 0) {
00731 min_sec = 1 ;
00732 max_sec = 24 ;
00733 }
00734 else if((sec<1) || (sec>24)) return 0 ;
00735 else {
00736 min_sec = max_sec = sec ;
00737 }
00738
00739
00740 assert(caller) ;
00741
00742
00743
00744 tot_bytes = 0 ;
00745
00746 for(int s=min_sec;s<=max_sec;s++) {
00747
00748 sprintf(str,"%s/sec%02d/pedrms",sfs_name, s) ;
00749
00750 LOG(NOTE,"%s: trying sfs on \"%s\"",name,str) ;
00751
00752 char *full_name = caller->get_sfs_name(str) ;
00753 if(full_name == 0) continue ;
00754
00755 int size = caller->sfs->fileSize(full_name) ;
00756
00757 LOG(NOTE,"%s: sector %d: ped size %d",name,s,size) ;
00758
00759 if(size <= 0) {
00760 assert(!"can't be 0") ;
00761 }
00762
00763
00764 char *tmp_cache = (char *) valloc(size) ;
00765 assert(tmp_cache) ;
00766
00767
00768 int ret = caller->sfs->read(full_name, tmp_cache, size) ;
00769
00770 if(ret != (int)size) {
00771 LOG(ERR,"%s: %s: read failed, expect %d, got %d [%s]",name,str,
00772 size,ret,strerror(errno)) ;
00773 free(tmp_cache) ;
00774 continue ;
00775 }
00776
00777
00778 if(tot_bytes == 0) {
00779 ped->create(size,"ped",rts_id,DAQ_DTA_STRUCT(daq_det_pedrms)) ;
00780 }
00781
00782 tot_bytes += size ;
00783
00784
00785
00786 u_short *d16 = (u_short *) tmp_cache ;
00787
00788
00789 while(size > 0) {
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801 int cou = l2h16(*d16++) ;
00802
00803 int row = l2h16(*d16++) ;
00804 int pad = row & 0xFF ;
00805 row >>= 8 ;
00806
00807 LOG(DBG,"sector %d: row %d, pad %d, cou %d",s,row,pad,cou) ;
00808
00809 size -= 2 * 2 ;
00810 size -= cou * 2 ;
00811
00812 daq_det_pedrms *d = (daq_det_pedrms *) ped->request(cou*10) ;
00813
00814 for(int i=0;i<cou;i++) {
00815 u_short tmp = l2h16(*d16++) ;
00816
00817 int i_rms = (tmp & 0xFC00) >> 10 ;
00818 int i_ped = tmp & 0x3FF ;
00819
00820 d[i].rms = (float)i_rms / 16.0 ;
00821 d[i].ped = i_ped ;
00822
00823 }
00824
00825 ped->finalize(cou,s,row,pad) ;
00826 }
00827
00828 free(tmp_cache) ;
00829
00830 }
00831
00832
00833 LOG(DBG,"Returning from ped_handler") ;
00834
00835 if(tot_bytes == 0) return 0 ;
00836
00837 ped->rewind() ;
00838 return ped ;
00839
00840 }
00841
00842
00843 daq_dta *daq_tpx::handle_adc(int sec, int rdo)
00844 {
00845
00846 int min_sec, max_sec ;
00847 int min_rdo, max_rdo ;
00848
00849
00850
00851 if(sec <= 0) {
00852 min_sec = 1 ;
00853 max_sec = MAX_SEC ;
00854 }
00855 else if((sec<1) || (sec>24)) return 0 ;
00856 else {
00857 min_sec = sec ;
00858 max_sec = sec ;
00859 }
00860
00861 if(rdo <= 0) {
00862 min_rdo = 1 ;
00863 max_rdo = 6 ;
00864 }
00865 else if((rdo<0) || (rdo>6)) return 0 ;
00866 else {
00867 min_rdo = max_rdo = rdo ;
00868 }
00869
00870
00871 int rdos = 0 ;
00872
00873 for(int s=min_sec;s<=max_sec;s++) {
00874 for(int r=min_rdo;r<=max_rdo;r++) {
00875 rdos++ ;
00876 }
00877 }
00878
00879
00880 int guess_bytes = rdos * 1152 * (sizeof(daq_store) + 10*sizeof(daq_adc_tb)) ;
00881
00882 adc->create(guess_bytes,(char *)"adc",rts_id,DAQ_DTA_STRUCT(daq_adc_tb)) ;
00883
00884
00885 for(int s=min_sec;s<=max_sec;s++) {
00886 for(int r=min_rdo;r<=max_rdo;r++) {
00887 daq_dta *rdo_dta ;
00888
00889
00890 char *rdo_ptr ;
00891 struct tpx_rdo_event rdo ;
00892 struct tpx_altro_struct a ;
00893 int rdo_words ;
00894
00895 LOG(NOTE,"Calling handle_raw for %d:%d",s,r) ;
00896 rdo_dta = handle_raw(s, r) ;
00897
00898
00899 if(rdo_dta == 0) {
00900 LOG(WARN,"rdo_dta NULL?") ;
00901 continue ;
00902 }
00903
00904 int ret = rdo_dta->iterate() ;
00905 if(ret==0) {
00906 continue ;
00907 }
00908
00909 LOG(DBG,"Called handle_raw for %d:%d, iterate %d, returned %d objs",s,r,ret,rdo_dta->ncontent) ;
00910 if(rdo_dta->ncontent == 0) continue ;
00911
00912 rdo_ptr = (char *)rdo_dta->Byte ;
00913 rdo_words = rdo_dta->ncontent / 4 ;
00914
00915 int token = tpx_get_start(rdo_ptr, rdo_words, &rdo, 0) ;
00916
00917 if(token <= 0) {
00918 LOG(ERR,"horrible error, token is %d?",token) ;
00919 continue ;
00920 }
00921
00922 if(rdo.rdo != r) {
00923 LOG(ERR,"RDO mismatch: in data %d, expect %d",rdo.rdo,r) ;
00924 }
00925
00926 u_int *data_end = rdo.data_end ;
00927
00928 a.rdo = rdo.rdo -1 ;
00929 a.t = token ;
00930 a.what = TPX_ALTRO_DO_ADC ;
00931 a.log_err = 0 ;
00932 a.sector = s ;
00933
00934 do {
00935 data_end = tpx_scan_to_next(data_end, rdo.data_start, &a) ;
00936
00937 if(a.count == 0) continue ;
00938
00939
00940 if((a.row>45) || (a.pad==0) || (a.pad>182)) {
00941 LOG(ERR,"TPX: S%02d:RDO%d: row %d, pad %d",a.sector,rdo.rdo,a.row,a.pad) ;
00942 }
00943
00944 daq_adc_tb *at = (daq_adc_tb *) adc->request(a.count) ;
00945
00946
00947
00948 for(u_int i=0 ; i < a.count ; i++) {
00949 at[i].adc = a.adc[i] ;
00950 at[i].tb = a.tb[i] ;
00951
00952 }
00953
00954 adc->finalize(a.count, s, a.row, a.pad) ;
00955
00956 } while(data_end && (data_end > rdo.data_start)) ;
00957
00958
00959 }
00960 }
00961
00962
00963 adc->rewind() ;
00964
00965
00966
00967
00968 return adc ;
00969
00970 }
00971
00972
00973
00974
00975 daq_dta *daq_tpx::handle_raw(int sec, int rdo)
00976 {
00977 char str[128] ;
00978 int tot_bytes ;
00979 int min_sec, max_sec, min_rdo, max_rdo ;
00980 struct {
00981 int sec ;
00982 int rb ;
00983 u_int bytes ;
00984 } obj[24*6] ;
00985
00986
00987 if(sec <= 0) {
00988 min_sec = 1 ;
00989 max_sec = 24 ;
00990 }
00991 else if((sec<1) || (sec>24)) return 0 ;
00992 else {
00993 min_sec = max_sec = sec ;
00994 }
00995
00996 if(rdo <= 0) {
00997 min_rdo = 1 ;
00998 max_rdo = 6 ;
00999 }
01000 else if((rdo<1) || (rdo>6)) return 0 ;
01001 else {
01002 min_rdo = max_rdo = rdo ;
01003 }
01004
01005 assert(caller) ;
01006
01007
01008
01009 tot_bytes = 0 ;
01010 int o_cou = 0 ;
01011
01012 for(int s=min_sec;s<=max_sec;s++) {
01013 for(int r=min_rdo;r<=max_rdo;r++) {
01014
01015
01016
01017 sprintf(str,"%s/sec%02d/rb%02d/adc",sfs_name, s, r) ;
01018
01019 LOG(NOTE,"%s: trying sfs on \"%s\"",name,str) ;
01020
01021 char *full_name = caller->get_sfs_name(str) ;
01022 if(full_name == 0) continue ;
01023
01024 int size = caller->sfs->fileSize(full_name) ;
01025
01026 LOG(DBG,"%s: sector %d, rdo %d : raw size %d",name,s,r,size) ;
01027
01028 if(size <= 0) {
01029 if(size < 0) {
01030 LOG(DBG,"%s: %s: not found in this event",name,str) ;
01031 }
01032 continue ;
01033 }
01034 else {
01035 obj[o_cou].rb = r ;
01036 obj[o_cou].sec = s ;
01037 obj[o_cou].bytes = size ;
01038
01039 o_cou++ ;
01040
01041 tot_bytes += size ;
01042
01043 LOG(DBG,"%s: %s: reading in \"%s\": bytes %d",name,str,"raw", size) ;
01044 }
01045 }
01046 }
01047
01048 raw->create(tot_bytes,(char *)"raw",rts_id,DAQ_DTA_STRUCT(u_char)) ;
01049
01050
01051 for(int i=0;i<o_cou;i++) {
01052
01053 sprintf(str,"%s/sec%02d/rb%02d/adc",sfs_name,obj[i].sec, obj[i].rb) ;
01054 char *full_name = caller->get_sfs_name(str) ;
01055 if(!full_name) continue ;
01056
01057 LOG(NOTE,"%s: request %d bytes",name,obj[i].bytes) ;
01058
01059 char *mem = (char *) raw->request(obj[i].bytes) ;
01060
01061 int ret = caller->sfs->read(full_name, mem, obj[i].bytes) ;
01062
01063 if(ret != (int)obj[i].bytes) {
01064 LOG(ERR,"%s: %s: read failed, expect %d, got %d [%s]",name,str,
01065 obj[i].bytes,ret,strerror(errno)) ;
01066 }
01067 else {
01068 LOG(NOTE,"%s: %s read %d bytes",name,str,ret) ;
01069 }
01070
01071 raw->finalize(obj[i].bytes, obj[i].sec, obj[i].rb, 0) ;
01072 }
01073
01074
01075 LOG(DBG,"Returning from raw_handler") ;
01076 raw->rewind() ;
01077 return raw ;
01078
01079 }
01080
01081 daq_dta *daq_tpx::handle_cld_raw(int sec, int rdo)
01082 {
01083 char str[128] ;
01084 int tot_bytes ;
01085 int min_sec, max_sec, min_rdo, max_rdo ;
01086 struct {
01087 int sec ;
01088 int rb ;
01089 u_int bytes ;
01090 } obj[24*6] ;
01091
01092
01093 if(sec <= 0) {
01094 min_sec = 1 ;
01095 max_sec = 24 ;
01096 }
01097 else if((sec<1) || (sec>24)) return 0 ;
01098 else {
01099 min_sec = max_sec = sec ;
01100 }
01101
01102 if(rdo <= 0) {
01103 min_rdo = 1 ;
01104 max_rdo = 6 ;
01105 }
01106 else if((rdo<1) || (rdo>6)) return 0 ;
01107 else {
01108 min_rdo = max_rdo = rdo ;
01109 }
01110
01111 assert(caller) ;
01112
01113
01114
01115 tot_bytes = 0 ;
01116 int o_cou = 0 ;
01117 for(int s=min_sec;s<=max_sec;s++) {
01118 for(int r=min_rdo;r<=max_rdo;r++) {
01119
01120
01121 sprintf(str,"%s/sec%02d/cld%02d",sfs_name, s, r) ;
01122
01123 LOG(DBG,"%s: trying sfs on \"%s\"",name,str) ;
01124
01125 char *full_name = caller->get_sfs_name(str) ;
01126 if(full_name == 0) continue ;
01127
01128 int size = caller->sfs->fileSize(full_name) ;
01129
01130 LOG(DBG,"%s: sector %d, rdo %d : cld size %d",name,s,r,size) ;
01131
01132
01133 if(size <= 0) {
01134 if(size < 0) {
01135 LOG(DBG,"%s: %s: not found in this event",name,str) ;
01136 }
01137 continue ;
01138 }
01139 else {
01140 obj[o_cou].rb = r ;
01141 obj[o_cou].sec = s ;
01142 obj[o_cou].bytes = size ;
01143
01144 o_cou++ ;
01145
01146 tot_bytes += size ;
01147
01148 LOG(DBG,"%s: %s: reading in \"%s\": bytes %d",name,str,"cld_raw", size) ;
01149 }
01150 }
01151 }
01152
01153 cld_raw->create(tot_bytes,(char *)"cld_raw",rts_id,DAQ_DTA_STRUCT(u_char)) ;
01154
01155
01156 for(int i=0;i<o_cou;i++) {
01157
01158 sprintf(str,"%s/sec%02d/cld%02d",sfs_name,obj[i].sec, obj[i].rb) ;
01159 char *full_name = caller->get_sfs_name(str) ;
01160 if(full_name==0) continue ;
01161
01162 char *mem = (char *) cld_raw->request(obj[i].bytes) ;
01163
01164 int ret = caller->sfs->read(full_name, mem, obj[i].bytes) ;
01165
01166 if(ret != (int)obj[i].bytes) {
01167 LOG(ERR,"%s: %s: read failed, expect %d, got %d [%s]",name,str,
01168 obj[i].bytes,ret,strerror(errno)) ;
01169 }
01170 else {
01171 LOG(NOTE,"%s: %s read %d bytes",name,str,ret) ;
01172 }
01173
01174 cld_raw->finalize(obj[i].bytes, obj[i].sec, obj[i].rb, 0) ;
01175 }
01176
01177
01178 LOG(DBG,"Returning from cld_raw_handler") ;
01179 cld_raw->rewind() ;
01180
01181 return cld_raw ;
01182
01183 }
01184
01185
01186 daq_dta *daq_tpx::handle_cld(int sec, int rdo)
01187 {
01188
01189 int min_sec, max_sec ;
01190 int min_rdo, max_rdo ;
01191 int found_broken_edges = 0 ;
01192
01193
01194 if(sec <= 0) {
01195 min_sec = 1 ;
01196 max_sec = MAX_SEC ;
01197 }
01198 else if((sec<1) || (sec>24)) return 0 ;
01199 else {
01200 min_sec = sec ;
01201 max_sec = sec ;
01202 }
01203
01204 if(rdo <= 0) {
01205 min_rdo = 1 ;
01206 max_rdo = 6 ;
01207 }
01208 else if((rdo<0) || (rdo>6)) return 0 ;
01209 else {
01210 min_rdo = max_rdo = rdo ;
01211 }
01212
01213
01214 int rdos = 0 ;
01215
01216 for(int s=min_sec;s<=max_sec;s++) {
01217 for(int r=min_rdo;r<=max_rdo;r++) {
01218 rdos++ ;
01219 }
01220 }
01221
01222
01223 int guess_bytes = rdos * (1152/10) * (sizeof(daq_store) + 10*sizeof(daq_cld)) ;
01224
01225
01226 cld->create(guess_bytes,(char *)"cld",rts_id,DAQ_DTA_STRUCT(daq_cld)) ;
01227
01228
01229 for(int s=min_sec;s<=max_sec;s++) {
01230 for(int r=min_rdo;r<=max_rdo;r++) {
01231 daq_dta *dd ;
01232
01233
01234 LOG(DBG,"Calling handle_cld_raw for %d:%d",s,r) ;
01235 dd = handle_cld_raw(s, r) ;
01236
01237
01238 if(dd == 0) {
01239 continue ;
01240 }
01241
01242 int ret = dd->iterate() ;
01243 if(ret==0) {
01244 continue ;
01245 }
01246
01247 LOG(DBG,"Called handle_cld_raw for %d:%d, iterate %d, returned %d objs",s,r,ret,dd->ncontent) ;
01248
01249 int bytes = dd->ncontent ;
01250 if(bytes <= 0) continue ;
01251
01252 u_int *buff = dd->Int32 ;
01253
01254 u_int *end_buff = buff + bytes/4 ;
01255 u_int *p_buff = buff ;
01256
01257 while(p_buff < end_buff) {
01258 u_int row = *p_buff++ ;
01259 u_int cou = *p_buff++ ;
01260
01261
01262 u_int version = (row >> 16) ;
01263 row &= 0xFFFF ;
01264
01265 daq_cld *dc = (daq_cld *) cld->request(cou) ;
01266
01267
01268 for(u_int i=0;i<cou;i++) {
01269 p_buff += fcf_algo[0]->fcf_decode(p_buff, dc, version) ;
01270 if((row==8) && (dc->flags & FCF_BROKEN_EDGE)) {
01271 found_broken_edges = 1 ;
01272 }
01273 dc++ ;
01274 }
01275
01276 cld->finalize(cou,s,row,0) ;
01277
01278
01279 }
01280
01281
01282
01283 }
01284 }
01285
01286
01287 cld->rewind() ;
01288
01289
01290 if(found_broken_edges && !fcf_afterburner_disable) {
01291
01292 const int FCF_MAX_MERGED_COU = 256 ;
01293
01294 daq_cld *merged_store[25][FCF_MAX_MERGED_COU] ;
01295 int merged_cou[25] ;
01296
01297 memset(merged_cou,0, sizeof(merged_cou)) ;
01298
01299 while(cld->iterate()) {
01300 if(cld->row != 8) continue ;
01301
01302 int s = cld->sec ;
01303
01304 for(u_int i=0;i<cld->ncontent;i++) {
01305 if((cld->cld[i].flags & FCF_BROKEN_EDGE) && (merged_cou[s] < FCF_MAX_MERGED_COU)) {
01306 merged_store[s][merged_cou[s]] = &cld->cld[i] ;
01307 merged_cou[s]++ ;
01308 }
01309 }
01310 }
01311
01312 for(int s=1;s<=24;s++) {
01313 fcf_algo[0]->afterburner(merged_cou[s],merged_store[s]) ;
01314 }
01315
01316 cld->rewind() ;
01317 }
01318
01319
01320
01321 return cld ;
01322
01323 }
01324
01325
01326
01327
01328 static int cmpr_sim_adc(const void *first, const void *second)
01329 {
01330 daq_sim_adc_tb *f = (daq_sim_adc_tb *)first ;
01331 daq_sim_adc_tb *s = (daq_sim_adc_tb *)second ;
01332
01333 if(f->tb == s->tb) return 0 ;
01334 if(f->tb > s->tb) return -1 ;
01335
01336 return 1 ;
01337 }
01338
01339
01340
01341
01342
01343 daq_dta *daq_tpx::handle_cld_sim(int sec, int row)
01344 {
01345
01346 int min_sec, max_sec ;
01347 int min_row, max_row ;
01348
01349
01350
01351 if(sec <= 0) {
01352 min_sec = 1 ;
01353 max_sec = MAX_SEC ;
01354 }
01355 else if((sec<1) || (sec>24)) return 0 ;
01356 else {
01357 min_sec = sec ;
01358 max_sec = sec ;
01359 }
01360
01361 if(row <= 0) {
01362 min_row = 1 ;
01363 max_row = sim_row_count ;
01364 }
01365 else if((row<0) || (row>250)) return 0 ;
01366 else {
01367 min_row = max_row = row ;
01368 }
01369
01370
01371 int rows = 0 ;
01372
01373 for(int s=min_sec;s<=max_sec;s++) {
01374 if(fcf_algo[s]) {
01375 LOG(DBG,"start_evt(): sec %d",s) ;
01376 fcf_algo[s]->start_evt() ;
01377 }
01378
01379 for(int r=min_row;r<=max_row;r++) {
01380 rows++ ;
01381 }
01382 }
01383
01384
01385 int guess_bytes = rows * (sizeof(daq_store) + 30*sizeof(daq_sim_cld)) ;
01386
01387 cld_sim->create(guess_bytes,(char *)"cld_sim",rts_id,DAQ_DTA_STRUCT(daq_sim_cld)) ;
01388
01389
01390
01391 daq_dta *sim = get("adc_sim") ;
01392
01393 if(sim==0) {
01394 LOG(ERR,"%s: sector %d, row %d: you need to add simulated data first!",name,sec,row) ;
01395 return 0 ;
01396 return cld_sim ;
01397 }
01398
01399
01400 while(sim->iterate()) {
01401 if((min_sec<=sim->sec) && (sim->sec<= max_sec) && (min_row<=sim->row) && (sim->row <= max_row)) ;
01402 else continue ;
01403
01404
01405 if(fcf_algo[sim->sec]==0) {
01406 LOG(NOTE,"No algo assigned for sector %d -- creating one!",sim->sec) ;
01407 fcf_algo[sim->sec] = new tpxFCF ;
01408 fcf_algo[sim->sec]->config(0x3F,1,sim_row_count,sim_tpx_rowlen) ;
01409 fcf_algo[sim->sec]->run_compatibility = fcf_run_compatibility ;
01410 fcf_algo[sim->sec]->do_cuts = fcf_do_cuts ;
01411
01412 fcf_algo[sim->sec]->apply_gains(sim->sec,gain_algo) ;
01413
01414 fcf_algo[sim->sec]->start_evt() ;
01415
01416 if(fcf_tmp_storage==0) {
01417 fcf_tmp_storage = (u_int *)valloc(FCF_TMP_BYTES) ;
01418 }
01419 }
01420
01421 u_short track_id[512] ;
01422 tpx_altro_struct a ;
01423
01424 a.row = sim->row ;
01425 a.pad = sim->pad ;
01426 a.count = 0 ;
01427
01428
01429 qsort(sim->sim_adc, sim->ncontent, sizeof(sim->sim_adc[0]),cmpr_sim_adc) ;
01430
01431
01432
01433 for(u_int i=0;i<sim->ncontent;i++) {
01434 a.adc[i] = sim->sim_adc[i].adc ;
01435 a.tb[i] = sim->sim_adc[i].tb ;
01436 track_id[i] = sim->sim_adc[i].track_id ;
01437 a.count++ ;
01438 }
01439
01440
01441 fcf_algo[sim->sec]->do_pad(&a, sim->sim_adc) ;
01442 LOG(DBG,"do_pad(): sec %d, row %d, pad %d: %d",sim->sec,a.row,a.pad,a.count) ;
01443 }
01444
01445
01446
01447 for(int s=min_sec;s<=max_sec;s++) {
01448 if(fcf_algo[s]) {
01449
01450 int words = fcf_algo[s]->stage2(fcf_tmp_storage,FCF_TMP_BYTES) ;
01451 if(words<=0) continue ;
01452
01453 LOG(DBG,"Sector %d: %d words",s,words) ;
01454 u_int *p_buff = fcf_tmp_storage ;
01455 u_int *end_buff = p_buff + words ;
01456
01457 while(p_buff < end_buff) {
01458 u_int row = *p_buff++ ;
01459 u_int cou = *p_buff++ ;
01460 int g_cou = 0 ;
01461
01462
01463 u_int version = (row >> 16) ;
01464 row &= 0xFFFF ;
01465
01466
01467 daq_sim_cld *cld = (daq_sim_cld *) cld_sim->request(cou) ;
01468
01469 while(cou) {
01470 int skip = fcf_algo[s]->fcf_decode(p_buff, cld + g_cou, version) ;
01471
01472 g_cou++ ;
01473
01474 p_buff += skip ;
01475 cou-- ;
01476
01477 }
01478
01479 cld_sim->finalize(g_cou,s,row) ;
01480 }
01481 }
01482 }
01483
01484
01485 cld_sim->rewind() ;
01486
01487 return cld_sim ;
01488 }
01489
01490
01491
01492 int daq_tpx::get_token(char *addr, int words)
01493 {
01494 daq_trg_word trgs[128] ;
01495
01496 get_l2(addr, words, trgs, 1) ;
01497
01498
01499
01500 if(trgs[0].t==0) {
01501 LOG(ERR,"Token 0 not allowed but I will try to use the other triggers...") ;
01502 trgs[0].t = 4097 ;
01503 }
01504
01505
01506 return trgs[0].t ;
01507
01508 }
01509
01510
01511
01512
01513 int daq_tpx::get_l2(char *addr, int words, struct daq_trg_word *trgs, int do_log)
01514 {
01515 struct tpx_rdo_event rdo ;
01516 int cou = 0 ;
01517 u_int collision = 0 ;
01518 int err = 0 ;
01519
01520 int ret = tpx_get_start(addr, words, &rdo, do_log) ;
01521 if(ret < 0) {
01522 LOG(ERR,"get_l2: broken data!") ;
01523 return 0 ;
01524 }
01525
01526 LOG(DBG,"rdo %d, rdo token %d, trg cou %d",rdo.rdo,rdo.token,rdo.trg_cou) ;
01527
01528
01529 for(u_int i=0;i<rdo.trg_cou;i++) {
01530 u_int dta = rdo.trg[i].data ;
01531 u_int marker = rdo.trg[i].csr >> 24 ;
01532 u_int rhic = rdo.trg[i].rhic_counter ;
01533
01534 if((marker==0) || (marker==0xEE)) {
01535
01536 trgs[cou].t = dta & 0xFFF ;
01537 trgs[cou].daq = (dta >> 12) & 0xF ;
01538 trgs[cou].trg = (dta >> 16) & 0xF ;
01539 trgs[cou].rhic_delta = 0 ;
01540 trgs[cou].rhic = rhic ;
01541 trgs[cou].reserved[0] = 0xF0000000 | (0x0FFFFFFF & dta) ;
01542
01543 switch(trgs[cou].trg) {
01544 case 4 :
01545 case 8 :
01546 case 9 :
01547 case 10 :
01548 break ;
01549 default :
01550 LOG(ERR,"RDO %d: T %d: prompt: bad trg: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01551 err = 1 ;
01552 continue ;
01553 }
01554
01555 if(trgs[cou].t==0) {
01556 LOG(ERR,"RDO %d: token 0 (prompt) -- ignoring: 0x%08X",rdo.rdo,dta) ;
01557 err = 1 ;
01558 continue ;
01559 }
01560
01561
01562 if((dta & 0x3000000) != 0x2000000) {
01563 LOG(ERR,"RDO %d: T %d: prompt: BUSY overrun: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01564 err = 1 ;
01565 continue ;
01566 }
01567
01568 if(cou) {
01569 LOG(ERR,"RDO %d: duplicate prompt trigger",rdo.rdo) ;
01570 err = 1 ;
01571 continue ;
01572 }
01573
01574 cou++ ;
01575
01576 collision = rhic ;
01577 }
01578
01579 }
01580
01581 if(cou==0) {
01582
01583
01584 if(rdo.token != 4096) {
01585 rdo.token = 4097 ;
01586 LOG(NOTE,"No triggers in event, making it %d",rdo.token) ;
01587 }
01588
01589 trgs[cou].t = rdo.token ;
01590 trgs[cou].daq = 0 ;
01591 trgs[cou].trg = 4 ;
01592 trgs[cou].rhic_delta = 0 ;
01593 trgs[cou].rhic = 0 ;
01594 trgs[cou].reserved[0] = 0 ;
01595
01596 cou++ ;
01597
01598 }
01599 else if (cou > 1) {
01600 LOG(ERR,"RDO %d: token %d? -- too many prompt contributions!",rdo.rdo,trgs[0].t) ;
01601 err = 1 ;
01602 }
01603
01604
01605
01606
01607
01608
01609 if(trgs[0].t == 0) {
01610 LOG(ERR,"Token 0 in RDO %d: making it 4097",rdo.rdo) ;
01611 err = 1 ;
01612 trgs[0].t = 4097 ;
01613 }
01614
01615 for(u_int i=0;i<rdo.trg_cou;i++) {
01616 u_int dta = rdo.trg[i].data ;
01617 u_int marker = rdo.trg[i].csr >> 24 ;
01618 u_int rhic = rdo.trg[i].rhic_counter ;
01619
01620 if(marker==0xFF) {
01621 int daq10k = 0 ;
01622
01623 trgs[cou].t = dta & 0xFFF ;
01624 trgs[cou].daq = (dta >> 12) & 0xF ;
01625 trgs[cou].trg = (dta >> 16) & 0xF ;
01626 trgs[cou].rhic = rhic ;
01627 trgs[cou].reserved[0] = 0x20000000 | (0x0FFFFFFF & dta) ;
01628
01629 switch(trgs[cou].trg) {
01630 case 13 :
01631 case 14 :
01632 case 15 :
01633 break ;
01634
01635 case 2 :
01636
01637 if((trgs[cou].t == 0x345) && (trgs[cou].daq == 2)) {
01638 continue ;
01639 }
01640 if((trgs[cou].t == 1001) && (trgs[cou].daq == 3)) {
01641 continue ;
01642 }
01643
01644
01645
01646
01647 default :
01648
01649
01650
01651 if((dta & 0x03A00000) == 0x00800000) {
01652
01653 daq10k = 1 ;
01654 }
01655 else {
01656 if((dta & 0x3000000) != 0x2000000) {
01657 if(trgs[0].trg == 9) {
01658 LOG(NOTE,"RDO %d: T %d: FIFO: BUSY overrun: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01659 }
01660 else {
01661 LOG(ERR,"RDO %d: T %d: FIFO: BUSY overrun: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01662 err = 1 ;
01663 }
01664 }
01665 }
01666
01667 switch(trgs[cou].trg) {
01668 case 4 :
01669 case 8 :
01670 case 9 :
01671 case 10 :
01672 break ;
01673 default:
01674 if(trgs[0].trg == 9) {
01675 LOG(NOTE,"RDO %d: T %d: FIFO: bad trg_cmd: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01676 }
01677 else {
01678 LOG(ERR,"RDO %d: T %d: FIFO: bad trg_cmd: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01679 err = 1 ;
01680 }
01681 break ;
01682 }
01683
01684 trgs[cou].reserved[0] = 0xA0000000 | (0x0FFFFFFF & dta) ;
01685
01686
01687
01688 if(daq10k) break ;
01689 else continue ;
01690
01691 }
01692
01693
01694
01695 if(rhic >= collision) {
01696 trgs[cou].rhic_delta = rhic - collision ;
01697 }
01698 else {
01699 trgs[cou].rhic_delta = -(collision - rhic) ;
01700 }
01701
01702 if(trgs[cou].rhic_delta == 1) {
01703 LOG(NOTE,"RDO %d: T %d: FIFO: delta == 1: 0x%08X",rdo.rdo,trgs[cou].t,dta) ;
01704 if(trgs[0].trg == 9) {
01705 continue ;
01706 }
01707 }
01708
01709 if((trgs[cou].t == 0)) {
01710 LOG(ERR,"RDO %d: token 0 in L2 contribution 0x%08X -- skipping",rdo.rdo,dta) ;
01711 err = 1 ;
01712 continue ;
01713 }
01714
01715 cou++ ;
01716 }
01717
01718 }
01719
01720 if(err) {
01721 LOG(ERR," RDO %d: words %d",rdo.rdo,words) ;
01722 for(u_int i=0;i<rdo.trg_cou;i++) {
01723 LOG(ERR," RDO %d: T %4d: %d/%d: data 0x%08X, CSR 0x%08X, RHIC %u",rdo.rdo, rdo.token, i, rdo.trg_cou, rdo.trg[i].data, rdo.trg[i].csr, rdo.trg[i].rhic_counter) ;
01724 }
01725 }
01726
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737 return cou ;
01738 }