00001 #include <stdio.h>
00002 #include <sys/types.h>
00003 #include <math.h>
00004 #include <stdlib.h>
00005 #include <string.h>
00006 #include <errno.h>
00007 #include <time.h>
00008 #include <unistd.h>
00009
00010 #include <rtsLog.h>
00011 #include <TPC/rowlen.h>
00012 #include <daqModes.h>
00013 #include <TPX/tpx_altro_to_pad.h>
00014
00015 #include "tpxCore.h"
00016 #include "tpxPed.h"
00017 #include "tpxGain.h"
00018
00019 static const u_int MIN_EVENTS = 500 ;
00020 #define TPX_PED_FILENAME "/RTScache/pedestals"
00021
00022 tpxPed::tpxPed()
00023 {
00024 smoothed = 0 ;
00025 valid = 0 ;
00026 rb_mask = 0x3F ;
00027
00028 memset(evts,0,sizeof(evts)) ;
00029 memset(valid_evts,0,sizeof(valid_evts)) ;
00030
00031 sizeof_ped = sizeof(struct peds) * 46 * 183 ;
00032
00033 ped_store = 0 ;
00034
00035 max_events = 1000 ;
00036
00037 clock_source = 9 ;
00038 sector = -1 ;
00039 return ;
00040 }
00041
00042
00043 tpxPed::~tpxPed()
00044 {
00045 if(ped_store) free(ped_store) ;
00046
00047 return ;
00048 }
00049
00050 #if 0
00051 tpxPed::peds *tpxPed::get(int row, int pad)
00052 {
00053 return (ped_store + row*183 + pad) ;
00054 }
00055 #endif
00056
00057 void tpxPed::init(int active_rbs)
00058 {
00059 smoothed = 0 ;
00060 valid = 0 ;
00061
00062 memset(evts,0,sizeof(evts)) ;
00063 memset(valid_evts,0,sizeof(valid_evts)) ;
00064 rb_mask = active_rbs ;
00065
00066 if(ped_store == 0) {
00067 ped_store = (struct peds *) malloc(sizeof_ped) ;
00068 }
00069
00070 memset(ped_store,0,sizeof_ped) ;
00071
00072 LOG(TERR,"Pedestals zapped: sector %2d, rb_mask 0x%02X.", sector, rb_mask) ;
00073 }
00074
00075
00076
00077
00078 void tpxPed::accum(char *evbuff, int bytes)
00079 {
00080 int t ;
00081 u_int *data_end ;
00082 tpx_rdo_event rdo ;
00083 tpx_altro_struct a ;
00084
00085
00086 t = tpx_get_start(evbuff, bytes/4, &rdo, 0) ;
00087
00088 if(t <= 0) return ;
00089
00090
00091
00092 a.what = TPX_ALTRO_DO_ADC ;
00093 a.rdo = rdo.rdo - 1 ;
00094 a.t = t ;
00095 a.sector = rdo.sector ;
00096 a.log_err = 0 ;
00097
00098 evts[a.rdo]++ ;
00099
00100
00101
00102 if(evts[a.rdo] <= 3) {
00103 LOG(NOTE,"RDO %d: skipping event %d < 3",rdo.rdo,evts[a.rdo]) ;
00104 return ;
00105 }
00106 if(tpx_rdo_dbg[a.rdo].delta < 200000) {
00107 LOG(WARN,"RDO %d: skipping event %d: delta %u too small",rdo.rdo,evts[a.rdo],tpx_rdo_dbg[a.rdo].delta) ;
00108 usleep(10000) ;
00109 return ;
00110 }
00111
00112 valid_evts[a.rdo]++ ;
00113
00114 LOG(NOTE,"RDO %d: event %d: delta %u OK",rdo.rdo,evts[a.rdo],tpx_rdo_dbg[a.rdo].delta) ;
00115
00116 data_end = rdo.data_end ;
00117
00118 do {
00119 data_end = tpx_scan_to_next(data_end, rdo.data_start, &a) ;
00120 accum(&a) ;
00121 } while(data_end && (data_end > rdo.data_start)) ;
00122
00123
00124 return ;
00125
00126 }
00127
00128 void tpxPed::accum(tpx_altro_struct *a)
00129 {
00130 int i ;
00131 int row, pad ;
00132 struct peds *p ;
00133
00134
00135
00136 row = a->row ;
00137 pad = a->pad ;
00138
00139
00140
00141 p = get(row, pad) ;
00142 if(p==0) {
00143 LOG(ERR,"ped::accum for row %d, pad %d, A %d:%d bad?",row,pad,a->id,a->ch) ;
00144 return ;
00145 }
00146
00147
00148 if(p->cou[20] > max_events) return ;
00149
00150
00151 LOG(DBG,"count %d",a->count) ;
00152 for(i=0;i<a->count;i++) {
00153 int tb, adc ;
00154
00155 adc = a->adc[i] ;
00156 tb = a->tb[i] ;
00157
00158 p->ped[tb] += (double) adc ;
00159 p->rms[tb] += (double) (adc*adc) ;
00160 p->cou[tb]++ ;
00161 }
00162
00163
00164 return ;
00165 }
00166
00167 void tpxPed::calc()
00168 {
00169 int r,p,t ;
00170 int bad ;
00171
00172
00173 LOG(NOTE,"Calculating pedestals for sector %2d",sector) ;
00174
00175 bad = 0 ;
00176
00177 for(r=0;r<=45;r++) {
00178 for(p=0;p<=182;p++) {
00179 struct peds *ped = get(r,p) ;
00180
00181 for(t=0;t<512;t++) {
00182 if(ped->cou[t] == 0) {
00183 ped->ped[t] = 1023.0 ;
00184 ped->rms[t] = 9.999 ;
00185 }
00186 else {
00187 double pp, rr ;
00188
00189 pp = ped->ped[t] / (double) ped->cou[t] ;
00190 rr = ped->rms[t] / (double) ped->cou[t] ;
00191
00192
00193 if(rr < (pp*pp)) rr = 0.0 ;
00194 else rr = sqrt(rr - pp*pp) ;
00195
00196 ped->ped[t] = pp ;
00197 ped->rms[t] = rr ;
00198 }
00199 }
00200 }
00201 }
00202
00203 for(r=0;r<6;r++) {
00204 if(rb_mask & (1<<r)) {
00205 if(valid_evts[r] < MIN_EVENTS) {
00206 bad = 1 ;
00207 LOG(ERR,"RDO %d: not enough valid events (%d < %d) [%d]",r+1,valid_evts[r],MIN_EVENTS,evts[r]) ;
00208 }
00209 }
00210 }
00211
00212
00213
00214 valid = ! bad ;
00215
00216 if(valid) {
00217 LOG(TERR,"Pedestals calculated. RDO counts: %u %u %u %u %u %u",valid_evts[0],valid_evts[1],valid_evts[2],valid_evts[3],valid_evts[4],valid_evts[5]) ;
00218 }
00219 else {
00220 LOG(ERR,"Pedestals calculated. RDO counts: %u %u %u %u %u %u",valid_evts[0],valid_evts[1],valid_evts[2],valid_evts[3],valid_evts[4],valid_evts[5]) ;
00221 }
00222
00223 return ;
00224 }
00225
00226
00227 int tpxPed::to_altro(char *buff, int rb, int timebins)
00228 {
00229 int row, pad, t ;
00230 int a, ch ;
00231
00232 FILE *fff = 0 ;
00233 char fname[128] ;
00234
00235 sprintf(fname,"/RTScache/altro_ped_%d_%03d.txt",rb+1,timebins) ;
00236
00237 fff = fopen(fname,"w") ;
00238 if(fff==0) {
00239 LOG(WARN,"Can't open \"%s\"",fname) ;
00240 }
00241
00242 char *rbuff = buff ;
00243
00244 if(!valid || !smoothed) {
00245 LOG(ERR,"ped::to_altro peds are bad: RDO %d: valid %d, smoothed %d",rb+1,valid,smoothed) ;
00246 }
00247
00248 LOG(NOTE,"Preparing pedestals for RDO %d...",rb) ;
00249
00250 for(a=0;a<256;a++) {
00251 for(ch=0;ch<16;ch++) {
00252
00253 tpx_from_altro(rb,a,ch,row,pad) ;
00254
00255 if(row > 45) continue ;
00256
00257
00258
00259 u_int *addr = (u_int *) rbuff ;
00260
00261 rbuff += 4 ;
00262
00263 u_short *ptr = (u_short *) rbuff ;
00264
00265 int tcou = 0 ;
00266
00267
00268
00269 struct peds *ped = get(row,pad) ;
00270
00271
00272 for(t=0;t<timebins+15;t++) {
00273 if(fff) fprintf(fff,"%3d %2d %3d %3d\n",a,ch,t,(u_short)ped->ped[t]) ;
00274 }
00275 #if 0
00276
00277
00278 for(t=15;t<509;t++) {
00279 *ptr++ = (u_short) ped->ped[t] ;
00280 tcou++ ;
00281 }
00282
00283 if(tcou & 1) {
00284 *ptr++ = (u_short) ped->ped[t] ;
00285 tcou++ ;
00286 }
00287 #endif
00288
00289
00290
00291
00292
00293 for(t=15;t<timebins+15;t++) {
00294 *ptr++ = (u_short) ped->ped[t] ;
00295 if((row==42)&&(pad==140)) {
00296
00297 }
00298 tcou++ ;
00299 }
00300
00301
00302
00303
00304 for(;t<(TPX_MAX_TB+15);t++) {
00305 u_short val = (u_short) 1023 ;
00306
00307 *ptr++ = val ;
00308 if((row==42)&&(pad==140)) {
00309
00310 }
00311
00312 tcou++ ;
00313 }
00314
00315
00316
00317
00318
00319
00320 for(t=0;t<15;t++) {
00321 u_short val = (u_short) ped->ped[t] ;
00322 *ptr++ = val ;
00323 if((row==42)&&(pad==140)) {
00324
00325 }
00326
00327 tcou++ ;
00328 }
00329
00330
00331 u_short val = (u_short) ped->ped[0] ;
00332 *ptr++ = val ;
00333 if((row==42)&&(pad==140)) {
00334
00335 }
00336
00337 tcou++ ;
00338
00339
00340
00341 #if 0
00342
00343
00344 for(t=0;t<15;t++) {
00345 *ptr++ = (u_short) ped->ped[t] ;
00346 tcou++ ;
00347 }
00348 #endif
00349
00350 #if 0
00351
00352
00353
00354
00355
00356
00357
00358 *ptr++ = 5 ;
00359 tcou++ ;
00360 *ptr++ = 10 ;
00361 tcou++ ;
00362 *ptr++ = 15 ;
00363 tcou++ ;
00364 *ptr++ = 20 ;
00365 tcou++ ;
00366 #endif
00367
00368
00369 if(tcou & 1) {
00370 LOG(WARN,"tcou %d is odd, adding ped of tb %d?",tcou,t) ;
00371 *ptr++ = (u_short) ped->ped[0];
00372 tcou++ ;
00373 }
00374
00375 int aid = a ;
00376 for(int i=0;i<tpx_fee_override_cou;i++) {
00377 if(sector == tpx_fee_override[i].sector) {
00378 if(rb == (tpx_fee_override[i].rdo-1)) {
00379 int fee = a & 0xFE ;
00380 if(fee == tpx_fee_override[i].orig_altro) {
00381
00382 if(a & 1) {
00383 aid = tpx_fee_override[i].curr_altro | 1 ;
00384
00385 }
00386 else {
00387 aid = tpx_fee_override[i].curr_altro ;
00388 }
00389
00390 LOG(NOTE,"Sector %2d, RDO %d: overriding ALTRO from %3d to %3d",sector,rb+1,a,aid) ;
00391 }
00392 }
00393 }
00394 }
00395
00396 *addr = (aid << 24) | (ch << 16) | tcou ;
00397
00398 rbuff += 2 * tcou ;
00399 }
00400 }
00401
00402 if(fff) fclose(fff) ;
00403
00404 LOG(NOTE,"Pedestals prepared for RDO %d, bytes %d",rb+1,rbuff-buff) ;
00405 return rbuff - buff ;
00406 }
00407
00408 int tpxPed::to_evb(char *buff)
00409 {
00410 int r, p, t ;
00411
00412 char *rbuff = buff ;
00413
00414 if(!valid || !smoothed) {
00415
00416 LOG(ERR,"ped::to_evb peds are bad: valid %d, smoothed %d",valid,smoothed) ;
00417 }
00418
00419 LOG(NOTE,"Preparing pedestals for later EVB...") ;
00420
00421 for(r=0;r<=45;r++) {
00422 for(p=1;p<=tpc_rowlen[r];p++) {
00423 struct peds *ped = get(r, p) ;
00424
00425 u_short *addr = (u_short *) rbuff ;
00426 *(addr+1) = (r<<8)|p ;
00427
00428 u_short *ptr = addr + 2;
00429
00430 for(t=0;t<512;t++) {
00431 double rms = (ped->rms[t] * 16.0) ;
00432 u_short val ;
00433
00434 if((u_short)rms > 0x3F) val = 0x3F ;
00435 else val = (u_short) rms ;
00436
00437
00438 if(ped->ped[t] == 0) {
00439 LOG(WARN,"WTF? ped 0 in rp %d:%d, tb %d",r,p,t) ;
00440 }
00441
00442 *ptr++ = (val << 10) | (u_short)ped->ped[t] ;
00443 }
00444
00445 *addr = t ;
00446 rbuff = (char *) ptr ;
00447 }
00448 }
00449
00450
00451
00452
00453 LOG(TERR,"Pedestals prepared for later EVB, sector %2d: %d bytes",sector,rbuff-buff) ;
00454 return (rbuff-buff) ;
00455 }
00456
00457 int tpxPed::from_cache(char *fname, u_int rb_msk)
00458 {
00459 FILE *f ;
00460 char fn[64] ;
00461 char *pn ;
00462
00463 init(rb_msk) ;
00464
00465
00466 if(fname) {
00467 pn = fname ;
00468 }
00469 else {
00470 pn = "/RTScache/pedestals" ;
00471 }
00472
00473
00474 int err = 0 ;
00475
00476 for(int rdo=1;rdo<=6;rdo++) {
00477 if(rb_mask & (1<<(rdo-1))) ;
00478 else continue ;
00479
00480 sprintf(fn,"%s_r%d.txt",pn,rdo) ;
00481 f = fopen(fn,"r") ;
00482
00483 if(f==0) {
00484 LOG(ERR,"ped::from_cache can't open output file \"%s\" [%s]",fn,strerror(errno)) ;
00485 err++ ;
00486 continue ;
00487 }
00488
00489
00490 LOG(NOTE,"Loading pedestals from cache \"%s\"...",fn) ;
00491
00492 while(!feof(f)) {
00493 int r, p , t ;
00494 float pp, rr ;
00495
00496 int ret = fscanf(f,"%d %d %d %f %f",&r,&p,&t,&pp,&rr) ;
00497 if(ret != 5) continue ;
00498
00499 struct peds *peds = get(r,p) ;
00500
00501
00502
00503 peds->ped[t] = pp ;
00504 peds->rms[t] = rr ;
00505 }
00506
00507 fclose(f) ;
00508 }
00509
00510
00511 if(!err) {
00512 LOG(TERR,"Pedestals loaded from cache (last was \"%s\"): sector %2d [0x%02X].",fn,sector,rb_mask) ;
00513 valid = 1 ;
00514 }
00515 else {
00516 LOG(ERR,"Pedestals failed from cache (last was \"%s\"): sector %2d [0x%02X].",fn,sector,rb_mask) ;
00517 valid = 0 ;
00518 }
00519
00520 smoothed = 0 ;
00521
00522
00523 return valid ;
00524 }
00525
00526 int tpxPed::to_cache(char *fname, u_int run)
00527 {
00528 FILE *f, *f_sum ;
00529 int r, p, t ;
00530 char fn[64] ;
00531 char f_sum_name[128] ;
00532 char *pn ;
00533
00534 static float old_sum[46][183] ;
00535
00536
00537
00538 if(!valid || smoothed) {
00539 LOG(ERR,"ped::to_cache peds are bad: valid %d, smoothed %d -- not caching",valid,smoothed) ;
00540 return -1 ;
00541 }
00542
00543 if(fname) {
00544 pn = fname ;
00545 }
00546 else {
00547 pn = "/RTScache/pedestals" ;
00548 }
00549
00550
00551
00552 for(int rdo=1;rdo<=6;rdo++) {
00553
00554
00555
00556 if(valid_evts[rdo-1] < MIN_EVENTS) {
00557 LOG(ERR,"Sector %2d, RDO %d has %d events -- not caching!",sector,rdo,valid_evts[rdo-1]) ;
00558 continue ;
00559 }
00560
00561 sprintf(fn,"%s_r%d.txt",pn,rdo) ;
00562
00563
00564
00565 memset(old_sum,0,sizeof(old_sum)) ;
00566 f = fopen(fn,"r") ;
00567 if(f==0) {
00568 LOG(ERR,"ped::to_cache can't open input file \"%s\" [%s]",fn,strerror(errno)) ;
00569 }
00570 else {
00571
00572 while(!feof(f)) {
00573 float fped, frms ;
00574 fscanf(f,"%d %d %d %f %f",&r,&p,&t,&fped,&frms) ;
00575
00576 if(t < 22) {
00577 old_sum[r][p] += fped ;
00578 }
00579 }
00580
00581 for(r=0;r<=45;r++) {
00582 for(p=1;p<=tpc_rowlen[r];p++) {
00583 old_sum[r][p] /= 22.0 ;
00584 }
00585 }
00586
00587 fclose(f) ;
00588 }
00589
00590
00591 f = fopen(fn,"w") ;
00592 if(f==0) {
00593 LOG(ERR,"ped::to_cache can't open output file \"%s\" [%s]",fn,strerror(errno)) ;
00594 continue ;
00595 }
00596
00597 if(run==0) {
00598 sprintf(f_sum_name,"/RTScache/ped_sum_s%02d_r%d_%u_%d.txt",sector,rdo,(u_int)time(NULL),clock_source) ;
00599 }
00600 else {
00601 sprintf(f_sum_name,"/RTScache/ped_sum_s%02d_r%d_%08u_%d.txt",sector,rdo,run,clock_source) ;
00602 }
00603
00604 f_sum = fopen(f_sum_name,"w") ;
00605 if(f_sum==0) {
00606 LOG(ERR,"ped::to_cache can't open trace file \"%s\" [%s]",f_sum_name,strerror(errno)) ;
00607 }
00608
00609
00610 LOG(NOTE,"Writing pedestals to cache \"%s\"...",fn) ;
00611
00612 for(r=0;r<=45;r++) {
00613
00614
00615 for(p=1;p<=tpc_rowlen[r];p++) {
00616 int t_rdo, t_a, t_ch ;
00617
00618 tpx_to_altro(r,p,t_rdo,t_a,t_ch) ;
00619 if(t_rdo != rdo) continue ;
00620
00621 struct peds *peds = get(r, p) ;
00622
00623 double sum = 0.0 ;
00624 int cou = 0 ;
00625
00626 for(t=0;t<22;t++) {
00627 sum += peds->ped[t] ;
00628 cou++ ;
00629 }
00630
00631 sum /= (double)cou ;
00632
00633 double p_diff = sum - old_sum[r][p] ;
00634 if(fabs(p_diff)>1.0) {
00635 LOG(WARN,"RDO %d: ped_compare r:p %d:%d = %.1f",rdo,r,p,p_diff) ;
00636 }
00637
00638
00639 if(f_sum) fprintf(f_sum,"%d %d %.5f\n",r,p,sum) ;
00640
00641 for(t=0;t<512;t++) {
00642
00643
00644 fprintf(f,"%d %d %d %.3f %.3f\n",r,p,t,peds->ped[t],peds->rms[t]) ;
00645 }
00646 }
00647 }
00648
00649 fclose(f) ;
00650 if(f_sum) fclose(f_sum) ;
00651 }
00652
00653 LOG(TERR,"Pedestals written to cache \"%s\", for sector %2d...",fn,sector) ;
00654
00655 return 1 ;
00656 }
00657
00658 int tpxPed::hlt_debug_setup(int param)
00659 {
00660 int delta_tb = param % 100 ;
00661 int delta_pad = param / 100 ;
00662 int hits ;
00663
00664 if(delta_tb < 6) delta_tb = 6 ;
00665 if(delta_pad < 3) delta_pad = 3 ;
00666
00667 hits = 0 ;
00668
00669 for(int r=1;r<=45;r++) {
00670
00671 for(int p=3;p<=(tpc_rowlen[r]-delta_pad-2);p+=delta_pad) {
00672
00673 for(int pd=0;pd<2;pd++) {
00674 struct peds *ped = get(r,p+pd) ;
00675
00676 for(int t=15;t<400;t+=delta_tb) {
00677
00678
00679 hits++ ;
00680
00681 for(int td=0;td<5;td++) {
00682 double val = ped->ped[t+td] ;
00683
00684 if(val < 10.0) val = 0.0 ;
00685 else val -= 10.0 ;
00686
00687 ped->ped[t+td] = val ;
00688 }
00689 }
00690 }
00691 }
00692 }
00693
00694 LOG(TERR,"param %u: delta pad %d,time %d: %d hits",param,delta_pad,delta_tb,hits/2) ;
00695
00696 valid = 1 ;
00697 smoothed = 1 ;
00698
00699 return 1 ;
00700 }
00701
00702 int tpxPed::special_setup(int run_type, int sub_type)
00703 {
00704 int r, p, t ;
00705 int m ;
00706
00707 switch(run_type) {
00708 case RUN_TYPE_PULSER_A :
00709 case RUN_TYPE_PULSER :
00710 case RUN_TYPE_PED_A :
00711 case RUN_TYPE_PED_B :
00712
00713 LOG(WARN,"Special Pedestal setup: %d, %d",run_type, sub_type) ;
00714 break ;
00715 case RUN_TYPE_HLT_DEBUG :
00716 LOG(WARN,"Special Pedestal setup: %d, %d",run_type, sub_type) ;
00717 hlt_debug_setup(sub_type) ;
00718 return 1 ;
00719
00720 default :
00721 return 1 ;
00722 }
00723
00724 for(r=0;r<=45;r++) {
00725 for(p=0;p<=182;p++) {
00726 struct peds *ped = get(r,p) ;
00727
00728
00729 switch(run_type) {
00730 case RUN_TYPE_PULSER_A :
00731
00732 for(t=100;t<110;t++) ped->ped[t] = 0.0 ;
00733
00734 for(t=400;t<415;t++) ped->ped[t] = 0.0 ;
00735 break ;
00736 case RUN_TYPE_PULSER :
00737 for(t=TPX_PULSER_PED_START;t<=TPX_PULSER_PED_STOP;t++) ped->ped[t] = 0.0 ;
00738 break ;
00739 case RUN_TYPE_HLT_DEBUG :
00740
00741 break ;
00742 case RUN_TYPE_PED_A :
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756 for(t=0;t<512;t++) {
00757 ped->ped[t] = 0 ;
00758 }
00759
00760
00761 for(t=390;t<512;t++) ped->ped[t] = 20 ;
00762
00763 break ;
00764 case RUN_TYPE_PED_B :
00765 m = 1 ;
00766 for(t=0;t<512;) {
00767 for(int i=0;i<16;i++) {
00768 ped->ped[t+i] = m * 1023.0 ;
00769 }
00770 if(m==0) m = 1 ;
00771 else m = 0 ;
00772 t += 16 ;
00773 }
00774 break ;
00775 default :
00776 for(t=0;t<512;t++) ped->ped[t] = 1023.0 ;
00777 for(t=p;t<(p+10);t++) ped->ped[t] = 0 ;
00778 break ;
00779 }
00780
00781 }
00782 }
00783
00784 valid = 1 ;
00785 smoothed = 1 ;
00786
00787 return 1 ;
00788 }
00789
00790
00791 void tpxPed::smooth()
00792 {
00793 int r, p, t ;
00794
00795 double mean ;
00796 int cou ;
00797
00798 if(smoothed || !valid) {
00799 LOG(ERR,"ped::smooth sector %2d invalid: smoothed %d, valid %d",sector,smoothed,valid) ;
00800 return ;
00801 }
00802
00803 #define TPX_GG_START 20 // depends on TCD!
00804 #define TPX_START_OF_RIPPLE 32 // doesn't depend on TCD
00805 #define TPX_START_CORRECTION 34
00806 #define TPX_USE_DATA 298
00807 #define TPX_GG_DOWN 420
00808
00809
00810 LOG(NOTE,"Smoothing pedestals...") ;
00811
00812 for(r=0;r<=45;r++) {
00813 for(p=0;p<=182;p++) {
00814 struct peds *ped = get(r,p) ;
00815 double smoother[513] ;
00816 double ripple[24] ;
00817
00818
00819
00820 for(t=0;t<512;t++) {
00821 smoother[t] = ped->ped[t] ;
00822 }
00823
00824
00825 mean = 0.0 ;
00826 cou = 0 ;
00827
00828 for(t=0;t<TPX_GG_START;t++) {
00829 mean += smoother[t] ;
00830 cou++ ;
00831 }
00832 mean /= (double)cou ;
00833
00834 for(t=0;t<TPX_GG_START;t++) {
00835 smoother[t] = mean ;
00836 }
00837
00838
00839
00840 mean = 0.0 ;
00841 cou = 0 ;
00842
00843 for(t=TPX_USE_DATA;t<(TPX_USE_DATA+8);t++) {
00844 mean += smoother[t] ;
00845 cou++ ;
00846 }
00847
00848 mean /= (double) cou ;
00849
00850
00851 for(t=TPX_USE_DATA;t<(TPX_USE_DATA+8);t++) {
00852 ripple[t-TPX_USE_DATA] = smoother[t] - mean ;
00853 }
00854
00855
00856 smoother[TPX_START_OF_RIPPLE] -= ripple[2] * 0.6 ;
00857
00858
00859 for(t=TPX_START_CORRECTION;t<512;t+=8) {
00860 for(int i=0;i<8;i++) {
00861 if((t+i)>434) continue ;
00862 smoother[t+i] -= ripple[i] ;
00863 }
00864 }
00865
00866
00867
00868 for(t=0;t<512;t++) {
00869 ped->ped[t] = (double) ((u_short) (smoother[t]+0.5)) ;
00870 }
00871
00872
00873
00874
00875 }
00876 }
00877
00878 LOG(TERR,"Pedestals smoothed: sector %2d",sector) ;
00879 smoothed = 1 ;
00880
00881 return ;
00882 }
00883
00884
00885 void tpxPed::kill_bad(int row, int pad)
00886 {
00887 struct peds *p ;
00888 int t ;
00889
00890 p = get(row, pad) ;
00891
00892 for(t=0;t<512;t++) {
00893 p->ped[t] = 1023.0 ;
00894 p->rms[t] = 9.999 ;
00895 }
00896
00897 return ;
00898 }
00899
00900
00901 int tpxPed::from_evb(char *buff, int bytes)
00902 {
00903 init(0x3F) ;
00904 valid = 0 ;
00905 smoothed = 0 ;
00906
00907
00908
00909 return 0 ;
00910 }
00911
00912
00913 int tpxPed::summarize(FILE *log)
00914 {
00915 int notes = 0 ;
00916
00917
00918 return notes ;
00919 }
00920