updates to fitting routines

This commit is contained in:
x10sa
2026-07-27 17:06:46 +02:00
committed by perl_d
parent f520456a39
commit 7360329b91
3 changed files with 96 additions and 26 deletions
+26
View File
@@ -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,
# }
+68 -25
View File
@@ -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}"
)
+2 -1
View File
@@ -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)