File indexing completed on 2025-08-05 08:14:38
0001 #include <iomanip>
0002 #include <algorithm>
0003 #include <numeric>
0004 #include <iostream>
0005 #include <fstream>
0006 #include <cmath>
0007 #include <ctime>
0008 #include <cstdlib>
0009 #include <stdint.h>
0010 #include <stddef.h>
0011 #include <stdlib.h>
0012 #include <string.h>
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 #include <fileEventiterator.h>
0044 #include <Event.h>
0045 #include <EventTypes.h>
0046 #include <PHTimeStamp.h>
0047 #include <packetConstants.h>
0048 #include <packet.h>
0049 #include <packet_hbd_fpgashort.h>
0050
0051
0052
0053
0054 #include "hcalUtil.h"
0055
0056
0057 hcalUtil * hcalUtil :: single = 0;
0058 hLabHelper * hLabHelper :: single = 0;
0059 hcalHelper * hcalHelper :: single = 0;
0060 hcalTree * hcalTree :: single = 0;
0061 tileHelper * tileHelper :: single = 0;
0062 tileTree * tileTree :: single = 0;
0063
0064 using namespace std;
0065 using namespace TMath;
0066
0067 TCanvas * fitFunc;
0068
0069 TCanvas * scCalibDisplay;
0070
0071
0072
0073
0074
0075
0076
0077
0078 static const int cosmicruns = 12;
0079 int cosmicRN[cosmicruns] = {212, 215, 216, 218, 223, 337, 338, 339, 405, 406, 229, 240};
0080
0081
0082 static const int pedruns = 1;
0083 int pedcalibRN[pedruns] = {646};
0084 static const int ledruns = 1;
0085 int ledcalibRN[ledruns] = {647};
0086
0087
0088
0089
0090 Double_t par0[] = { 1., (Double_t)NSAMPLES/2, 3., 2., PEDESTAL, 0. };
0091 Double_t par0Max[] = { -100., (Double_t)NSAMPLES, 4., 5., 50000., 0.3};
0092
0093 Double_t par0Min[] = {-50000., 0., 2., 0., -50000., -0.3};
0094
0095
0096 TString runId;
0097
0098
0099
0100
0101
0102 Double_t ps( Double_t *chadc, Double_t *par)
0103 {
0104 Double_t x = chadc[0];
0105
0106 Double_t mu = par[0];
0107 Double_t g = par[1];
0108 Double_t sigma = par[2];
0109 Double_t norm = par[3];
0110
0111 Double_t sum = 0.0;
0112 for (Double_t n = 1.0; n < 100.0; n++ ) {
0113 sum += TMath::Poisson(n,mu)*TMath::Gaus(x,n*g,sigma,kTRUE);
0114 }
0115
0116 return norm*sum;
0117 }
0118
0119 Int_t calibPeaks(0), calibMode (0); Double_t spCalib(10.);
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 Double_t sipmPeaks(Double_t *x, Double_t *par) {
0134 Double_t result = par[0] + par[1]*x[0] + par[2]*x[0]*x[0];
0135
0136 result += par[4]*TMath::Gaus(x[0],par[5],par[6]);
0137 for (Int_t p=1; p<calibPeaks; p++) {
0138 Double_t norm = par[4 + p*3];
0139 Double_t mean = par[5 + p*3];
0140 if(calibMode) {
0141 mean = (Int_t)((mean+spCalib/2)/spCalib)*par[3];
0142 }
0143 Double_t sigma = par[6 + p*3];
0144 result += norm*TMath::Gaus(x[0],mean,sigma);
0145 }
0146 return result;
0147 ;}
0148
0149
0150
0151
0152
0153
0154
0155 Int_t sipmCalib(TString & hName, Int_t mode){
0156 TH1F * data = (TH1F*)(gROOT->FindObject(hName));
0157 if(!data){
0158 cout<<"spmCalib Data Histogramm "<<hName<<" not found"<<endl;
0159 return 0;
0160 }
0161 cout<<hName<<" calibration mode "<<mode<<endl;
0162 calibMode = mode;
0163 Int_t maxPeaks(20);
0164 Double_t range(150.);
0165
0166 Double_t bckgr0(100.), bckgr1(-1./range), bckgr2(0.);
0167 Double_t pNorm(1000.), pLoc(0.), pRMS(1.);
0168 Double_t par[4+maxPeaks*3];
0169
0170 par[0] = bckgr0;
0171 par[1] = bckgr1;
0172 par[2] = bckgr2;
0173 par[3] = spCalib;
0174 par[4] = pNorm;
0175 par[5] = pLoc;
0176 par[6] = pRMS;
0177
0178 for (int p=1; p<= maxPeaks; p++) {
0179 par[4 + p*3] = pNorm;
0180 par[5 + p*3] = par[3]*p;
0181 par[6 + p*3] = pRMS;
0182 }
0183 TH1F * dataCl = (TH1F*)(data->Clone("dataCl"));
0184 dataCl -> SetAxisRange(0., range);
0185 TH1F * dataCl2 = (TH1F*)data->Clone("dataCl2");
0186 dataCl2 -> SetAxisRange(0., range);
0187 TString cTitle = "Peaks from "; cTitle += hName;
0188 TCanvas * peaks = new TCanvas("peaks",cTitle,10,10,1000,900);
0189 peaks -> Divide(1,2);
0190 peaks -> cd(1);
0191 dataCl -> Draw();
0192
0193
0194 TSpectrum *s = new TSpectrum(maxPeaks);
0195 s->SetResolution(2.);
0196 Int_t nfound = s->Search(dataCl, 1.5, "nobackground ", 0.10);
0197 printf("TSpectrum: Found %d candidate peaks to fit\n",nfound);
0198
0199
0200 TH1 *hb = s->Background(dataCl, 20, "same");
0201 if (hb) peaks->Update();
0202
0203 if(nfound<=1) {
0204 cout<<"sipmCalib One or No peaks were found - EXITING"<<endl;
0205 calibPeaks = nfound;
0206
0207 } else {
0208 peaks -> cd(2);
0209
0210
0211
0212
0213 TF1 *fline = new TF1("fline","pol2",0.,range);
0214
0215 dataCl2 -> Fit("fline","qn");
0216
0217 par[0] = fline->GetParameter(0);
0218 par[1] = fline->GetParameter(1);
0219 par[2] = fline->GetParameter(2);
0220
0221 Float_t * xpeaks = s->GetPositionX();
0222
0223 Int_t pindex[nfound];
0224 TMath::Sort(nfound, xpeaks, pindex, kFALSE);
0225
0226 Double_t sep[nfound-1];
0227
0228
0229 for (int ip = 1; ip<nfound; ip++){
0230 sep[ip-1] = xpeaks[pindex[ip]];
0231 if(ip>1) sep[ip-1] -= xpeaks[pindex[ip-1]];
0232 cout<<"Separation "<<ip<<" val "<<sep[ip-1]<<endl;
0233 }
0234
0235
0236 Int_t cont(0); Double_t avsep(0.);
0237 for (int ip = 0; ip < nfound-1; ip++){
0238 if(ip==0) {
0239
0240 avsep = sep[ip];
0241 cont ++;
0242 } else {
0243
0244 if(abs((avsep- sep[ip])/(avsep+ sep[ip]))<0.2) {
0245 avsep = (avsep*cont+sep[ip])/(cont+1);
0246 cont++;
0247 }
0248 }
0249 cout<<"ip "<<ip<<" cont "<<cont<<" avsep "<<avsep<<" var "<<(ip!=0? (avsep- sep[ip])/(avsep+ sep[ip]) : 0.)<<endl;
0250 }
0251 cout<<"Zero approximation to sSingle Pixel Calib = "<<avsep<<" Contributors "<<cont<<endl;
0252 spCalib = avsep;
0253 par[3] = avsep;
0254 calibPeaks = 0;
0255 for (int p=0; p<nfound; p++) {
0256 Double_t xp = xpeaks[pindex[p]];
0257 Int_t bin = dataCl2->GetXaxis()->FindBin(xp);
0258 Double_t yp = dataCl2->GetBinContent(bin);
0259 cout<<"Testing Peak (LFit) "<<p<<" index "<<pindex[p]<<" xp "<<xp<<" bin "<<bin<<" yP "<<yp<<" BCKG "<<fline->Eval(xp)<<endl;
0260
0261 Double_t bckgr = hb->GetBinContent(bin);
0262 cout<<"Testing Peak (TSp ) "<<p<<" xp "<<xp<<" bin "<<bin<<" Bcgrd "<<bckgr<<" Signal "<<yp-bckgr<<endl;
0263 if (yp-TMath::Sqrt(yp) < bckgr) continue;
0264 par[4 + calibPeaks*3] = yp;
0265 par[5 + calibPeaks*3] = xp;
0266 par[6 + calibPeaks*3] = (p==0? pRMS : 2.);
0267 calibPeaks++;
0268 }
0269 }
0270 printf("Found %d useful peaks to fit\n",calibPeaks);
0271 printf("Now fitting: Be patient\n");
0272 TF1 *fit = new TF1("fit",&sipmPeaks,0,range,4+calibPeaks*3);
0273
0274 TVirtualFitter::Fitter(dataCl2,10+calibPeaks*3);
0275 fit->SetParameters(par);
0276
0277 if(mode) for(int ip=0; ip<calibPeaks; ip++) {
0278 fit->FixParameter(5+ip*3, par[5+ip*3]);
0279 fit->SetParLimits(3, 0.5*par[3], 1.5*par[3]);
0280 } else fit->FixParameter(3, par[3]);
0281
0282 for(int ip=0; ip<calibPeaks; ip++) fit->SetParLimits(6+ip*3, 0.5, par[3]/2.);
0283
0284 fit->SetNpx(1000);
0285 dataCl2->Fit("fit");
0286 fit->GetParameters(par);
0287
0288 char p5[10], p6[10], p3[10];
0289 sprintf(p5, "%.2f ", par[5]);
0290 sprintf(p6, "%.2f ", par[6]);
0291 sprintf(p3, "%.2f ", par[3]);
0292
0293 TString ped = "Pedestal at "; ped += p5; ped += " RMS = "; ped += p6;
0294 TString cal = "Pixel Calibtion "; cal += p3; cal += " ADC counts per pixel";
0295 TText label;
0296 Double_t ymax = data-> GetMaximum();
0297 label.DrawText(30, ymax*0.8,ped);
0298 label.DrawText(30, ymax*0.6,cal);
0299 return nfound;
0300 }
0301
0302
0303 Double_t AsymToX(Double_t ax){
0304 return 12.5*(1 + ax/0.19);
0305 }
0306
0307
0308
0309
0310 Double_t signalShape(Double_t *x, Double_t * par){
0311 Double_t signal(0.), pedestal(0.);
0312
0313
0314 pedestal = par[4]+x[0]*par[5];
0315 if(x[0]<par[1]) return pedestal;
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326 signal = par[0]*pow((x[0]-par[1]),par[2])*exp(-(x[0]-par[1])*par[3]);
0327
0328 return signal+pedestal;
0329 }
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 Double_t erfunc(Double_t *x, Double_t * par){
0340
0341
0342 return par[3]*(TMath::Erf((x[0]-par[0])/par[1])+1.)*TMath::Exp(par[2]*x[0]);
0343 }
0344
0345
0346 Double_t erf_g(Double_t *x, Double_t * par){
0347 float g = par[0]/(sqrt(6.2830)*par[2])*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/(2.*par[2]*par[2]));
0348 return g+par[6]*(TMath::Erf((x[0]-par[3])/par[4])+1.)*TMath::Exp(par[5]*x[0]);
0349 }
0350
0351
0352 Double_t powerFun(Double_t *x, Double_t * par){
0353
0354 return par[0]*pow(x[0],par[1])*pow((1-x[0]),par[2]);
0355
0356 }
0357
0358
0359
0360 Double_t power_g(Double_t *x, Double_t * par){
0361 float g = par[0]/(sqrt(6.2830)*par[2])*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/(2.*par[2]*par[2]));
0362 float p = par[3]*pow(x[0],par[4])*pow((1-x[0]),par[5]);
0363
0364 return g+p;
0365 }
0366
0367
0368
0369
0370
0371
0372
0373
0374 hcalUtil::hcalUtil(){
0375 char * s = getenv("BASE_DIR");
0376 TString basedir = (s==0||strlen(s)==0)? "/home/kistenev/workarea/" : s;
0377 }
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387 float hcalUtil::xPeak(TF1* f, float x1, float x2){
0388
0389 float y1 = f->Derivative(x1, 0, 0.002);
0390 float y2 = f->Derivative(x2, 0, 0.002);
0391 if(y1*y2>0) {
0392 return (f->Eval(x1)>f->Eval(x2))? x1 : x2;
0393 }
0394 float xx1 = x1;
0395 float xx2 = x2;
0396 float dx = fabs(xx2-xx1);
0397 float x = 0.;
0398 while(y1*y2<0&&dx>0.001){
0399 x = (xx1+xx2)/2.;
0400 float y = f->Derivative(x, 0, 0.01);
0401 if(y1*y>0) xx1 = x; else xx2 = x;
0402 dx = fabs(xx2-xx1);
0403 }
0404 return x;
0405 }
0406
0407
0408
0409 float hcalUtil::width(TF1* f, float x1, float x2, float peak){
0410
0411 float yhm = f->Eval(peak)/2;
0412
0413 float xl = x1;
0414 float xr = peak;
0415
0416 float xm = (xr+xl)/2.;
0417 float ym = f->Eval(xm);
0418
0419 while(abs(ym-yhm)>0.01*yhm && xr-xl>0.001){
0420 if(ym>yhm) xr = xm; else xl = xm;
0421 xm = (xr+xl)/2.;
0422 ym = f->Eval(xm);
0423
0424 }
0425 bool lok = (abs(ym-yhm)>0.1*yhm)? false : true;
0426 float xml = xm;
0427 xl = peak;
0428 xr = x2;
0429 xm = (xr+xl)/2.;
0430 ym = f->Eval(xm);
0431 while(abs(ym-yhm)>0.01*yhm&&xr-xl>0.001){
0432 if(ym>yhm) xl = xm; else xr = xm;
0433 xm = (xr+xl)/2.;
0434 ym = f->Eval(xm);
0435
0436 }
0437 float xmr = xm;
0438 bool rok = (abs(ym-yhm)>0.1*yhm)? false : true;
0439 float w = 0;
0440 if(lok){
0441 if(rok) w = xmr-xml; else w = 2*(peak-xml);
0442 } else if (rok){
0443 w = 2*(xmr-peak);
0444 } else w = x2-x1;
0445 return w/2.35;
0446 }
0447
0448
0449
0450 bool hcalUtil::shapeFit(TH1D * proj, Double_t * pE, float & maxE, Double_t * pG, bool fine, bool MIP){
0451 TF1 * fE;
0452 TF1 * fG;
0453 int bMax = proj->GetMaximumBin();
0454 float pMax = proj->GetBinCenter(bMax);
0455 bool erfOK = true;
0456 TAxis *x;
0457 x = proj->GetXaxis();
0458 double xmin = x->GetXmin();
0459 double xmax = x->GetXmax();
0460 pE[0] = pMax;
0461 pE[1] = proj->GetRMS();
0462 pE[2] = -1./pE[1];
0463 pE[3] = proj->GetBinContent(bMax)/TMath::Exp(pE[2]*pE[0]);
0464 fE = (TF1*)(gROOT->GetListOfFunctions()->FindObject("fE"));
0465 if(fE) delete fE;
0466 fE = new TF1("fE",&erfunc,xmin,xmax,4);
0467 fE->SetParameters(pE);
0468 proj->Fit("fE","NQL0");
0469 fE->GetParameters(pE);
0470 maxE = xPeak(fE,xmin,xmax);
0471
0472 if(maxE<=xmin||maxE>=xmax||pE[0]<=xmin) erfOK = false;
0473 float scale = (fine? 1. : 1.5);
0474
0475 pG[0] = proj->GetBinContent(bMax);
0476 if(erfOK){
0477 pG[1] = maxE;
0478 pG[2] = width(fE,xmin,xmax,maxE);
0479 } else {
0480 pG[1] = proj->GetMean();
0481 pG[2] = proj->GetRMS();
0482 }
0483 fG = (TF1*)(gROOT->FindObject("fG"));
0484 if(fG) delete fG;
0485 if(MIP) {
0486 fG = new TF1("fG","gaus",TMath::Max(xmin,pG[1]-0.3*scale),TMath::Min(xmax,pG[1]+0.075*scale));
0487 fG->SetParameters(pG);
0488 fG->SetParLimits(1,TMath::Max(xmin,pG[1]-0.1*scale),TMath::Min(xmax,pG[1]+0.05*scale));
0489 } else {
0490 fG = new TF1("fG","gaus",TMath::Max(xmin,pG[1]-1.5*scale),TMath::Min(xmax,pG[1]+1.5*scale));
0491 fG->SetParameters(pG);
0492 fG->SetParLimits(1,TMath::Max(xmin,pG[1]-2.*scale),TMath::Min(xmax,pG[1]+2.*scale));
0493 }
0494 proj->Fit("fG","NLQR0");
0495 fG->GetParameters(pG);
0496 return ((!erfOK||pG[1]<xmin+0.1||pG[1]>xmax-0.05)? false : true);
0497 }
0498
0499
0500
0501 bool hcalUtil::emcFit(TH1D * proj, bool fine, bool sing, Double_t * pE, float & maxE, Double_t * pG, bool MIP){
0502 TF1 * fE;
0503 TF1 * fG;
0504 int bMax = proj->GetMaximumBin();
0505 float pMax = proj->GetBinCenter(bMax);
0506 bool erfOK = true;
0507 TAxis *x;
0508 x = proj->GetXaxis();
0509 double xmin = x->GetXmin();
0510 double xmax = x->GetXmax();
0511 pE[0] = pMax;
0512 pE[1] = proj->GetRMS();
0513 pE[2] = -1./pE[1];
0514 pE[3] = proj->GetBinContent(bMax)/TMath::Exp(pE[2]*pE[0]);
0515 fE = (TF1*)(gROOT->GetListOfFunctions()->FindObject("fE"));
0516 if(fE) delete fE;
0517 fE = new TF1("fE",&erfunc,xmin,xmax,4);
0518 fE->SetParameters(pE);
0519 proj->Fit("fE","NQL0");
0520 fE->GetParameters(pE);
0521 maxE = xPeak(fE,xmin,xmax);
0522
0523 if(maxE<=xmin||maxE>=xmax||pE[0]<=xmin) erfOK = false;
0524 if(!sing){
0525 float scale = (fine? 1. : 1.5);
0526
0527 pG[0] = proj->GetBinContent(bMax);
0528 if(erfOK){
0529 pG[1] = maxE;
0530 pG[2] = width(fE,xmin,xmax,maxE);
0531 } else {
0532 pG[1] = proj->GetMean();
0533 pG[2] = proj->GetRMS();
0534 }
0535 fG = (TF1*)(gROOT->FindObject("fG"));
0536 if(fG) delete fG;
0537 if(MIP) {
0538 fG = new TF1("fG","gaus",TMath::Max(xmin,pG[1]-0.3*scale),TMath::Min(xmax,pG[1]+0.075*scale));
0539 fG->SetParameters(pG);
0540 fG->SetParLimits(1,TMath::Max(xmin,pG[1]-0.1*scale),TMath::Min(xmax,pG[1]+0.05*scale));
0541 } else {
0542 fG = new TF1("fG","gaus",TMath::Max(xmin,pG[1]-1.5*scale),TMath::Min(xmax,pG[1]+1.5*scale));
0543 fG->SetParameters(pG);
0544 fG->SetParLimits(1,TMath::Max(xmin,pG[1]-2.*scale),TMath::Min(xmax,pG[1]+2.*scale));
0545 }
0546 proj->Fit("fG","NLQR0");
0547 fG->GetParameters(pG);
0548 }
0549 return ((!erfOK||pG[1]<xmin+0.1||pG[1]>xmax-0.05)? false : true);
0550 }
0551
0552
0553
0554 bool hcalUtil::emcFit(TH1D * proj, bool sing, Double_t * pE, float & maxE, Double_t * pG){
0555 TF1 * fE;
0556 TF1 * fG;
0557 int bMax = proj->GetMaximumBin();
0558 float pMax = proj->GetBinCenter(bMax);
0559 bool erfOK = true;
0560 TAxis *x;
0561 x = proj->GetXaxis();
0562 double xmin = x->GetXmin();
0563 double xmax = x->GetXmax();
0564 pE[0] = pMax;
0565 pE[1] = proj->GetRMS();
0566 pE[2] = -1./pE[1];
0567 pE[3] = proj->GetBinContent(bMax)/TMath::Exp(pE[2]*pE[0]);
0568 fE = (TF1*)(gROOT->GetListOfFunctions()->FindObject("fE"));
0569 if(fE) delete fE;
0570 fE = new TF1("fE",&erfunc,xmin,xmax,4);
0571 fE->SetParameters(pE);
0572 proj->Fit("fE","QNL0");
0573 fE->GetParameters(pE);
0574 maxE = xPeak(fE,xmin,xmax);
0575
0576 if(maxE<=xmin||maxE>=xmax||pE[0]<=xmin) erfOK = false;
0577 if(!sing){
0578 pG[0] = proj->GetBinContent(bMax);
0579 if(erfOK){
0580 pG[1] = maxE;
0581 pG[2] = width(fE,xmin,xmax,maxE) ;
0582 } else {
0583 pG[1] = proj->GetMean();
0584 pG[2] = proj->GetRMS();
0585 }
0586 fG = (TF1*)(gROOT->FindObject("fG"));
0587 if(fG) delete fG;
0588 fG = new TF1("fG","gaus",TMath::Max(xmin,pG[1]-pG[2]),TMath::Min(xmax,pG[1]+pG[2]));
0589 fG->SetParameters(pG);
0590 fG->SetParLimits(1,TMath::Max(xmin,pG[1]-pG[2]),TMath::Min(xmax,pG[1]+pG[2]));
0591 proj->Fit("fG","QNLR0");
0592 fG->GetParameters(pG);
0593 }
0594 return ((!erfOK||pG[1]<xmin+0.1||pG[1]>xmax-0.05)? false : true);
0595 }
0596
0597
0598 bool hcalUtil::emcFit(TH1D * proj, bool sing, Double_t * pE, float & maxE, Double_t * pG, float minx, float maxx){
0599 TF1 * fE;
0600 TF1 * fG;
0601 int bMax = proj->GetMaximumBin();
0602 float pMax = proj->GetBinCenter(bMax);
0603 bool erfOK = true;
0604 TAxis *x(NULL);
0605 double xmin(0.);
0606 double xmax = x->GetXmax();
0607 xmin = TMath::Max((double)minx,xmin);
0608 xmax = TMath::Min((double)maxx,xmax);
0609 pE[0] = pMax;
0610 pE[1] = proj->GetRMS();
0611 pE[2] = -1./pE[1];
0612 pE[3] = proj->GetBinContent(bMax)/TMath::Exp(pE[2]*pE[0]);
0613 fE = (TF1*)(gROOT->GetListOfFunctions()->FindObject("fE"));
0614 if(fE) delete fE;
0615 fE = new TF1("fE",&erfunc,xmin,xmax,4);
0616 fE->SetParameters(pE);
0617 proj->Fit("fE","QNL0");
0618 fE->GetParameters(pE);
0619 maxE = xPeak(fE,xmin,xmax);
0620
0621 if(maxE<=xmin||maxE>=xmax||pE[0]<=xmin) erfOK = false;
0622 if(!sing){
0623 pG[0] = proj->GetBinContent(bMax);
0624 if(erfOK){
0625 pG[1] = maxE;
0626 pG[2] = width(fE,xmin,xmax,maxE) ;
0627
0628 } else {
0629 pG[1] = proj->GetMean();
0630 pG[2] = proj->GetRMS();
0631 }
0632 fG = (TF1*)(gROOT->FindObject("fG"));
0633 if(fG) delete fG;
0634 fG = new TF1("fG","gaus",TMath::Max(xmin,pG[1]-pG[2]),TMath::Min(xmax,pG[1]+pG[2]));
0635 fG->SetParameters(pG);
0636 fG->SetParLimits(1,TMath::Max(xmin,pG[1]-pG[2]),TMath::Min(xmax,pG[1]+pG[2]));
0637 proj->Fit("fG","QNLR0");
0638 fG->GetParameters(pG);
0639 }
0640 return ((!erfOK||pG[1]<xmin+0.1||pG[1]>xmax-0.05)? false : true);
0641 }
0642
0643
0644
0645 bool hcalUtil::twrMipFit(TH1D * pr, Double_t * pE, float & maxE, Double_t * pG){
0646 TF1 * fE;
0647 TF1 * fG;
0648 int bMax = pr->GetMaximumBin();
0649 TAxis *x;
0650 x = pr->GetXaxis();
0651 TH1D * p=(TH1D*)(pr->Clone());
0652 float xmean = p->GetMean();
0653 xmean = 0.3;
0654 int b1 = x->FindBin(xmean-0.07);
0655 int b2 = x->FindBin(xmean+0.07);
0656 for (int bin = b1; bin<=b2; bin++){
0657 p->SetBinError(bin,p->GetBinContent(bin));
0658 }
0659 double xmin = x->GetXmin();
0660 if(xmin<=0.) xmin = 0.05;
0661
0662 double xmax = x->GetXmax();
0663 pE[0] = pr->Integral()*x->GetBinWidth(0)/(log(xmax)-log(xmin));;
0664 pE[1] = 1.;
0665 pE[2] = 1.;
0666 cout<<"Initial par. values"<<pE[0]<<" "<<pE[1]<<" "<< pE[2]<<endl;
0667 if(pE[0]<=0.) return false;
0668
0669 fE = (TF1*)(gROOT->GetListOfFunctions()->FindObject("fE"));
0670 if(fE) delete fE;
0671
0672 fE = new TF1("fE",&powerFun,xmin,xmax,3);
0673 fE->SetParameters(pE);
0674
0675 p->Fit("fE","NR");
0676
0677
0678 fE->GetParameters(pE);
0679 pG[0] = pr->GetBinContent(bMax)*sqrt(6.28)*0.03;
0680 pG[1] = 0.3;
0681 pG[2] = 0.03;
0682 pG[3] = pE[0];
0683 pG[4] = pE[1];
0684 pG[5] = pE[2];
0685 fG = (TF1*)(gROOT->FindObject("fG"));
0686 if(fG) delete fG;
0687 fG = new TF1("fG",&power_g,xmin,xmax,6);
0688 fG->SetParameters(pG);
0689 fG->SetParLimits(3,pE[0],pE[0]);
0690 fG->SetParLimits(4,pE[1],pE[1]);
0691 fG->SetParLimits(5,pE[2],pE[2]);
0692
0693
0694
0695
0696 pr->Fit("fG","NRB");
0697
0698
0699 fG->GetParameters(pG);
0700 maxE = xPeak(fG,pG[1]-0.1,pG[1]+0.1);
0701 cout<<maxE<<endl;
0702
0703 return ((pG[1]<xmin+0.05||pG[1]>xmax-0.05)? false : true);
0704 }
0705
0706
0707
0708
0709 bool hcalUtil::twrTimeFit(TH1D * pr, Double_t * pE, float & maxE, Double_t * pG){
0710 TF1 * fE;
0711 TF1 * fG;
0712 int bMax = pr->GetMaximumBin();
0713 TAxis *x;
0714 x = pr->GetXaxis();
0715 TH1D * p=(TH1D*)(pr->Clone());
0716 float xmean = p->GetMean();
0717 xmean = 0.3;
0718 int b1 = x->FindBin(xmean-0.07);
0719 int b2 = x->FindBin(xmean+0.07);
0720 for (int bin = b1; bin<=b2; bin++){
0721 p->SetBinError(bin,p->GetBinContent(bin));
0722 }
0723 double xmin = x->GetXmin();
0724
0725
0726 double xmax = x->GetXmax();
0727 pE[0] = pr->Integral()*x->GetBinWidth(0)/(log(xmax)-log(xmin));;
0728 pE[1] = 1.;
0729 pE[2] = 1.;
0730 fE = (TF1*)(gROOT->GetListOfFunctions()->FindObject("fE"));
0731 if(fE) delete fE;
0732
0733 fE = new TF1("fE",&powerFun,xmin,xmax,3);
0734 fE->SetParameters(pE);
0735
0736 p->Fit("fE","NR");
0737
0738
0739 fE->GetParameters(pE);
0740 pG[0] = pr->GetBinContent(bMax)*sqrt(6.28)*0.03;
0741 pG[1] = 0.3;
0742 pG[2] = 0.03;
0743 pG[3] = pE[0];
0744 pG[4] = pE[1];
0745 pG[5] = pE[2];
0746 fG = (TF1*)(gROOT->FindObject("fG"));
0747 if(fG) delete fG;
0748 fG = new TF1("fG",&power_g,xmin,xmax,6);
0749 fG->SetParameters(pG);
0750 fG->SetParLimits(3,pE[0],pE[0]);
0751 fG->SetParLimits(4,pE[1],pE[1]);
0752 fG->SetParLimits(5,pE[2],pE[2]);
0753
0754
0755
0756
0757 pr->Fit("fG","NRB");
0758
0759
0760 fG->GetParameters(pG);
0761 maxE = xPeak(fG,pG[1]-0.1,pG[1]+0.1);
0762 cout<<maxE<<endl;
0763
0764 return ((pG[1]<xmin+0.05||pG[1]>xmax-0.05)? false : true);
0765 }
0766
0767
0768
0769
0770
0771 #include "hLabHelper.C"
0772
0773 #include "hcalHelper.C"
0774
0775 #include "hcalTree.C"
0776
0777 #include "tileHelper.C"
0778
0779 #include "tileTree.C"
0780