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

1""" Simultate some peaks add noise and fit using peakipy """ 

2 

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 

10 

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) 

20 

21 

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} 

25 

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) 

36 

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) 

47 

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 

62 

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) 

77 

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) 

88 

89fit_peaks_input = FitPeaksInput( 

90 fit_peaks_args, Z_sim.reshape(1, y, x), dict(dims=[0, 1]), plane_numbers=[0] 

91) 

92 

93fit_peaks_result = fit_peak_clusters(peak_parameters, fit_peaks_input) 

94 

95 

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 ) 

125 

126 

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) 

133 

134 

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()