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