From 485c9770e74bd57dfd0ad0c7943d1145aea51380 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Tue, 5 Jul 2022 00:57:14 +0300 Subject: [PATCH 01/15] WIP red dwarf flares fitting --- .../light_curve/light_curve_py/__init__.py | 1 + .../light_curve_py/features/red_dwarf_fit.py | 89 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py diff --git a/light-curve/light_curve/light_curve_py/__init__.py b/light-curve/light_curve/light_curve_py/__init__.py index b94c9df6..de52ea8f 100644 --- a/light-curve/light_curve/light_curve_py/__init__.py +++ b/light-curve/light_curve/light_curve_py/__init__.py @@ -23,6 +23,7 @@ from .features.otsusplit import * from .features.pdiffmperc import * from .features.percampl import * +from .features.red_dwarf_fit import * from .features.redchi2 import * from .features.skew import * from .features.stdev import * diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py new file mode 100644 index 00000000..c6bdfd02 --- /dev/null +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -0,0 +1,89 @@ +import numpy as np +from scipy.special import erfc +from scipy.stats import chisquare, sigmaclip + +from ._base import BaseFeature + + +class RedDwarfFit(BaseFeature): + """Red dwarf flares fitting function. + + - Depends on: **time**, **magnitude** + - Minimum number of observations: **2** + - Number of features: **4** + + Note, that the function is developed to be used with fluxes, not magnitudes. + + Guadalupe Tovar Mendoza et al. 2022 [DOI:10.3847/1538-3881/ac6fe6](https://doi.org/10.3847/1538-3881/ac6fe6) + """ + + def _eval(self, t, m, sigma=None): + amplitude, fwhm, tpeak = RedDwarfFit._flare_params(t, m) + model = self.fit(t, amplitude, fwhm, tpeak) + chi2 = np.sum((m - model) ** 2) / (len(m) - 1) + + return np.array([amplitude, fwhm, tpeak, chi2]) + + @staticmethod + def _flare_params(t, m): + clipped = sigmaclip(m, low=3.0, high=3.0)[0] + background = np.mean(clipped) + clean_flux = m - background + peak = np.argmax(clean_flux) + amplitude = clean_flux[peak] + tpeak = t[peak] + + left_idx = np.where(clean_flux[:peak] < 0.5 * clean_flux[peak])[0][-1] + left_t = t[left_idx] + (t[left_idx + 1] - t[left_idx]) * (0.5 * clean_flux[peak] - clean_flux[left_idx]) / ( + clean_flux[left_idx + 1] - clean_flux[left_idx] + ) + + right_idx = (np.where(clean_flux[peak:] < 0.5 * clean_flux[peak]) + peak)[0][0] + right_t = t[right_idx] + (t[right_idx + 1] - t[right_idx]) * ( + 0.5 * clean_flux[peak] - clean_flux[right_idx] + ) / (clean_flux[right_idx + 1] - clean_flux[right_idx]) + + fwhm = right_t - left_t + + return amplitude, fwhm, tpeak + + @staticmethod + def fit(t, amplitude, fwhm, tpeak): + A, B, C, D1, D2, f1 = [ + 0.9687734504375167, + -0.251299705922117, + 0.22675974948468916, + 0.15551880775110513, + 1.2150539528490194, + 0.12695865022878844, + ] + + t_new = (t - tpeak) / fwhm + f2 = 1 - f1 + + eq = ( + (1 / 2) + * np.sqrt(np.pi) + * A + * C + * f1 + * np.exp(-D1 * t_new + ((B / C) + (D1 * C / 2)) ** 2) + * erfc(((B - t_new) / C) + (C * D1 / 2)) + ) + ( + (1 / 2) + * np.sqrt(np.pi) + * A + * C + * f2 + * np.exp(-D2 * t_new + ((B / C) + (D2 * C / 2)) ** 2) + * erfc(((B - t_new) / C) + (C * D2 / 2)) + ) + + return eq * amplitude + + @property + def size(self): + return 4 + + +__all__ = ("RedDwarfFit",) From a78ad1f37f6f86541e4c4bd6c98895601e396112 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Tue, 5 Jul 2022 01:12:02 +0300 Subject: [PATCH 02/15] fix chi2: subtract background from flux --- .../light_curve/light_curve_py/features/red_dwarf_fit.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index c6bdfd02..c5c4b1b9 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -18,9 +18,10 @@ class RedDwarfFit(BaseFeature): """ def _eval(self, t, m, sigma=None): - amplitude, fwhm, tpeak = RedDwarfFit._flare_params(t, m) + amplitude, fwhm, tpeak, background = RedDwarfFit._flare_params(t, m) + m_clear = m - background model = self.fit(t, amplitude, fwhm, tpeak) - chi2 = np.sum((m - model) ** 2) / (len(m) - 1) + chi2 = np.sum((m_clear - model) ** 2) / (len(m) - 1) return np.array([amplitude, fwhm, tpeak, chi2]) @@ -45,7 +46,7 @@ def _flare_params(t, m): fwhm = right_t - left_t - return amplitude, fwhm, tpeak + return amplitude, fwhm, tpeak, background @staticmethod def fit(t, amplitude, fwhm, tpeak): From ab2009659df7e489422a5fd0ce590fe9d30c324b Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 01:19:57 +0300 Subject: [PATCH 03/15] parametric fit --- .../light_curve_py/features/red_dwarf_fit.py | 144 +++++++++++++----- 1 file changed, 105 insertions(+), 39 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index c5c4b1b9..deb22ae1 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -1,29 +1,51 @@ +from dataclasses import dataclass + import numpy as np +from iminuit import Minuit +from iminuit.cost import LeastSquares +from scipy.optimize import curve_fit from scipy.special import erfc -from scipy.stats import chisquare, sigmaclip +from scipy.stats import sigmaclip from ._base import BaseFeature +@dataclass() class RedDwarfFit(BaseFeature): """Red dwarf flares fitting function. - - Depends on: **time**, **magnitude** - - Minimum number of observations: **2** - - Number of features: **4** + The function returns computed amplitude, fwhm, tpeak, chi2 and 7 parameters of the fit. + + - Depends on: **time**, **magnitude**, **sigma** + - Minimum number of observations: **7** + - Number of features: **11** Note, that the function is developed to be used with fluxes, not magnitudes. Guadalupe Tovar Mendoza et al. 2022 [DOI:10.3847/1538-3881/ac6fe6](https://doi.org/10.3847/1538-3881/ac6fe6) """ + method: str = "scipy" + def _eval(self, t, m, sigma=None): amplitude, fwhm, tpeak, background = RedDwarfFit._flare_params(t, m) - m_clear = m - background - model = self.fit(t, amplitude, fwhm, tpeak) - chi2 = np.sum((m_clear - model) ** 2) / (len(m) - 1) + norm_t = (t - tpeak) / fwhm + + if sigma is None: + pass # check if there is no sigma, do np.array(ones) + + if self.method == "scipy": + popt = RedDwarfFit._scipy_optimize(t, m, amplitude, fwhm, tpeak, background) + elif self.method == "minuit": + popt = RedDwarfFit._minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background) + else: + raise ValueError + + func = RedDwarfFit._func(amplitude) + model = func(norm_t, *popt) + chi2 = np.sum((m - model) ** 2) / (len(m) - 7) - return np.array([amplitude, fwhm, tpeak, chi2]) + return np.concatenate((np.array([amplitude, fwhm, tpeak, chi2]), popt)) @staticmethod def _flare_params(t, m): @@ -49,42 +71,86 @@ def _flare_params(t, m): return amplitude, fwhm, tpeak, background @staticmethod - def fit(t, amplitude, fwhm, tpeak): - A, B, C, D1, D2, f1 = [ - 0.9687734504375167, - -0.251299705922117, - 0.22675974948468916, - 0.15551880775110513, - 1.2150539528490194, - 0.12695865022878844, - ] - - t_new = (t - tpeak) / fwhm - f2 = 1 - f1 - - eq = ( - (1 / 2) - * np.sqrt(np.pi) - * A - * C - * f1 - * np.exp(-D1 * t_new + ((B / C) + (D1 * C / 2)) ** 2) - * erfc(((B - t_new) / C) + (C * D1 / 2)) - ) + ( - (1 / 2) - * np.sqrt(np.pi) - * A - * C - * f2 - * np.exp(-D2 * t_new + ((B / C) + (D2 * C / 2)) ** 2) - * erfc(((B - t_new) / C) + (C * D2 / 2)) + def _func(amplitude): + eq = lambda t, A, B, C, D1, D2, f1, background: amplitude * ( + background + + ( + (1 / 2) + * np.sqrt(np.pi) + * A + * C + * f1 + * np.exp(-D1 * t + ((B / C) + (D1 * C / 2)) ** 2) + * erfc(((B - t) / C) + (C * D1 / 2)) + ) + + ( + (1 / 2) + * np.sqrt(np.pi) + * A + * C + * (1 - f1) + * np.exp(-D2 * t + ((B / C) + (D2 * C / 2)) ** 2) + * erfc(((B - t) / C) + (C * D2 / 2)) + ) ) - return eq * amplitude + return eq + + @staticmethod + def _scipy_optimize(t, m, amplitude, fwhm, tpeak, background): + initial = np.array( + [ + 0.9687734504375167, + -0.251299705922117, + 0.22675974948468916, + 0.15551880775110513, + 1.2150539528490194, + 0.12695865022878844, + background / amplitude, + ] + ) + + func = RedDwarfFit._func(amplitude) + norm_t = (t - tpeak) / fwhm + + popt, _ = curve_fit(func, norm_t, m, p0=initial) + + return np.array(popt) + + @staticmethod + def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): + func = RedDwarfFit._func(amplitude) + norm_t = (t - tpeak) / fwhm + + initial_dict = { + "A": 0.9687734504375167, + "B": -0.251299705922117, + "C": 0.22675974948468916, + "D1": 0.15551880775110513, + "D2": 1.2150539528490194, + "f1": 0.12695865022878844, + "background": background / amplitude, + } + + least_squares = LeastSquares(norm_t, m, sigma, func) + fit = Minuit(least_squares, **initial_dict).migrad() + + popt = fit.values + + return np.array(popt) + + @staticmethod + def model(t, params): + amplitude, fwhm, tpeak, _, *popt = params + norm_t = (t - tpeak) / fwhm + func = RedDwarfFit._func(amplitude) + predict = func(norm_t, *popt) + + return predict @property def size(self): - return 4 + return 11 __all__ = ("RedDwarfFit",) From 1fbb39be452e4cb767a0f34da96aadc4751ead53 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 01:29:42 +0300 Subject: [PATCH 04/15] t_norm -> t in model --- .../light_curve/light_curve_py/features/red_dwarf_fit.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index deb22ae1..30e643e3 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -142,9 +142,8 @@ def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): @staticmethod def model(t, params): amplitude, fwhm, tpeak, _, *popt = params - norm_t = (t - tpeak) / fwhm func = RedDwarfFit._func(amplitude) - predict = func(norm_t, *popt) + predict = func(t, *popt) return predict From 6303887fa24a00238bd53a8add73001bf184942b Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 02:18:05 +0300 Subject: [PATCH 05/15] dependencies update: added iminuit --- light-curve/pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/light-curve/pyproject.toml b/light-curve/pyproject.toml index 2dfd2497..8fcafb9b 100644 --- a/light-curve/pyproject.toml +++ b/light-curve/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "light-curve" -dependencies = ["numpy", "scipy", "dataclasses; python_version < '3.7'"] +dependencies = ["numpy", "scipy", "iminuit", "dataclasses; python_version < '3.7'"] classifier = ["Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Rust", "Topic :: Scientific/Engineering :: Astronomy"] [tool.maturin] @@ -41,6 +41,7 @@ deps = pytest-markdown numpy scipy + iminuit feets commands = pytest README.md tests/ light_curve/ """ From 2f2341e871d8620c2dfdbf134e31a9608f2da96e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 23:39:01 +0000 Subject: [PATCH 06/15] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- light-curve/light_curve/light_curve_py/features/_base.py | 1 - light-curve/light_curve/light_curve_py/features/extractor.py | 1 - light-curve/tests/light_curve_ext/test_dmdt.py | 3 +-- light-curve/tests/light_curve_ext/test_feature.py | 3 +-- light-curve/tests/light_curve_py/test_adnormal.py | 3 +-- light-curve/tests/light_curve_py/test_amplitude.py | 3 +-- light-curve/tests/light_curve_py/test_beyondnstd.py | 3 +-- light-curve/tests/light_curve_py/test_bins.py | 1 - light-curve/tests/light_curve_py/test_call.py | 1 - light-curve/tests/light_curve_py/test_cusum.py | 3 +-- light-curve/tests/light_curve_py/test_eta.py | 3 +-- light-curve/tests/light_curve_py/test_etae.py | 3 +-- light-curve/tests/light_curve_py/test_excvar.py | 3 +-- light-curve/tests/light_curve_py/test_extractor.py | 1 - light-curve/tests/light_curve_py/test_intpercrange.py | 3 +-- light-curve/tests/light_curve_py/test_kurtosis.py | 3 +-- light-curve/tests/light_curve_py/test_linfit.py | 3 +-- light-curve/tests/light_curve_py/test_lintrend.py | 3 +-- light-curve/tests/light_curve_py/test_magnpratio.py | 3 +-- light-curve/tests/light_curve_py/test_maxslope.py | 3 +-- light-curve/tests/light_curve_py/test_mean.py | 3 +-- light-curve/tests/light_curve_py/test_meanvar.py | 3 +-- light-curve/tests/light_curve_py/test_medabsdev.py | 3 +-- light-curve/tests/light_curve_py/test_medbufrperc.py | 3 +-- light-curve/tests/light_curve_py/test_median.py | 3 +-- light-curve/tests/light_curve_py/test_n_not_det_before_fd.py | 1 - light-curve/tests/light_curve_py/test_otsusplit.py | 3 +-- light-curve/tests/light_curve_py/test_pdiffmperc.py | 3 +-- light-curve/tests/light_curve_py/test_percampl.py | 3 +-- light-curve/tests/light_curve_py/test_redchi2.py | 3 +-- light-curve/tests/light_curve_py/test_skew.py | 3 +-- light-curve/tests/light_curve_py/test_stdev.py | 3 +-- light-curve/tests/light_curve_py/test_stetsonk.py | 3 +-- light-curve/tests/light_curve_py/test_weightmean.py | 3 +-- light-curve/tests/test_w_bench.py | 5 ++--- 35 files changed, 30 insertions(+), 65 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/_base.py b/light-curve/light_curve/light_curve_py/features/_base.py index 886b6be6..66273a1a 100644 --- a/light-curve/light_curve/light_curve_py/features/_base.py +++ b/light-curve/light_curve/light_curve_py/features/_base.py @@ -2,7 +2,6 @@ from dataclasses import dataclass import numpy as np - from light_curve.light_curve_py.warnings import mark_experimental, warn_experimental diff --git a/light-curve/light_curve/light_curve_py/features/extractor.py b/light-curve/light_curve/light_curve_py/features/extractor.py index 2679d201..e9aab2f8 100644 --- a/light-curve/light_curve/light_curve_py/features/extractor.py +++ b/light-curve/light_curve/light_curve_py/features/extractor.py @@ -2,7 +2,6 @@ from typing import Collection, Union import numpy as np - from light_curve.light_curve_ext import Extractor as _RustExtractor from light_curve.light_curve_ext import _FeatureEvaluator as _RustBaseFeature diff --git a/light-curve/tests/light_curve_ext/test_dmdt.py b/light-curve/tests/light_curve_ext/test_dmdt.py index 80f4852e..a5e6df19 100644 --- a/light-curve/tests/light_curve_ext/test_dmdt.py +++ b/light-curve/tests/light_curve_ext/test_dmdt.py @@ -12,9 +12,8 @@ def nullcontext(enter_result=None): import numpy as np import pytest -from numpy.testing import assert_allclose, assert_array_equal - from light_curve.light_curve_ext import DmDt +from numpy.testing import assert_allclose, assert_array_equal def random_lc(n, sigma=True, rng=None, dtype=np.float64): diff --git a/light-curve/tests/light_curve_ext/test_feature.py b/light-curve/tests/light_curve_ext/test_feature.py index 392b08df..587e92fc 100644 --- a/light-curve/tests/light_curve_ext/test_feature.py +++ b/light-curve/tests/light_curve_ext/test_feature.py @@ -1,11 +1,10 @@ import inspect +import light_curve.light_curve_ext as lc import numpy as np import pytest from numpy.testing import assert_allclose, assert_array_equal -import light_curve.light_curve_ext as lc - def _feature_classes(module, exclude_parametric=True): for name, obj in inspect.getmembers(module): diff --git a/light-curve/tests/light_curve_py/test_adnormal.py b/light-curve/tests/light_curve_py/test_adnormal.py index 157b079d..7ec42f42 100644 --- a/light-curve/tests/light_curve_py/test_adnormal.py +++ b/light-curve/tests/light_curve_py/test_adnormal.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import AndersonDarlingNormal +from numpy.testing import assert_allclose def test_adnormal(): diff --git a/light-curve/tests/light_curve_py/test_amplitude.py b/light-curve/tests/light_curve_py/test_amplitude.py index c4c537ad..b11eb67e 100644 --- a/light-curve/tests/light_curve_py/test_amplitude.py +++ b/light-curve/tests/light_curve_py/test_amplitude.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Amplitude +from numpy.testing import assert_allclose def test_amplitude(): diff --git a/light-curve/tests/light_curve_py/test_beyondnstd.py b/light-curve/tests/light_curve_py/test_beyondnstd.py index 450edba1..2342189c 100644 --- a/light-curve/tests/light_curve_py/test_beyondnstd.py +++ b/light-curve/tests/light_curve_py/test_beyondnstd.py @@ -1,6 +1,5 @@ -from numpy.testing import assert_allclose - from light_curve.light_curve_py import BeyondNStd +from numpy.testing import assert_allclose def test_beyondnstd_1(): diff --git a/light-curve/tests/light_curve_py/test_bins.py b/light-curve/tests/light_curve_py/test_bins.py index 291d4934..b292f6aa 100644 --- a/light-curve/tests/light_curve_py/test_bins.py +++ b/light-curve/tests/light_curve_py/test_bins.py @@ -1,5 +1,4 @@ import numpy as np - from light_curve.light_curve_py import Amplitude, Bins, Mean, Median diff --git a/light-curve/tests/light_curve_py/test_call.py b/light-curve/tests/light_curve_py/test_call.py index b30797a5..6658e978 100644 --- a/light-curve/tests/light_curve_py/test_call.py +++ b/light-curve/tests/light_curve_py/test_call.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from light_curve.light_curve_py import MaximumSlope diff --git a/light-curve/tests/light_curve_py/test_cusum.py b/light-curve/tests/light_curve_py/test_cusum.py index 7d246ac6..d2fd5027 100644 --- a/light-curve/tests/light_curve_py/test_cusum.py +++ b/light-curve/tests/light_curve_py/test_cusum.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Cusum +from numpy.testing import assert_allclose def test_cusum(): diff --git a/light-curve/tests/light_curve_py/test_eta.py b/light-curve/tests/light_curve_py/test_eta.py index 3a7bd7ca..661c2bf9 100644 --- a/light-curve/tests/light_curve_py/test_eta.py +++ b/light-curve/tests/light_curve_py/test_eta.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Eta +from numpy.testing import assert_allclose def test_eta(): diff --git a/light-curve/tests/light_curve_py/test_etae.py b/light-curve/tests/light_curve_py/test_etae.py index 29d847b5..c4884fca 100644 --- a/light-curve/tests/light_curve_py/test_etae.py +++ b/light-curve/tests/light_curve_py/test_etae.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Eta, EtaE +from numpy.testing import assert_allclose def test_etae_1(): diff --git a/light-curve/tests/light_curve_py/test_excvar.py b/light-curve/tests/light_curve_py/test_excvar.py index 52b92616..f9bbbb94 100644 --- a/light-curve/tests/light_curve_py/test_excvar.py +++ b/light-curve/tests/light_curve_py/test_excvar.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import ExcessVariance +from numpy.testing import assert_allclose def test_excvar(): diff --git a/light-curve/tests/light_curve_py/test_extractor.py b/light-curve/tests/light_curve_py/test_extractor.py index 84f36092..c1211e94 100644 --- a/light-curve/tests/light_curve_py/test_extractor.py +++ b/light-curve/tests/light_curve_py/test_extractor.py @@ -1,5 +1,4 @@ import numpy as np - from light_curve.light_curve_ext import Eta, Mean from light_curve.light_curve_ext import _FeatureEvaluator as _RustBaseFeature from light_curve.light_curve_py import Amplitude, Extractor, OtsuSplit diff --git a/light-curve/tests/light_curve_py/test_intpercrange.py b/light-curve/tests/light_curve_py/test_intpercrange.py index 31279e69..6f086069 100644 --- a/light-curve/tests/light_curve_py/test_intpercrange.py +++ b/light-curve/tests/light_curve_py/test_intpercrange.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import InterPercentileRange +from numpy.testing import assert_allclose def test_intpercrange_1(): diff --git a/light-curve/tests/light_curve_py/test_kurtosis.py b/light-curve/tests/light_curve_py/test_kurtosis.py index 69b6ac75..e8a7cb6c 100644 --- a/light-curve/tests/light_curve_py/test_kurtosis.py +++ b/light-curve/tests/light_curve_py/test_kurtosis.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Kurtosis +from numpy.testing import assert_allclose def test_kurtosis(): diff --git a/light-curve/tests/light_curve_py/test_linfit.py b/light-curve/tests/light_curve_py/test_linfit.py index daf2aa73..53aee05d 100644 --- a/light-curve/tests/light_curve_py/test_linfit.py +++ b/light-curve/tests/light_curve_py/test_linfit.py @@ -1,9 +1,8 @@ import numpy as np +from light_curve.light_curve_py import LinearFit from numpy.testing import assert_allclose from scipy.optimize import curve_fit -from light_curve.light_curve_py import LinearFit - def test_linfit(): def f(x, slope, c): diff --git a/light-curve/tests/light_curve_py/test_lintrend.py b/light-curve/tests/light_curve_py/test_lintrend.py index c369b05d..77ffcb65 100644 --- a/light-curve/tests/light_curve_py/test_lintrend.py +++ b/light-curve/tests/light_curve_py/test_lintrend.py @@ -1,9 +1,8 @@ import numpy as np +from light_curve.light_curve_py import LinearTrend from numpy.testing import assert_allclose from scipy.optimize import curve_fit -from light_curve.light_curve_py import LinearTrend - def test_lintrend_1(): def f(x, slope, c): diff --git a/light-curve/tests/light_curve_py/test_magnpratio.py b/light-curve/tests/light_curve_py/test_magnpratio.py index 89c8dd73..75668168 100644 --- a/light-curve/tests/light_curve_py/test_magnpratio.py +++ b/light-curve/tests/light_curve_py/test_magnpratio.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import MagnitudePercentageRatio +from numpy.testing import assert_allclose def test_magnpratio_1(): diff --git a/light-curve/tests/light_curve_py/test_maxslope.py b/light-curve/tests/light_curve_py/test_maxslope.py index 04cdefc9..5a4e4fc7 100644 --- a/light-curve/tests/light_curve_py/test_maxslope.py +++ b/light-curve/tests/light_curve_py/test_maxslope.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import MaximumSlope +from numpy.testing import assert_allclose def test_maxslope(): diff --git a/light-curve/tests/light_curve_py/test_mean.py b/light-curve/tests/light_curve_py/test_mean.py index b2c293d4..e8de8121 100644 --- a/light-curve/tests/light_curve_py/test_mean.py +++ b/light-curve/tests/light_curve_py/test_mean.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Mean +from numpy.testing import assert_allclose def test_mean_1(): diff --git a/light-curve/tests/light_curve_py/test_meanvar.py b/light-curve/tests/light_curve_py/test_meanvar.py index ac4f6b70..71f2ac6e 100644 --- a/light-curve/tests/light_curve_py/test_meanvar.py +++ b/light-curve/tests/light_curve_py/test_meanvar.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import MeanVariance +from numpy.testing import assert_allclose def test_meanvar(): diff --git a/light-curve/tests/light_curve_py/test_medabsdev.py b/light-curve/tests/light_curve_py/test_medabsdev.py index 058c27af..a172b01b 100644 --- a/light-curve/tests/light_curve_py/test_medabsdev.py +++ b/light-curve/tests/light_curve_py/test_medabsdev.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import MedianAbsoluteDeviation +from numpy.testing import assert_allclose def test_medabsdev(): diff --git a/light-curve/tests/light_curve_py/test_medbufrperc.py b/light-curve/tests/light_curve_py/test_medbufrperc.py index e8e6f82e..57b28236 100644 --- a/light-curve/tests/light_curve_py/test_medbufrperc.py +++ b/light-curve/tests/light_curve_py/test_medbufrperc.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import MedianBufferRangePercentage +from numpy.testing import assert_allclose def test_medbufrperc(): diff --git a/light-curve/tests/light_curve_py/test_median.py b/light-curve/tests/light_curve_py/test_median.py index f995111e..278c0939 100644 --- a/light-curve/tests/light_curve_py/test_median.py +++ b/light-curve/tests/light_curve_py/test_median.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Median +from numpy.testing import assert_allclose def test_median_1(): diff --git a/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py b/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py index cf3ceaeb..d7101037 100644 --- a/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py +++ b/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from light_curve.light_curve_py import FluxNNotDetBeforeFd, MagnitudeNNotDetBeforeFd diff --git a/light-curve/tests/light_curve_py/test_otsusplit.py b/light-curve/tests/light_curve_py/test_otsusplit.py index 1d759ad6..95c37c52 100644 --- a/light-curve/tests/light_curve_py/test_otsusplit.py +++ b/light-curve/tests/light_curve_py/test_otsusplit.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import OtsuSplit +from numpy.testing import assert_allclose def test_otsu_1(): diff --git a/light-curve/tests/light_curve_py/test_pdiffmperc.py b/light-curve/tests/light_curve_py/test_pdiffmperc.py index 7298ebd7..3174d68e 100644 --- a/light-curve/tests/light_curve_py/test_pdiffmperc.py +++ b/light-curve/tests/light_curve_py/test_pdiffmperc.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import PercentDifferenceMagnitudePercentile +from numpy.testing import assert_allclose def test_pdiffmperc(): diff --git a/light-curve/tests/light_curve_py/test_percampl.py b/light-curve/tests/light_curve_py/test_percampl.py index 950cdf56..202d2679 100644 --- a/light-curve/tests/light_curve_py/test_percampl.py +++ b/light-curve/tests/light_curve_py/test_percampl.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import PercentAmplitude +from numpy.testing import assert_allclose def test_medabsdev(): diff --git a/light-curve/tests/light_curve_py/test_redchi2.py b/light-curve/tests/light_curve_py/test_redchi2.py index 1eca2873..290fa1a1 100644 --- a/light-curve/tests/light_curve_py/test_redchi2.py +++ b/light-curve/tests/light_curve_py/test_redchi2.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import ReducedChi2 +from numpy.testing import assert_allclose def test_redchi2_equal_sigma(): diff --git a/light-curve/tests/light_curve_py/test_skew.py b/light-curve/tests/light_curve_py/test_skew.py index aef9f5ba..00dbfa26 100644 --- a/light-curve/tests/light_curve_py/test_skew.py +++ b/light-curve/tests/light_curve_py/test_skew.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import Skew +from numpy.testing import assert_allclose def test_skew(): diff --git a/light-curve/tests/light_curve_py/test_stdev.py b/light-curve/tests/light_curve_py/test_stdev.py index 64433c13..453c297d 100644 --- a/light-curve/tests/light_curve_py/test_stdev.py +++ b/light-curve/tests/light_curve_py/test_stdev.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import StandardDeviation +from numpy.testing import assert_allclose def test_stdev(): diff --git a/light-curve/tests/light_curve_py/test_stetsonk.py b/light-curve/tests/light_curve_py/test_stetsonk.py index 5bdf068f..f809f227 100644 --- a/light-curve/tests/light_curve_py/test_stetsonk.py +++ b/light-curve/tests/light_curve_py/test_stetsonk.py @@ -1,9 +1,8 @@ import numpy as np +from light_curve.light_curve_py import StetsonK from numpy.testing import assert_allclose from scipy import signal -from light_curve.light_curve_py import StetsonK - def test_stetsonk_1(): feature = StetsonK() diff --git a/light-curve/tests/light_curve_py/test_weightmean.py b/light-curve/tests/light_curve_py/test_weightmean.py index 62ccd3de..adeb56c2 100644 --- a/light-curve/tests/light_curve_py/test_weightmean.py +++ b/light-curve/tests/light_curve_py/test_weightmean.py @@ -1,7 +1,6 @@ import numpy as np -from numpy.testing import assert_allclose - from light_curve.light_curve_py import WeightedMean +from numpy.testing import assert_allclose def test_weightmean(): diff --git a/light-curve/tests/test_w_bench.py b/light-curve/tests/test_w_bench.py index 3d5b61d1..e476115f 100644 --- a/light-curve/tests/test_w_bench.py +++ b/light-curve/tests/test_w_bench.py @@ -1,13 +1,12 @@ import feets +import light_curve.light_curve_ext as lc_ext +import light_curve.light_curve_py as lc_py import numpy as np import pytest from numpy.testing import assert_allclose from scipy import stats from scipy.optimize import curve_fit -import light_curve.light_curve_ext as lc_ext -import light_curve.light_curve_py as lc_py - class _Test: # Feature name must be updated in child classes From 48d90e40bb7b85e6108a8ec0cd1774f1d755effa Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 02:50:13 +0300 Subject: [PATCH 07/15] fix pyproject.toml --- light-curve/pyproject.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/light-curve/pyproject.toml b/light-curve/pyproject.toml index d92e8c77..5db66cae 100644 --- a/light-curve/pyproject.toml +++ b/light-curve/pyproject.toml @@ -4,10 +4,7 @@ build-backend = "maturin" [project] name = "light-curve" - dependencies = ["numpy", "scipy", "iminuit"] -classifier = ["Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Rust", "Topic :: Scientific/Engineering :: Astronomy"] - requires-python = ">=3.7" classifier = [ "Intended Audience :: Science/Research", From be466157503d62324385e175a9dd3b771bfa6232 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Jul 2022 23:50:36 +0000 Subject: [PATCH 08/15] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- light-curve/light_curve/light_curve_py/features/_base.py | 1 + light-curve/light_curve/light_curve_py/features/extractor.py | 1 + light-curve/tests/light_curve_ext/test_dmdt.py | 3 ++- light-curve/tests/light_curve_ext/test_feature.py | 3 ++- light-curve/tests/light_curve_py/test_adnormal.py | 3 ++- light-curve/tests/light_curve_py/test_amplitude.py | 3 ++- light-curve/tests/light_curve_py/test_beyondnstd.py | 3 ++- light-curve/tests/light_curve_py/test_bins.py | 1 + light-curve/tests/light_curve_py/test_call.py | 1 + light-curve/tests/light_curve_py/test_cusum.py | 3 ++- light-curve/tests/light_curve_py/test_eta.py | 3 ++- light-curve/tests/light_curve_py/test_etae.py | 3 ++- light-curve/tests/light_curve_py/test_excvar.py | 3 ++- light-curve/tests/light_curve_py/test_extractor.py | 1 + light-curve/tests/light_curve_py/test_intpercrange.py | 3 ++- light-curve/tests/light_curve_py/test_kurtosis.py | 3 ++- light-curve/tests/light_curve_py/test_linfit.py | 3 ++- light-curve/tests/light_curve_py/test_lintrend.py | 3 ++- light-curve/tests/light_curve_py/test_magnpratio.py | 3 ++- light-curve/tests/light_curve_py/test_maxslope.py | 3 ++- light-curve/tests/light_curve_py/test_mean.py | 3 ++- light-curve/tests/light_curve_py/test_meanvar.py | 3 ++- light-curve/tests/light_curve_py/test_medabsdev.py | 3 ++- light-curve/tests/light_curve_py/test_medbufrperc.py | 3 ++- light-curve/tests/light_curve_py/test_median.py | 3 ++- light-curve/tests/light_curve_py/test_n_not_det_before_fd.py | 1 + light-curve/tests/light_curve_py/test_otsusplit.py | 3 ++- light-curve/tests/light_curve_py/test_pdiffmperc.py | 3 ++- light-curve/tests/light_curve_py/test_percampl.py | 3 ++- light-curve/tests/light_curve_py/test_redchi2.py | 3 ++- light-curve/tests/light_curve_py/test_skew.py | 3 ++- light-curve/tests/light_curve_py/test_stdev.py | 3 ++- light-curve/tests/light_curve_py/test_stetsonk.py | 3 ++- light-curve/tests/light_curve_py/test_weightmean.py | 3 ++- light-curve/tests/test_w_bench.py | 5 +++-- 35 files changed, 65 insertions(+), 30 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/_base.py b/light-curve/light_curve/light_curve_py/features/_base.py index 66273a1a..886b6be6 100644 --- a/light-curve/light_curve/light_curve_py/features/_base.py +++ b/light-curve/light_curve/light_curve_py/features/_base.py @@ -2,6 +2,7 @@ from dataclasses import dataclass import numpy as np + from light_curve.light_curve_py.warnings import mark_experimental, warn_experimental diff --git a/light-curve/light_curve/light_curve_py/features/extractor.py b/light-curve/light_curve/light_curve_py/features/extractor.py index e9aab2f8..2679d201 100644 --- a/light-curve/light_curve/light_curve_py/features/extractor.py +++ b/light-curve/light_curve/light_curve_py/features/extractor.py @@ -2,6 +2,7 @@ from typing import Collection, Union import numpy as np + from light_curve.light_curve_ext import Extractor as _RustExtractor from light_curve.light_curve_ext import _FeatureEvaluator as _RustBaseFeature diff --git a/light-curve/tests/light_curve_ext/test_dmdt.py b/light-curve/tests/light_curve_ext/test_dmdt.py index a5e6df19..80f4852e 100644 --- a/light-curve/tests/light_curve_ext/test_dmdt.py +++ b/light-curve/tests/light_curve_ext/test_dmdt.py @@ -12,9 +12,10 @@ def nullcontext(enter_result=None): import numpy as np import pytest -from light_curve.light_curve_ext import DmDt from numpy.testing import assert_allclose, assert_array_equal +from light_curve.light_curve_ext import DmDt + def random_lc(n, sigma=True, rng=None, dtype=np.float64): rng = np.random.default_rng(rng) diff --git a/light-curve/tests/light_curve_ext/test_feature.py b/light-curve/tests/light_curve_ext/test_feature.py index 587e92fc..392b08df 100644 --- a/light-curve/tests/light_curve_ext/test_feature.py +++ b/light-curve/tests/light_curve_ext/test_feature.py @@ -1,10 +1,11 @@ import inspect -import light_curve.light_curve_ext as lc import numpy as np import pytest from numpy.testing import assert_allclose, assert_array_equal +import light_curve.light_curve_ext as lc + def _feature_classes(module, exclude_parametric=True): for name, obj in inspect.getmembers(module): diff --git a/light-curve/tests/light_curve_py/test_adnormal.py b/light-curve/tests/light_curve_py/test_adnormal.py index 7ec42f42..157b079d 100644 --- a/light-curve/tests/light_curve_py/test_adnormal.py +++ b/light-curve/tests/light_curve_py/test_adnormal.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import AndersonDarlingNormal from numpy.testing import assert_allclose +from light_curve.light_curve_py import AndersonDarlingNormal + def test_adnormal(): m = np.arange(0, 9) diff --git a/light-curve/tests/light_curve_py/test_amplitude.py b/light-curve/tests/light_curve_py/test_amplitude.py index b11eb67e..c4c537ad 100644 --- a/light-curve/tests/light_curve_py/test_amplitude.py +++ b/light-curve/tests/light_curve_py/test_amplitude.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Amplitude from numpy.testing import assert_allclose +from light_curve.light_curve_py import Amplitude + def test_amplitude(): n = 11 diff --git a/light-curve/tests/light_curve_py/test_beyondnstd.py b/light-curve/tests/light_curve_py/test_beyondnstd.py index 2342189c..450edba1 100644 --- a/light-curve/tests/light_curve_py/test_beyondnstd.py +++ b/light-curve/tests/light_curve_py/test_beyondnstd.py @@ -1,6 +1,7 @@ -from light_curve.light_curve_py import BeyondNStd from numpy.testing import assert_allclose +from light_curve.light_curve_py import BeyondNStd + def test_beyondnstd_1(): m = [1.0, 2.0, 3.0, 4.0, 5.0, 10.0] diff --git a/light-curve/tests/light_curve_py/test_bins.py b/light-curve/tests/light_curve_py/test_bins.py index b292f6aa..291d4934 100644 --- a/light-curve/tests/light_curve_py/test_bins.py +++ b/light-curve/tests/light_curve_py/test_bins.py @@ -1,4 +1,5 @@ import numpy as np + from light_curve.light_curve_py import Amplitude, Bins, Mean, Median diff --git a/light-curve/tests/light_curve_py/test_call.py b/light-curve/tests/light_curve_py/test_call.py index 6658e978..b30797a5 100644 --- a/light-curve/tests/light_curve_py/test_call.py +++ b/light-curve/tests/light_curve_py/test_call.py @@ -1,5 +1,6 @@ import numpy as np import pytest + from light_curve.light_curve_py import MaximumSlope diff --git a/light-curve/tests/light_curve_py/test_cusum.py b/light-curve/tests/light_curve_py/test_cusum.py index d2fd5027..7d246ac6 100644 --- a/light-curve/tests/light_curve_py/test_cusum.py +++ b/light-curve/tests/light_curve_py/test_cusum.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Cusum from numpy.testing import assert_allclose +from light_curve.light_curve_py import Cusum + def test_cusum(): m = [1, 2, 3, 4, 5, 5] diff --git a/light-curve/tests/light_curve_py/test_eta.py b/light-curve/tests/light_curve_py/test_eta.py index 661c2bf9..3a7bd7ca 100644 --- a/light-curve/tests/light_curve_py/test_eta.py +++ b/light-curve/tests/light_curve_py/test_eta.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Eta from numpy.testing import assert_allclose +from light_curve.light_curve_py import Eta + def test_eta(): a = np.array([1, 2, 3, 3, 3, 4, 4]) diff --git a/light-curve/tests/light_curve_py/test_etae.py b/light-curve/tests/light_curve_py/test_etae.py index c4884fca..29d847b5 100644 --- a/light-curve/tests/light_curve_py/test_etae.py +++ b/light-curve/tests/light_curve_py/test_etae.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Eta, EtaE from numpy.testing import assert_allclose +from light_curve.light_curve_py import Eta, EtaE + def test_etae_1(): a = np.array([1, 2, 3, 8]) diff --git a/light-curve/tests/light_curve_py/test_excvar.py b/light-curve/tests/light_curve_py/test_excvar.py index f9bbbb94..52b92616 100644 --- a/light-curve/tests/light_curve_py/test_excvar.py +++ b/light-curve/tests/light_curve_py/test_excvar.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import ExcessVariance from numpy.testing import assert_allclose +from light_curve.light_curve_py import ExcessVariance + def test_excvar(): m = [1, 1, 2, 3, 4, 5] diff --git a/light-curve/tests/light_curve_py/test_extractor.py b/light-curve/tests/light_curve_py/test_extractor.py index c1211e94..84f36092 100644 --- a/light-curve/tests/light_curve_py/test_extractor.py +++ b/light-curve/tests/light_curve_py/test_extractor.py @@ -1,4 +1,5 @@ import numpy as np + from light_curve.light_curve_ext import Eta, Mean from light_curve.light_curve_ext import _FeatureEvaluator as _RustBaseFeature from light_curve.light_curve_py import Amplitude, Extractor, OtsuSplit diff --git a/light-curve/tests/light_curve_py/test_intpercrange.py b/light-curve/tests/light_curve_py/test_intpercrange.py index 6f086069..31279e69 100644 --- a/light-curve/tests/light_curve_py/test_intpercrange.py +++ b/light-curve/tests/light_curve_py/test_intpercrange.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import InterPercentileRange from numpy.testing import assert_allclose +from light_curve.light_curve_py import InterPercentileRange + def test_intpercrange_1(): m = np.arange(1.0, 7.0) diff --git a/light-curve/tests/light_curve_py/test_kurtosis.py b/light-curve/tests/light_curve_py/test_kurtosis.py index e8a7cb6c..69b6ac75 100644 --- a/light-curve/tests/light_curve_py/test_kurtosis.py +++ b/light-curve/tests/light_curve_py/test_kurtosis.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Kurtosis from numpy.testing import assert_allclose +from light_curve.light_curve_py import Kurtosis + def test_kurtosis(): m = [ diff --git a/light-curve/tests/light_curve_py/test_linfit.py b/light-curve/tests/light_curve_py/test_linfit.py index 53aee05d..daf2aa73 100644 --- a/light-curve/tests/light_curve_py/test_linfit.py +++ b/light-curve/tests/light_curve_py/test_linfit.py @@ -1,8 +1,9 @@ import numpy as np -from light_curve.light_curve_py import LinearFit from numpy.testing import assert_allclose from scipy.optimize import curve_fit +from light_curve.light_curve_py import LinearFit + def test_linfit(): def f(x, slope, c): diff --git a/light-curve/tests/light_curve_py/test_lintrend.py b/light-curve/tests/light_curve_py/test_lintrend.py index 77ffcb65..c369b05d 100644 --- a/light-curve/tests/light_curve_py/test_lintrend.py +++ b/light-curve/tests/light_curve_py/test_lintrend.py @@ -1,8 +1,9 @@ import numpy as np -from light_curve.light_curve_py import LinearTrend from numpy.testing import assert_allclose from scipy.optimize import curve_fit +from light_curve.light_curve_py import LinearTrend + def test_lintrend_1(): def f(x, slope, c): diff --git a/light-curve/tests/light_curve_py/test_magnpratio.py b/light-curve/tests/light_curve_py/test_magnpratio.py index 75668168..89c8dd73 100644 --- a/light-curve/tests/light_curve_py/test_magnpratio.py +++ b/light-curve/tests/light_curve_py/test_magnpratio.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import MagnitudePercentageRatio from numpy.testing import assert_allclose +from light_curve.light_curve_py import MagnitudePercentageRatio + def test_magnpratio_1(): m = np.arange(1.0, 11.0) diff --git a/light-curve/tests/light_curve_py/test_maxslope.py b/light-curve/tests/light_curve_py/test_maxslope.py index 5a4e4fc7..04cdefc9 100644 --- a/light-curve/tests/light_curve_py/test_maxslope.py +++ b/light-curve/tests/light_curve_py/test_maxslope.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import MaximumSlope from numpy.testing import assert_allclose +from light_curve.light_curve_py import MaximumSlope + def test_maxslope(): m = [2, 4, 15, 3] diff --git a/light-curve/tests/light_curve_py/test_mean.py b/light-curve/tests/light_curve_py/test_mean.py index e8de8121..b2c293d4 100644 --- a/light-curve/tests/light_curve_py/test_mean.py +++ b/light-curve/tests/light_curve_py/test_mean.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Mean from numpy.testing import assert_allclose +from light_curve.light_curve_py import Mean + def test_mean_1(): n = 10 diff --git a/light-curve/tests/light_curve_py/test_meanvar.py b/light-curve/tests/light_curve_py/test_meanvar.py index 71f2ac6e..ac4f6b70 100644 --- a/light-curve/tests/light_curve_py/test_meanvar.py +++ b/light-curve/tests/light_curve_py/test_meanvar.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import MeanVariance from numpy.testing import assert_allclose +from light_curve.light_curve_py import MeanVariance + def test_meanvar(): feature = MeanVariance() diff --git a/light-curve/tests/light_curve_py/test_medabsdev.py b/light-curve/tests/light_curve_py/test_medabsdev.py index a172b01b..058c27af 100644 --- a/light-curve/tests/light_curve_py/test_medabsdev.py +++ b/light-curve/tests/light_curve_py/test_medabsdev.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import MedianAbsoluteDeviation from numpy.testing import assert_allclose +from light_curve.light_curve_py import MedianAbsoluteDeviation + def test_medabsdev(): m = [1.0, 1.0, 3.0, 4.0, 7.0] diff --git a/light-curve/tests/light_curve_py/test_medbufrperc.py b/light-curve/tests/light_curve_py/test_medbufrperc.py index 57b28236..e8e6f82e 100644 --- a/light-curve/tests/light_curve_py/test_medbufrperc.py +++ b/light-curve/tests/light_curve_py/test_medbufrperc.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import MedianBufferRangePercentage from numpy.testing import assert_allclose +from light_curve.light_curve_py import MedianBufferRangePercentage + def test_medbufrperc(): m = np.arange(1.0, 8.0) diff --git a/light-curve/tests/light_curve_py/test_median.py b/light-curve/tests/light_curve_py/test_median.py index 278c0939..f995111e 100644 --- a/light-curve/tests/light_curve_py/test_median.py +++ b/light-curve/tests/light_curve_py/test_median.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Median from numpy.testing import assert_allclose +from light_curve.light_curve_py import Median + def test_median_1(): n = 9 diff --git a/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py b/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py index d7101037..cf3ceaeb 100644 --- a/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py +++ b/light-curve/tests/light_curve_py/test_n_not_det_before_fd.py @@ -1,5 +1,6 @@ import numpy as np import pytest + from light_curve.light_curve_py import FluxNNotDetBeforeFd, MagnitudeNNotDetBeforeFd diff --git a/light-curve/tests/light_curve_py/test_otsusplit.py b/light-curve/tests/light_curve_py/test_otsusplit.py index 95c37c52..1d759ad6 100644 --- a/light-curve/tests/light_curve_py/test_otsusplit.py +++ b/light-curve/tests/light_curve_py/test_otsusplit.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import OtsuSplit from numpy.testing import assert_allclose +from light_curve.light_curve_py import OtsuSplit + def test_otsu_1(): feature = OtsuSplit() diff --git a/light-curve/tests/light_curve_py/test_pdiffmperc.py b/light-curve/tests/light_curve_py/test_pdiffmperc.py index 3174d68e..7298ebd7 100644 --- a/light-curve/tests/light_curve_py/test_pdiffmperc.py +++ b/light-curve/tests/light_curve_py/test_pdiffmperc.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import PercentDifferenceMagnitudePercentile from numpy.testing import assert_allclose +from light_curve.light_curve_py import PercentDifferenceMagnitudePercentile + def test_pdiffmperc(): m = np.arange(1.0, 7.0) diff --git a/light-curve/tests/light_curve_py/test_percampl.py b/light-curve/tests/light_curve_py/test_percampl.py index 202d2679..950cdf56 100644 --- a/light-curve/tests/light_curve_py/test_percampl.py +++ b/light-curve/tests/light_curve_py/test_percampl.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import PercentAmplitude from numpy.testing import assert_allclose +from light_curve.light_curve_py import PercentAmplitude + def test_medabsdev(): m = [1.0, 1.0, 3.0, 4.0, 7.0] diff --git a/light-curve/tests/light_curve_py/test_redchi2.py b/light-curve/tests/light_curve_py/test_redchi2.py index 290fa1a1..1eca2873 100644 --- a/light-curve/tests/light_curve_py/test_redchi2.py +++ b/light-curve/tests/light_curve_py/test_redchi2.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import ReducedChi2 from numpy.testing import assert_allclose +from light_curve.light_curve_py import ReducedChi2 + def test_redchi2_equal_sigma(): m = np.array([1.0, 1.0, 2.0, 3.0, 4.0, 5.0]) diff --git a/light-curve/tests/light_curve_py/test_skew.py b/light-curve/tests/light_curve_py/test_skew.py index 00dbfa26..aef9f5ba 100644 --- a/light-curve/tests/light_curve_py/test_skew.py +++ b/light-curve/tests/light_curve_py/test_skew.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import Skew from numpy.testing import assert_allclose +from light_curve.light_curve_py import Skew + def test_skew(): m = [1.0, 2.0, 3.0, 50.0, 25.0] diff --git a/light-curve/tests/light_curve_py/test_stdev.py b/light-curve/tests/light_curve_py/test_stdev.py index 453c297d..64433c13 100644 --- a/light-curve/tests/light_curve_py/test_stdev.py +++ b/light-curve/tests/light_curve_py/test_stdev.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import StandardDeviation from numpy.testing import assert_allclose +from light_curve.light_curve_py import StandardDeviation + def test_stdev(): m = np.arange(10) diff --git a/light-curve/tests/light_curve_py/test_stetsonk.py b/light-curve/tests/light_curve_py/test_stetsonk.py index f809f227..5bdf068f 100644 --- a/light-curve/tests/light_curve_py/test_stetsonk.py +++ b/light-curve/tests/light_curve_py/test_stetsonk.py @@ -1,8 +1,9 @@ import numpy as np -from light_curve.light_curve_py import StetsonK from numpy.testing import assert_allclose from scipy import signal +from light_curve.light_curve_py import StetsonK + def test_stetsonk_1(): feature = StetsonK() diff --git a/light-curve/tests/light_curve_py/test_weightmean.py b/light-curve/tests/light_curve_py/test_weightmean.py index adeb56c2..62ccd3de 100644 --- a/light-curve/tests/light_curve_py/test_weightmean.py +++ b/light-curve/tests/light_curve_py/test_weightmean.py @@ -1,7 +1,8 @@ import numpy as np -from light_curve.light_curve_py import WeightedMean from numpy.testing import assert_allclose +from light_curve.light_curve_py import WeightedMean + def test_weightmean(): a = [2.0, 3.0, 1.0, 9.0, 5.0] diff --git a/light-curve/tests/test_w_bench.py b/light-curve/tests/test_w_bench.py index e476115f..3d5b61d1 100644 --- a/light-curve/tests/test_w_bench.py +++ b/light-curve/tests/test_w_bench.py @@ -1,12 +1,13 @@ import feets -import light_curve.light_curve_ext as lc_ext -import light_curve.light_curve_py as lc_py import numpy as np import pytest from numpy.testing import assert_allclose from scipy import stats from scipy.optimize import curve_fit +import light_curve.light_curve_ext as lc_ext +import light_curve.light_curve_py as lc_py + class _Test: # Feature name must be updated in child classes From 34f1a006007b2133ddde55fde61a08e8ebe4c939 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 20:08:45 +0300 Subject: [PATCH 09/15] bug fix: right_t + 1 in case when right_t the last value --- .../light_curve_py/features/red_dwarf_fit.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index 30e643e3..c19b5b52 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -62,9 +62,13 @@ def _flare_params(t, m): ) right_idx = (np.where(clean_flux[peak:] < 0.5 * clean_flux[peak]) + peak)[0][0] - right_t = t[right_idx] + (t[right_idx + 1] - t[right_idx]) * ( - 0.5 * clean_flux[peak] - clean_flux[right_idx] - ) / (clean_flux[right_idx + 1] - clean_flux[right_idx]) + + if right_idx == len(clean_flux): + right_t = right_idx + else: + right_t = t[right_idx] + (t[right_idx + 1] - t[right_idx]) * ( + 0.5 * clean_flux[peak] - clean_flux[right_idx] + ) / (clean_flux[right_idx + 1] - clean_flux[right_idx]) fwhm = right_t - left_t From dce72cd582ec5f84d5bf6d4b305aac1c3828551d Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 20:17:59 +0300 Subject: [PATCH 10/15] bug fix upd --- .../light_curve/light_curve_py/features/red_dwarf_fit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index c19b5b52..9c385657 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -63,7 +63,7 @@ def _flare_params(t, m): right_idx = (np.where(clean_flux[peak:] < 0.5 * clean_flux[peak]) + peak)[0][0] - if right_idx == len(clean_flux): + if right_idx == len(clean_flux) - 1: right_t = right_idx else: right_t = t[right_idx] + (t[right_idx + 1] - t[right_idx]) * ( From 9d9e826d9139a4c5b584e7f48eb67ec64fe887f3 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 20:52:24 +0300 Subject: [PATCH 11/15] bug fix right_idx --- .../light_curve/light_curve_py/features/red_dwarf_fit.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index 9c385657..62e4d6d4 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -61,7 +61,11 @@ def _flare_params(t, m): clean_flux[left_idx + 1] - clean_flux[left_idx] ) - right_idx = (np.where(clean_flux[peak:] < 0.5 * clean_flux[peak]) + peak)[0][0] + condition = (np.where(clean_flux[peak:] < 0.5 * clean_flux[peak]) + peak)[0] + if np.any(condition): + right_idx = condition[0] + else: + right_idx = peak if right_idx == len(clean_flux) - 1: right_t = right_idx From d55a33ce40d6cbace44d42465c187272c5a49f1d Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Wed, 6 Jul 2022 21:18:33 +0300 Subject: [PATCH 12/15] fix left_idx --- .../light_curve/light_curve_py/features/red_dwarf_fit.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index 62e4d6d4..943e715f 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -56,7 +56,12 @@ def _flare_params(t, m): amplitude = clean_flux[peak] tpeak = t[peak] - left_idx = np.where(clean_flux[:peak] < 0.5 * clean_flux[peak])[0][-1] + condition = np.where(clean_flux[:peak] < 0.5 * clean_flux[peak])[0] + if np.any(condition): + left_idx = condition[-1] + else: + left_idx = peak + left_t = t[left_idx] + (t[left_idx + 1] - t[left_idx]) * (0.5 * clean_flux[peak] - clean_flux[left_idx]) / ( clean_flux[left_idx + 1] - clean_flux[left_idx] ) From 6a5842e14e361f63ee61258be562ef8ff4c92eb6 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Sat, 29 Oct 2022 11:46:25 +0300 Subject: [PATCH 13/15] Drop scipy optimization --- .../light_curve_py/features/red_dwarf_fit.py | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py index 943e715f..8a5c8629 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py @@ -3,7 +3,6 @@ import numpy as np from iminuit import Minuit from iminuit.cost import LeastSquares -from scipy.optimize import curve_fit from scipy.special import erfc from scipy.stats import sigmaclip @@ -25,21 +24,11 @@ class RedDwarfFit(BaseFeature): Guadalupe Tovar Mendoza et al. 2022 [DOI:10.3847/1538-3881/ac6fe6](https://doi.org/10.3847/1538-3881/ac6fe6) """ - method: str = "scipy" - def _eval(self, t, m, sigma=None): amplitude, fwhm, tpeak, background = RedDwarfFit._flare_params(t, m) norm_t = (t - tpeak) / fwhm - if sigma is None: - pass # check if there is no sigma, do np.array(ones) - - if self.method == "scipy": - popt = RedDwarfFit._scipy_optimize(t, m, amplitude, fwhm, tpeak, background) - elif self.method == "minuit": - popt = RedDwarfFit._minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background) - else: - raise ValueError + popt = RedDwarfFit._minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background) func = RedDwarfFit._func(amplitude) model = func(norm_t, *popt) @@ -109,27 +98,6 @@ def _func(amplitude): return eq - @staticmethod - def _scipy_optimize(t, m, amplitude, fwhm, tpeak, background): - initial = np.array( - [ - 0.9687734504375167, - -0.251299705922117, - 0.22675974948468916, - 0.15551880775110513, - 1.2150539528490194, - 0.12695865022878844, - background / amplitude, - ] - ) - - func = RedDwarfFit._func(amplitude) - norm_t = (t - tpeak) / fwhm - - popt, _ = curve_fit(func, norm_t, m, p0=initial) - - return np.array(popt) - @staticmethod def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): func = RedDwarfFit._func(amplitude) From 1c24e8e44d3f02bba7c3d3e02e57420d85f20764 Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Tue, 1 Nov 2022 00:29:47 +0300 Subject: [PATCH 14/15] __init__ fix and docstring update --- .../light_curve/light_curve_py/__init__.py | 2 +- .../{red_dwarf_fit.py => mendoza_fit.py} | 28 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) rename light-curve/light_curve/light_curve_py/features/{red_dwarf_fit.py => mendoza_fit.py} (77%) diff --git a/light-curve/light_curve/light_curve_py/__init__.py b/light-curve/light_curve/light_curve_py/__init__.py index de52ea8f..3520f38f 100644 --- a/light-curve/light_curve/light_curve_py/__init__.py +++ b/light-curve/light_curve/light_curve_py/__init__.py @@ -20,10 +20,10 @@ from .features.medabsdev import * from .features.medbufrperc import * from .features.median import * +from .features.mendoza_fit import * from .features.otsusplit import * from .features.pdiffmperc import * from .features.percampl import * -from .features.red_dwarf_fit import * from .features.redchi2 import * from .features.skew import * from .features.stdev import * diff --git a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py b/light-curve/light_curve/light_curve_py/features/mendoza_fit.py similarity index 77% rename from light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py rename to light-curve/light_curve/light_curve_py/features/mendoza_fit.py index 8a5c8629..b8897f3f 100644 --- a/light-curve/light_curve/light_curve_py/features/red_dwarf_fit.py +++ b/light-curve/light_curve/light_curve_py/features/mendoza_fit.py @@ -10,10 +10,20 @@ @dataclass() -class RedDwarfFit(BaseFeature): - """Red dwarf flares fitting function. +class MendozaFit(BaseFeature): + """White-light flares fitting function. - The function returns computed amplitude, fwhm, tpeak, chi2 and 7 parameters of the fit. + The function returns computed amplitude, fwhm, tpeak, chi2 and 7 parameters of the Mendoza function developed + for white-light flares: + + $$ + f(t) = \frac{\sqrt{\pi} A C}{2} \times (F_1 h(t, B, C, D_1) + F_2 h(t, B, C, D_2)), + $$ + + where $h(t, B, C, D) = e^{-D t + (\frac{B}{C} + \frac{D C}{2})^2} \times erfc \left(\frac{B - t}{C} + + \frac{D C}{2}\right)$, where $erfc$ is $1-erf(t)$, t -- relative time, A -- amplitude, B -- position of the peak of + the flare, C -- Gaussian heating timescale, $D_1$ -- rapid cooling phase timescale, $D_2$ -- slow cooling phase + timescale, $F_2 \equiv 1 - F_1$ and describe the relative importance of the exponential cooling terms. - Depends on: **time**, **magnitude**, **sigma** - Minimum number of observations: **7** @@ -25,12 +35,12 @@ class RedDwarfFit(BaseFeature): """ def _eval(self, t, m, sigma=None): - amplitude, fwhm, tpeak, background = RedDwarfFit._flare_params(t, m) + amplitude, fwhm, tpeak, background = MendozaFit._flare_params(t, m) norm_t = (t - tpeak) / fwhm - popt = RedDwarfFit._minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background) + popt = MendozaFit._minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background) - func = RedDwarfFit._func(amplitude) + func = MendozaFit._func(amplitude) model = func(norm_t, *popt) chi2 = np.sum((m - model) ** 2) / (len(m) - 7) @@ -100,7 +110,7 @@ def _func(amplitude): @staticmethod def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): - func = RedDwarfFit._func(amplitude) + func = MendozaFit._func(amplitude) norm_t = (t - tpeak) / fwhm initial_dict = { @@ -123,7 +133,7 @@ def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): @staticmethod def model(t, params): amplitude, fwhm, tpeak, _, *popt = params - func = RedDwarfFit._func(amplitude) + func = MendozaFit._func(amplitude) predict = func(t, *popt) return predict @@ -133,4 +143,4 @@ def size(self): return 11 -__all__ = ("RedDwarfFit",) +__all__ = ("MendozaFit",) From 075a0627febb480d36747437fc9a46695bdaca9b Mon Sep 17 00:00:00 2001 From: stlavrukhina Date: Mon, 7 Aug 2023 16:31:04 +0300 Subject: [PATCH 15/15] update fit function according to paper notation --- .../light_curve_py/features/mendoza_fit.py | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/light-curve/light_curve/light_curve_py/features/mendoza_fit.py b/light-curve/light_curve/light_curve_py/features/mendoza_fit.py index b8897f3f..1bb6394d 100644 --- a/light-curve/light_curve/light_curve_py/features/mendoza_fit.py +++ b/light-curve/light_curve/light_curve_py/features/mendoza_fit.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from typing import Tuple import numpy as np from iminuit import Minuit @@ -17,13 +18,13 @@ class MendozaFit(BaseFeature): for white-light flares: $$ - f(t) = \frac{\sqrt{\pi} A C}{2} \times (F_1 h(t, B, C, D_1) + F_2 h(t, B, C, D_2)), + f(t) = f^* + \frac{\sqrt{\pi} A C}{2} \times (F_1 h(t, B, C, D_1) + F_2 h(t, B, C, D_2)), $$ - where $h(t, B, C, D) = e^{-D t + (\frac{B}{C} + \frac{D C}{2})^2} \times erfc \left(\frac{B - t}{C} + - \frac{D C}{2}\right)$, where $erfc$ is $1-erf(t)$, t -- relative time, A -- amplitude, B -- position of the peak of - the flare, C -- Gaussian heating timescale, $D_1$ -- rapid cooling phase timescale, $D_2$ -- slow cooling phase - timescale, $F_2 \equiv 1 - F_1$ and describe the relative importance of the exponential cooling terms. + where $h(t, B, C, D) = \exp{(\alpha C D)} \times \text{erfc} (\alpha)$, $\alpha(t, C, D) = \frac12 C D + \frac{B + - t}{C}$, where $erfc$ is $1-erf(t)$, t -- relative time, A -- amplitude, B -- position of the peak of the flare, + C -- Gaussian heating timescale, $D_1$ -- rapid cooling phase timescale, $D_2$ -- slow cooling phase timescale, + $F_2 \equiv 1 - F_1$ and describe the relative importance of the exponential cooling terms. - Depends on: **time**, **magnitude**, **sigma** - Minimum number of observations: **7** @@ -84,25 +85,25 @@ def _flare_params(t, m): @staticmethod def _func(amplitude): - eq = lambda t, A, B, C, D1, D2, f1, background: amplitude * ( + eq = lambda t, A1, A2, B, C, D1, D2, f1, background: amplitude * ( background + ( (1 / 2) * np.sqrt(np.pi) - * A + * A1 * C * f1 - * np.exp(-D1 * t + ((B / C) + (D1 * C / 2)) ** 2) - * erfc(((B - t) / C) + (C * D1 / 2)) + * np.exp(((1 / 2) * C * D1 + (B - t) / C) * C * D1) + * erfc((1 / 2) * C * D1 + (B - t) / C) ) + ( (1 / 2) * np.sqrt(np.pi) - * A + * A2 * C * (1 - f1) - * np.exp(-D2 * t + ((B / C) + (D2 * C / 2)) ** 2) - * erfc(((B - t) / C) + (C * D2 / 2)) + * np.exp(((1 / 2) * C * D2 + (B - t) / C) * C * D2) + * erfc((1 / 2) * C * D2 + (B - t) / C) ) ) @@ -114,7 +115,8 @@ def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): norm_t = (t - tpeak) / fwhm initial_dict = { - "A": 0.9687734504375167, + "A1": 0.9687734504375167, + "A2": 0.9687734504375167, "B": -0.251299705922117, "C": 0.22675974948468916, "D1": 0.15551880775110513, @@ -123,6 +125,16 @@ def _minuit_optimize(t, m, sigma, amplitude, fwhm, tpeak, background): "background": background / amplitude, } + initial_dict["A1"] = initial_dict["A1"] * np.exp( + -(initial_dict["B"] ** 2) / (initial_dict["C"] ** 2) + + (initial_dict["D1"] ** 2 * initial_dict["C"] ** 2) / 4 + ) + + initial_dict["A2"] = initial_dict["A2"] * np.exp( + -(initial_dict["B"] ** 2) / (initial_dict["C"] ** 2) + + (initial_dict["D2"] ** 2 * initial_dict["C"] ** 2) / 4 + ) + least_squares = LeastSquares(norm_t, m, sigma, func) fit = Minuit(least_squares, **initial_dict).migrad() @@ -142,5 +154,9 @@ def model(t, params): def size(self): return 11 + @property + def names(self) -> Tuple[str, ...]: + return ("amplitude", "fwhm", "tpeak", "chi2", "A1", "A2", "B", "C", "D1", "D2", "f1", "background") + __all__ = ("MendozaFit",)