Float_t pi = acos(-1.0); Float_t sqrtp = sqrt(2.0*pi); Double_t Lorentzian(Double_t *x, Double_t *par) { // Parameter :0 -> "Peak" // Parameter :1 -> "Peak ToF" // Parameter :2 -> "Halfwidth" // Parameter :3 -> "Mean" // Parameter :4 -> "Sigma" Double_t F = (x[0] - par[3])/par[2]; F = 1.0 + F*F; F = par[0]/F; return F; } Double_t mgaus(Double_t *x, Double_t *par) { Double_t D = (x[0] - par[3])/par[4]; D = par[0]*exp(-0.5*D*D); return D; } Double_t Combination(Double_t *x, Double_t *par) { // Parameter :0 -> "Peak" // Parameter :1 -> "Peak ToF" // Parameter :2 -> "Halfwidth" // Parameter :3 -> "Mean" // Parameter :4 -> "Sigma" Double_t D = 0.0; Double_t F = 0.0; if( fabs(x[0]-par[3]) < 3.0*par[4] ) { //----- Gaussian D = (x[0] - par[3])/par[4]; D = par[0]*exp(-0.5*D*D); } else { //----- Lorentzian (full amplitude) F = (x[0] - par[3])/par[2]; F = 1.0 + F*F; F = par[0]/F; } F = F + D; return F; } Double_t comb1(Double_t *x, Double_t *p) { Double_t D = abs(x[0] - p[1])/p[2]; return p[0]*exp(-pow(D,p[3]))+p[4]; } Double_t Bin2X( TH1D *h, Int_t bin ) { Int_t nxbins = h -> GetNbinsX(); Double_t xmax = h -> GetXaxis() -> GetXmax(); Double_t xmin = h -> GetXaxis() -> GetXmin(); return (xmax - (xmax - xmin)*(1.0*nxbins - 1.0*bin)/(1.0*nxbins - 1.0)); } Double_t FWHP( TH1D *h, Double_t &t1, Double_t &t2 ) { Int_t bin1, bin2; Double_t c1, c2; Int_t nxbins = h -> GetNbinsX(); Double_t NMax = h -> GetMaximum(); Int_t binc = h -> GetMaximumBin(); Double_t HNMax = 0.5*NMax; for( int i=0; i GetBinContent(i); if( c1 >= HNMax ) break; } bin1 -= 1; for( int i=binc; i GetBinContent(i); if( c2 <= HNMax ) break; } t1 = Bin2X( h, bin1); t2 = Bin2X( h, bin2); return ((t2-t1)/1.0); } void fit1() { //=========Macro generated from canvas: c02a/ //========= (Fri Feb 19 21:18:39 2021) by ROOT version 6.22/06 Int_t ci, binc, tbins = 161; // for color index setting Double_t T1 = -20, T2 = 20, tc, peakwidth, PeakVal, t1, t2; Double_t mean, sigma; //TF1 *signalFcn = new TF1("signalFcn",Combination,-15,15,6); TF1 *signalFcn1 = new TF1("signalFcn1",Lorentzian,-15,15,6); TF1 *g1; TF1 *p1; TF1 *signalFcn = new TF1("signalFcn",comb1,-15,15,5); signalFcn -> SetNpx(tbins); signalFcn -> SetLineColor(kBlue+1); signalFcn -> SetLineWidth(1); signalFcn1 -> SetNpx(tbins); signalFcn1 -> SetLineColor(kBlue+1); signalFcn1 -> SetLineWidth(1); Double_t par[6]; TCanvas *c02a = new TCanvas("c02a", "",28,49,1200,900); gStyle->SetOptFit(1); c02a->Range(-25,-1.276279,25,6.153606); c02a->SetFillColor(0); c02a->SetBorderMode(0); c02a->SetBorderSize(2); c02a->SetLogy(); c02a->SetGridx(); c02a->SetGridy(); c02a->SetTickx(1); c02a->SetTicky(1); c02a->SetFrameFillStyle(0); c02a->SetFrameBorderMode(0); c02a->SetFrameFillStyle(0); c02a->SetFrameBorderMode(0); TH1D *MToFg = new TH1D("MToFg","",161,-20,20); MToFg->SetBinContent(0,12623); MToFg->SetBinContent(1,49); MToFg->SetBinContent(2,46); MToFg->SetBinContent(3,47); MToFg->SetBinContent(4,43); MToFg->SetBinContent(5,195); MToFg->SetBinContent(6,173); MToFg->SetBinContent(7,39); MToFg->SetBinContent(8,156); MToFg->SetBinContent(9,30); MToFg->SetBinContent(10,21); MToFg->SetBinContent(11,14); MToFg->SetBinContent(12,339); MToFg->SetBinContent(13,39); MToFg->SetBinContent(14,288); MToFg->SetBinContent(15,325); MToFg->SetBinContent(16,928); MToFg->SetBinContent(17,258); MToFg->SetBinContent(18,569); MToFg->SetBinContent(19,1181); MToFg->SetBinContent(20,1175); MToFg->SetBinContent(21,1349); MToFg->SetBinContent(22,1402); MToFg->SetBinContent(23,1281); MToFg->SetBinContent(24,1108); MToFg->SetBinContent(25,1018); MToFg->SetBinContent(26,955); MToFg->SetBinContent(27,929); MToFg->SetBinContent(28,1566); MToFg->SetBinContent(29,954); MToFg->SetBinContent(30,1309); MToFg->SetBinContent(31,1041); MToFg->SetBinContent(32,1045); MToFg->SetBinContent(33,986); MToFg->SetBinContent(34,955); MToFg->SetBinContent(35,789); MToFg->SetBinContent(36,1055); MToFg->SetBinContent(37,674); MToFg->SetBinContent(38,738); MToFg->SetBinContent(39,1048); MToFg->SetBinContent(40,964); MToFg->SetBinContent(41,1272); MToFg->SetBinContent(42,1022); MToFg->SetBinContent(43,884); MToFg->SetBinContent(44,1298); MToFg->SetBinContent(45,1079); MToFg->SetBinContent(46,868); MToFg->SetBinContent(47,1362); MToFg->SetBinContent(48,1111); MToFg->SetBinContent(49,789); MToFg->SetBinContent(50,915); MToFg->SetBinContent(51,1115); MToFg->SetBinContent(52,745); MToFg->SetBinContent(53,802); MToFg->SetBinContent(54,828); MToFg->SetBinContent(55,1199); MToFg->SetBinContent(56,1045); MToFg->SetBinContent(57,1052); MToFg->SetBinContent(58,1052); MToFg->SetBinContent(59,1077); MToFg->SetBinContent(60,1077); MToFg->SetBinContent(61,1374); MToFg->SetBinContent(62,777); MToFg->SetBinContent(63,950); MToFg->SetBinContent(64,1486); MToFg->SetBinContent(65,1568); MToFg->SetBinContent(66,927); MToFg->SetBinContent(67,1400); MToFg->SetBinContent(68,1765); MToFg->SetBinContent(69,1069); MToFg->SetBinContent(70,1112); MToFg->SetBinContent(71,1945); MToFg->SetBinContent(72,2319); MToFg->SetBinContent(73,1811); MToFg->SetBinContent(74,3688); MToFg->SetBinContent(75,3466); MToFg->SetBinContent(76,3820); MToFg->SetBinContent(77,5828); MToFg->SetBinContent(78,8844); MToFg->SetBinContent(79,13490); MToFg->SetBinContent(80,17825); MToFg->SetBinContent(81,29542); MToFg->SetBinContent(82,46262); MToFg->SetBinContent(83,70868); MToFg->SetBinContent(84,94290); MToFg->SetBinContent(85,112062); MToFg->SetBinContent(86,132175); MToFg->SetBinContent(87,125121); MToFg->SetBinContent(88,109370); MToFg->SetBinContent(89,82368); MToFg->SetBinContent(90,64360); MToFg->SetBinContent(91,53033); MToFg->SetBinContent(92,36635); MToFg->SetBinContent(93,26910); MToFg->SetBinContent(94,20387); MToFg->SetBinContent(95,15051); MToFg->SetBinContent(96,9463); MToFg->SetBinContent(97,7315); MToFg->SetBinContent(98,5376); MToFg->SetBinContent(99,4491); MToFg->SetBinContent(100,3752); MToFg->SetBinContent(101,2499); MToFg->SetBinContent(102,2653); MToFg->SetBinContent(103,1791); MToFg->SetBinContent(104,2322); MToFg->SetBinContent(105,1691); MToFg->SetBinContent(106,1485); MToFg->SetBinContent(107,1203); MToFg->SetBinContent(108,1989); MToFg->SetBinContent(109,1262); MToFg->SetBinContent(110,1195); MToFg->SetBinContent(111,1355); MToFg->SetBinContent(112,1970); MToFg->SetBinContent(113,692); MToFg->SetBinContent(114,1479); MToFg->SetBinContent(115,1457); MToFg->SetBinContent(116,1278); MToFg->SetBinContent(117,1547); MToFg->SetBinContent(118,1679); MToFg->SetBinContent(119,1171); MToFg->SetBinContent(120,811); MToFg->SetBinContent(121,1295); MToFg->SetBinContent(122,693); MToFg->SetBinContent(123,1978); MToFg->SetBinContent(124,1276); MToFg->SetBinContent(125,1116); MToFg->SetBinContent(126,720); MToFg->SetBinContent(127,1545); MToFg->SetBinContent(128,1409); MToFg->SetBinContent(129,1395); MToFg->SetBinContent(130,1863); MToFg->SetBinContent(131,1392); MToFg->SetBinContent(132,781); MToFg->SetBinContent(133,1416); MToFg->SetBinContent(134,853); MToFg->SetBinContent(135,1039); MToFg->SetBinContent(136,1397); MToFg->SetBinContent(137,1281); MToFg->SetBinContent(138,921); MToFg->SetBinContent(139,1020); MToFg->SetBinContent(140,1209); MToFg->SetBinContent(141,714); MToFg->SetBinContent(142,25); MToFg->SetBinContent(143,24); MToFg->SetBinContent(144,15); MToFg->SetBinContent(145,346); MToFg->SetBinContent(146,27); MToFg->SetBinContent(147,20); MToFg->SetBinContent(148,129); MToFg->SetBinContent(149,14); MToFg->SetBinContent(150,395); MToFg->SetBinContent(151,130); MToFg->SetBinContent(152,130); MToFg->SetBinContent(154,129); MToFg->SetBinContent(155,1); MToFg->SetBinContent(159,2); MToFg->SetBinContent(160,8); MToFg->SetBinContent(162,273); MToFg->SetBinError(0,1198.018); MToFg->SetBinError(1,16.52271); MToFg->SetBinError(2,14.62874); MToFg->SetBinError(3,14.66288); MToFg->SetBinError(4,14.52584); MToFg->SetBinError(5,129.3484); MToFg->SetBinError(6,129.0465); MToFg->SetBinError(7,14.38749); MToFg->SetBinError(8,128.3277); MToFg->SetBinError(9,11.91638); MToFg->SetBinError(10,8.774964); MToFg->SetBinError(11,3.741657); MToFg->SetBinError(12,158.6285); MToFg->SetBinError(13,14.38749); MToFg->SetBinError(14,181.5709); MToFg->SetBinError(15,182.2882); MToFg->SetBinError(16,338.9513); MToFg->SetBinError(17,144.5061); MToFg->SetBinError(18,256.4391); MToFg->SetBinError(19,368.311); MToFg->SetBinError(20,339.7867); MToFg->SetBinError(21,390.1859); MToFg->SetBinError(22,390.7557); MToFg->SetBinError(23,369.2817); MToFg->SetBinError(24,345.7571); MToFg->SetBinError(25,321.6862); MToFg->SetBinError(26,320.8909); MToFg->SetBinError(27,281.4694); MToFg->SetBinError(28,425.5702); MToFg->SetBinError(29,315.1666); MToFg->SetBinError(30,369.4712); MToFg->SetBinError(31,322.1568); MToFg->SetBinError(32,316.3748); MToFg->SetBinError(33,315.4838); MToFg->SetBinError(34,315.0794); MToFg->SetBinError(35,242.8271); MToFg->SetBinError(36,321.8307); MToFg->SetBinError(37,233.4138); MToFg->SetBinError(38,234.2691); MToFg->SetBinError(39,316.1139); MToFg->SetBinError(40,301.6289); MToFg->SetBinError(41,347.206); MToFg->SetBinError(42,315.5408); MToFg->SetBinError(43,273.8248); MToFg->SetBinError(44,363.8049); MToFg->SetBinError(45,296.7676); MToFg->SetBinError(46,266.6458); MToFg->SetBinError(47,369.4672); MToFg->SetBinError(48,316.5675); MToFg->SetBinError(49,226.6032); MToFg->SetBinError(50,260.2518); MToFg->SetBinError(51,296.9225); MToFg->SetBinError(52,225.6391); MToFg->SetBinError(53,234.1666); MToFg->SetBinError(54,227.1827); MToFg->SetBinError(55,309.7983); MToFg->SetBinError(56,295.6704); MToFg->SetBinError(57,289.9448); MToFg->SetBinError(58,268.1418); MToFg->SetBinError(59,315.2729); MToFg->SetBinError(60,268.6057); MToFg->SetBinError(61,347.2722); MToFg->SetBinError(62,197.3449); MToFg->SetBinError(63,266.9045); MToFg->SetBinError(64,353.5845); MToFg->SetBinError(65,365.4805); MToFg->SetBinError(66,208.4778); MToFg->SetBinError(67,324.0988); MToFg->SetBinError(68,392.1492); MToFg->SetBinError(69,267.4416); MToFg->SetBinError(70,261.2738); MToFg->SetBinError(71,408.6184); MToFg->SetBinError(72,464.8172); MToFg->SetBinError(73,367.4929); MToFg->SetBinError(74,600.2); MToFg->SetBinError(75,562.048); MToFg->SetBinError(76,597.5985); MToFg->SetBinError(77,751.3747); MToFg->SetBinError(78,933.023); MToFg->SetBinError(79,1187.654); MToFg->SetBinError(80,1321.136); MToFg->SetBinError(81,1710.132); MToFg->SetBinError(82,2144.572); MToFg->SetBinError(83,2673.687); MToFg->SetBinError(84,3050.16); MToFg->SetBinError(85,3333.741); MToFg->SetBinError(86,3677.836); MToFg->SetBinError(87,3570.443); MToFg->SetBinError(88,3375.701); MToFg->SetBinError(89,2937.788); MToFg->SetBinError(90,2616.521); MToFg->SetBinError(91,2433.62); MToFg->SetBinError(92,2013.024); MToFg->SetBinError(93,1738.597); MToFg->SetBinError(94,1511.858); MToFg->SetBinError(95,1301.007); MToFg->SetBinError(96,1016.826); MToFg->SetBinError(97,890.0129); MToFg->SetBinError(98,762.1129); MToFg->SetBinError(99,694.9209); MToFg->SetBinError(100,622.7616); MToFg->SetBinError(101,477.8985); MToFg->SetBinError(102,506.5856); MToFg->SetBinError(103,397.2896); MToFg->SetBinError(104,485.1742); MToFg->SetBinError(105,376.2911); MToFg->SetBinError(106,348.237); MToFg->SetBinError(107,276.3386); MToFg->SetBinError(108,427.9685); MToFg->SetBinError(109,322.76); MToFg->SetBinError(110,297.0572); MToFg->SetBinError(111,346.9222); MToFg->SetBinError(112,445.5311); MToFg->SetBinError(113,186.9224); MToFg->SetBinError(114,364.9753); MToFg->SetBinError(115,369.5957); MToFg->SetBinError(116,341.1129); MToFg->SetBinError(117,386.4751); MToFg->SetBinError(118,411.5033); MToFg->SetBinError(119,322.4453); MToFg->SetBinError(120,234.5442); MToFg->SetBinError(121,346.9164); MToFg->SetBinError(122,224.5284); MToFg->SetBinError(123,454.3149); MToFg->SetBinError(124,363.5437); MToFg->SetBinError(125,322.0124); MToFg->SetBinError(126,233.8718); MToFg->SetBinError(127,406.4099); MToFg->SetBinError(128,385.7162); MToFg->SetBinError(129,358.7241); MToFg->SetBinError(130,440.3987); MToFg->SetBinError(131,374.8493); MToFg->SetBinError(132,265.7461); MToFg->SetBinError(133,375.1053); MToFg->SetBinError(134,288.2447); MToFg->SetBinError(135,321.8928); MToFg->SetBinError(136,390.6776); MToFg->SetBinError(137,352.898); MToFg->SetBinError(138,314.9365); MToFg->SetBinError(139,308.8754); MToFg->SetBinError(140,357.2912); MToFg->SetBinError(141,287.1271); MToFg->SetBinError(142,11.7047); MToFg->SetBinError(143,11.6619); MToFg->SetBinError(144,8.42615); MToFg->SetBinError(145,192.5045); MToFg->SetBinError(146,13.96424); MToFg->SetBinError(147,11.48913); MToFg->SetBinError(148,128.0039); MToFg->SetBinError(149,8.3666); MToFg->SetBinError(150,221.8536); MToFg->SetBinError(151,128.0078); MToFg->SetBinError(152,128.0078); MToFg->SetBinError(154,128.0039); MToFg->SetBinError(155,1); MToFg->SetBinError(159,1.414214); MToFg->SetBinError(160,8); MToFg->SetBinError(162,181.3753); MToFg->SetEntries(97528); /* TPaveStats *ptstats = new TPaveStats(0.68,0.75,0.89,0.89,"brNDC"); ptstats->SetName("stats"); ptstats->SetBorderSize(1); ptstats->SetFillColor(0); ptstats->SetTextAlign(12); TText *ptstats_LaTex = ptstats->AddText("MToFg"); ptstats_LaTex->SetTextSize(0.01073333); ptstats_LaTex = ptstats->AddText("Entries = 97528 "); ptstats_LaTex = ptstats->AddText("Mean = 1.273"); ptstats_LaTex = ptstats->AddText("Std Dev = 3.353"); ptstats_LaTex = ptstats->AddText("#chi^{2} / ndf = 1.208e+04 / 150"); ptstats_LaTex = ptstats->AddText("Prob = 0"); ptstats_LaTex = ptstats->AddText("Peak = 40.97 #pm 2.43 "); ptstats_LaTex = ptstats->AddText("Peak ToF = -24.23 #pm 1.36 "); ptstats_LaTex = ptstats->AddText("Halfwidth = 11.37 #pm 1.48 "); ptstats_LaTex = ptstats->AddText("Mean = 0.9971 #pm 0.0000 "); ptstats_LaTex = ptstats->AddText("Sigma = 0.003341 #pm 0.000005 "); ptstats_LaTex = ptstats->AddText("p5 = 1 #pm 0.4 "); ptstats->SetOptStat(1); ptstats->SetOptFit(1111); ptstats->Draw(); MToFg->GetListOfFunctions()->Add(ptstats); ptstats->SetParent(MToFg); */ // MToFg->GetListOfFunctions()->Add(signalFcn12); MToFg->SetLineWidth(2); ci = TColor::GetColor("#000066"); MToFg->SetMarkerColor(ci); MToFg->SetMarkerStyle(20); MToFg->SetMarkerSize(0.9); MToFg->GetXaxis()->SetTitle("t^{#gamma}_{CsI}-t^{e}_{PV} [ns]"); MToFg->GetXaxis()->CenterTitle(true); MToFg->GetXaxis()->SetDecimals(); MToFg->GetXaxis()->SetLabelFont(42); MToFg->GetXaxis()->SetLabelSize(0.03); MToFg->GetXaxis()->SetTitleSize(0.04); MToFg->GetXaxis()->SetTickLength(0.018); MToFg->GetXaxis()->SetTitleOffset(1); MToFg->GetXaxis()->SetTitleFont(42); MToFg->GetYaxis()->SetTitle("Events"); MToFg->GetYaxis()->CenterTitle(true); MToFg->GetYaxis()->SetDecimals(); MToFg->GetYaxis()->SetLabelFont(42); MToFg->GetYaxis()->SetLabelSize(0.03); MToFg->GetYaxis()->SetTitleSize(0.04); MToFg->GetYaxis()->SetTickLength(0.018); MToFg->GetYaxis()->SetTitleOffset(1.1); MToFg->GetYaxis()->SetTitleFont(42); MToFg->GetZaxis()->SetLabelFont(42); MToFg->GetZaxis()->SetTickLength(0.018); MToFg->GetZaxis()->SetTitleOffset(1); MToFg->GetZaxis()->SetTitleFont(42); MToFg->Draw("pe"); signalFcn -> SetParameters(1.37e5,1.4,1.06,1.37,1080);//chi^2/ndf = 208/116 MToFg -> Fit("signalFcn","R"); /* binc = MToFg -> GetMaximumBin(); PeakVal = MToFg -> GetMaximum();// Amplitude (peak value) tc = Bin2X( MToFg, binc );// ToF at peak peakwidth = 0.25*FWHP(MToFg, t1, t2);// peak width at half power signalFcn -> SetParameters(1,1,1,1,1,1);// Initialize parameters // MToFg -> Fit("gaus","0Q+"); // g1 = MToFg -> GetFunction("gaus"); // mean = g1 -> GetParameter(1); // sigma = g1 -> GetParameter(2); mean = MToFg -> GetMean(1); sigma = MToFg -> GetStdDev(1); printf("\tFit Combination\n"); signalFcn -> SetParNames("Peak", "Peak ToF", "Halfwidth", "Mean" ,"Sigma", "unused"); signalFcn -> SetParameters(PeakVal,tc,peakwidth,mean,sigma,0); MToFg -> Fit("signalFcn","0"); // First attempt (0 - do not draw) MToFg -> Fit("signalFcn","Q+","ep");// Second attempt (quiet). signalFcn -> GetParameters(par); signalFcn -> Draw("sames"); signalFcn -> SetLineColor(kRed+1); signalFcn -> SetLineWidth(2); PeakVal = par[0]; tc = par[1]; peakwidth = par[2]; mean = par[3]; sigma = par[4]; printf("\tFit Lorentzian\n"); signalFcn1 -> SetParNames("Peak", "ToF @ Peak", "Halfwidth", "Mean" ,"Sigma", "unused"); signalFcn1 -> SetParameters(PeakVal,tc,peakwidth,mean,sigma,0); MToFg -> Fit("signalFcn1","0","",-15,15); // First attempt (0 - do not draw) MToFg -> Fit("signalFcn1","Q+","l",15,15);// Second attempt (quiet). signalFcn1 -> GetParameters(par); signalFcn1 -> Draw("sames"); signalFcn1 -> SetLineColor(kGreen+1); signalFcn1 -> SetLineWidth(1); printf("\tFit gaus\n"); MToFg -> Fit("gaus","+"); g1 = MToFg -> GetFunction("gaus"); g1 -> SetLineColor(kBlue+1); TLegend *leg = new TLegend(0.15,0.75,0.3,0.85,NULL,"brNDC"); leg->SetBorderSize(0); leg->SetTextFont(72); leg->SetTextSize(0.02); leg->SetLineColor(1); leg->SetLineStyle(1); leg->SetLineWidth(1); leg->SetFillColor(0); leg->SetFillStyle(1001); TLegendEntry *entry=leg->AddEntry("MToFg","Data","pe"); entry=leg->AddEntry("signalFcn1","Lorentzian","l"); entry=leg->AddEntry("g1","Gaussian","l"); entry=leg->AddEntry("signalFcn","Combination","l"); entry->SetLineColor(1); entry->SetLineStyle(1); entry->SetLineWidth(2); ci = TColor::GetColor("#000066"); entry->SetMarkerColor(ci); entry->SetMarkerStyle(20); entry->SetMarkerSize(0.9); entry->SetTextFont(72); // entry=leg->AddEntry("signalFcn","Signal fit","l"); ci = TColor::GetColor("#0000cc"); entry->SetLineColor(ci); entry->SetLineStyle(1); entry->SetLineWidth(1); entry->SetMarkerColor(1); entry->SetMarkerStyle(21); entry->SetMarkerSize(1); entry->SetTextFont(72); leg->Draw(); c02a->Modified(); c02a->cd(); c02a->SetSelected(c02a); */ }