diff --git a/Analyser/FitAnalyser.py b/Analyser/FitAnalyser.py index a5c5539..55c8a22 100644 --- a/Analyser/FitAnalyser.py +++ b/Analyser/FitAnalyser.py @@ -428,6 +428,8 @@ class DensityProfileBEC2dModel(lmfit.Model): # reshaping the image to 2D in the form [[a_00, a_01, .., a_0Y], [a_10,.., a_1Y], .., [a_X0, .., a_XY]], with a_xy x_width = len(np.unique(x)) y_width = len(np.unique(y)) + x_1d = np.linspace(x[0], x[-1], x_width) + y_1d = np.linspace(y[0], y[-1], y_width) data = np.reshape(data, (y_width, x_width)) data = data.T @@ -440,13 +442,15 @@ class DensityProfileBEC2dModel(lmfit.Model): # binarizing image to guess BEC width and calculate center thresh = self.calc_thresh(data,thresh_val=0.5) # calculating center of cloud by statistical distribution of binarized image - center = self.calc_cen(thresh) + center_pix = self.calc_cen_pix(thresh) + center = self.center_pix_conv(center_pix, x_1d, y_1d) # guessing BEC width, or better of width of center blob if no BEC is present - BEC_width_guess = self.guess_BEC_width(thresh, center) + BEC_width_guess = self.guess_BEC_width(thresh, center_pix) # plot binarized image and center position for debugging if self.is_debug: - plt.pcolormesh(thresh.T, cmap='jet') + X, Y = np.meshgrid(x_1d,y_1d) + plt.pcolormesh(X,Y, thresh.T, cmap='jet') plt.plot(center[0], center[1], marker='x', markersize=25, color='green') plt.gca().set_aspect('equal') plt.title(f'Binarized image for guessing BEC width + center position (BEC_width: x={BEC_width_guess[0]:.0f}, y={BEC_width_guess[1]:.0f} pix)') @@ -459,17 +463,19 @@ class DensityProfileBEC2dModel(lmfit.Model): if self.is_debug: print(f'x smaller y, 1d fit along x') s_width_ind = 0 + x_fit = x_1d # slice of the image along the short BEC axis with width of BEC width is taken - X_guess = np.sum(data[:, round(center[1] - BEC_width_guess[1]/2) : round(center[1] + BEC_width_guess[1]/2)], 1) / len(data[0,round(center[1] - BEC_width_guess[1]/2) : round(center[1] + BEC_width_guess[1]/2)]) + X_guess = np.sum(data[:, round(center_pix[1] - BEC_width_guess[1]/2) : round(center_pix[1] + BEC_width_guess[1]/2)], 1) / len(data[0,round(center_pix[1] - BEC_width_guess[1]/2) : round(center_pix[1] + BEC_width_guess[1]/2)]) else: if self.is_debug: print(f'y smaller x, 1d fit along y') s_width_ind = 1 - X_guess = np.sum(data[round(center[0] - BEC_width_guess[0]/2) : round(center[0] + BEC_width_guess[0]/2), :], 0) / len(data[0,round(center[0] - BEC_width_guess[0]/2) : round(center[0] + BEC_width_guess[0]/2)]) + x_fit = y_1d + X_guess = np.sum(data[round(center_pix[0] - BEC_width_guess[0]/2) : round(center_pix[0] + BEC_width_guess[0]/2), :], 0) / len(data[0,round(center_pix[0] - BEC_width_guess[0]/2) : round(center_pix[0] + BEC_width_guess[0]/2)]) # Creating 1d fit init params + Performing fit - x = np.linspace(0, len(X_guess), len(X_guess)) + max_val = np.max(X_guess) @@ -487,7 +493,7 @@ class DensityProfileBEC2dModel(lmfit.Model): params_1d.add('sigma_th', 3*BEC_width_guess[0], min=0, expr=f'0.632*sigma_bec + 0.518*deltax') - res_1d = fitmodel_1d.fit(X_guess, x=x, params=params_1d) + res_1d = fitmodel_1d.fit(X_guess, x=x_fit, params=params_1d) bval_1d = res_1d.best_values if self.is_debug: @@ -501,17 +507,16 @@ class DensityProfileBEC2dModel(lmfit.Model): print('1d fitted values') self.print_bval(res_1d) - x = np.linspace(0, len(X_guess), len(X_guess)) - plt.plot(x, X_guess, label='1d int. data') - plt.plot(x, density_1d(x,**bval_1d), label='bimodal fit') - plt.plot(x, thermal(x,x0=bval_1d['x0_th'], amp=bval_1d['amp_th'], sigma=bval_1d['sigma_th']), label='thermal part') + plt.plot(x_fit, X_guess, label='1d int. data') + plt.plot(x_fit, density_1d(x_fit,**bval_1d), label='bimodal fit') + plt.plot(x_fit, thermal(x_fit,x0=bval_1d['x0_th'], amp=bval_1d['amp_th'], sigma=bval_1d['sigma_th']), label='thermal part') plt.legend() if s_width_ind==0: plt.title('1d fit of data along x-axis') - plt.xlabel('x_axis (pix)') + plt.xlabel('x_') else: plt.title('1d fit of data along y-axis') - plt.xlabel('y_axis (pix)') + plt.xlabel('y_axis') plt.show() # scaling amplitudes of 1d fit with the maximum value of blurred 2d data @@ -600,6 +605,7 @@ class DensityProfileBEC2dModel(lmfit.Model): bval = res.best_values # Do described post_check if enabled + if res.params['amp_bec'].vary and res.params['amp_th'].vary and bval['amp_bec']>0.5*bval['amp_th'] and self.post_check: # creating image by cutting out region around BEC and counting number of atoms @@ -648,8 +654,8 @@ class DensityProfileBEC2dModel(lmfit.Model): return thresh - def calc_cen(self, thresh1): - """Calculating the center of a blob (atom cloud) in a binarized image by first calculating the probability distribution along both axes and afterwards the expectation value + def calc_cen_pix(self, thresh1): + """Calculating the center (in pixel) of a blob (atom cloud) in a binarized image by first calculating the probability distribution along both axes and afterwards the expectation value :param thresh1: Binary 2D image in the form [[a_00, a_01, .., a_0Y], [a_10,.., a_1Y], .., [a_X0, .., a_XY]], with a_xy, x_dim=X, y_dim=Y :type thresh1: 2D numpy array @@ -669,13 +675,30 @@ class DensityProfileBEC2dModel(lmfit.Model): cen[0] = np.sum(dx * np.arange(X)) cen[1] = np.sum(dy * np.arange(Y)) return cen + + def center_pix_conv(self, center_pix, x, y): + """Converts center in pixel to center in values of x and y + + :param center_pix: pixel values of center + :type center_pix: numpy array (shape=(1,2)) + :param x: x-axis + :type x: 1d numpy array + :param y: y-axis + :type y: 1d numpy array + :return: center coordinates in form [x_center, y_center] with respect to the axes + :rtype: numpy array (shap=(1,2)) + """ + center = np.empty(2) + center[0] = x[round(center_pix[0])] + center[1] = y[round(center_pix[1])] + return center def guess_BEC_width(self, thresh, center): """ returns width of blob in binarized image along both axis through the center :param thresh: Binary 2D image in the form [[a_00, a_01, .., a_0Y], [a_10,.., a_1Y], .., [a_X0, .., a_XY]], with a_xy, x_dim=X, y_dim=Y :type thresh: 2d numpy array - :param center: center of blob in image in form [x_center, y_center] + :param center: center of blob in image in form [x_center, y_center] in pixel :type center: 1d numpy array (shape=(1,2)) :return: width of blob in image as [x_width, y_width] :rtype: 1d numpy array (shape=(1,2))