diff --git a/src/python/histogram.cpp b/src/python/histogram.cpp index d6a09ef1..72d527c0 100644 --- a/src/python/histogram.cpp +++ b/src/python/histogram.cpp @@ -56,8 +56,13 @@ histogram_fill(python::tuple args, python::dict kwargs) { histogram& self = extract(args[0]); object ow; - if (kwargs) - ow = kwargs["w"]; + if (kwargs) { + if (len(kwargs) > 1 || !kwargs.has_key("w")) { + PyErr_SetString(PyExc_RuntimeError, "only keyword w allowed"); + throw_error_already_set(); + } + ow = kwargs.get("w"); + } #ifdef HAVE_NUMPY if (nargs == 2) { @@ -90,7 +95,6 @@ histogram_fill(python::tuple args, python::dict kwargs) { throw_error_already_set(); } - PyArrayObject* aw = 0; if (!ow.is_none()) { if (PySequence_Check(ow.ptr())) { PyArrayObject* aw = (PyArrayObject*) @@ -109,16 +113,18 @@ histogram_fill(python::tuple args, python::dict kwargs) { PyErr_SetString(PyExc_ValueError, "sizes do not match"); throw_error_already_set(); } - } - } - if (aw) { - for (unsigned i = 0; i < dims[0]; ++i) { - double* v = (double*)PyArray_GETPTR1(a, i); - double* w = (double*)PyArray_GETPTR1(aw, i); - self.wfill_c(self.dim(), v, *w); + for (unsigned i = 0; i < dims[0]; ++i) { + double* v = (double*)PyArray_GETPTR1(a, i); + double* w = (double*)PyArray_GETPTR1(aw, i); + self.wfill_c(self.dim(), v, *w); + } + + Py_DECREF(aw); + } else { + PyErr_SetString(PyExc_ValueError, "w is not a sequence"); + throw_error_already_set(); } - Py_DECREF(aw); } else { for (unsigned i = 0; i < dims[0]; ++i) { double* v = (double*)PyArray_GETPTR1(a, i); diff --git a/test/python_suite_test.py.in b/test/python_suite_test.py.in index e9e89fe2..2d314d74 100755 --- a/test/python_suite_test.py.in +++ b/test/python_suite_test.py.in @@ -577,13 +577,59 @@ class histogram_test(unittest.TestCase): def test_fill_with_numpy_array_0(self): a = histogram(integer_axis(0, 2, uoflow=False)) a.fill(numpy.array([-1, 0, 1, 2, 1, 4])) - self.assertEqual(a.value(0), 1) - self.assertEqual(a.value(1), 2) - self.assertEqual(a.value(2), 1) + a.fill((-1, 0)) + a.fill([1, 2]) + self.assertEqual(a.value(0), 2) + self.assertEqual(a.value(1), 3) + self.assertEqual(a.value(2), 2) + with self.assertRaises(ValueError): a.fill(numpy.empty((2, 2))) + with self.assertRaises(ValueError): + a.fill(numpy.empty((1, 2, 2))) with self.assertRaises(RuntimeError): a.fill(numpy.empty((2, 1)), 1) + with self.assertRaises(ValueError): + a.fill("abc") + + a = histogram(integer_axis(0, 1, uoflow=False), + regular_axis(2, 0, 2, uoflow=False)) + a.fill(numpy.array([[-1., -1.], [0., 1.], [1., 0.1]])) + self.assertEqual(a.value(0, 0), 0) + self.assertEqual(a.value(0, 1), 1) + self.assertEqual(a.value(1, 0), 1) + self.assertEqual(a.value(1, 1), 0) + + with self.assertRaises(ValueError): + a.fill((1, 2, 3)) + + a = histogram(integer_axis(0, 2, uoflow=False)) + a.fill([0, 0, 1, 2]) + a.fill((1, 0, 2, 2)) + self.assertEqual(a.value(0), 3) + self.assertEqual(a.value(1), 2) + self.assertEqual(a.value(2), 3) + + + @unittest.skipUnless(have_numpy, "requires build with numpy-support") + def test_fill_with_numpy_array_1(self): + a = histogram(integer_axis(0, 2, uoflow=True)) + v = numpy.array([-1, 0, 1, 2, 3, 4]) + w = numpy.array([ 2, 3, 4, 5, 6, 7]) + a.fill(v, w=w) + a.fill([0, 1], w=[2.0, 3.0]) + self.assertEqual(a.value(0), 5) + self.assertEqual(a.value(1), 7) + self.assertEqual(a.value(2), 5) + + with self.assertRaises(RuntimeError): + a.fill([1, 2], foo=1) + with self.assertRaises(ValueError): + a.fill([1, 2], w=1) + with self.assertRaises(RuntimeError): + a.fill([1, 2], w=[1], foo=1) + with self.assertRaises(ValueError): + a.fill([1, 2], w=[[1, 1], [2, 2]]) a = histogram(integer_axis(0, 1, uoflow=False), regular_axis(2, 0, 2, uoflow=False)) @@ -599,27 +645,5 @@ class histogram_test(unittest.TestCase): self.assertEqual(a.value(1), 2) self.assertEqual(a.value(2), 3) - @unittest.skipUnless(have_numpy, "requires build with numpy-support") - def test_fill_with_numpy_array_1(self): - a = histogram(integer_axis(0, 2, uoflow=False)) - a.fill(numpy.array([-1, 0, 1, 2, 1, 4]), - w=numpy.array([2.0, 3.0, 4.0, 5.0, 6.0, 7.0])) - self.assertEqual(a.value(0), 1) - self.assertEqual(a.value(1), 2) - self.assertEqual(a.value(2), 1) - a = histogram(integer_axis(0, 1, uoflow=False), - regular_axis(2, 0, 2, uoflow=False)) - a.fill(numpy.array([[-1., -1.], [0., 1.], [1., 0.1]])) - self.assertEqual(a.value(0, 0), 0) - self.assertEqual(a.value(0, 1), 1) - self.assertEqual(a.value(1, 0), 1) - self.assertEqual(a.value(1, 1), 0) - a = histogram(integer_axis(0, 2, uoflow=False)) - a.fill([0, 0, 1, 2]) - a.fill((1, 0, 2, 2)) - self.assertEqual(a.value(0), 3) - self.assertEqual(a.value(1), 2) - self.assertEqual(a.value(2), 3) - if __name__ == "__main__": unittest.main()