Coverage for test/test_simulation.py: 100%
49 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-09-14 14:49 -0400
« prev ^ index » next coverage.py v7.4.4, created at 2024-09-14 14:49 -0400
1""" Simultate some peaks add noise and fit using peakipy """
3import numpy as np
4import pandas as pd
5from lmfit import Model
6from skimage.filters import threshold_otsu
7from nmrglue.fileio.fileiobase import unit_conversion
8from mpl_toolkits.mplot3d import axes3d
9import matplotlib.pyplot as plt
11from peakipy.lineshapes import pvoigt2d, Lineshape
12from peakipy.fitting import (
13 simulate_lineshapes_from_fitted_peak_parameters,
14 make_models,
15 make_meshgrid,
16 FitPeaksArgs,
17 FitPeaksInput,
18 fit_peak_clusters,
19)
22uc_x = unit_conversion(400, False, 2400, 600, 4800)
23uc_y = unit_conversion(200, False, 1200, 60, 7200)
24uc_dics = {"f1": uc_y, "f2": uc_x}
26p1 = dict(
27 amp=10,
28 center_x=200.0,
29 center_y=100.0,
30 sigma_x=10.0,
31 sigma_y=18.0,
32 fraction=0.5,
33 lineshape="PV",
34 ASS="one",
35)
37p2 = dict(
38 amp=12,
39 center_x=220.0,
40 center_y=130.0,
41 sigma_x=20.0,
42 sigma_y=15.0,
43 fraction=0.5,
44 lineshape="PV",
45 ASS="two",
46)
48peak_parameters = pd.DataFrame([p1, p2])
49peak_parameters["X_AXIS"] = peak_parameters.center_x
50peak_parameters["Y_AXIS"] = peak_parameters.center_y
51peak_parameters["X_AXISf"] = peak_parameters.center_x
52peak_parameters["Y_AXISf"] = peak_parameters.center_y
53peak_parameters["X_RADIUS"] = 60
54peak_parameters["Y_RADIUS"] = 30
55peak_parameters["X_PPM"] = peak_parameters.center_x.apply(uc_x.ppm)
56peak_parameters["Y_PPM"] = peak_parameters.center_x.apply(uc_x.ppm)
57peak_parameters["XW"] = peak_parameters.sigma_x
58peak_parameters["YW"] = peak_parameters.sigma_y
59peak_parameters["CLUSTID"] = 1
60peak_parameters["MEMCNT"] = peak_parameters.shape[0]
61peak_parameters["plane"] = 0
63x = 400
64y = 200
65data_shape_Y_X = (y, x)
66data_shape_X_Y = (x, y)
67XY = make_meshgrid(data_shape_Y_X)
68X, Y = XY
69Z_sim = np.random.normal(loc=0.0, scale=0.0001, size=data_shape_Y_X)
70Z_sim_singles = []
71Z_sim, Z_sim_singles = simulate_lineshapes_from_fitted_peak_parameters(
72 peak_parameters=peak_parameters,
73 XY=XY,
74 sim_data=Z_sim,
75 sim_data_singles=Z_sim_singles,
76)
78fit_peaks_args = FitPeaksArgs(
79 noise=threshold_otsu(Z_sim),
80 uc_dics=uc_dics,
81 lineshape=Lineshape.PV,
82 max_cluster_size=10,
83 reference_plane_indices=[],
84 xy_bounds=None,
85 initial_fit_threshold=None,
86 vclist=None,
87)
89fit_peaks_input = FitPeaksInput(
90 fit_peaks_args, Z_sim.reshape(1, y, x), dict(dims=[0, 1]), plane_numbers=[0]
91)
93fit_peaks_result = fit_peak_clusters(peak_parameters, fit_peaks_input)
96def test_fit_from_simulated_data():
97 pd.testing.assert_series_equal(
98 fit_peaks_result.df.center_x,
99 fit_peaks_result.df.center_x_init,
100 check_exact=False,
101 check_names=False,
102 rtol=1e-3,
103 )
104 pd.testing.assert_series_equal(
105 fit_peaks_result.df.center_y,
106 fit_peaks_result.df.center_y_init,
107 check_exact=False,
108 check_names=False,
109 rtol=1e-3,
110 )
111 pd.testing.assert_series_equal(
112 fit_peaks_result.df.sigma_x,
113 fit_peaks_result.df.sigma_x_init,
114 check_exact=False,
115 check_names=False,
116 rtol=1e-2,
117 )
118 pd.testing.assert_series_equal(
119 fit_peaks_result.df.sigma_y,
120 fit_peaks_result.df.sigma_y_init,
121 check_exact=False,
122 check_names=False,
123 rtol=1e-2,
124 )
127def test_fit_from_simulated_data_jack_knife():
128 fit_peaks_input = FitPeaksInput(
129 fit_peaks_args, Z_sim.reshape(1, y, x), dict(dims=[0, 1]), plane_numbers=[0]
130 )
131 fit_peaks_input.args.jack_knife_sample_errors = True
132 fit_peaks_result = fit_peak_clusters(peak_parameters, fit_peaks_input)
135# def plot3D(X,Y,Z,Z_singles):
136# fig = plt.figure()
137# ax = fig.add_subplot(projection='3d')
138# ax.plot_wireframe(X,Y,Z)
139# for Z_single in Z_singles:
140# ax.plot_surface(X, Y, Z_single,alpha=0.5)
141# plt.xlabel("X")
142# plt.ylabel("Y")
143# plt.show()