Skip to content

Commit 8967521

Browse files
committed
Add new fitting functions: Multi-Lorentzian, Planckian, Two half-Gaussian, and Double exponential
1 parent ca892ad commit 8967521

5 files changed

Lines changed: 348 additions & 17 deletions

File tree

datalab/gui/actionhandler.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,29 @@ def cra_fit(title, fitdlgfunc, iconname, tip: str | None = None):
918918
triggered=self.panel.processor.compute_multigaussianfit,
919919
icon_name="multigaussfit.svg",
920920
)
921+
self.new_action(
922+
_("Multi-Lorentzian fit"),
923+
triggered=self.panel.processor.compute_multilorentzianfit,
924+
icon_name="lorentzfit.svg",
925+
)
926+
cra_fit(
927+
_("Planckian fit"),
928+
fitdialog.planckianfit,
929+
"expfit.svg",
930+
tip=_("Planckian (blackbody radiation) fitting"),
931+
)
932+
cra_fit(
933+
_("Two half-Gaussian fit"),
934+
fitdialog.twohalfgaussianfit,
935+
"gaussfit.svg",
936+
tip=_("Asymmetric peak fitting with two half-Gaussians"),
937+
)
938+
cra_fit(
939+
_("Double exponential fit"),
940+
fitdialog.doubleexponentialfit,
941+
"expfit.svg",
942+
tip=_("Double exponential decay fitting"),
943+
)
921944
cra_fit(_("Exponential fit"), fitdialog.exponentialfit, "expfit.svg")
922945
cra_fit(_("Sinusoidal fit"), fitdialog.sinusoidalfit, "sinfit.svg")
923946
cra_fit(

datalab/gui/processor/signal.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,25 @@ def multigaussianfit(x, y, parent=None):
641641

642642
self.__row_compute_fit(obj, _("Multi-Gaussian fit"), multigaussianfit)
643643

644+
@qt_try_except()
645+
def compute_multilorentzianfit(self) -> None:
646+
"""Compute Multi-Lorentzian fitting curve using an interactive dialog"""
647+
fitdlgfunc = fitdialog.multilorentzianfit
648+
for obj in self.panel.objview.get_sel_objects():
649+
dlg = signalpeak.SignalPeakDetectionDialog(obj, parent=self.panel)
650+
if exec_dialog(dlg):
651+
# Computing x, y
652+
peaks = dlg.get_peak_indices()
653+
654+
def multilorentzianfit(x, y, parent=None):
655+
"""Multi-Lorentzian fit dialog function"""
656+
# pylint: disable=cell-var-from-loop
657+
return fitdlgfunc(x, y, peaks, parent=parent)
658+
659+
self.__row_compute_fit(
660+
obj, _("Multi-Lorentzian fit"), multilorentzianfit
661+
)
662+
644663
@qt_try_except()
645664
def _extract_multiple_roi_in_single_object(self, params: list[ROI1DParam]) -> None:
646665
"""Extract multiple Regions Of Interest (ROIs) from data in a single object"""

datalab/tests/features/signal/fitdialog_unit_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@ def test_fit_dialog():
5555
# CDF curve fitting test
5656
execenv.print(fdlg.cdffit(x, y))
5757

58+
# Planckian curve fitting test
59+
execenv.print(fdlg.planckianfit(x, y))
60+
61+
# N-Lorentzian curve fitting test (needs peaks)
62+
execenv.print(fdlg.nlorentzianfit(x, y, peakidx))
63+
64+
# Two half-Gaussian curve fitting test
65+
execenv.print(fdlg.twohalfgaussianfit(x, y))
66+
67+
# Double exponential curve fitting test
68+
execenv.print(fdlg.doubleexponentialfit(x, y))
69+
5870

5971
if __name__ == "__main__":
6072
test_fit_dialog()

datalab/tests/scenarios/common.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ def run_signal_computations(
210210
(_("Exponential fit"), fitdialog.exponentialfit),
211211
(_("CDF fit"), fitdialog.cdffit),
212212
(_("Sinusoidal fit"), fitdialog.sinusoidalfit),
213+
(_("Planckian fit"), fitdialog.planckianfit),
214+
(_("Two half-Gaussian fit"), fitdialog.twohalfgaussianfit),
215+
(_("Double exponential fit"), fitdialog.doubleexponentialfit),
213216
):
214217
panel.objview.set_current_object(sig)
215218
panel.processor.compute_fit(fittitle, fitfunc)

0 commit comments

Comments
 (0)