def setUp(self):
     self.x = numpy.arange(100)
     self.y = 10 + 0.05 * self.x + sum_gauss(self.x, 10., 45., 15.)
     # add a very narrow high amplitude peak to test strip and snip
     self.y += sum_gauss(self.x, 100., 75., 2.)
     self.narrow_peak_index = list(self.x).index(75)
     random.seed()
Exemple #2
0
def main():
    # synthetic data
    from silx.math.fit.functions import sum_gauss

    x = numpy.arange(5000)
    # (height1, center1, fwhm1, ...) 5 peaks
    params1 = (50, 500, 100,
               20, 2000, 200,
               50, 2250, 100,
               40, 3000, 75,
               23, 4000, 150)
    y0 = sum_gauss(x, *params1)

    # random values between [-1;1]
    noise = 2 * numpy.random.random(5000) - 1
    # make it +- 5%
    noise *= 0.05

    # 2 gaussians with very large fwhm, as background signal
    actual_bg = sum_gauss(x, 15, 3500, 3000, 5, 1000, 1500)

    # Add 5% random noise to gaussians and add background
    y = y0 + numpy.average(y0) * noise + actual_bg

    # Open widget
    a = qt.QApplication(sys.argv)
    a.lastWindowClosed.connect(a.quit)

    def mySlot(ddict):
        print(ddict)

    w = BackgroundDialog()
    w.parametersWidget.parametersWidget.sigBackgroundParamWidgetSignal.connect(mySlot)
    w.setData(x, y)
    w.exec_()
Exemple #3
0
def main():
    # synthetic data
    from silx.math.fit.functions import sum_gauss

    x = numpy.arange(5000)
    # (height1, center1, fwhm1, ...) 5 peaks
    params1 = (50, 500, 100,
               20, 2000, 200,
               50, 2250, 100,
               40, 3000, 75,
               23, 4000, 150)
    y0 = sum_gauss(x, *params1)

    # random values between [-1;1]
    noise = 2 * numpy.random.random(5000) - 1
    # make it +- 5%
    noise *= 0.05

    # 2 gaussians with very large fwhm, as background signal
    actual_bg = sum_gauss(x, 15, 3500, 3000, 5, 1000, 1500)

    # Add 5% random noise to gaussians and add background
    y = y0 + numpy.average(y0) * noise + actual_bg

    # Open widget
    a = qt.QApplication(sys.argv)
    a.lastWindowClosed.connect(a.quit)

    def mySlot(ddict):
        print(ddict)

    w = BackgroundDialog()
    w.parametersWidget.parametersWidget.sigBackgroundParamWidgetSignal.connect(mySlot)
    w.setData(x, y)
    w.exec()
Exemple #4
0
def gaussian_fit(y, x):

    #
    # Fitting
    #
    from silx.math.fit.functions import sum_gauss
    from silx.math.fit import fittheories
    from silx.math.fit.fitmanager import FitManager

    p = [y.max(), 0, 5]

    fit = FitManager()
    fit.setdata(x=x, y=y)
    fit.loadtheories(fittheories)
    fit.settheory('Gaussians')
    fit.estimate()
    fit.runfit()

    print("Searched parameters = %s" % p)
    print("Obtained parameters : ")
    dummy_list = []
    for param in fit.fit_results:
        print(param['name'], ' = ', param['fitresult'])
        dummy_list.append(param['fitresult'])
    print("chisq = ", fit.chisq)
    fwhm_txt = "FWHM of fit = %5.3f um" % (fit.fit_results[2]['fitresult'])
    y1 = sum_gauss(x, *dummy_list)

    return y1
Exemple #5
0
    def testFitManager(self):
        """Test fit manager on synthetic data using a gaussian function
        and a linear background"""
        # Create synthetic data with a sum of gaussian functions
        x = numpy.arange(1000).astype(numpy.float64)

        p = [1000, 100., 250,
             255, 650., 45,
             1500, 800.5, 95]
        linear_bg = 2.65 * x + 13
        y = linear_bg + sum_gauss(x, *p)

        y_with_nans = numpy.array(y)
        y_with_nans[::10] = numpy.nan

        x_with_nans = numpy.array(x)
        x_with_nans[5::15] = numpy.nan

        tests = {
            'all finite': (x, y),
            'y with NaNs': (x, y_with_nans),
            'x with NaNs': (x_with_nans, y),
            }

        for name, (xdata, ydata) in tests.items():
            with self.subTest(name=name):
                # Fitting
                fit = fitmanager.FitManager()
                fit.setdata(x=xdata, y=ydata)
                fit.loadtheories(fittheories)
                # Use one of the default fit functions
                fit.settheory('Gaussians')
                fit.setbackground('Linear')
                fit.estimate()
                fit.runfit()

                # fit.fit_results[]

                # first 2 parameters are related to the linear background
                self.assertEqual(fit.fit_results[0]["name"], "Constant")
                self.assertAlmostEqual(fit.fit_results[0]["fitresult"], 13)
                self.assertEqual(fit.fit_results[1]["name"], "Slope")
                self.assertAlmostEqual(fit.fit_results[1]["fitresult"], 2.65)

                for i, param in enumerate(fit.fit_results[2:]):
                    param_number = i // 3 + 1
                    if i % 3 == 0:
                        self.assertEqual(param["name"],
                                         "Height%d" % param_number)
                    elif i % 3 == 1:
                        self.assertEqual(param["name"],
                                         "Position%d" % param_number)
                    elif i % 3 == 2:
                        self.assertEqual(param["name"],
                                         "FWHM%d" % param_number)

                    self.assertAlmostEqual(param["fitresult"],
                                           p[i])
                    self.assertAlmostEqual(_order_of_magnitude(param["estimation"]),
                                           _order_of_magnitude(p[i]))
def test():
    from silx.math.fit import fittheories
    from silx.math.fit import fitmanager
    from silx.math.fit import functions
    from silx.gui.plot.PlotWindow import PlotWindow
    import numpy

    a = qt.QApplication([])

    x = numpy.arange(1000)
    y1 = functions.sum_gauss(x, 100, 400, 100)

    fit = fitmanager.FitManager(x=x, y=y1)

    fitfuns = fittheories.FitTheories()
    fit.addtheory(name="Gaussian",
                  function=functions.sum_gauss,
                  parameters=("height", "peak center", "fwhm"),
                  estimate=fitfuns.estimate_height_position_fwhm)
    fit.settheory('Gaussian')
    fit.configure(
        PositiveFwhmFlag=True,
        PositiveHeightAreaFlag=True,
        AutoFwhm=True,
    )

    # Fit
    fit.estimate()
    fit.runfit()

    w = ParametersTab()
    w.show()
    w.fillFromFit(fit.fit_results, view='Gaussians')

    y2 = functions.sum_splitgauss(x, 100, 400, 100, 40, 10, 600, 50, 500, 80,
                                  850, 10, 50)
    fit.setdata(x=x, y=y2)

    # Define new theory
    fit.addtheory(name="Asymetric gaussian",
                  function=functions.sum_splitgauss,
                  parameters=("height", "peak center", "left fwhm",
                              "right fwhm"),
                  estimate=fitfuns.estimate_splitgauss)
    fit.settheory('Asymetric gaussian')

    # Fit
    fit.estimate()
    fit.runfit()

    w.fillFromFit(fit.fit_results, view='Asymetric gaussians')

    # Plot
    pw = PlotWindow(control=True)
    pw.addCurve(x, y1, "Gaussians")
    pw.addCurve(x, y2, "Asymetric gaussians")
    pw.show()

    a.exec_()
Exemple #7
0
    def testGauss(self):
        """Compare sum_gauss with scipy.signals.gaussian"""
        y = functions.sum_gauss(self.x, self.g_params["height"],
                                self.g_params["center"],
                                self.g_params["fwhm1"])

        for i in range(11):
            self.assertAlmostEqual(y[i], self.scipy_gaussian[i])
Exemple #8
0
def test():
    from silx.math.fit import fittheories
    from silx.math.fit import fitmanager
    from silx.math.fit import functions
    from silx.gui.plot.PlotWindow import PlotWindow
    import numpy

    a = qt.QApplication([])

    x = numpy.arange(1000)
    y1 = functions.sum_gauss(x, 100, 400, 100)

    fit = fitmanager.FitManager(x=x, y=y1)

    fitfuns = fittheories.FitTheories()
    fit.addtheory(name="Gaussian",
                  function=functions.sum_gauss,
                  parameters=("height", "peak center", "fwhm"),
                  estimate=fitfuns.estimate_height_position_fwhm)
    fit.settheory('Gaussian')
    fit.configure(PositiveFwhmFlag=True,
                  PositiveHeightAreaFlag=True,
                  AutoFwhm=True,)

    # Fit
    fit.estimate()
    fit.runfit()

    w = ParametersTab()
    w.show()
    w.fillFromFit(fit.fit_results, view='Gaussians')

    y2 = functions.sum_splitgauss(x,
                                  100, 400, 100, 40,
                                  10, 600, 50, 500,
                                  80, 850, 10, 50)
    fit.setdata(x=x, y=y2)

    # Define new theory
    fit.addtheory(name="Asymetric gaussian",
                  function=functions.sum_splitgauss,
                  parameters=("height", "peak center", "left fwhm", "right fwhm"),
                  estimate=fitfuns.estimate_splitgauss)
    fit.settheory('Asymetric gaussian')

    # Fit
    fit.estimate()
    fit.runfit()

    w.fillFromFit(fit.fit_results, view='Asymetric gaussians')

    # Plot
    pw = PlotWindow(control=True)
    pw.addCurve(x, y1, "Gaussians")
    pw.addCurve(x, y2, "Asymetric gaussians")
    pw.show()

    a.exec_()
Exemple #9
0
    def testGauss(self):
        """Compare sum_gauss with scipy.signals.gaussian"""
        y = functions.sum_gauss(self.x,
                                self.g_params["height"],
                                self.g_params["center"],
                                self.g_params["fwhm1"])

        for i in range(11):
            self.assertAlmostEqual(y[i], self.scipy_gaussian[i])
    def testQuarticcBg(self):
        gaussian_params = [10000, 69, 25]
        poly_params = [5e-10, 0.0005, 0.005, 2, 4]
        p = numpy.poly1d(poly_params)

        y = p(self.x) + sum_gauss(self.x, *gaussian_params)

        fm = fitmanager.FitManager(self.x, y)
        fm.loadtheories(fittheories)
        fm.settheory("Gaussians")
        fm.setbackground("Degree 4 Polynomial")
        esti_params = fm.estimate()
        fit_params = fm.runfit()[0]

        for p, pfit in zip(poly_params + gaussian_params, fit_params):
            self.assertAlmostEqual(p, pfit, places=5)
    def testCubicBg(self):
        gaussian_params = [1000, 45, 8]
        poly_params = [0.0005, -0.05, 3, -4]
        p = numpy.poly1d(poly_params)

        y = p(self.x) + sum_gauss(self.x, *gaussian_params)

        fm = fitmanager.FitManager(self.x, y)
        fm.loadtheories(fittheories)
        fm.settheory("Gaussians")
        fm.setbackground("Degree 3 Polynomial")
        esti_params = fm.estimate()
        fit_params = fm.runfit()[0]

        for p, pfit in zip(poly_params + gaussian_params, fit_params):
            self.assertAlmostEqual(p, pfit)
Exemple #12
0
    def testFitManager(self):
        """Test fit manager on synthetic data using a gaussian function
        and a linear background"""
        # Create synthetic data with a sum of gaussian functions
        x = numpy.arange(1000).astype(numpy.float)

        p = [1000, 100., 250,
             255, 650., 45,
             1500, 800.5, 95]
        linear_bg = 2.65 * x + 13
        y = linear_bg + sum_gauss(x, *p)

        # Fitting
        fit = fitmanager.FitManager()
        fit.setdata(x=x, y=y)
        fit.loadtheories(fittheories)
        # Use one of the default fit functions
        fit.settheory('Gaussians')
        fit.setbackground('Linear')
        fit.estimate()
        fit.runfit()

        # fit.fit_results[]

        # first 2 parameters are related to the linear background
        self.assertEqual(fit.fit_results[0]["name"], "Constant")
        self.assertAlmostEqual(fit.fit_results[0]["fitresult"], 13)
        self.assertEqual(fit.fit_results[1]["name"], "Slope")
        self.assertAlmostEqual(fit.fit_results[1]["fitresult"], 2.65)

        for i, param in enumerate(fit.fit_results[2:]):
            param_number = i // 3 + 1
            if i % 3 == 0:
                self.assertEqual(param["name"],
                                 "Height%d" % param_number)
            elif i % 3 == 1:
                self.assertEqual(param["name"],
                                 "Position%d" % param_number)
            elif i % 3 == 2:
                self.assertEqual(param["name"],
                                 "FWHM%d" % param_number)

            self.assertAlmostEqual(param["fitresult"],
                                   p[i])
            self.assertAlmostEqual(_order_of_magnitude(param["estimation"]),
                                   _order_of_magnitude(p[i]))
Exemple #13
0
    def testCubicBg(self):
        gaussian_params = [1000, 45, 8]
        poly_params = [0.0005, -0.05, 3, -4]
        p = numpy.poly1d(poly_params)

        y = p(self.x) + sum_gauss(self.x, *gaussian_params)

        fm = fitmanager.FitManager(self.x, y)
        fm.loadtheories(fittheories)
        fm.settheory("Gaussians")
        fm.setbackground("Degree 3 Polynomial")
        esti_params = fm.estimate()
        fit_params = fm.runfit()[0]

        for p, pfit in zip(poly_params + gaussian_params, fit_params):
            self.assertAlmostEqual(p,
                                   pfit)
Exemple #14
0
    def testQuarticcBg(self):
        gaussian_params = [10000, 69, 25]
        poly_params = [5e-10, 0.0005, 0.005, 2, 4]
        p = numpy.poly1d(poly_params)

        y = p(self.x) + sum_gauss(self.x, *gaussian_params)

        fm = fitmanager.FitManager(self.x, y)
        fm.loadtheories(fittheories)
        fm.settheory("Gaussians")
        fm.setbackground("Degree 4 Polynomial")
        esti_params = fm.estimate()
        fit_params = fm.runfit()[0]

        for p, pfit in zip(poly_params + gaussian_params, fit_params):
            self.assertAlmostEqual(p,
                                   pfit,
                                   places=5)
Exemple #15
0
            else:
                chisq = data['chisq']
                self.guistatus.ChisqLine.setText("%6.2f" % chisq)

        if 'status' in data:
            status = data['status']
            self.guistatus.StatusLine.setText(str(status))

    def dismiss(self):
        """Close FitWidget"""
        self.close()


if __name__ == "__main__":
    import numpy

    x = numpy.arange(1500).astype(numpy.float64)
    constant_bg = 3.14

    p = [
        1000, 100., 30.0, 500, 300., 25., 1700, 500., 35., 750, 700., 30.0,
        1234, 900., 29.5, 302, 1100., 30.5, 75, 1300., 21.
    ]
    y = functions.sum_gauss(x, *p) + constant_bg

    a = qt.QApplication(sys.argv)
    w = FitWidget()
    w.setData(x=x, y=y)
    w.show()
    a.exec()
Exemple #16
0
# fit.settheory('Area Gaussians')
# fit.settheory('Slit')
fit.estimate()
fit.runfit()

print("Searched parameters = %s" % p)
print("Obtained parameters : ")
dummy_list = []
for param in fit.fit_results:
    # print(param)
    print(param['name'], ' = ', param['fitresult'])
    if param['name'] == "FWHM1":
        print("sigma1 = ",
              param['fitresult'] / (2 * numpy.sqrt(2 * numpy.log(2))))
    dummy_list.append(param['fitresult'])
print("chisq = ", fit.chisq)

y1 = sum_gauss(x, *dummy_list)
# y1 = sum_agauss(x, *dummy_list)

print("Area original: ", y.sum() * (x[1] - x[0]))
print("Area fit: ", y1.sum() * (x[1] - x[0]))

plt.rc('text', usetex=True)
plt.plot(x, y)
plt.xlabel(r'$\theta_r=\theta\sqrt{L/\lambda}$')  # =\sigma_{\mu}/\sigma_I')
plt.ylabel(r'$(sin(\Gamma)/\Gamma)^2$')
plt.plot(x, y1)
plt.savefig('undulator_fit.eps')
plt.show()
Exemple #17
0
        if 'status' in data:
            status = data['status']
            self.guistatus.StatusLine.setText(str(status))

    def dismiss(self):
        """Close FitWidget"""
        self.close()


if __name__ == "__main__":
    import numpy

    x = numpy.arange(1500).astype(numpy.float)
    constant_bg = 3.14

    p = [1000, 100., 30.0,
         500, 300., 25.,
         1700, 500., 35.,
         750, 700., 30.0,
         1234, 900., 29.5,
         302, 1100., 30.5,
         75, 1300., 21.]
    y = functions.sum_gauss(x, *p) + constant_bg

    a = qt.QApplication(sys.argv)
    w = FitWidget()
    w.setData(x=x, y=y)
    w.show()
    a.exec_()
Exemple #18
0
def gaussian_fit_scan(simulation_test0,
                      shift_min=-5e-2,
                      shift_max=5e-2,
                      shift_n=5,
                      do_plot=True):
    from silx.math.fit.functions import sum_gauss
    from silx.math.fit import fittheories
    from silx.math.fit.fitmanager import FitManager

    SHIFT = np.linspace(shift_min, shift_max, shift_n)

    CHI = np.zeros_like(SHIFT)
    KUR = np.zeros_like(SHIFT)

    for i, shift in enumerate(SHIFT):

        simulation_test = simulation_test0.copy()
        print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", SHIFT[i])

        omega0 = simulation_test.radiation_fact.photon_frequency
        omega = omega0 + omega0 * shift
        simulation_test.radiation_fact.photon_frequency = omega

        simulation_test.update_radiation()

        #
        #
        #

        x = 1e6 * simulation_test.radiation.Y[0, :]
        y = simulation_test.radiation.intensity[0, :]

        y /= y.max()

        #
        # Fitting
        #

        p = [y.max(), 0, 0.3 * x.max()]

        fit = FitManager()
        fit.setdata(x=x, y=y)
        fit.loadtheories(fittheories)
        fit.settheory('Gaussians')
        fit.estimate()
        fit.runfit()

        print("Searched parameters = %s" % p)
        print("Obtained parameters : ")
        dummy_list = []
        for param in fit.fit_results:
            print(param['name'], ' = ', param['fitresult'])
            dummy_list.append(param['fitresult'])
        print("chisq = ", fit.chisq)
        fwhm_txt = "FWHM of fit = %5.3f um" % (fit.fit_results[2]['fitresult'])
        y1 = sum_gauss(x, *dummy_list)

        # plot(x,y,x,y1,legend=["data","fit"])

        print(">>>> Kurtosis0: ", scipy.stats.kurtosis(y, axis=None))
        print(">>>> Kurtosis: ", scipy.stats.kurtosis(y1, axis=None))

        print(">>>>>>> chi**2", ((y - y1)**2).sum())
        KUR[i] = scipy.stats.kurtosis(y1, axis=None)
        CHI[i] = ((y - y1)**2).sum()

    plot(SHIFT, CHI, title="CHI", show=False)
    plot(SHIFT, KUR, title="kur")