Esempio n. 1
0
 def test_DecayConvolution_init(self):
     irf = fit2x.DecayCurve(x, irf_y)
     lh = fit2x.DecayLifetimeHandler([1, 4])
     settings = {
         "instrument_response_function": irf,
         "lifetime_handler": lh,
         "convolution_method": 0,
         "excitation_period": 100,
         "irf_shift_channels": 0,
         "irf_background_counts": 0,
         "start": 0,
         "stop": -1
     }
     ref = [
         [4.70950187e-11, 9.33162000e-01, 2.56789386e-01, 7.06638168e-02],
         [1.78095108e-87, 9.33162000e-01, 2.56789386e-01, 7.06638168e-02],
         [4.49386205e-11, 9.27072464e-01, 2.65610708e-01, 7.60987419e-02],
         [1.72529636e-87, 9.27072464e-01, 2.65610708e-01, 7.60987419e-02],
         [1.72529636e-87, 9.27072464e-01, 2.65610708e-01, 7.60987419e-02]
     ]
     for i in range(5):
         settings["convolution_method"] = i
         dc = fit2x.DecayConvolution(**settings)
         decay = fit2x.DecayCurve(x)
         dc.add(decay)
         print(decay.y[::8])
         self.assertEqual(np.allclose(decay.y[::8], ref[i]), True)
Esempio n. 2
0
 def test_DecayConvolution_init(self):
     irf = fit2x.DecayCurve(x, irf_y)
     lh = fit2x.DecayLifetimeHandler([1, 4])
     settings = {
         "instrument_response_function": irf,
         "lifetime_handler": lh,
         "use_corrected_irf_as_scatter": True,
         "scatter_fraction": 0.0,
         "convolution_method": 0,
         "excitation_period": 100,
         "irf_shift_channels": 0,
         "irf_background_counts": 0,
         "start": 0,
         "stop": -1
     }
     dc = fit2x.DecayConvolution(**settings)
     decay = fit2x.DecayCurve(x)
     dc.add(decay)
     ref = np.array([1.19203776e-10, 1.59816046e-05, 2.61648339e-02, 4.63676222e-01,
                     8.17250308e-01, 7.51713472e-01, 6.39828454e-01, 5.44522781e-01,
                     4.63413367e-01, 3.94385610e-01, 3.35639884e-01, 2.85644631e-01,
                     2.43096423e-01, 2.06885985e-01, 1.76069274e-01, 1.49842868e-01,
                     1.27523017e-01, 1.08527821e-01, 9.23620548e-02, 7.86042610e-02,
                     6.68957600e-02, 5.69312992e-02, 4.84510951e-02, 4.12340602e-02,
                     3.50920390e-02, 2.98649029e-02, 2.54163750e-02, 2.16304778e-02,
                     1.84085090e-02, 1.56664688e-02, 1.33328693e-02, 1.13468712e-02])
     self.assertEqual(np.allclose(decay.y, ref), True)
     ref = np.array([ 0.        ,  0.64516129,  1.29032258,  1.93548387,  2.58064516,
                      3.22580645,  3.87096774,  4.51612903,  5.16129032,  5.80645161,
                      6.4516129 ,  7.09677419,  7.74193548,  8.38709677,  9.03225806,
                      9.67741935, 10.32258065, 10.96774194, 11.61290323, 12.25806452,
                      12.90322581, 13.5483871 , 14.19354839, 14.83870968, 15.48387097,
                      16.12903226, 16.77419355, 17.41935484, 18.06451613, 18.70967742,
                      19.35483871, 20.        ])
     self.assertEqual(np.allclose(decay.x, ref), True)
    def test_pileup(self):
        x = np.arange(0, 16)
        y = np.ones_like(x) * 10000
        decay_settings = {"x": x, "y": y, "acquisition_time": 0.1}
        data = fit2x.DecayCurve(**decay_settings)
        model = fit2x.DecayCurve(**decay_settings)

        pileup_settings = {
            "data": data,
            "pile_up_model": "coates",
            "repetition_rate": 100.0,
            "instrument_dead_time": 120.0,
            "active": True
        }
        dp = fit2x.DecayPileup(**pileup_settings)
        self.assertEqual(dp.repetition_rate, 100.0)
        self.assertEqual(dp.instrument_dead_time, 120.0)

        dp.add(model)
        ref = np.array([
            10093.8673586, 10081.35171081, 10068.83606301, 10056.32041521,
            10043.8047674, 10031.28911959, 10018.77347177, 10006.25782395,
            9993.74217613, 9981.2265283, 9968.71088047, 9956.19523264,
            9943.6795848, 9931.16393695, 9918.64828911, 9906.13264125
        ])
        self.assertEqual(np.allclose(model.y, ref), True)
Esempio n. 4
0
    def test_lin(self):
        x = np.arange(0, 16)
        y = np.ones_like(x) * 10000
        model = fit2x.DecayCurve(x, y)

        lin = np.sin(x) * 0.2 + 0.8
        linearization = fit2x.DecayCurve(x, lin)
        dl = fit2x.DecayLinearization(linearization_table=linearization,
                                      start=0,
                                      stop=-1,
                                      active=True)
        dl.add(model)

        ref = np.array([
            8000., 9682.94196962, 9818.59485365, 8282.24001612, 6486.39500938,
            6082.15145067, 7441.1690036, 9313.97319744, 9978.71649325,
            8824.23697048, 6911.95777822, 6000.0195869, 6926.854164,
            8840.33407365, 9981.21471139, 9300.57568031
        ])
        self.assertEqual(np.allclose(model.y, ref), True)

        model = fit2x.DecayCurve(x, y)
        dl.active = False
        dl.add(model)
        self.assertEqual(np.allclose(model.y, y), True)
    def test_scale_scale_2(self):
        import numpy as np
        import fit2x

        x = np.arange(0, 16)
        y = np.ones_like(x) * 100
        y2 = y * 10
        data = fit2x.DecayCurve(x, y2)
        settings = {
            "data": data,
            "constant_background": 0,
            "active": True,
            "start": 0,
            "stop": -1
        }

        ds = fit2x.DecayScale(**settings)
        model = fit2x.DecayCurve(x, y)
        self.assertEqual(
            np.allclose(ds.data.y,
                        np.ones_like(ds.data.y) * 1000), True)
        self.assertEqual(np.allclose(model.y,
                                     np.ones_like(ds.data.y) * 100), True)
        ds.add(model)
        self.assertEqual(np.sum(model.y), np.sum(ds.data.y))
    def test_DecayCurve_operator(self):
        x = np.linspace(0, 10, 10)
        y = np.sin(x)
        ey = np.clip(np.sqrt(np.abs(y)), 1, 1e12)

        # Multiplication
        curve1 = fit2x.DecayCurve(x, y)
        curve2 = curve1 * curve1
        curve3 = curve1 * 2
        curve1 *= 2
        self.assertEqual(np.allclose(curve1.y, y * 2), True)
        self.assertEqual(np.allclose(curve1.ey, ey * 2), True)
        self.assertEqual(np.allclose(curve3.y, curve1.y), True)
        self.assertEqual(np.allclose(curve2.x, curve1.x), True)
        self.assertEqual(np.allclose(curve3.ey, curve1.ey), True)
        self.assertEqual(np.allclose(curve2.y, y * y), True)

        # Addition
        curve1 = fit2x.DecayCurve(x, y)
        curve3 = curve1 + curve1
        curve2 = curve1 + 2
        curve1 += 2
        self.assertEqual(np.allclose(curve1.y, y + 2), True)
        self.assertEqual(np.allclose(curve1.ey, ey), True)
        self.assertEqual(np.allclose(curve2.y, curve1.y), True)
        self.assertEqual(np.allclose(curve2.x, curve1.x), True)
        self.assertEqual(np.allclose(curve2.ey, curve1.ey), True)
        self.assertEqual(np.allclose(curve3.y, y + y), True)
Esempio n. 7
0
 def make_decay_curves(
     data: np.ndarray = None,
     data_noise: np.ndarray = None,
     time_axis: np.array = None,
     irf_histogram: np.array = None,
     tttr_data: tttrlib.TTTR = None,
     tttr_irf: tttrlib.TTTR = None,
     tttr_micro_time_coarsening: int = 1,
     acquisition_time: float = MAX_FLOAT,
 ) -> typing.Tuple[fit2x.DecayCurve, fit2x.DecayCurve]:
     # Data
     if time_axis is None:
         time_axis = np.array([], np.float64)
     if data is None:
         data = np.array([], np.float64)
     # IRF
     if irf_histogram is None:
         irf_histogram = np.zeros_like(data)
         if len(irf_histogram) > 0:
             irf_histogram[0] = 1.0
     decay = fit2x.DecayCurve(x=time_axis,
                              y=data,
                              acquisition_time=acquisition_time)
     irf = fit2x.DecayCurve(x=time_axis, y=irf_histogram)
     if data_noise is not None:
         decay.set_ey(data_noise)
     # Handle TTTR data
     if isinstance(tttr_data, tttrlib.TTTR):
         decay.set_tttr(tttr_data, tttr_micro_time_coarsening)
     if isinstance(tttr_irf, tttrlib.TTTR):
         irf.set_tttr(tttr_irf, tttr_micro_time_coarsening)
     return decay, irf
 def test_DecayCurve_init(self):
     x = np.linspace(0, 10, 10)
     y = np.sin(x) * 1000
     curve1 = fit2x.DecayCurve(x, y)
     curve2 = fit2x.DecayCurve(x=x, y=y)
     self.assertEqual(np.allclose(curve1.x, curve2.x), True)
     self.assertEqual(np.allclose(curve1.y, curve2.y), True)
     # Noise is by default Poisson noise
     ey = np.clip(np.sqrt(np.abs(y)), 1, 1e12)
     curve1 = fit2x.DecayCurve(x, y)
     self.assertEqual(np.allclose(curve1.ey, ey), True)
    def test_setter_getter(self):
        dc = fit2x.DecayScore(**score_settings)
        self.assertEqual(np.allclose(dc.model.y, model.y), True)
        self.assertEqual(np.allclose(dc.data.y, data.y), True)

        x = np.arange(10, dtype=np.float64)
        a1 = np.ones_like(x, dtype=np.float64)
        a2 = np.ones_like(x, dtype=np.float64) * 2
        c1 = fit2x.DecayCurve(x, a1)
        c2 = fit2x.DecayCurve(x, a2)
        dc.data = c1
        dc.model = c2
        self.assertEqual(np.allclose(dc.data.y, c1.y), True)
        self.assertEqual(np.allclose(dc.model.y, c2.y), True)
Esempio n. 10
0
    def test_setter_getter_2(self):
        dc = fit2x.DecayScore(**score_settings)
        self.assertEqual(np.allclose(dc.model.y, model.y), True)
        self.assertEqual(np.allclose(dc.data.y, data.y), True)

        x = np.arange(10, dtype=np.float64)
        a1 = np.ones_like(x, dtype=np.float64)
        a2 = np.ones_like(x, dtype=np.float64) * 2
        # Works on pointers reference counting issues
        # see: https://stackoverflow.com/questions/20029377/why-does-swig-appear-to-corrupt-contents-of-a-member-class
        dc.data = fit2x.DecayCurve(x, a1)
        dc.model = fit2x.DecayCurve(x, a2)
        self.assertEqual(np.allclose(dc.data.y, a1), True)
        self.assertEqual(np.allclose(dc.model.y, a2), True)
Esempio n. 11
0
    def test_getter_setter(self):
        irf = fit2x.DecayCurve(x, irf_y)
        lh = fit2x.DecayLifetimeHandler()
        ls = np.array([1., 10.0])

        dc = fit2x.DecayConvolution()
        dc.irf = irf

        self.assertEqual(dc.convolution_method, 0)
        dc.convolution_method = 1
        self.assertEqual(dc.convolution_method, 1)

        self.assertEqual(dc.excitation_period, 100.0)
        dc.excitation_period = 32.0
        self.assertEqual(dc.excitation_period, 32.0)

        self.assertEqual(dc.start, 0)
        dc.start = 5
        self.assertEqual(dc.start, 5)

        self.assertEqual(dc.stop, -1)
        dc.stop = 20
        self.assertEqual(dc.stop, 20)

        dc.lifetime_handler = lh
        dc.lifetime_handler.lifetime_spectrum = ls
        np.allclose(dc.lifetime_handler.lifetime_spectrum, ls)
Esempio n. 12
0
 def test_DecayCurve_set_tttr(self):
     tttr_fn = "../tttr-data/bh/bh_spc132_sm_dna/m000.spc"
     tttr = tttrlib.TTTR(tttr_fn, "SPC-130")
     curve = fit2x.DecayCurve()
     curve.set_tttr(tttr, 256)
     # plt.semilogy(curve.x * 1e9, curve.y)
     # plt.show()
     self.assertEqual(
         np.allclose(
             curve.y,
             np.array([
                 0., 547., 34014., 74748., 15763., 9930., 7289., 5942.,
                 4909., 4386., 4029., 3683., 3419., 4021., 1758., 0.
             ])), True)
     self.assertEqual(
         np.allclose(
             curve.x,
             np.array([
                 0.00000000e+00, 1.28746033e-14, 2.57492065e-14,
                 3.86238098e-14, 5.14984131e-14, 6.43730164e-14,
                 7.72476196e-14, 9.01222229e-14, 1.02996826e-13,
                 1.15871429e-13, 1.28746033e-13, 1.41620636e-13,
                 1.54495239e-13, 1.67369843e-13, 1.80244446e-13,
                 1.93119049e-13
             ])), True)
Esempio n. 13
0
 def test_mean_lifetime(self):
     irf = fit2x.DecayCurve(x, irf_y)
     lh = fit2x.DecayLifetimeHandler([1, 4])
     settings = {
         "instrument_response_function": irf,
         "lifetime_handler": lh,
         "convolution_method": 0,
         "excitation_period": 100,
         "irf_shift_channels": 0,
         "irf_background_counts": 0,
         "start": 0,
         "stop": -1
     }
     dc = fit2x.DecayConvolution(**settings)
     y = np.ones_like(x)
     decay = fit2x.DecayCurve(x, y)
     self.assertAlmostEqual(dc.get_mean_lifetime(decay), 7.812499963266247)
Esempio n. 14
0
 def test_decay_curve_resize(self):
     d = fit2x.DecayCurve()
     d.x = np.array([0, 0.1])
     d.resize(5)
     self.assertEqual(np.allclose(d.x, np.array([0., 0.1, 0.2, 0.3, 0.4])),
                      True)
     d.resize(6)
     self.assertEqual(
         np.allclose(d.x, np.array([0., 0.1, 0.2, 0.3, 0.4, 0.5])), True)
Esempio n. 15
0
 def test_scale_scale_3(self):
     ds = fit2x.DecayScale(**settings)
     # Scaling considering noise & background of data
     ds.constant_background = 100
     # Set number of photons to negative value for scaling
     model = fit2x.DecayCurve(x, y)
     ds.add(model)
     self.assertEqual(np.allclose(model.y, ds.data.y - 100), True)
     self.assertEqual(ds.number_of_photons, 16000)
Esempio n. 16
0
 def test_shift_2(self):
     x = np.arange(0, 8, dtype=np.float64)
     y = np.zeros_like(x)
     y[5] = 1.0
     dc = fit2x.DecayCurve(x, y)
     self.assertEqual(dc.shift, 0.0)
     dc.shift = 2
     self.assertEqual(np.allclose(np.roll(y, -2), dc.y), True)
     dc.shift = 2.5
     self.assertEqual(
         np.allclose(np.array([0., 0., 0.5, 0.5, 0., 0., 0., 0.]), dc.y),
         True)
Esempio n. 17
0
    def test_scale_scale_1(self):
        x = np.arange(0, 16)
        y = np.ones_like(x) * 100
        y2 = y * 10
        data = fit2x.DecayCurve(x, y2)
        settings = {
            "data": data,
            "constant_background": 0,
            "active": True,
            "start": 0,
            "stop": -1
        }
        ds = fit2x.DecayScale(**settings)
        model = fit2x.DecayCurve(x, y)
        ds.add(model)

        self.assertEqual(np.allclose(model.y, data.y), True)

        ds.active = False
        self.assertEqual(ds.active, False)

        model = fit2x.DecayCurve(x, y)
        ds.add(model)
        self.assertEqual(np.allclose(model.y, y), True)
Esempio n. 18
0
    def test_pileup_setter_getter(self):
        x = np.arange(0, 16)
        y = np.ones_like(x) * 10000
        decay_settings = {"x": x, "y": y, "acquisition_time": 0.1}
        data = fit2x.DecayCurve(**decay_settings)
        model = fit2x.DecayCurve(**decay_settings)

        dp = fit2x.DecayPileup()

        dp.repetition_rate = 13.0
        self.assertEqual(dp.repetition_rate, 13.0)

        dp.pile_up_model = "coates"
        self.assertEqual(dp.pile_up_model, "coates")

        dp.instrument_dead_time = 89
        self.assertEqual(dp.instrument_dead_time, 89)

        dp.data = data
        (np.allclose(dp.data.x, data.x), True)
        (np.allclose(dp.data.y, data.y), True)

        dp.resize(10)
        self.assertEqual(len(dp.data.y), 10)
Esempio n. 19
0
 def test_irf(self):
     irf = fit2x.DecayCurve(x=x, y=irf_y)
     dc = fit2x.DecayConvolution()
     dc.irf = irf
     dc.irf_background_counts = 1e-3
     self.assertEqual(np.allclose(dc.irf.y, irf_y), True)
     self.assertEqual(dc.irf_background_counts, 1e-3)
     np.allclose(dc.corrected_irf.y, np.clip(dc.irf.y - dc.irf_background_counts, 0, 1e30))
     dc.irf_background_counts = 0.0
     dc.irf_shift_channels = 0.0
     self.assertEqual(
         np.allclose(
             dc.corrected_irf.y,
             np.array([5.52094836e-087, 5.51600473e-040, 4.61808726e-011, 3.23985966e+000,
                       1.90465720e-007, 9.38283342e-033, 3.87326980e-076, 1.33982492e-137,
                       3.88369320e-217, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000])
         ), True
     )
     dc.irf_shift_channels = 10.0
     self.assertEqual(dc.irf_shift_channels, 10.0)
     self.assertEqual(
         np.allclose(
             dc.corrected_irf.y,
             np.array([0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000,
                       0.00000000e+000, 0.00000000e+000, 5.52094836e-087, 5.51600473e-040,
                       4.61808726e-011, 3.23985966e+000, 1.90465720e-007, 9.38283342e-033,
                       3.87326980e-076, 1.33982492e-137, 3.88369320e-217, 0.00000000e+000])
         ), True
     )
Esempio n. 20
0
from __future__ import division
import unittest

import numpy as np
import fit2x

np.random.seed(42)

x = np.arange(0, 1024)
ym = np.ones_like(x) * 500
yd = np.random.poisson(ym)
data = fit2x.DecayCurve(x, yd)
model = fit2x.DecayCurve(x, ym)
score_settings = {"model": model, "data": data, "start": 0, "stop": -1}


class Tests(unittest.TestCase):
    def test_score_1(self):
        dc = fit2x.DecayScore(**score_settings)
        self.assertAlmostEqual(dc.score, 1114.2359946704964)
        dc.model.y = ym * 0.95
        self.assertAlmostEqual(dc.score, 2185.4654851901237)

    def test_score_range(self):
        dc = fit2x.DecayScore(**score_settings)
        dc.start, dc.stop = 10, 20
        wr = dc.weighted_residuals
        ref = np.array([
            -0.13456839, -0.95951449, 0.26673253, 0.31088091, -0.58908623,
            0.53033009, -1.38379681, -0.72727273, -0.58908623, 0.13376339
        ])
Esempio n. 21
0
from __future__ import division
import unittest

import numpy as np
import fit2x

x = np.arange(0, 16)
y = np.ones_like(x) * 100
y2 = y * 10
data = fit2x.DecayCurve(x, y2)
settings = {
    "data": data,
    "constant_background": 0,
    "active": True,
    "start": 0,
    "stop": -1
}


class Tests(unittest.TestCase):
    def test_scale_init(self):
        ds = fit2x.DecayScale(**settings)
        self.assertEqual(np.allclose(ds.data.y, data.y), True)
        self.assertEqual(np.allclose(ds.data.x, data.x), True)
        self.assertEqual(ds.constant_background, 0.0)
        self.assertEqual(ds.active, True)

    def test_scale_scale_1(self):
        x = np.arange(0, 16)
        y = np.ones_like(x) * 100
        y2 = y * 10
Esempio n. 22
0
    def __init__(
        self,
        data_settings=None,  # type: DataSettings
        lifetime_settings=None,  # type: LifetimeSettings
        convolution_settings=None,  # type: ConvolutionSettings
        scatter_settings=None,  # type: PatternSettings
        background_settings=None,  # type: PatternSettings
        pileup_settings=None,  # type: PileupSettings
        scaling_settings=None,  # type: ScalingSettings
        linearization_settings=None,  # type: LinearizationSettings
        score_settings=None  # type: ScoreSettings
    ):
        super().__init__()
        if data_settings is None:
            data_settings = DataSettings()
        if lifetime_settings is None:
            lifetime_settings = LifetimeSettings()
        if convolution_settings is None:
            convolution_settings = ConvolutionSettings()
        if background_settings is None:
            background_settings = PatternSettings()
        if scatter_settings is None:
            scatter_settings = PatternSettings()
        if pileup_settings is None:
            pileup_settings = PileupSettings()
        if linearization_settings is None:
            linearization_settings = LinearizationSettings()
        if scaling_settings is None:
            scaling_settings = ScalingSettings()
        if score_settings is None:
            score_settings = ScoreSettings()

        # init decay curves
        data, irf = self.make_decay_curves(*data_settings)
        model = fit2x.DecayCurve(data.x)

        lifetime_handler = fit2x.DecayLifetimeHandler(*lifetime_settings)
        decay_convolution = fit2x.DecayConvolution(lifetime_handler, irf,
                                                   *convolution_settings)
        decay_scatter = fit2x.DecayPattern(*scatter_settings)
        decay_scatter.data = irf
        decay_background = fit2x.DecayPattern(*background_settings)
        decay_pileup = fit2x.DecayPileup(data, *pileup_settings)
        decay_linearization = fit2x.DecayLinearization(*linearization_settings)
        decay_scale = fit2x.DecayScale(data, *scaling_settings)
        decay_score = fit2x.DecayScore(model, data, *score_settings)

        self._data, self._irf, self._model = data, irf, model
        self.lifetime_handler = lifetime_handler
        self.decay_convolution = decay_convolution
        self.decay_scatter = decay_scatter
        self.decay_pileup = decay_pileup
        self.decay_linearization = decay_linearization
        self.decay_scale = decay_scale
        self.decay_background = decay_background
        self.decay_score = decay_score

        self._decay_modifier = [
            self.decay_convolution,
            self.decay_scatter,
            # self.decay_pileup, # TODO: seems broken
            self.decay_linearization,
            self.decay_scale,
            self.decay_background,
        ]