CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TMatacq.cc
Go to the documentation of this file.
1 /*
2  * \class TMatacq
3  *
4  * \author: Patrice Verrecchia - CEA/Saclay
5  */
7 
8 #include <iostream>
9 #include <math.h>
10 #include "TVectorD.h"
11 
13 
14 using namespace std;
15 //ClassImp(TMatacq)
16 
18 {
19  for(int k=0;k<NMAXSAMP;k++)
20  bong[k]=0.;
21 
22  for(int k=0;k<=100;k++)
23  bing[k]=0;
24 
25  for(int k=0;k<NSPARAB;k++)
26  t[k]= (double) k;
27 
28  return ;
29 }
30 
31 // Constructor...
32 TMatacq::TMatacq(int Ntot, int Nsamp1, int Nsamp2, int cut, int Nbef, int Naft, int niv1, int niv2, int niv3, int nevl, int NSlide)
33 {
34  fNsamples= Ntot;
35  presample= Nsamp1;
36  endsample= Nsamp2;
37  nsigcut= (double) cut;
38  fNum_samp_bef_max= Nbef;
39  fNum_samp_aft_max= Naft;
40  level1= ((double) niv1)/100.;
41  level2= ((double) niv2)/100.;
42  level3= ((double) niv3)/100.;
43  nevlasers= nevl;
44  slidingmean=0.0;
45  nslide=NSlide;
46  for(int k=0;k<nevlasers;k++)
47  status[k]=0;
48  for(int k=0;k<nevlasers;k++)
49  status[k+nevlasers]=0;
50 
51  nevmtq0=0; nevmtq1=0;
52 }
53 
54 // Destructor
56 {
57 }
58 
59 int TMatacq::rawPulseAnalysis(Int_t Nsamp, Double_t *adc) // GHM
60 {
61  using namespace std;
62 
63  // std::cout << "Entering rawPulseAnalysis" << std::endl;
64 
65  int k,ithr;
66  double dsum=0.,dsum2=0.;
67 
68  // std::cout << "calling init" << std::endl;
69  init();
70  // std::cout << ".......done" << std::endl;
71 
72  if(Nsamp != fNsamples) {
73  printf("found different number of samples fNsamples=%d Nsamp=%d\n",fNsamples,Nsamp);
74  return 100;
75  }
76 
77  for(k=0;k<presample;k++) {
78  dsum+= adc[k];
79  dsum2+= adc[k]*adc[k];
80  }
81  bl=dsum/((double) presample);
82  double ss= (dsum2/((double) presample)-bl*bl);
83  if(ss<0.) ss=0.;
84  sigbl=sqrt(ss);
85  for(ithr=0,k=presample;k<endsample;k++) {
86  if(adc[k] > (bl+nsigcut*sigbl) && ithr == 0) {
87  ithr=1; firstsample=k;
88  }
89  }
90 
91  if(ithr == 0) return 101;
92 
93  for(ithr=0,k=firstsample;k<Nsamp;k++) {
94  if(adc[k] < (bl+nsigcut*sigbl) && ithr == 0) {
95  ithr=1; lastsample=k;
96  }
97  }
98  if(ithr == 0) lastsample= Nsamp;
99 
100  if(lastsample > firstsample+NMAXSAMP) lastsample= firstsample+NMAXSAMP;
101 
102  val_max=0.; samplemax=0;
103  for (Int_t is=firstsample;is<lastsample;is++) {
104  bong[is-firstsample]= adc[is] - bl;
105  if(bong[is-firstsample] > val_max) {
106  val_max= bong[is-firstsample]; samplemax=is;
107  }
108  }
109  if(samplemax == 0) return 103;
110  if(samplemax > lastsample) return 104;
111  if(samplemax < firstsample) return 105;
112 
113 
114  int endslide=samplemax -nslide;
115  int beginslide=nslide;
116  int islidingmean=0;
117  slidingmean=0.0;
118 
119  for(int i=beginslide;i<endslide;i++) {
120  slidingmean+= adc[i];
121  islidingmean+=1;
122  }
123  if( islidingmean!=0) slidingmean/=double(islidingmean);
124 
125  return 0;
126 }
128 {
129  int k; int nbinf=0; int jfind=0;
130  int nbsup= 0;
131  double thres= val_max*level1;
132 
133  for(k=0,jfind=0;k<NMAXSAMP;k++) {
134  if(jfind == 0) {
135  if(bong[k] > thres) {
136  nbinf=k; jfind=1;
137  }
138  }
139  }
140  if(jfind == 0) nbinf=0;
141 
142  for(k=NMAXSAMP,jfind=0;k>nbinf;k--) {
143  if(jfind == 0) {
144  if(bong[k] > thres) {
145  nbsup=k; jfind=1;
146  }
147  }
148  }
149  if(nbsup == 0) nbsup=nbinf;
150 
151  double sumpkval=1.;
152  pkval= 0.;
153  sigpkval=0.5;
154  if(nbsup == nbinf) {
155  return 301;
156  } else {
157  if(nbinf > 4) nbinf-=3;
158  else nbinf=1;
159  if(nbsup < NMAXSAMP-4) nbsup+=3;
160  else nbsup=NMAXSAMP;
161 
162  for(k=0;k<nbinf;k++)
163  bong[k]=0.;
164  for(k=nbsup;k<NMAXSAMP;k++)
165  bong[k]=0.;
166 
167  for(k=0,jfind=0;k<NMAXSAMP;k++) {
168  if(bong[k] > 0.) jfind++;
169  }
170  if(jfind == 0) {
171  return 302;
172  } else if(jfind == 1) {
173  return 303;
174  } else {
175 
176  for(k=0;k<NMAXSAMP;k++) {
177  if(k < 100)
178  bing[k+1]= (int) bong[k];
179  }
180 
181  TMarkov *peak = new TMarkov();
182 
183  peak -> peakFinder(&bing[0]);
184  pkval= peak -> getPeakValue(0);
185  sigpkval= peak -> getPeakValue(1);
186 
187  delete peak;
188 
189  sumpkval= 0.0;
190 
191  if(sumpkval > 1000.)
192  sumpkval=10.;
193 
194  pkval+= (firstsample -1);
195  }
196  }
197 
198  return 0;
199 }
200 
202 {
203  int testneg=0;
204  ampl=0.; timeatmax=0.;
205  int heresamplemax= samplemax-firstsample;
206 
207  int beginfit= heresamplemax - fNum_samp_bef_max;
208  int endfit= heresamplemax + fNum_samp_aft_max;
209 
210  int nval= endfit-beginfit +1;
211  if(nval != NSPARAB) return 201;
212  for(int kn=beginfit;kn<=endfit;kn++) {
213  if(bong[kn] <= 0) testneg=1;
214  }
215  if(testneg == 1) return 202;
216 
217  for(int i=0;i<nval;i++) {
218  val[i]= bong[beginfit+i];
219  fv1[i]= 1.;
220  fv2[i]= (double) (i);
221  fv3[i]= ((double)(i))*((double)(i));
222  }
223 
224  TVectorD y(nval,val);
225  TVectorD f1(nval,fv1);
226  TVectorD f2(nval,fv2);
227  TVectorD f3(nval,fv3);
228 
229  double bj[3];
230  bj[0]= f1*y; bj[1]=f2*y; bj[2]= f3*y;
231  TVectorD b(3,bj);
232 
233  double aij[9];
234  aij[0]= f1*f1; aij[1]=f1*f2; aij[2]=f1*f3;
235  aij[3]= f2*f1; aij[4]=f2*f2; aij[5]=f2*f3;
236  aij[6]= f3*f1; aij[7]=f3*f2; aij[8]=f3*f3;
237  TMatrixD a(3,3,aij);
238 
239  double det1;
240  a.InvertFast(&det1);
241 
242  TVectorD c= a*b;
243 
244  double *par= c.GetMatrixArray();
245  if(par[2] != 0.) {
246  timeatmax= -par[1]/(2.*par[2]);
247  ampl= par[0]-par[2]*(timeatmax*timeatmax);
248  }
249 
250  if(ampl <= 0.) {
251  ampl=bong[heresamplemax];
252  return 203;
253  }
254 
255  if((int)timeatmax > NSPARAB)
256  return 204;
257  if((int)timeatmax < 0)
258  return 205;
259 
260  timeatmax+= (beginfit + firstsample);
261 
262  int tplus[3], tminus[3];
263  double xampl[3];
264  xampl[0]=0.2*ampl;
265  xampl[1]=0.5*ampl;
266  xampl[2]=0.8*ampl;
267 
268  int hitplus[3];
269  int hitminus[3];
270  double width[3];
271 
272  for(int i=0;i<3;i++){
273  hitplus[i]=0;
274  hitminus[i]=0;
275  width[i]=0.0;
276  tplus[i]=firstsample+lastsample;
277  tminus[i]=0;
278  }
279 
280  // calculate first estimate of half width
281  int im = heresamplemax;
282  int iplusbound = firstsample+lastsample-im;
283 
284  for(int j=0;j<3;j++){
285 
286  for(int i=1;i<im;i++){
287 
288 
289  if (bong[im-i]<xampl[j] && bong[im-i+1]>xampl[j]) {
290  tminus[j]=im-i;
291  hitminus[j]++;
292  i=im;
293  }
294  }
295 
296 
297  for(int i=0;i<iplusbound;i++){
298 
299  if (bong[im+i]>xampl[j] && bong[im+i+1]<xampl[j]){
300  tplus[j]=im+i;
301  hitplus[j]++;
302  i=iplusbound;
303  }
304  }
305 
306  // interpolate to get a better estimate
307 
308  double slopeplus = double( bong[tplus[j] +1] - bong[tplus[j] ] );
309  double slopeminus = double( bong[tminus[j]+1] - bong[tminus[j]] );
310 
311 
312  double timeminus=double(tminus[j])+0.5;
313  if(slopeminus!=0) timeminus=tminus[j]+(xampl[j]-double(bong[tminus[j]]))/slopeminus;
314 
315 
316  double timeplus=double(tplus[j])+0.5;
317  if(slopeplus!=0) timeplus=tplus[j]+(xampl[j]-double(bong[tplus[j]]))/slopeplus;
318 
319  width[j]=timeplus-timeminus;
320 
321  }
322 
323  width20=width[0];
324  width50=width[1];
325  width80=width[2];
326 
327  return 0;
328 }
329 
331 {
332  int error;
333  trise= 0.;
334 
335  double t20= interpolate(ampl*level2);
336  if(t20 < 0.) {
337  error= (int) -t20;
338  return error;
339  }
340  double t80= interpolate(ampl*level3);
341  if(t80 < 0.) {
342  error= (int) -t80;
343  return error;
344  }
345  trise= t80 - t20;
346 
347  return 0;
348 }
349 
350 
351 
352 
353 
354 double TMatacq::interpolate(double amplx)
355 {
356  double T;
357  int kmax= (int) pkval - firstsample;
358 
359  int bin_low=0;
360  for(Int_t k=0;k<kmax;k++)
361  if(0. < bong[k] && bong[k] < amplx) {
362  bin_low=k;
363  }
364  if(bin_low == 0) return -301.;
365  int bin_high=0;
366  for(Int_t k=kmax;k>=0;k--)
367  if(bong[k] > amplx) {
368  bin_high=k;
369  }
370  if(bin_high == 0) return -302.;
371  if(bin_high < bin_low) return -303.;
372 
373 
374  if(bin_low == bin_high) {
375  T= (double) bin_high;
376  } else {
377  double slope= (bong[bin_high]-bong[bin_low])/((double) (bin_high-bin_low));
378  T= (double) bin_high - (bong[bin_high] - amplx)/slope;
379  }
380 
381  return T;
382 }
383 
384 void TMatacq::enterdata(Int_t anevt)
385 {
386  if(anevt < 2*nevlasers) {
387  if(anevt < nevlasers) {
388  nevmtq0++;
389  status[nevmtq0-1]= anevt;
390  comp_trise[nevmtq0-1]= trise;
391  comp_peak[nevmtq0-1]= pkval;
392  } else {
393  nevmtq1++;
394  status[nevmtq0+nevmtq1-1]= anevt;
395  comp_trise[nevmtq0+nevmtq1-1]= trise;
396  comp_peak[nevmtq0+nevmtq1-1]= pkval;
397  }
398  } else {
399  if(anevt < 3*nevlasers) {
400  nevmtq0++;
401  status[nevmtq0-1]= anevt;
402  comp_trise[nevmtq0-1]= trise;
403  comp_peak[nevmtq0-1]= pkval;
404  } else {
405  nevmtq1++;
406  status[nevmtq0+nevmtq1-1]= anevt;
407  comp_trise[nevmtq0+nevmtq1-1]= trise;
408  comp_peak[nevmtq0+nevmtq1-1]= pkval;
409  }
410  }
411 }
412 
413 void TMatacq::printmatacqData(int gRunNumber, int color, int timestart)
414 {
415  FILE *fmatacq;
416  char filename[80];
417  int i;
418  double ss;
419  sprintf(filename,"runMatacq%d.pedestal",gRunNumber);
420  fmatacq = fopen(filename, "w");
421  if(fmatacq == NULL) printf("Error while opening file : %s\n",filename);
422 
423  double sumtrise=0.; double sumtrise2=0.;
424  int timestop= timestart+3;
425  double mintrise=10000.;
426  double maxtrise=0.;
427  for(i=0;i<nevmtq0;i++) {
428  if(comp_trise[i] > maxtrise) {
429  maxtrise=comp_trise[i];
430  }
431  if(comp_trise[i] < mintrise) {
432  mintrise= comp_trise[i];
433  }
434  sumtrise+=comp_trise[i];
435  sumtrise2+=comp_trise[i]*comp_trise[i];
436  }
437  meantrise= sumtrise/((double) nevmtq0);
438  ss= (sumtrise2/((double) nevmtq0) - meantrise*meantrise);
439  if(ss < 0.) ss=0.;
440  sigtrise=sqrt(ss);
441  fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
442  nevmtq0,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
443 
444  sumtrise=0.; sumtrise2=0.;
445  mintrise=10000.;
446  maxtrise=0.;
447  for(i=nevmtq0;i<nevmtq0+nevmtq1;i++) {
448  if(comp_trise[i] > maxtrise) {
449  maxtrise=comp_trise[i];
450  }
451  if(comp_trise[i] < mintrise) {
452  mintrise= comp_trise[i];
453  }
454  sumtrise+=comp_trise[i];
455  sumtrise2+=comp_trise[i]*comp_trise[i];
456  }
457  meantrise= sumtrise/((double) nevmtq1);
458  ss= (sumtrise2/((double) nevmtq1) - meantrise*meantrise);
459  if(ss < 0.) ss=0.;
460  sigtrise=sqrt(ss);
461  fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
462  nevmtq1,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
463 
464  int iret=fclose(fmatacq);
465  printf(" Closing file : %d\n",iret);
466 }
467 
468 int TMatacq::countBadPulses(int gRunNumber)
469 {
470  FILE *fmatacq;
471  char filename[80];
472  sprintf(filename,"badevtsMatacq%d.dat",gRunNumber);
473  fmatacq = fopen(filename, "w");
474  if(fmatacq == NULL) printf("Error while opening file : %s\n",filename);
475 
476  int nevbad=0;
477  for(Int_t i=0;i<nevmtq0+nevmtq1;i++) {
478  if(comp_trise[i] < meantrise - 3.*sigtrise) {
479  nevbad++;
480  fprintf(fmatacq,"%d \n",status[i]);
481  status[i]=-1;
482  }
483  if(comp_trise[i] > meantrise + 3.*sigtrise) {
484  nevbad++;
485  fprintf(fmatacq,"%d \n",status[i]);
486  status[i]=-1;
487  }
488  }
489 
490  int iret=fclose(fmatacq);
491  printf(" Closing file : %d\n",iret);
492  return nevbad;
493 }
494 
495 void TMatacq::printitermatacqData(int gRunNumber, int color, int timestart)
496 {
497  FILE *fmatacq;
498  char filename[80];
499  int i;
500  double ss;
501  sprintf(filename,"runiterMatacq%d.pedestal",gRunNumber);
502  fmatacq = fopen(filename, "w");
503  if(fmatacq == NULL) printf("Error while opening file : %s\n",filename);
504 
505  int nevmtqgood=0;
506  double sumtrise=0.; double sumtrise2=0.;
507  int timestop= timestart+3;
508  double mintrise=10000.;
509  double maxtrise=0.;
510  for(i=0;i<nevmtq0;i++) {
511  if(status[i] >= 0) {
512  nevmtqgood++;
513  if(comp_trise[i] > maxtrise) {
514  maxtrise=comp_trise[i];
515  }
516  if(comp_trise[i] < mintrise) {
517  mintrise= comp_trise[i];
518  }
519  sumtrise+=comp_trise[i];
520  sumtrise2+=comp_trise[i]*comp_trise[i];
521  }
522  }
523  meantrise= sumtrise/((double) nevmtqgood);
524  ss= (sumtrise2/((double) nevmtqgood) - meantrise*meantrise);
525  if(ss < 0.) ss=0.;
526  sigtrise=sqrt(ss);
527  fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
528  nevmtqgood,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
529 
530  nevmtqgood=0;
531  sumtrise=0.; sumtrise2=0.;
532  mintrise=10000.;
533  maxtrise=0.;
534  for(i=nevmtq0;i<nevmtq0+nevmtq1;i++) {
535  if(status[i] >= 0) {
536  nevmtqgood++;
537  if(comp_trise[i] > maxtrise) {
538  maxtrise=comp_trise[i];
539  }
540  if(comp_trise[i] < mintrise) {
541  mintrise= comp_trise[i];
542  }
543  sumtrise+=comp_trise[i];
544  sumtrise2+=comp_trise[i]*comp_trise[i];
545  }
546  }
547  meantrise= sumtrise/((double) nevmtqgood);
548  ss= (sumtrise2/((double) nevmtqgood) - meantrise*meantrise);
549  if(ss < 0.) ss=0.;
550  sigtrise=sqrt(ss);
551  fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
552  nevmtqgood,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
553 
554  int iret=fclose(fmatacq);
555  printf(" Closing file : %d\n",iret);
556 }
void printitermatacqData(Int_t, Int_t, Int_t)
Definition: TMatacq.cc:495
int adc(sample_type sample)
get the ADC sample (12 bits)
int i
Definition: DBlmapReader.cc:9
#define NMAXSAMP
Definition: TMatacq.h:6
static const double slope[3]
int init
Definition: HydjetWrapper.h:67
double interpolate(double)
Definition: TMatacq.cc:354
virtual ~TMatacq()
Definition: TMatacq.cc:55
int compute_trise()
Definition: TMatacq.cc:330
#define NULL
Definition: scimark2.h:8
void printmatacqData(Int_t, Int_t, Int_t)
Definition: TMatacq.cc:413
void init()
Definition: TMatacq.cc:17
return((rh^lh)&mask)
void enterdata(Int_t)
Definition: TMatacq.cc:384
T sqrt(T t)
Definition: SSEVec.h:48
int doFit()
Definition: TMatacq.cc:201
int j
Definition: DBlmapReader.cc:9
int rawPulseAnalysis(Int_t, Double_t *)
Definition: TMatacq.cc:59
Definition: TMarkov.h:6
int findPeak()
Definition: TMatacq.cc:127
double b
Definition: hdecay.h:120
TMatacq(int, int, int, int, int, int, int, int, int, int, int)
Definition: TMatacq.cc:32
double a
Definition: hdecay.h:121
tuple filename
Definition: lut2db_cfg.py:20
#define NSPARAB
Definition: TMatacq.h:7
tuple status
Definition: ntuplemaker.py:245
long double T
int countBadPulses(Int_t)
Definition: TMatacq.cc:468