From 7360329b9145404e52608dfb4ece02fca821fbc9 Mon Sep 17 00:00:00 2001 From: x10sa Date: Tue, 30 Jun 2026 14:07:09 +0200 Subject: [PATCH] updates to fitting routines --- pxii_bec/macros/katscripts.py | 26 ++++++++++ pxii_bec/macros/mx_basics.py | 93 +++++++++++++++++++++++++---------- pxii_bec/macros/mx_methods.py | 3 +- 3 files changed, 96 insertions(+), 26 deletions(-) diff --git a/pxii_bec/macros/katscripts.py b/pxii_bec/macros/katscripts.py index ed9f6cf..9dff871 100755 --- a/pxii_bec/macros/katscripts.py +++ b/pxii_bec/macros/katscripts.py @@ -1446,3 +1446,29 @@ def define_slits(): ] return slits +def get_mirror_data(history_index: int): + """Read data from the BEC history and return the X and Y data as arrays.""" + motor1 = "vfm_bu" + motor2 = "vfm_bd" + + scan = bec.history[history_index] + md = scan.metadata["bec"] + x1_data = scan.devices[motor1][motor1].read()["value"] + x2_data = scan.devices[motor2][motor2].read()["value"] + y1_data = scan.devices['microscope_stats']['microscope_stats_data_sigma_y'].read()['value'] + y2_data = scan.devices['microscope_stats']['microscope_stats_data_eccentricity'].read()['value'] + np.savetxt("luts/x1_data", x1_data) + np.savetxt("luts/x2_data", x2_data) + np.savetxt("luts/y1_data", y1_data) + np.savetxt("luts/y2_data", y2_data) + + + # plt.imshow(y1_data, cmap="hot") + # plt.clf + # return { + # "signal_name": signal_name, + # "x_data": x_data, + # "y_data": y_data, + # "motor_name": motor_name, + # "scan_number": scan_number, + # } \ No newline at end of file diff --git a/pxii_bec/macros/mx_basics.py b/pxii_bec/macros/mx_basics.py index 132c8a9..7577658 100755 --- a/pxii_bec/macros/mx_basics.py +++ b/pxii_bec/macros/mx_basics.py @@ -15,6 +15,7 @@ import matplotlib.pyplot as plt def create_fit_parameters( deriv: bool = False, + negative: bool = False, model: str = "Voigt", baseline: str = "Linear", smoothing: None = None, @@ -30,6 +31,7 @@ def create_fit_parameters( } return { "deriv": deriv, + "negative": negative, "model": model_mappings[model], "baseline": model_mappings[baseline], "smoothing": smoothing, @@ -53,23 +55,39 @@ def get_data_from_h5(signal_name: str = "lu_bpmsum"): "scan_number": str(scan_number), } +def get_history(scan): + if isinstance(scan, int): + if scan < 0: + return bec.history[scan] + return bec.history.get_by_scan_number(scan) + # return bec.history.get_by_dataset_number(scan) + return scan + def get_data_from_history( - history_index: int, + scan: int, signal_name: str = "lu_bpmsum", ): """Read data from the BEC history and return the X and Y data as arrays.""" - scan = bec.history[history_index] - md = scan.metadata["bec"] + + data = get_history(scan) + md = data.metadata["bec"] motor_name = md["scan_report_devices"][0].decode() + mot_name = motor_name.replace(".","_") + if "." in motor_name: + root_name = motor_name.split(".")[0] + x_data = data.devices[root_name][mot_name].read()["value"] + else: + x_data = data.devices[mot_name][mot_name].read()["value"] + scan_number = md["scan_number"] - x_data = scan.devices[motor_name][motor_name].read()["value"] - y_data = scan.devices[signal_name][signal_name].read()["value"] + + y_data = data.devices[signal_name][signal_name].read()["value"] return { "signal_name": signal_name, "x_data": x_data, "y_data": y_data, - "motor_name": motor_name, + "motor_name": mot_name, "scan_number": scan_number, } @@ -78,31 +96,56 @@ def process_data(data, fit_params): """ Process the signal data for fitting based on derivative or smoothing. """ - smoothing, deriv = fit_params["smoothing"], fit_params["deriv"] + smoothing = fit_params["smoothing"] + deriv = fit_params["deriv"] + negative = fit_params["negative"] + signal_name = data["signal_name"] y_data = data["y_data"] - if deriv: - if smoothing: - y_smooth = gaussian_filter1d(y_data, smoothing) - fitting_data = np.gradient(y_smooth) - signal_name = f"Derivative of smoothed {signal_name}" - else: - fitting_data = np.gradient(y_data) - signal_name = f"Derivative of {signal_name}" - elif smoothing and smoothing > 0.01: + if smoothing and smoothing > 0.01: fitting_data = gaussian_filter1d(y_data, smoothing) signal_name = f"Smoothed {signal_name}" else: - fitting_data = y_data + fitting_data = y_data.copy() - updated_data = { - "y_to_fit": fitting_data, - "signal_name": signal_name, - } - data.update(updated_data) + if deriv: + fitting_data = np.gradient(fitting_data) + signal_name = f"Derivative of {signal_name}" + + if negative: + fitting_data = -fitting_data + signal_name = f"Negative {signal_name}" + + data.update( + { + "y_to_fit": fitting_data, + "signal_name": signal_name, + } + ) return data + # if deriv: + # if smoothing: + # y_smooth = gaussian_filter1d(y_data, smoothing) + # fitting_data = np.gradient(y_smooth) + # signal_name = f"Derivative of smoothed {signal_name}" + # else: + # fitting_data = np.gradient(y_data) + # signal_name = f"Derivative of {signal_name}" + # elif smoothing and smoothing > 0.01: + # fitting_data = gaussian_filter1d(y_data, smoothing) + # signal_name = f"Smoothed {signal_name}" + # else: + # fitting_data = y_data + + # updated_data = { + # "y_to_fit": fitting_data, + # "signal_name": signal_name, + # } + # data.update(updated_data) + # return data + def fit(data, fit_params): """Fit a signal to a model and return the fitting results.""" @@ -234,9 +277,9 @@ def plot_fitted_data_bec( """ wf, text_box = select_bec_window() fit_text = ( - f"Fit parameters: Centre = {fit_result['centre']:.4f}, " - f"FWHM = {fit_result['fwhm']:.3f}, " - f"Height = {fit_result['height']:.4f}\n" + f"Fit parameters: Centre = {fit_result['centre']:.5g}, " + f"FWHM = {fit_result['fwhm']:.5f}, " + f"Height = {fit_result['height']:.4g}\n" f"Model = {fit_result['model']}\n" f"Chi sq = {fit_result['chi_sq']:.3g}" ) diff --git a/pxii_bec/macros/mx_methods.py b/pxii_bec/macros/mx_methods.py index 54d99cb..38cc6ed 100755 --- a/pxii_bec/macros/mx_methods.py +++ b/pxii_bec/macros/mx_methods.py @@ -198,6 +198,7 @@ def fit_history( history_index: int, signal_name: str, deriv: bool = False, + negative: bool = False, model: str = FitDefaults.MODEL, move_to_peak: bool = False, ): @@ -226,7 +227,7 @@ def fit_history( data = get_data_from_history(history_index, signal_name) # Define fitting parameters - fit_params = create_fit_parameters(deriv, model, FitDefaults.BASELINE) + fit_params = create_fit_parameters(deriv, negative, model, FitDefaults.BASELINE) # Perform fit and plot the data fit_result = fit(data, fit_params)