StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
itpcPed.cxx
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <math.h>
5 #include <errno.h>
6 #include <unistd.h>
7 #include <time.h>
8 
9 #include <rtsLog.h>
10 #include <DAQ_ITPC/itpcCore.h>
11 
12 #include "itpcPed.h"
13 
14 
15 itpcPed::itpcPed()
16 {
17  memset(ped_p,0,sizeof(ped_p)) ;
18  memset(padplane_id,0,sizeof(padplane_id)) ;
19 
20  pulser_peak_timebin = 90 ; // as on the iFEE test stand in the lab!
21  pulser_in_star = 0 ;
22 }
23 
24 
25 itpcPed::~itpcPed()
26 {
27  for(int s=0;s<24;s++) {
28  for(int r=0;r<4;r++) {
29  for(int p=0;p<16;p++) {
30  for(int c=0;c<64;c++) {
31  if(ped_p[s][r][p][c]) {
32  free(ped_p[s][r][p][c]) ;
33  ped_p[s][r][p][c] = 0 ;
34  }
35  }
36  }
37  }
38  }
39 
40 }
41 
42 int itpcPed::kill_non_phys()
43 {
44  int cou = 0 ;
45 
46  for(int s=0;s<24;s++) {
47  for(int r=0;r<4;r++) {
48  for(int p=0;p<16;p++) {
49  for(int c=0;c<64;c++) {
50  if(ped_p[s][r][p][c]) ;
51  else continue ;
52 
53  int row, pad, fee_id ;
54  fee_id = padplane_id[s][r][p] ;
55 
56 
57  itpc_ifee_to_rowpad(fee_id,c,row,pad) ;
58 
59  if(row==0) {
60  cou++ ;
61  LOG(NOTE,"Non-phys ch %d: %d %d %d %d: fee_id %d, rp %d:%d",cou,s+1,r+1,p+1,c,row,pad) ;
62 
63  ped_p[s][r][p][c]->c_ped = 1023.0 ;
64  }
65 
66  }}}}
67 
68 
69  return cou ;
70 }
71 
72 
73 // sector: 1 to 24
74 // rdo: 1 to 4
75 void itpcPed::init(int sector, int rdo, u_int mask)
76 {
77  LOG(NOTE,"%s: sector %d, RDO %d, mask 0x%04X",__PRETTY_FUNCTION__,sector,rdo,mask) ;
78 
79  sector-- ; // to start from 0
80  rdo-- ; // to start from 0
81 
82  //alloc per sector, per rdo
83  for(int p=0;p<16;p++) {
84  for(int c=0;c<64;c++) {
85  if(ped_p[sector][rdo][p][c]) continue ; // ...silently
86 
87  ped_p[sector][rdo][p][c] = (ped_t *)malloc(sizeof(ped_t)) ;
88  }
89  }
90 
91 
92  fee_mask[sector][rdo] = mask ;
93 
94 }
95 
96 // Needed to get from port to (row:pad) and pin too
97 void itpcPed::set_padplane_id(int sector, int rdo, int port, int id)
98 {
99  sector-- ;
100  rdo-- ;
101  port-- ;
102 
103  padplane_id[sector][rdo][port] = id ;
104 }
105 
106 
107 void itpcPed::clear()
108 {
109  memset(evts,0,sizeof(evts)) ;
110 
111  for(int s=0;s<24;s++) {
112  for(int r=0;r<4;r++) {
113  for(int p=0;p<16;p++) {
114  for(int c=0;c<64;c++) {
115  if(ped_p[s][r][p][c]) {
116  memset(ped_p[s][r][p][c],0,sizeof(ped_t)) ;
117  }
118  }
119  }
120  }
121  }
122 
123  memset(fee_err,0,sizeof(fee_err)) ;
124 
125 }
126 
127 // sector, rdo, port, channel, timebin, value
128 void itpcPed::accum(int sector, int rdo, int port,int fee_id, int ch, int tb, int adc_val)
129 {
130  ped_t *pt = ped_p[sector][rdo][port][ch] ;
131 
132  if(pt==0) return ; // super-precaution
133 
134  if(evts[sector][rdo]<250) {
135  evts[sector][rdo]++ ;
136  }
137 //printf("accum %d %d %d %d\n",sector,rdo,port,ch) ;
138 
139  pt->ped[tb] += adc_val ;
140  pt->rms[tb] += adc_val*adc_val ;
141  pt->cou[tb]++ ;
142 
143  pt->c_ped += adc_val ;
144  pt->c_rms += adc_val*adc_val ;
145  pt->c_cou++ ;
146 
147 }
148 
149 
150 void itpcPed::calc()
151 {
152  for(int s=0;s<24;s++) {
153  for(int r=0;r<4;r++) {
154  if(ped_p[s][r][0][0]==0) continue ;
155 
156 //printf("calc S%d:%d fee_mask 0x%08X\n",s,r,fee_mask[s][r]) ;
157 
158  for(int p=0;p<16;p++) {
159  if(fee_mask[s][r] & (1<<p)) ;
160  else continue ;
161 
162  for(int c=0;c<64;c++) {
163  ped_t *pt = ped_p[s][r][p][c] ;
164 
165 //printf(" port %d, channel %d: cou %d\n",p,c,pt->c_cou) ;
166 
167  if(pt->c_cou==0) { // problem!!!
168  pt->c_ped = 1023.0 ;
169  pt->c_rms = 1023.0 ;
170  continue ;
171  }
172 
173  pt->c_ped /= pt->c_cou ;
174  pt->c_rms /= pt->c_cou ;
175  pt->c_rms = pt->c_rms - pt->c_ped*pt->c_ped ;
176 
177  if(pt->c_rms <= 0.0) pt->c_rms = 0.0 ;
178  else pt->c_rms = sqrt(pt->c_rms) ;
179 
180  for(int t=0;t<512;t++) {
181  if(pt->cou[t]==0) {
182  pt->ped[t] = 1023.0 ;
183  pt->rms[t] = 1022.0 ;
184  continue ;
185  }
186 
187  pt->ped[t] /= pt->cou[t] ;
188  pt->rms[t] /= pt->cou[t] ;
189 
190  pt->rms[t] = pt->rms[t] - pt->ped[t]*pt->ped[t] ;
191 
192  if(pt->rms[t] <= 0.0) pt->rms[t] = 0.0 ;
193  else pt->rms[t] = sqrt(pt->rms[t]) ;
194  }
195  }
196  }
197  }
198  }
199 
200 
201 }
202 
203 
204 int itpcPed::from_cache(const char *fname, int sec1, int rdo1)
205 {
206  FILE *f ;
207  char fn[256] ;
208 
209  if(fname==0) {
210  sprintf(fn,"/RTScache/itpc_pedestals_s%02d_r%d.txt",sec1,rdo1) ;
211  }
212  else strcpy(fn,fname) ;
213 
214 
215  f = fopen(fn,"r") ;
216  if(f==0) {
217  LOG(ERR,"%s: [%s]",fn,strerror(errno)) ;
218  return -1 ;
219  }
220 
221 
222  while(!feof(f)) {
223  char buff[256] ;
224  int sec, rdo, fee_port, fee_ch, tb, fee_id, dummy ;
225  float fd, fped, frms ;
226 
227  if(fgets(buff,sizeof(buff),f)==0) continue ;
228 
229  int ret = sscanf(buff,"%d %d %d %d %d %d %d %d %d %f %f %f %f",
230  &sec,&rdo,&fee_port,&fee_ch,&fee_id,&dummy,&dummy,&dummy,&dummy,&fd,&fd,&fped,&frms) ;
231 
232 
233  if(ret == 13) { // first, global section
234 
235  sec-- ;
236  rdo-- ;
237  fee_port-- ;
238 
239 
240  if(ped_p[sec][rdo][fee_port][fee_ch]) ;
241  else continue ;
242 
243  padplane_id[sec][rdo][fee_port] = fee_id ;
244 
245  ped_p[sec][rdo][fee_port][fee_ch]->c_ped = fped ;
246  ped_p[sec][rdo][fee_port][fee_ch]->c_rms = frms ;
247  }
248  else { // per timebin
249  ret = sscanf(buff,"%d %d %d %d %d %f %f",
250  &sec,&rdo,&fee_port,&fee_ch,&tb,&fped,&frms) ;
251 
252  if(ret != 7) {
253  LOG(ERR,"WTF?") ;
254  continue ;
255  }
256 
257  sec-- ;
258  rdo-- ;
259  fee_port-- ;
260 
261 
262  if(ped_p[sec][rdo][fee_port][fee_ch]) ;
263  else continue ;
264 
265  ped_p[sec][rdo][fee_port][fee_ch]->ped[tb] = fped ;
266  ped_p[sec][rdo][fee_port][fee_ch]->rms[tb] = frms ;
267 
268 
269 
270  }
271 
272  }
273 
274  fclose(f) ;
275 
276  return 0 ;
277 }
278 
279 int itpcPed::sanity(int mode)
280 {
281  u_int bad_cou =0 ;
282  u_int good_cou =0 ;
283 
284  char fname[128] ;
285  sprintf(fname,"/log/itpc/itpc_log_%02d.txt",sector_id) ;
286  FILE *f = fopen(fname,"a") ;
287  if(f==0) {
288  LOG(ERR,"sanity: %s [%s]",fname,strerror(errno)) ;
289  }
290  else {
291  time_t now = time(0) ;
292 
293  fprintf(f,"Run %08u, Sector %2d, Run-type %d. Date %s",run_number,sector_id,run_type,ctime(&now)) ;
294  }
295 
296  if(mode) {
297  LOG(INFO,"Using pulser peak timebin %d, in STAR %c",
298  pulser_peak_timebin, pulser_in_star?'Y':'N') ;
299  }
300 
301  for(int s=0;s<24;s++) {
302  for(int r=0;r<4;r++) {
303  if(ped_p[s][r][0][0]==0) continue ;
304 
305  if(evts[s][r]<100) { // no point in complaining if there's not enough events
306  continue ;
307  }
308 
309  for(int p=0;p<16;p++) {
310  if(fee_mask[s][r] & (1<<p)) ;
311  else continue ;
312 
313  for(int c=0;c<64;c++) {
314  ped_t *pt = ped_p[s][r][p][c] ;
315 
316 
317  int row, pad, fee_id ;
318 
319  fee_id = padplane_id[s][r][p] ;
320 
321  //if(p==4) fee_id = 54 ;
322  //else if(p==11) fee_id = 55 ;
323  //else fee_id = 46 ;
324 
325  itpc_ifee_to_rowpad(fee_id,c,row,pad) ;
326 
327  int pin ;
328  itpc_rowpad_to_id(row,pad,fee_id,pin) ;
329 
330  //LOG(TERR,"%2d %d %2d %2d -1 %.3f %.3f :: FEE_ID %d,RP %d:%d, pin %d",s+1,r+1,p+1,c,pt->c_ped,pt->c_rms,fee_id,row,pad,pin) ;
331 
332 
333  double m_ped = 0.0 ;
334  double m_rms = 0.0 ;
335  u_int m_cou = 0 ;
336 
337  for(int t=0;t<=20;t++) {
338  m_ped += pt->ped[t] ;
339  m_rms += pt->rms[t] ;
340  m_cou++ ;
341  }
342 
343 
344 
345  m_ped /= m_cou ;
346  m_rms /= m_cou ;
347 
348  double pulser = pt->ped[pulser_peak_timebin] - m_ped ; // this is where the pulser on the FEE QA stand resides
349 
350  int bad = 0 ;
351 
352  if(row) { // only for connected pads!
353  if((m_ped<20)||(m_ped>150)) bad |= 1 ;
354  if(m_rms < 0.5) bad |= 2 ;
355 
356 
357  // only check for non-pulser events because the STAR pulser is very noisy
358  if(mode==1 && pulser_in_star) {
359  // The STAR TPC pulser introduces so much noise
360  // it is not worth looking at it.
361  //if(m_rms>3) bad |= 4 ;
362 
363  }
364  else {
365  if(m_rms>1.8) bad |= 4 ;
366  }
367 
368  if(mode==1 && pulser < 200) bad |= 8 ;
369  }
370 
371  if(bad) {
372  bad_cou++ ;
373  fee_err[s][r][p][c] |= bad ;
374 
375  if(f) {
376  fprintf(f," Bad FEE Ch: RDO %d, Port #%d, Ch %d (Padplane %d, rp %d:%d): flag 0x%X: %.1f +- %.1f, %.1f\n",
377  r+1,p+1,c,fee_id,row,pad,bad,m_ped,m_rms,pulser) ;
378  }
379 
380  LOG(WARN,"Bad FEE Ch: RDO %d, Port #%d, Ch %d (Padplane %d, rp %d:%d): flag 0x%X: %.1f +- %.1f, %.1f",
381  r+1,p+1,c,fee_id,row,pad,bad,m_ped,m_rms,pulser) ;
382 
383  usleep(1000) ; // to give time for the printout
384  }
385  else {
386  good_cou++ ;
387  }
388 
389  }
390  }
391  }
392  }
393 
394  if(f) {
395  fprintf(f,"Bad channels: %d/%d\n",bad_cou,bad_cou+good_cou) ;
396  fclose(f) ;
397  }
398 
399  LOG(INFO,"Bad channels: %d/%d",bad_cou,bad_cou+good_cou) ;
400 
401 
402  return 0 ;
403 }
404 
405 
406 int itpcPed::to_cache(const char *fname, int sec1, int rdo1)
407 {
408  FILE *outf ;
409  int s_start, s_stop ;
410  int r_start, r_stop ;
411 
412  s_start = 1 ;
413  s_stop = 24 ;
414 
415  r_start = 1 ;
416  r_stop = 4 ;
417 
418  if(fname) {
419  outf = fopen(fname,"w") ;
420  if(outf==0) {
421  LOG(ERR,"%s: %s [%s]",__PRETTY_FUNCTION__,fname,strerror(errno)) ;
422  return -1 ;
423  }
424  }
425  else if(sec1 < 0) {
426  outf = stdout ;
427  }
428  else { // canonical!
429 
430  char fn[256] ;
431 
432  if(evts[sec1-1][rdo1-1]<100) {
433  LOG(ERR,"S%02d:%d -- not enough ped events %d",sec1,rdo1,evts[sec1-1][rdo1-1]) ;
434  return -1 ;
435  }
436 
437  s_start = sec1 ;
438  s_stop = sec1 ;
439 
440  r_start = rdo1 ;
441  r_stop = rdo1 ;
442 
443  sprintf(fn,"/RTScache/itpc_pedestals_s%02d_r%d.txt",sec1,rdo1) ;
444 
445  outf = fopen(fn,"w") ;
446  if(outf==0) {
447  LOG(ERR,"%s: %s [%s]",__PRETTY_FUNCTION__,fn,strerror(errno)) ;
448  return -1 ;
449 
450  }
451  }
452 
453 
454  for(int sx=s_start;sx<=s_stop;sx++) {
455  int s = sx - 1 ;
456  for(int rx=r_start;rx<=r_stop;rx++) {
457  int r = rx - 1 ;
458 
459  if(ped_p[s][r][0][0]==0) continue ;
460 
461 
462 
463  for(int p=0;p<16;p++) {
464  if(fee_mask[s][r] & (1<<p)) ;
465  else continue ;
466 
467  for(int c=0;c<64;c++) {
468  ped_t *pt = ped_p[s][r][p][c] ;
469 
470 
471  int row, pad, fee_id ;
472 
473  fee_id = padplane_id[s][r][p] ;
474 
475  //if(p==4) fee_id = 54 ;
476  //else if(p==11) fee_id = 55 ;
477  //else fee_id = 46 ;
478 
479  itpc_ifee_to_rowpad(fee_id,c,row,pad) ;
480 
481  int pin ;
482  itpc_rowpad_to_id(row,pad,fee_id,pin) ;
483 
484  //LOG(TERR,"%2d %d %2d %2d -1 %.3f %.3f :: FEE_ID %d,RP %d:%d, pin %d",s+1,r+1,p+1,c,pt->c_ped,pt->c_rms,fee_id,row,pad,pin) ;
485 
486 
487  double m_ped = 0.0 ;
488  double m_rms = 0.0 ;
489  u_int m_cou = 0 ;
490 
491  for(int t=0;t<=20;t++) {
492  m_ped += pt->ped[t] ;
493  m_rms += pt->rms[t] ;
494  m_cou++ ;
495  }
496 
497  m_ped /= m_cou ;
498  m_rms /= m_cou ;
499 
500 
501  fprintf(outf,"%2d %d %2d %2d %2d %2d %2d %3d %3d %.3f %.3f %.3f %.3f \n",s+1,r+1,p+1,c,fee_id,pin,row,pad,-1,pt->c_ped,pt->c_rms, m_ped, m_rms) ;
502 
503  // NOTE HACK!!!!
504  pt->c_ped = m_ped ;
505  pt->c_rms = m_rms ;
506 
507  }
508  }
509  }
510  }
511 
512 
513 
514 
515  for(int sx=s_start;sx<=s_stop;sx++) {
516  int s = sx - 1 ;
517  for(int rx=r_start;rx<=r_stop;rx++) {
518  int r = rx - 1 ;
519 
520  if(ped_p[s][r][0][0]==0) continue ;
521 
522 
523 
524  for(int p=0;p<16;p++) {
525  if(fee_mask[s][r] & (1<<p)) ;
526  else continue ;
527 
528  for(int c=0;c<64;c++) {
529  ped_t *pt = ped_p[s][r][p][c] ;
530 
531  for(int t=0;t<512;t++) {
532  double ped = pt->ped[t] ;
533 
534  //if(t==185 || t==186) printf("YADA %f %f %f\n",ped,pt->c_ped,pt->rms[t]) ;
535 
536  if(run_type==5) {
537  ped -= pt->c_ped ;
538 
539  if(ped<2.0) ped = 0.0 ; // kill low lying pulses
540 
541  if(ped==0.0) continue ;
542 
543  if(pt->rms[t]>1000.0) continue ;
544  }
545 
546  fprintf(outf,"%2d %d %2d %2d %3d %.3f %.3f\n",s+1,r+1,p+1,c,t,ped,pt->rms[t]) ;
547  }
548  }
549  }
550  }
551  }
552 
553 
554  if(outf != stdout) fclose(outf) ;
555 
556  return 0 ;
557 }