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)
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"
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)
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]"
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
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"
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])