00001
00002
00003
00004
00005
00006
00007 #include <CalibCalorimetry/EcalLaserAnalyzer/interface/TMatacq.h>
00008
00009 #include <iostream>
00010 #include <math.h>
00011 #include "TVectorD.h"
00012
00013 #include <CalibCalorimetry/EcalLaserAnalyzer/interface/TMarkov.h>
00014
00015 using namespace std;
00016
00017
00018 void TMatacq::init()
00019 {
00020 for(int k=0;k<NMAXSAMP;k++)
00021 bong[k]=0.;
00022
00023 for(int k=0;k<=100;k++)
00024 bing[k]=0;
00025
00026 for(int k=0;k<NSPARAB;k++)
00027 t[k]= (double) k;
00028
00029 return ;
00030 }
00031
00032
00033 TMatacq::TMatacq(int Ntot, int Nsamp1, int Nsamp2, int cut, int Nbef, int Naft, int niv1, int niv2, int niv3, int nevl, int NSlide)
00034 {
00035 fNsamples= Ntot;
00036 presample= Nsamp1;
00037 endsample= Nsamp2;
00038 nsigcut= (double) cut;
00039 fNum_samp_bef_max= Nbef;
00040 fNum_samp_aft_max= Naft;
00041 level1= ((double) niv1)/100.;
00042 level2= ((double) niv2)/100.;
00043 level3= ((double) niv3)/100.;
00044 nevlasers= nevl;
00045 slidingmean=0.0;
00046 nslide=NSlide;
00047 for(int k=0;k<nevlasers;k++)
00048 status[k]=0;
00049 for(int k=0;k<nevlasers;k++)
00050 status[k+nevlasers]=0;
00051
00052 nevmtq0=0; nevmtq1=0;
00053 }
00054
00055
00056 TMatacq::~TMatacq()
00057 {
00058 }
00059
00060 int TMatacq::rawPulseAnalysis(Int_t Nsamp, Double_t *adc)
00061 {
00062 using namespace std;
00063
00064
00065
00066 int k,ithr;
00067 double dsum=0.,dsum2=0.;
00068
00069
00070 init();
00071
00072
00073 if(Nsamp != fNsamples) {
00074 printf("found different number of samples fNsamples=%d Nsamp=%d\n",fNsamples,Nsamp);
00075 return 100;
00076 }
00077
00078 for(k=0;k<presample;k++) {
00079 dsum+= adc[k];
00080 dsum2+= adc[k]*adc[k];
00081 }
00082 bl=dsum/((double) presample);
00083 double ss= (dsum2/((double) presample)-bl*bl);
00084 if(ss<0.) ss=0.;
00085 sigbl=sqrt(ss);
00086 for(ithr=0,k=presample;k<endsample;k++) {
00087 if(adc[k] > (bl+nsigcut*sigbl) && ithr == 0) {
00088 ithr=1; firstsample=k;
00089 }
00090 }
00091
00092 if(ithr == 0) return 101;
00093
00094 for(ithr=0,k=firstsample;k<Nsamp;k++) {
00095 if(adc[k] < (bl+nsigcut*sigbl) && ithr == 0) {
00096 ithr=1; lastsample=k;
00097 }
00098 }
00099 if(ithr == 0) lastsample= Nsamp;
00100
00101 if(lastsample > firstsample+NMAXSAMP) lastsample= firstsample+NMAXSAMP;
00102
00103 val_max=0.; samplemax=0;
00104 for (Int_t is=firstsample;is<lastsample;is++) {
00105 bong[is-firstsample]= adc[is] - bl;
00106 if(bong[is-firstsample] > val_max) {
00107 val_max= bong[is-firstsample]; samplemax=is;
00108 }
00109 }
00110 if(samplemax == 0) return 103;
00111 if(samplemax > lastsample) return 104;
00112 if(samplemax < firstsample) return 105;
00113
00114
00115 int endslide=samplemax -nslide;
00116 int beginslide=nslide;
00117 int islidingmean=0;
00118 slidingmean=0.0;
00119
00120 for(int i=beginslide;i<endslide;i++) {
00121 slidingmean+= adc[i];
00122 islidingmean+=1;
00123 }
00124 if( islidingmean!=0) slidingmean/=double(islidingmean);
00125
00126 return 0;
00127 }
00128 int TMatacq::findPeak()
00129 {
00130 int k; int nbinf=0; int jfind=0;
00131 int nbsup= 0;
00132 double thres= val_max*level1;
00133
00134 for(k=0,jfind=0;k<NMAXSAMP;k++) {
00135 if(jfind == 0) {
00136 if(bong[k] > thres) {
00137 nbinf=k; jfind=1;
00138 }
00139 }
00140 }
00141 if(jfind == 0) nbinf=0;
00142
00143 for(k=NMAXSAMP,jfind=0;k>nbinf;k--) {
00144 if(jfind == 0) {
00145 if(bong[k] > thres) {
00146 nbsup=k; jfind=1;
00147 }
00148 }
00149 }
00150 if(nbsup == 0) nbsup=nbinf;
00151
00152 double sumpkval=1.;
00153 pkval= 0.;
00154 sigpkval=0.5;
00155 if(nbsup == nbinf) {
00156 return 301;
00157 } else {
00158 if(nbinf > 4) nbinf-=3;
00159 else nbinf=1;
00160 if(nbsup < NMAXSAMP-4) nbsup+=3;
00161 else nbsup=NMAXSAMP;
00162
00163 for(k=0;k<nbinf;k++)
00164 bong[k]=0.;
00165 for(k=nbsup;k<NMAXSAMP;k++)
00166 bong[k]=0.;
00167
00168 for(k=0,jfind=0;k<NMAXSAMP;k++) {
00169 if(bong[k] > 0.) jfind++;
00170 }
00171 if(jfind == 0) {
00172 return 302;
00173 } else if(jfind == 1) {
00174 return 303;
00175 } else {
00176
00177 for(k=0;k<NMAXSAMP;k++) {
00178 if(k < 100)
00179 bing[k+1]= (int) bong[k];
00180 }
00181
00182 TMarkov *peak = new TMarkov();
00183
00184 peak -> peakFinder(&bing[0]);
00185 pkval= peak -> getPeakValue(0);
00186 sigpkval= peak -> getPeakValue(1);
00187
00188 delete peak;
00189
00190 sumpkval= 0.0;
00191
00192 if(sumpkval > 1000.)
00193 sumpkval=10.;
00194
00195 pkval+= (firstsample -1);
00196 }
00197 }
00198
00199 return 0;
00200 }
00201
00202 int TMatacq::doFit()
00203 {
00204 int testneg=0;
00205 ampl=0.; timeatmax=0.;
00206 int heresamplemax= samplemax-firstsample;
00207
00208 int beginfit= heresamplemax - fNum_samp_bef_max;
00209 int endfit= heresamplemax + fNum_samp_aft_max;
00210
00211 int nval= endfit-beginfit +1;
00212 if(nval != NSPARAB) return 201;
00213 for(int kn=beginfit;kn<=endfit;kn++) {
00214 if(bong[kn] <= 0) testneg=1;
00215 }
00216 if(testneg == 1) return 202;
00217
00218 for(int i=0;i<nval;i++) {
00219 val[i]= bong[beginfit+i];
00220 fv1[i]= 1.;
00221 fv2[i]= (double) (i);
00222 fv3[i]= ((double)(i))*((double)(i));
00223 }
00224
00225 TVectorD y(nval,val);
00226 TVectorD f1(nval,fv1);
00227 TVectorD f2(nval,fv2);
00228 TVectorD f3(nval,fv3);
00229
00230 double bj[3];
00231 bj[0]= f1*y; bj[1]=f2*y; bj[2]= f3*y;
00232 TVectorD b(3,bj);
00233
00234 double aij[9];
00235 aij[0]= f1*f1; aij[1]=f1*f2; aij[2]=f1*f3;
00236 aij[3]= f2*f1; aij[4]=f2*f2; aij[5]=f2*f3;
00237 aij[6]= f3*f1; aij[7]=f3*f2; aij[8]=f3*f3;
00238 TMatrixD a(3,3,aij);
00239
00240 double det1;
00241 a.InvertFast(&det1);
00242
00243 TVectorD c= a*b;
00244
00245 double *par= c.GetMatrixArray();
00246 if(par[2] != 0.) {
00247 timeatmax= -par[1]/(2.*par[2]);
00248 ampl= par[0]-par[2]*(timeatmax*timeatmax);
00249 }
00250
00251 if(ampl <= 0.) {
00252 ampl=bong[heresamplemax];
00253 return 203;
00254 }
00255
00256 if((int)timeatmax > NSPARAB)
00257 return 204;
00258 if((int)timeatmax < 0)
00259 return 205;
00260
00261 timeatmax+= (beginfit + firstsample);
00262
00263 int tplus[3], tminus[3];
00264 double xampl[3];
00265 xampl[0]=0.2*ampl;
00266 xampl[1]=0.5*ampl;
00267 xampl[2]=0.8*ampl;
00268
00269 int hitplus[3];
00270 int hitminus[3];
00271 double width[3];
00272
00273 for(int i=0;i<3;i++){
00274 hitplus[i]=0;
00275 hitminus[i]=0;
00276 width[i]=0.0;
00277 tplus[i]=firstsample+lastsample;
00278 tminus[i]=0;
00279 }
00280
00281
00282 int im = heresamplemax;
00283 int iplusbound = firstsample+lastsample-im;
00284
00285 for(int j=0;j<3;j++){
00286
00287 for(int i=1;i<im;i++){
00288
00289
00290 if (bong[im-i]<xampl[j] && bong[im-i+1]>xampl[j]) {
00291 tminus[j]=im-i;
00292 hitminus[j]++;
00293 i=im;
00294 }
00295 }
00296
00297
00298 for(int i=0;i<iplusbound;i++){
00299
00300 if (bong[im+i]>xampl[j] && bong[im+i+1]<xampl[j]){
00301 tplus[j]=im+i;
00302 hitplus[j]++;
00303 i=iplusbound;
00304 }
00305 }
00306
00307
00308
00309 double slopeplus = double( bong[tplus[j] +1] - bong[tplus[j] ] );
00310 double slopeminus = double( bong[tminus[j]+1] - bong[tminus[j]] );
00311
00312
00313 double timeminus=double(tminus[j])+0.5;
00314 if(slopeminus!=0) timeminus=tminus[j]+(xampl[j]-double(bong[tminus[j]]))/slopeminus;
00315
00316
00317 double timeplus=double(tplus[j])+0.5;
00318 if(slopeplus!=0) timeplus=tplus[j]+(xampl[j]-double(bong[tplus[j]]))/slopeplus;
00319
00320 width[j]=timeplus-timeminus;
00321
00322 }
00323
00324 width20=width[0];
00325 width50=width[1];
00326 width80=width[2];
00327
00328 return 0;
00329 }
00330
00331 int TMatacq::compute_trise()
00332 {
00333 int error;
00334 trise= 0.;
00335
00336 double t20= interpolate(ampl*level2);
00337 if(t20 < 0.) {
00338 error= (int) -t20;
00339 return error;
00340 }
00341 double t80= interpolate(ampl*level3);
00342 if(t80 < 0.) {
00343 error= (int) -t80;
00344 return error;
00345 }
00346 trise= t80 - t20;
00347
00348 return 0;
00349 }
00350
00351
00352
00353
00354
00355 double TMatacq::interpolate(double amplx)
00356 {
00357 double T;
00358 int kmax= (int) pkval - firstsample;
00359
00360 int bin_low=0;
00361 for(Int_t k=0;k<kmax;k++)
00362 if(0. < bong[k] && bong[k] < amplx) {
00363 bin_low=k;
00364 }
00365 if(bin_low == 0) return -301.;
00366 int bin_high=0;
00367 for(Int_t k=kmax;k>=0;k--)
00368 if(bong[k] > amplx) {
00369 bin_high=k;
00370 }
00371 if(bin_high == 0) return -302.;
00372 if(bin_high < bin_low) return -303.;
00373
00374
00375 if(bin_low == bin_high) {
00376 T= (double) bin_high;
00377 } else {
00378 double slope= (bong[bin_high]-bong[bin_low])/((double) (bin_high-bin_low));
00379 T= (double) bin_high - (bong[bin_high] - amplx)/slope;
00380 }
00381
00382 return T;
00383 }
00384
00385 void TMatacq::enterdata(Int_t anevt)
00386 {
00387 if(anevt < 2*nevlasers) {
00388 if(anevt < nevlasers) {
00389 nevmtq0++;
00390 status[nevmtq0-1]= anevt;
00391 comp_trise[nevmtq0-1]= trise;
00392 comp_peak[nevmtq0-1]= pkval;
00393 } else {
00394 nevmtq1++;
00395 status[nevmtq0+nevmtq1-1]= anevt;
00396 comp_trise[nevmtq0+nevmtq1-1]= trise;
00397 comp_peak[nevmtq0+nevmtq1-1]= pkval;
00398 }
00399 } else {
00400 if(anevt < 3*nevlasers) {
00401 nevmtq0++;
00402 status[nevmtq0-1]= anevt;
00403 comp_trise[nevmtq0-1]= trise;
00404 comp_peak[nevmtq0-1]= pkval;
00405 } else {
00406 nevmtq1++;
00407 status[nevmtq0+nevmtq1-1]= anevt;
00408 comp_trise[nevmtq0+nevmtq1-1]= trise;
00409 comp_peak[nevmtq0+nevmtq1-1]= pkval;
00410 }
00411 }
00412 }
00413
00414 void TMatacq::printmatacqData(int gRunNumber, int color, int timestart)
00415 {
00416 FILE *fmatacq;
00417 char filename[80];
00418 int i;
00419 double ss;
00420 sprintf(filename,"runMatacq%d.pedestal",gRunNumber);
00421 fmatacq = fopen(filename, "w");
00422 if(fmatacq == NULL) printf("Error while opening file : %s\n",filename);
00423
00424 double sumtrise=0.; double sumtrise2=0.;
00425 int timestop= timestart+3;
00426 double mintrise=10000.;
00427 double maxtrise=0.;
00428 for(i=0;i<nevmtq0;i++) {
00429 if(comp_trise[i] > maxtrise) {
00430 maxtrise=comp_trise[i];
00431 }
00432 if(comp_trise[i] < mintrise) {
00433 mintrise= comp_trise[i];
00434 }
00435 sumtrise+=comp_trise[i];
00436 sumtrise2+=comp_trise[i]*comp_trise[i];
00437 }
00438 meantrise= sumtrise/((double) nevmtq0);
00439 ss= (sumtrise2/((double) nevmtq0) - meantrise*meantrise);
00440 if(ss < 0.) ss=0.;
00441 sigtrise=sqrt(ss);
00442 fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
00443 nevmtq0,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
00444
00445 sumtrise=0.; sumtrise2=0.;
00446 mintrise=10000.;
00447 maxtrise=0.;
00448 for(i=nevmtq0;i<nevmtq0+nevmtq1;i++) {
00449 if(comp_trise[i] > maxtrise) {
00450 maxtrise=comp_trise[i];
00451 }
00452 if(comp_trise[i] < mintrise) {
00453 mintrise= comp_trise[i];
00454 }
00455 sumtrise+=comp_trise[i];
00456 sumtrise2+=comp_trise[i]*comp_trise[i];
00457 }
00458 meantrise= sumtrise/((double) nevmtq1);
00459 ss= (sumtrise2/((double) nevmtq1) - meantrise*meantrise);
00460 if(ss < 0.) ss=0.;
00461 sigtrise=sqrt(ss);
00462 fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
00463 nevmtq1,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
00464
00465 int iret=fclose(fmatacq);
00466 printf(" Closing file : %d\n",iret);
00467 }
00468
00469 int TMatacq::countBadPulses(int gRunNumber)
00470 {
00471 FILE *fmatacq;
00472 char filename[80];
00473 sprintf(filename,"badevtsMatacq%d.dat",gRunNumber);
00474 fmatacq = fopen(filename, "w");
00475 if(fmatacq == NULL) printf("Error while opening file : %s\n",filename);
00476
00477 int nevbad=0;
00478 for(Int_t i=0;i<nevmtq0+nevmtq1;i++) {
00479 if(comp_trise[i] < meantrise - 3.*sigtrise) {
00480 nevbad++;
00481 fprintf(fmatacq,"%d \n",status[i]);
00482 status[i]=-1;
00483 }
00484 if(comp_trise[i] > meantrise + 3.*sigtrise) {
00485 nevbad++;
00486 fprintf(fmatacq,"%d \n",status[i]);
00487 status[i]=-1;
00488 }
00489 }
00490
00491 int iret=fclose(fmatacq);
00492 printf(" Closing file : %d\n",iret);
00493 return nevbad;
00494 }
00495
00496 void TMatacq::printitermatacqData(int gRunNumber, int color, int timestart)
00497 {
00498 FILE *fmatacq;
00499 char filename[80];
00500 int i;
00501 double ss;
00502 sprintf(filename,"runiterMatacq%d.pedestal",gRunNumber);
00503 fmatacq = fopen(filename, "w");
00504 if(fmatacq == NULL) printf("Error while opening file : %s\n",filename);
00505
00506 int nevmtqgood=0;
00507 double sumtrise=0.; double sumtrise2=0.;
00508 int timestop= timestart+3;
00509 double mintrise=10000.;
00510 double maxtrise=0.;
00511 for(i=0;i<nevmtq0;i++) {
00512 if(status[i] >= 0) {
00513 nevmtqgood++;
00514 if(comp_trise[i] > maxtrise) {
00515 maxtrise=comp_trise[i];
00516 }
00517 if(comp_trise[i] < mintrise) {
00518 mintrise= comp_trise[i];
00519 }
00520 sumtrise+=comp_trise[i];
00521 sumtrise2+=comp_trise[i]*comp_trise[i];
00522 }
00523 }
00524 meantrise= sumtrise/((double) nevmtqgood);
00525 ss= (sumtrise2/((double) nevmtqgood) - meantrise*meantrise);
00526 if(ss < 0.) ss=0.;
00527 sigtrise=sqrt(ss);
00528 fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
00529 nevmtqgood,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
00530
00531 nevmtqgood=0;
00532 sumtrise=0.; sumtrise2=0.;
00533 mintrise=10000.;
00534 maxtrise=0.;
00535 for(i=nevmtq0;i<nevmtq0+nevmtq1;i++) {
00536 if(status[i] >= 0) {
00537 nevmtqgood++;
00538 if(comp_trise[i] > maxtrise) {
00539 maxtrise=comp_trise[i];
00540 }
00541 if(comp_trise[i] < mintrise) {
00542 mintrise= comp_trise[i];
00543 }
00544 sumtrise+=comp_trise[i];
00545 sumtrise2+=comp_trise[i]*comp_trise[i];
00546 }
00547 }
00548 meantrise= sumtrise/((double) nevmtqgood);
00549 ss= (sumtrise2/((double) nevmtqgood) - meantrise*meantrise);
00550 if(ss < 0.) ss=0.;
00551 sigtrise=sqrt(ss);
00552 fprintf(fmatacq, "%d %d %d %d %f %f %f %f\n",
00553 nevmtqgood,color,timestart,timestop,meantrise,sigtrise,mintrise,maxtrise);
00554
00555 int iret=fclose(fmatacq);
00556 printf(" Closing file : %d\n",iret);
00557 }