Python: Подгонка гистограммы с запутанной функцией - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь согласовать гистограмму с запутанной функцией. Поэтому я генерирую гистограмму один раз для графика и один раз для подгонки и использую центр ячейки в качестве значений x для подгонки. Подгонка выполняется с помощью scipy.optimize.curve_fit. Приспособленная кривая, кажется, смещена к левому краю корзины, хотя я использовал центр корзины для установки. Среднее значение подгонки также отличается. Что не так?

Полученный результат см. Fit

# Fill histograms


hist_MC_Mll_counts, hist_MC_Mll_edges = np.histogram(df_sig['Mll'].loc[xxx], bins=120, range=(60,120))

xHist_MC = hist_MC_Mll_edges
yHist_MC = np.append(hist_MC_Mll_counts,hist_MC_Mll_counts[-1])



xFitMin = 75
xFitMax = 105
fitBins = 60

hist_MC_Mll_Fit_counts, hist_MC_Mll_Fit_edges = np.histogram(df_sig['Mll'].loc[xxx], bins=fitBins, range=(xFitMin,xFitMax))

xFit_MC = (hist_MC_Mll_Fit_edges[:-1] + hist_MC_Mll_Fit_edges[1:]) / 2
yFit_MC = hist_MC_Mll_Fit_counts



# Define fitting functions



def crystal_ball(x, alpha, n, mean, sigma):
    return np.piecewise(x, [(x-mean)/sigma>-alpha, (x-mean)/sigma<=-alpha], [lambda x: np.exp(-(x-mean)**2/(2*sigma**2)), lambda x: (n/abs(alpha))**n * np.exp((-abs(alpha)**2)/2) * (n/abs(alpha)-abs(alpha)-(x-mean)/sigma)**(-n)])

def unrelativistic_breit_wigner(x, resonance_mass, width):
    return 1 /((x - resonance_mass)**2 + (width**2)/4)

def bwcb_nonfixed(x, alpha, n, resonance_mass, sigma, norm):
    width = 2.4952
    return norm*fftconvolve(unrelativistic_breit_wigner(x, resonance_mass, width),crystal_ball(x, alpha, n, resonance_mass, sigma),mode='same')


popt_MC_bwcb_nonfixed, pcov_MC_bwcb_nonfixed = curve_fit(bwcb_nonfixed, xFit_MC, yFit_MC, p0=[1, 1, 90, 5,9000])



# Plot

xPlot = np.linspace(xFitMin,xFitMax,10000)
dxPlot = (xPlot[1]-xPlot[0])/(xHist_MC[1]-xHist_MC[0])
dxHist = hist_MC_Mll_edges[1] - hist_MC_Mll_edges[0]

fig2, ax2 = plt.subplots(nrows=1,ncols=1,figsize=(8,8),constrained_layout=True)
ax2.plot(xPlot, bwcb_nonfixed(xPlot, *popt_MC_bwcb_nonfixed)*dxPlot, c='red', label='Fit BWCB')
ax2.plot(xFit_MC, yFit_MC, c='black',ls='',marker='.')
ax2.fill_between(xHist_MC, yHist_MC, label=r"$Z \rightarrow ee$ MC", step='post', fc='yellow', ec='black')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...