source: sasview/src/sas/sascalc/corfunc/transform_thread.py @ 22194b1

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalcmagnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 22194b1 was 22194b1, checked in by lewis, 7 years ago

Only calculate gamma3 up to x=200, as this is all that's plotted

  • Property mode set to 100644
File size: 2.7 KB
Line 
1from sas.sascalc.data_util.calcthread import CalcThread
2from sas.sascalc.dataloader.data_info import Data1D
3from scipy.fftpack import dct
4from scipy.integrate import trapz
5import numpy as np
6from time import sleep
7
8class FourierThread(CalcThread):
9    def __init__(self, raw_data, extrapolated_data, bg, extrap_fn=None,
10        updatefn=None, completefn=None):
11        CalcThread.__init__(self, updatefn=updatefn, completefn=completefn)
12        self.data = raw_data
13        self.background = bg
14        self.extrapolation = extrapolated_data
15        self.extrap_fn = extrap_fn
16
17    def compute(self):
18        qs = self.extrapolation.x
19        iqs = self.extrapolation.y
20        q = self.data.x
21        background = self.background
22
23        xs = np.pi*np.arange(len(qs),dtype=np.float32)/(q[1]-q[0])/len(qs)
24
25        self.ready(delay=0.0)
26        self.update(msg="Fourier transform in progress.")
27        self.ready(delay=0.0)
28
29        if self.isquit():
30            return
31        try:
32            gamma1 = dct((iqs-background)*qs**2)
33            gamma1 = gamma1 / gamma1.max()
34
35            # gamma3(R) = 1/R int_{0}^{R} gamma1(x) dx
36            # trapz uses the trapezium rule to calculate the integral
37            mask = xs <= 200.0 # Only calculate gamma3 up to x=200 (as this is all that's plotted)
38            gamma3 = [trapz(gamma1[:n], xs[:n])/xs[n-1] for n in range(2, len(xs[mask]) + 1)]
39            gamma3.insert(0, 1.0) # Gamma_3(0) is defined as 1
40            gamma3 = np.array(gamma3)
41        except Exception as e:
42            import logging
43            logger = logging.getLogger(__name__)
44            logger.error(e)
45
46            self.update(msg="Fourier transform failed.")
47            self.complete(transforms=None)
48            return
49        if self.isquit():
50            return
51        self.update(msg="Fourier transform completed.")
52
53        transform1 = Data1D(xs, gamma1)
54        transform3 = Data1D(xs[xs <= 200], gamma3)
55
56        transforms = (transform1, transform3)
57
58        self.complete(transforms=transforms)
59
60class HilbertThread(CalcThread):
61    def __init__(self, raw_data, extrapolated_data, bg, updatefn=None,
62        completefn=None):
63        CalcThread.__init__(self, updatefn=updatefn, completefn=completefn)
64        self.data = raw_data
65        self.background = bg
66        self.extrapolation = extrapolated_data
67
68    def compute(self):
69        qs = self.extrapolation.x
70        iqs = self.extrapolation.y
71        q = self.data.x
72        background = self.background
73
74        self.ready(delay=0.0)
75        self.update(msg="Starting Hilbert transform.")
76        self.ready(delay=0.0)
77        if self.isquit():
78            return
79
80        # TODO: Implement hilbert transform
81
82        self.update(msg="Hilbert transform completed.")
83
84        self.complete(transform=None)
Note: See TracBrowser for help on using the repository browser.