1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- import numpy as np
- from scipy.optimize import curve_fit
- import matplotlib.pyplot as plt
- #############################################################################################################################
- # Load data
- fontsize = 16
- fileName = "DATA/original_histograms/mass_mm_higgs_Signal.npz"
- with np.load(fileName) as data:
- bin_edges = data['bin_edges']
- bin_centers = data['bin_centers']
- bin_values = data['bin_values']
- bin_errors = data['bin_errors']
- #############################################################################################################################
- # Crystal Ball Function
- def CrystalBall(x, A, aL, aR, nL, nR, mCB, sCB):
- return np.piecewise(x, [(x - mCB) / sCB <= -aL,
- (x - mCB) / sCB >= aR],
- [lambda x: A * (nL / np.abs(aL))**nL * np.exp(-aL**2 / 2) * (nL / np.abs(aL) - np.abs(aL) - (x - mCB) / sCB)**(-nL),
- lambda x: A * (nR / np.abs(aR))**nR * np.exp(-aR**2 / 2) * (nR / np.abs(aR) - np.abs(aR) + (x - mCB) / sCB)**(-nR),
- lambda x: A * np.exp(-(x - mCB)**2 / (2 * sCB**2))
- ])
- #############################################################################################################################
- # Fit
- popt, pcov = curve_fit(CrystalBall, bin_centers, bin_values, sigma=bin_errors, p0=[133., 1.5, 1.5, 3.7, 9.6, 124.5, 3.])
- perr = np.sqrt(np.diag(pcov))
- A, aL, aR, nL, nR, mCB, sCB = popt
- xs = np.linspace(110, 160, 501)
- my_fit = np.array(CrystalBall(xs, A, aL, aR, nL, nR, mCB, sCB))
- xerrs = 0.5 * (bin_edges[1:] - bin_edges[:-1])
- plt.figure(figsize=(8, 4.5))
- plt.errorbar(bin_centers, bin_values, bin_errors, xerrs, marker='o', markersize=5, color='k', ecolor='k', ls='', label='Original histogram')
- plt.plot(xs, my_fit, 'r-', label='signal fit CB')
- plt.xlabel(r'$m_{\mu \mu}$', fontsize=fontsize)
- plt.ylabel('Number of events', fontsize=fontsize)
- plt.legend(fontsize=fontsize)
- plt.xticks(size=fontsize)
- plt.yticks(size=fontsize)
- plt.tight_layout()
- plt.grid()
- plt.show()
- # Print out the parameters
- print("A: {A:.3f}\naL: {aL:.3f}\naR: {aR:.3f}\nnL: {nL:.3f}\nnR: {nR:.3f}\nmCB: {mCB:.3f}\nsCB: {sCB:.3f}".format(A=A, aL=aL, aR=aR, nL=nL, nR=nR, mCB=mCB, sCB=sCB))
|