Example #1
0
    def test_polynomial_fit(self):
        """tests for fitting to a polynomial"""

        a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        b = [
            5.82616885, 10.73323542, 18.53401063, 27.16662982, 37.99711327,
            51.41386193, 66.09297228, 83.46407479, 102.23573159, 122.8573845
        ]

        result = q.fit(a, b, model=q.FitModel.QUADRATIC)

        assert len(result.params) == 3
        assert result[0].value == pytest.approx(1, rel=0.15)
        assert result[1].value == pytest.approx(2, rel=0.15)
        assert result[2].value == pytest.approx(3, rel=0.15)

        a = q.MeasurementArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        b = q.MeasurementArray([
            9.96073312, 31.18583676, 78.11727423, 161.58352404, 298.7038423,
            494.25761959, 766.3146814, 1123.59437138, 1578.30697946,
            2142.70591363
        ])

        result = q.fit(a, b, model=q.FitModel.POLYNOMIAL)

        assert len(result.params) == 4
        assert result[0].value == pytest.approx(2, rel=0.3)
        assert result[1].value == pytest.approx(1, rel=0.3)
        assert result[2].value == pytest.approx(4, rel=0.3)
        assert result[3].value == pytest.approx(3, rel=0.4)

        b = [
            20.32132071, 64.27190108, 189.14762997, 469.97259457, 999.96248493,
            1899.41641639, 3312.43244643, 5411.38221041, 8379.45187783,
            12439.47094005
        ]

        dataset = q.XYDataSet(a, b, yerr=0.2)
        result = q.fit(dataset, model=q.FitModel.POLYNOMIAL, degrees=4)

        assert len(result.params) == 5
        assert result[0].value == pytest.approx(1, rel=0.3)
        assert result[1].value == pytest.approx(2, rel=0.3)
        assert result[2].value == pytest.approx(4, rel=0.3)
        assert result[3].value == pytest.approx(3, rel=0.4)
        assert result[4].value == pytest.approx(10, rel=0.4)

        with pytest.raises(IllegalArgumentError):
            q.fit(1, 2)
Example #2
0
    def test_construct_data_set(self):
        """test for various ways to construct a data set"""

        with pytest.raises(ValueError):
            q.XYDataSet([0, 1, 2, 3, 4], [0, 1, 2, 3])

        with pytest.raises(IllegalArgumentError):
            q.XYDataSet(0, 0)

        dataset = q.XYDataSet([0, 1, 2, 3, 4], [0, 0.2, 0.5, 0.8, 1.3],
                              xerr=0.1,
                              yerr=[0.1, 0.1, 0.1, 0.1, 0.5],
                              name="test",
                              xname="time",
                              xunit="s",
                              yname="distance",
                              yunit="m")
        assert dataset.xname == "time"
        assert dataset.xunit == "s"
        assert dataset.yname == "distance"
        assert dataset.yunit == "m"
        assert dataset.name == "test"

        assert all(dataset.xvalues == [0, 1, 2, 3, 4])
        assert all(dataset.xerr == [0.1, 0.1, 0.1, 0.1, 0.1])
        assert all(dataset.yvalues == [0, 0.2, 0.5, 0.8, 1.3])
        assert all(dataset.yerr == [0.1, 0.1, 0.1, 0.1, 0.5])

        a = q.MeasurementArray([1, 2, 3, 4, 5])
        b = q.MeasurementArray([10, 20, 30, 40, 50])
        dataset = q.XYDataSet(a,
                              b,
                              xerr=0.5,
                              yerr=0.5,
                              name="test",
                              xname="x",
                              yname="y",
                              xunit="m",
                              yunit="s")
        assert dataset.name == "test"
        assert all(dataset.xerr == [0.5, 0.5, 0.5, 0.5, 0.5])
        assert str(dataset.xdata[0]) == "x_0 = 1.0 +/- 0.5 [m]"

        c = q.MeasurementArray([1, 2, 3, 4, 5])
        d = q.MeasurementArray([10, 20, 30, 40, 50])
        dataset = q.XYDataSet(c, d)
        assert all(dataset.xerr == [0, 0, 0, 0, 0])
        assert str(dataset.xdata[0]) == "1 +/- 0"
Example #3
0
    def test_calculations_with_measurement_array(self):
        """tests for calculating properties of a measurement array"""

        a = q.MeasurementArray([1, 2, 3, 4, 5])
        assert a.mean() == 3
        assert a.std() == pytest.approx(1.58113883008419)
        assert a.sum() == 15
        assert a.error_on_mean() == pytest.approx(0.707106781186548)

        with pytest.warns(UserWarning):
            assert np.isnan(a.error_weighted_mean())
        with pytest.warns(UserWarning):
            assert np.isnan(a.propagated_error())

        b = q.MeasurementArray([1, 2, 3, 4, 5], [0.1, 0.2, 0.3, 0.4, 0.5])
        assert b.error_weighted_mean() == pytest.approx(1.5600683241601823)
        assert b.propagated_error() == pytest.approx(0.08265842980736918)
Example #4
0
    def test_manipulate_measurement_array(self):
        """tests for manipulating a measurement array"""

        a = q.MeasurementArray([1, 2, 3, 4], 0.5, name="test", unit="m")
        a = a.append(q.Measurement(5, 0.5))
        assert str(a[-1]) == "test_4 = 5.0 +/- 0.5 [m]"
        a = a.insert(1, (1.5, 0.5))
        assert str(a[1]) == "test_1 = 1.5 +/- 0.5 [m]"
        assert str(a[-1]) == "test_5 = 5.0 +/- 0.5 [m]"
        a = a.delete(1)
        assert str(a[1]) == "test_1 = 2.0 +/- 0.5 [m]"

        with pytest.raises(TypeError):
            a.name = 1
        with pytest.raises(TypeError) as e:
            a.unit = 1
        assert str(e.value) == "Cannot set unit to \"int\"!"

        a.name = "speed"
        a.unit = "m/s"
        assert a.name == "speed"
        assert a.unit == "m⋅s^-1"
        assert str(a[4]) == "speed_4 = 5.0 +/- 0.5 [m⋅s^-1]"

        a = a.append(6)
        assert str(a[5]) == "speed_5 = 6 +/- 0 [m⋅s^-1]"

        a[3] = 10
        assert str(a[3]) == "speed_3 = 10.0 +/- 0.5 [m⋅s^-1]"
        a[4] = (10, 0.6)
        assert str(a[4]) == "speed_4 = 10.0 +/- 0.6 [m⋅s^-1]"

        with pytest.raises(TypeError):
            a[2] = 'a'

        b = q.MeasurementArray([5, 6, 7], 0.5)
        b[-1] = (8, 0.5)

        a = a.append(b)
        assert str(a[-1]) == "speed_8 = 8.0 +/- 0.5 [m⋅s^-1]"

        a = a.append([8, 9, 10])
        assert str(a[-1]) == "speed_11 = 10 +/- 0 [m⋅s^-1]"
Example #5
0
    def test_vectorized_functions(self):
        """tests for functions on experimental value arrays"""

        a = q.MeasurementArray([1, 2, 3, 4, 5])
        assert q.mean(a) == 3
        assert q.std(a) == pytest.approx(1.58113883008419)
        assert q.sum(a) == 15

        b = [1, 2, 3, 4, 5]

        res = q.mean(b)

        assert res == 3
        assert not isinstance(res, ExperimentalValue)

        assert q.std(b) == pytest.approx(1.58113883008419)
        assert q.sum(b) == 15
Example #6
0
    def test_record_measurement_array(self):
        """tests for recording a measurement array in different ways"""

        a = q.MeasurementArray([1, 2, 3, 4, 5])
        assert isinstance(a, ExperimentalValueArray)
        assert all(a.values == [1, 2, 3, 4, 5])
        assert all(a.errors == [0, 0, 0, 0, 0])
        assert str(a) == "[ 1 +/- 0, 2 +/- 0, 3 +/- 0, 4 +/- 0, 5 +/- 0 ]"

        with pytest.raises(TypeError):
            q.MeasurementArray(1)

        b = q.MeasurementArray([1, 2, 3, 4, 5], 0.5)
        assert all(b.errors == [0.5, 0.5, 0.5, 0.5, 0.5])
        c = q.MeasurementArray([1, 2, 3, 4, 5], relative_error=0.1)
        assert c.errors == pytest.approx([0.1, 0.2, 0.3, 0.4, 0.5])
        d = q.MeasurementArray([1, 2, 3, 4, 5], [0.1, 0.2, 0.3, 0.4, 0.5])
        assert all(d.errors == [0.1, 0.2, 0.3, 0.4, 0.5])
        e = q.MeasurementArray([1, 2, 3, 4, 5],
                               relative_error=[0.1, 0.2, 0.3, 0.4, 0.5])
        assert e.errors == pytest.approx([0.1, 0.4, 0.9, 1.6, 2.5])

        with pytest.raises(ValueError):
            q.MeasurementArray([1, 2, 3, 4, 5], [0.1, 0.2, 0.3, 0.4])
        with pytest.raises(ValueError):
            q.MeasurementArray([1, 2, 3, 4, 5],
                               relative_error=[0.1, 0.2, 0.3, 0.4])
        with pytest.raises(TypeError):
            q.MeasurementArray([1, 2, 3, 4, 5], '1')
        with pytest.raises(TypeError):
            q.MeasurementArray([1, 2, 3, 4, 5], [0.1, 0.2, 0.3, 0.4, '0.5'])
        with pytest.raises(TypeError):
            q.MeasurementArray([1, 2, 3, 4, '5'])
        with pytest.raises(ValueError):
            q.MeasurementArray([1, 2, 3, 4, 5], -0.5)
        with pytest.raises(ValueError):
            q.MeasurementArray([1, 2, 3, 4, 5], [0.5, 0.5, 0.5, 0.5, -0.5])

        f = q.MeasurementArray(data=[1, 2, 3, 4],
                               error=0.5,
                               name="test",
                               unit="m")
        assert f.name == "test"
        assert f.unit == "m"
        assert str(
            f
        ) == "test = [ 1.0 +/- 0.5, 2.0 +/- 0.5, 3.0 +/- 0.5, 4.0 +/- 0.5 ] (m)"
        assert str(f[0]) == "test_0 = 1.0 +/- 0.5 [m]"
        assert str(f[-1]) == "test_3 = 4.0 +/- 0.5 [m]"

        g = q.MeasurementArray([q.Measurement(5, 0.5),
                                q.Measurement(10, 0.5)],
                               name="test",
                               unit="m")
        assert str(g[-1]) == "test_1 = 10.0 +/- 0.5 [m]"

        h = q.MeasurementArray([q.Measurement(5, 0.5),
                                q.Measurement(10, 0.5)],
                               error=0.1)
        assert str(h[-1]) == "10.0 +/- 0.1"
Example #7
0
    def test_vectorized_arithmetic(self):
        """tests for arithmetic with experimental value arrays"""

        a = q.MeasurementArray([1, 2, 3, 4, 5], 0.5, unit="s")

        res = a + 2
        assert all(res.values == [3, 4, 5, 6, 7])
        assert all(res.errors == [0.5, 0.5, 0.5, 0.5, 0.5])
        assert res.unit == "s"

        res = 2 + a
        assert all(res.values == [3, 4, 5, 6, 7])
        assert all(res.errors == [0.5, 0.5, 0.5, 0.5, 0.5])
        assert res.unit == "s"

        res = a + (2, 0.5)
        assert all(res.values == [3, 4, 5, 6, 7])

        res = (2, 0.5) + a
        assert all(res.values == [3, 4, 5, 6, 7])

        res = q.Measurement(2, 0.5) + a
        assert all(res.values == [3, 4, 5, 6, 7])

        res = a + [1, 2, 3, 4, 5]
        assert all(res.values == [2, 4, 6, 8, 10])

        res = [1, 2, 3, 4, 5] + a
        assert all(res.values == [2, 4, 6, 8, 10])

        res = a - 1
        assert all(res.values == [0, 1, 2, 3, 4])

        res = 10 - a
        assert all(res.values == [9, 8, 7, 6, 5])

        res = q.Measurement(10, 0.5) - a
        assert all(res.values == [9, 8, 7, 6, 5])

        res = a - [1, 2, 3, 4, 5]
        assert all(res.values == [0, 0, 0, 0, 0])

        res = [1, 2, 3, 4, 5] - a
        assert all(res.values == [0, 0, 0, 0, 0])

        res = a * 2
        assert all(res.values == [2, 4, 6, 8, 10])

        res = 2 * a
        assert all(res.values == [2, 4, 6, 8, 10])

        res = q.Measurement(2, 0.5) * a
        assert all(res.values == [2, 4, 6, 8, 10])

        b = q.MeasurementArray([10, 20, 30, 40, 50], 0.5, unit="m")

        res = b * a
        assert all(res.values == [10, 40, 90, 160, 250])
        assert res.unit == "m⋅s"

        res = [1, 2, 3, 4, 5] * a
        assert all(res.values == [1, 4, 9, 16, 25])

        res = a / 2
        assert all(res.values == [0.5, 1, 1.5, 2, 2.5])

        res = 2 / a
        assert all(res.values == [2, 1, 2 / 3, 2 / 4, 2 / 5])

        res = q.Measurement(2, 0.5) / a
        assert all(res.values == [2, 1, 2 / 3, 2 / 4, 2 / 5])

        res = b / a
        assert all(res.values == [10, 10, 10, 10, 10])
        assert res.unit == "m⋅s^-1"

        res = [1, 2, 3, 4, 5] / a
        assert all(res.values == [1, 1, 1, 1, 1])

        res = a**2
        assert all(res.values == [1, 4, 9, 16, 25])

        res = 2**a
        assert all(res.values == [2, 4, 8, 16, 32])

        res = q.Measurement(2, 0.5)**a
        assert all(res.values == [2, 4, 8, 16, 32])

        res = a**[2, 2, 2, 2, 2]
        assert all(res.values == [1, 4, 9, 16, 25])
        assert res.unit == "s^2"

        res = [2, 2, 2, 2, 2]**a
        assert all(res.values == [2, 4, 8, 16, 32])