summaryrefslogtreecommitdiff
path: root/silx/gui/plot/test/testStats.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/plot/test/testStats.py')
-rw-r--r--silx/gui/plot/test/testStats.py284
1 files changed, 169 insertions, 115 deletions
diff --git a/silx/gui/plot/test/testStats.py b/silx/gui/plot/test/testStats.py
index faedcff..7fbc247 100644
--- a/silx/gui/plot/test/testStats.py
+++ b/silx/gui/plot/test/testStats.py
@@ -1,7 +1,7 @@
# coding: utf-8
# /*##########################################################################
#
-# Copyright (c) 2016-2018 European Synchrotron Radiation Facility
+# Copyright (c) 2016-2019 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -112,34 +112,34 @@ class TestStats(TestCaseQt):
"""Test result for simple stats on a curve"""
_stats = self.getBasicStats()
xData = yData = numpy.array(range(20))
- self.assertTrue(_stats['min'].calculate(self.curveContext) == 0)
- self.assertTrue(_stats['max'].calculate(self.curveContext) == 19)
- self.assertTrue(_stats['minCoords'].calculate(self.curveContext) == [0])
- self.assertTrue(_stats['maxCoords'].calculate(self.curveContext) == [19])
- self.assertTrue(_stats['std'].calculate(self.curveContext) == numpy.std(yData))
- self.assertTrue(_stats['mean'].calculate(self.curveContext) == numpy.mean(yData))
+ self.assertEqual(_stats['min'].calculate(self.curveContext), 0)
+ self.assertEqual(_stats['max'].calculate(self.curveContext), 19)
+ self.assertEqual(_stats['minCoords'].calculate(self.curveContext), (0,))
+ self.assertEqual(_stats['maxCoords'].calculate(self.curveContext), (19,))
+ self.assertEqual(_stats['std'].calculate(self.curveContext), numpy.std(yData))
+ self.assertEqual(_stats['mean'].calculate(self.curveContext), numpy.mean(yData))
com = numpy.sum(xData * yData) / numpy.sum(yData)
- self.assertTrue(_stats['com'].calculate(self.curveContext) == com)
+ self.assertEqual(_stats['com'].calculate(self.curveContext), com)
def testBasicStatsImage(self):
"""Test result for simple stats on an image"""
_stats = self.getBasicStats()
- self.assertTrue(_stats['min'].calculate(self.imageContext) == 0)
- self.assertTrue(_stats['max'].calculate(self.imageContext) == 128 * 32 - 1)
- self.assertTrue(_stats['minCoords'].calculate(self.imageContext) == (0, 0))
- self.assertTrue(_stats['maxCoords'].calculate(self.imageContext) == (127, 31))
- self.assertTrue(_stats['std'].calculate(self.imageContext) == numpy.std(self.imageData))
- self.assertTrue(_stats['mean'].calculate(self.imageContext) == numpy.mean(self.imageData))
-
- yData = numpy.sum(self.imageData, axis=1)
- xData = numpy.sum(self.imageData, axis=0)
+ self.assertEqual(_stats['min'].calculate(self.imageContext), 0)
+ self.assertEqual(_stats['max'].calculate(self.imageContext), 128 * 32 - 1)
+ self.assertEqual(_stats['minCoords'].calculate(self.imageContext), (0, 0))
+ self.assertEqual(_stats['maxCoords'].calculate(self.imageContext), (127, 31))
+ self.assertEqual(_stats['std'].calculate(self.imageContext), numpy.std(self.imageData))
+ self.assertEqual(_stats['mean'].calculate(self.imageContext), numpy.mean(self.imageData))
+
+ yData = numpy.sum(self.imageData.astype(numpy.float64), axis=1)
+ xData = numpy.sum(self.imageData.astype(numpy.float64), axis=0)
dataXRange = range(self.imageData.shape[1])
dataYRange = range(self.imageData.shape[0])
ycom = numpy.sum(yData*dataYRange) / numpy.sum(yData)
xcom = numpy.sum(xData*dataXRange) / numpy.sum(xData)
- self.assertTrue(_stats['com'].calculate(self.imageContext) == (xcom, ycom))
+ self.assertEqual(_stats['com'].calculate(self.imageContext), (xcom, ycom))
def testStatsImageAdv(self):
"""Test that scale and origin are taking into account for images"""
@@ -153,52 +153,46 @@ class TestStats(TestCaseQt):
onlimits=False
)
_stats = self.getBasicStats()
- self.assertTrue(_stats['min'].calculate(image2Context) == 0)
- self.assertTrue(
- _stats['max'].calculate(image2Context) == 128 * 32 - 1)
- self.assertTrue(
- _stats['minCoords'].calculate(image2Context) == (100, 10))
- self.assertTrue(
- _stats['maxCoords'].calculate(image2Context) == (127*2. + 100,
- 31 * 0.5 + 10)
- )
- self.assertTrue(
- _stats['std'].calculate(image2Context) == numpy.std(
- self.imageData))
- self.assertTrue(
- _stats['mean'].calculate(image2Context) == numpy.mean(
- self.imageData))
+ self.assertEqual(_stats['min'].calculate(image2Context), 0)
+ self.assertEqual(
+ _stats['max'].calculate(image2Context), 128 * 32 - 1)
+ self.assertEqual(
+ _stats['minCoords'].calculate(image2Context), (100, 10))
+ self.assertEqual(
+ _stats['maxCoords'].calculate(image2Context), (127*2. + 100,
+ 31 * 0.5 + 10))
+ self.assertEqual(_stats['std'].calculate(image2Context),
+ numpy.std(self.imageData))
+ self.assertEqual(_stats['mean'].calculate(image2Context),
+ numpy.mean(self.imageData))
yData = numpy.sum(self.imageData, axis=1)
xData = numpy.sum(self.imageData, axis=0)
- dataXRange = range(self.imageData.shape[1])
- dataYRange = range(self.imageData.shape[0])
+ dataXRange = numpy.arange(self.imageData.shape[1], dtype=numpy.float64)
+ dataYRange = numpy.arange(self.imageData.shape[0], dtype=numpy.float64)
ycom = numpy.sum(yData * dataYRange) / numpy.sum(yData)
ycom = (ycom * 0.5) + 10
xcom = numpy.sum(xData * dataXRange) / numpy.sum(xData)
xcom = (xcom * 2.) + 100
- self.assertTrue(
- _stats['com'].calculate(image2Context) == (xcom, ycom))
+ self.assertTrue(numpy.allclose(
+ _stats['com'].calculate(image2Context), (xcom, ycom)))
def testBasicStatsScatter(self):
"""Test result for simple stats on a scatter"""
_stats = self.getBasicStats()
- self.assertTrue(_stats['min'].calculate(self.scatterContext) == 5)
- self.assertTrue(_stats['max'].calculate(self.scatterContext) == 90)
- self.assertTrue(_stats['minCoords'].calculate(self.scatterContext) == (0, 2))
- self.assertTrue(_stats['maxCoords'].calculate(self.scatterContext) == (50, 69))
- self.assertTrue(_stats['std'].calculate(self.scatterContext) == numpy.std(self.valuesScatterData))
- self.assertTrue(_stats['mean'].calculate(self.scatterContext) == numpy.mean(self.valuesScatterData))
-
- comx = numpy.sum(self.xScatterData * self.valuesScatterData).astype(numpy.float32) / numpy.sum(
- self.valuesScatterData).astype(numpy.float32)
- comy = numpy.sum(self.yScatterData * self.valuesScatterData).astype(numpy.float32) / numpy.sum(
- self.valuesScatterData).astype(numpy.float32)
- self.assertTrue(numpy.all(
- numpy.equal(_stats['com'].calculate(self.scatterContext),
- (comx, comy)))
- )
+ self.assertEqual(_stats['min'].calculate(self.scatterContext), 5)
+ self.assertEqual(_stats['max'].calculate(self.scatterContext), 90)
+ self.assertEqual(_stats['minCoords'].calculate(self.scatterContext), (0, 2))
+ self.assertEqual(_stats['maxCoords'].calculate(self.scatterContext), (50, 69))
+ self.assertEqual(_stats['std'].calculate(self.scatterContext), numpy.std(self.valuesScatterData))
+ self.assertEqual(_stats['mean'].calculate(self.scatterContext), numpy.mean(self.valuesScatterData))
+
+ data = self.valuesScatterData.astype(numpy.float64)
+ comx = numpy.sum(self.xScatterData * data) / numpy.sum(data)
+ comy = numpy.sum(self.yScatterData * data) / numpy.sum(data)
+ self.assertEqual(_stats['com'].calculate(self.scatterContext),
+ (comx, comy))
def testKindNotManagedByStat(self):
"""Make sure an exception is raised if we try to execute calculate
@@ -227,21 +221,21 @@ class TestStats(TestCaseQt):
item=self.plot1d.getCurve('curve0'),
plot=self.plot1d,
onlimits=True)
- self.assertTrue(stat.calculate(curveContextOnLimits) == 2)
+ self.assertEqual(stat.calculate(curveContextOnLimits), 2)
self.plot2d.getXAxis().setLimitsConstraints(minPos=32)
imageContextOnLimits = stats._ImageContext(
item=self.plot2d.getImage('test image'),
plot=self.plot2d,
onlimits=True)
- self.assertTrue(stat.calculate(imageContextOnLimits) == 32)
+ self.assertEqual(stat.calculate(imageContextOnLimits), 32)
self.scatterPlot.getXAxis().setLimitsConstraints(minPos=40)
scatterContextOnLimits = stats._ScatterContext(
item=self.scatterPlot.getScatter('scatter plot'),
plot=self.scatterPlot,
onlimits=True)
- self.assertTrue(stat.calculate(scatterContextOnLimits) == 20)
+ self.assertEqual(stat.calculate(scatterContextOnLimits), 20)
class TestStatsFormatter(TestCaseQt):
@@ -267,15 +261,15 @@ class TestStatsFormatter(TestCaseQt):
"""Make sure a formatter with no formatter definition will return a
simple cast to str"""
emptyFormatter = statshandler.StatFormatter()
- self.assertTrue(
- emptyFormatter.format(self.stat.calculate(self.curveContext)) == '0.000')
+ self.assertEqual(
+ emptyFormatter.format(self.stat.calculate(self.curveContext)), '0.000')
def testSettedFormatter(self):
"""Make sure a formatter with no formatter definition will return a
simple cast to str"""
formatter= statshandler.StatFormatter(formatter='{0:.3f}')
- self.assertTrue(
- formatter.format(self.stat.calculate(self.curveContext)) == '0.000')
+ self.assertEqual(
+ formatter.format(self.stat.calculate(self.curveContext)), '0.000')
class TestStatsHandler(unittest.TestCase):
@@ -309,9 +303,9 @@ class TestStatsHandler(unittest.TestCase):
res = handler0.calculate(item=self.curveItem, plot=self.plot1d,
onlimits=False)
self.assertTrue('min' in res)
- self.assertTrue(res['min'] == '0')
+ self.assertEqual(res['min'], '0')
self.assertTrue('max' in res)
- self.assertTrue(res['max'] == '19')
+ self.assertEqual(res['max'], '19')
handler1 = statshandler.StatsHandler(
(
@@ -323,9 +317,9 @@ class TestStatsHandler(unittest.TestCase):
res = handler1.calculate(item=self.curveItem, plot=self.plot1d,
onlimits=False)
self.assertTrue('min' in res)
- self.assertTrue(res['min'] == '0')
+ self.assertEqual(res['min'], '0')
self.assertTrue('max' in res)
- self.assertTrue(res['max'] == '19.000')
+ self.assertEqual(res['max'], '19.000')
handler2 = statshandler.StatsHandler(
(
@@ -336,9 +330,9 @@ class TestStatsHandler(unittest.TestCase):
res = handler2.calculate(item=self.curveItem, plot=self.plot1d,
onlimits=False)
self.assertTrue('min' in res)
- self.assertTrue(res['min'] == '0')
+ self.assertEqual(res['min'], '0')
self.assertTrue('max' in res)
- self.assertTrue(res['max'] == '19.000')
+ self.assertEqual(res['max'], '19.000')
handler3 = statshandler.StatsHandler((
(('amin', numpy.argmin), statshandler.StatFormatter()),
@@ -348,9 +342,9 @@ class TestStatsHandler(unittest.TestCase):
res = handler3.calculate(item=self.curveItem, plot=self.plot1d,
onlimits=False)
self.assertTrue('amin' in res)
- self.assertTrue(res['amin'] == '0.000')
+ self.assertEqual(res['amin'], '0.000')
self.assertTrue('amax' in res)
- self.assertTrue(res['amax'] == '19')
+ self.assertEqual(res['amax'], '19')
with self.assertRaises(ValueError):
statshandler.StatsHandler(('name'))
@@ -395,47 +389,49 @@ class TestStatsWidgetWithCurves(TestCaseQt):
def testInit(self):
"""Make sure all the curves are registred on initialization"""
- self.assertTrue(self.widget.rowCount() is 3)
+ self.assertEqual(self.widget.rowCount(), 3)
def testRemoveCurve(self):
"""Make sure the Curves stats take into account the curve removal from
plot"""
self.plot.removeCurve('curve2')
- self.assertTrue(self.widget.rowCount() is 2)
+ self.assertEqual(self.widget.rowCount(), 2)
for iRow in range(2):
self.assertTrue(self.widget.item(iRow, 0).text() in ('curve0', 'curve1'))
self.plot.removeCurve('curve0')
- self.assertTrue(self.widget.rowCount() is 1)
+ self.assertEqual(self.widget.rowCount(), 1)
self.plot.removeCurve('curve1')
- self.assertTrue(self.widget.rowCount() is 0)
+ self.assertEqual(self.widget.rowCount(), 0)
def testAddCurve(self):
"""Make sure the Curves stats take into account the add curve action"""
self.plot.addCurve(legend='curve3', x=range(10), y=range(10))
- self.assertTrue(self.widget.rowCount() is 4)
+ self.assertEqual(self.widget.rowCount(), 4)
- def testUpdateCurveFrmAddCurve(self):
+ def testUpdateCurveFromAddCurve(self):
"""Make sure the stats of the cuve will be removed after updating a
curve"""
self.plot.addCurve(legend='curve0', x=range(10), y=range(10))
- self.assertTrue(self.widget.rowCount() is 3)
- itemMax = self.widget._getItem(name='max', legend='curve0',
- kind='curve', indexTable=None)
- self.assertTrue(itemMax.text() == '9')
+ self.qapp.processEvents()
+ self.assertEqual(self.widget.rowCount(), 3)
+ curve = self.plot._getItem(kind='curve', legend='curve0')
+ tableItems = self.widget._itemToTableItems(curve)
+ self.assertEqual(tableItems['max'].text(), '9')
- def testUpdateCurveFrmCurveObj(self):
+ def testUpdateCurveFromCurveObj(self):
self.plot.getCurve('curve0').setData(x=range(4), y=range(4))
- self.assertTrue(self.widget.rowCount() is 3)
- itemMax = self.widget._getItem(name='max', legend='curve0',
- kind='curve', indexTable=None)
- self.assertTrue(itemMax.text() == '3')
+ self.qapp.processEvents()
+ self.assertEqual(self.widget.rowCount(), 3)
+ curve = self.plot._getItem(kind='curve', legend='curve0')
+ tableItems = self.widget._itemToTableItems(curve)
+ self.assertEqual(tableItems['max'].text(), '3')
def testSetAnotherPlot(self):
plot2 = Plot1D()
plot2.addCurve(x=range(26), y=range(26), legend='new curve')
self.widget.setPlot(plot2)
- self.assertTrue(self.widget.rowCount() is 1)
+ self.assertEqual(self.widget.rowCount(), 1)
self.qapp.processEvents()
plot2.setAttribute(qt.Qt.WA_DeleteOnClose)
plot2.close()
@@ -444,12 +440,15 @@ class TestStatsWidgetWithCurves(TestCaseQt):
class TestStatsWidgetWithImages(TestCaseQt):
"""Basic test for StatsWidget with images"""
+
+ IMAGE_LEGEND = 'test image'
+
def setUp(self):
TestCaseQt.setUp(self)
self.plot = Plot2D()
self.plot.addImage(data=numpy.arange(128*128).reshape(128, 128),
- legend='test image', replace=False)
+ legend=self.IMAGE_LEGEND, replace=False)
self.widget = StatsWidget.StatsTable(plot=self.plot)
@@ -476,31 +475,30 @@ class TestStatsWidgetWithImages(TestCaseQt):
TestCaseQt.tearDown(self)
def test(self):
- columnsIndex = self.widget._columns_index
- itemLegend = self.widget._lgdAndKindToItems[('test image', 'image')]['legend']
- itemMin = self.widget.item(itemLegend.row(), columnsIndex['min'])
- itemMax = self.widget.item(itemLegend.row(), columnsIndex['max'])
- itemDelta = self.widget.item(itemLegend.row(), columnsIndex['delta'])
- itemCoordsMin = self.widget.item(itemLegend.row(),
- columnsIndex['coords min'])
- itemCoordsMax = self.widget.item(itemLegend.row(),
- columnsIndex['coords max'])
- max = (128 * 128) - 1
- self.assertTrue(itemMin.text() == '0.000')
- self.assertTrue(itemMax.text() == '{0:.3f}'.format(max))
- self.assertTrue(itemDelta.text() == '{0:.3f}'.format(max))
- self.assertTrue(itemCoordsMin.text() == '0.0, 0.0')
- self.assertTrue(itemCoordsMax.text() == '127.0, 127.0')
+ image = self.plot._getItem(
+ kind='image', legend=self.IMAGE_LEGEND)
+ tableItems = self.widget._itemToTableItems(image)
+
+ maxText = '{0:.3f}'.format((128 * 128) - 1)
+ self.assertEqual(tableItems['legend'].text(), self.IMAGE_LEGEND)
+ self.assertEqual(tableItems['min'].text(), '0.000')
+ self.assertEqual(tableItems['max'].text(), maxText)
+ self.assertEqual(tableItems['delta'].text(), maxText)
+ self.assertEqual(tableItems['coords min'].text(), '0.0, 0.0')
+ self.assertEqual(tableItems['coords max'].text(), '127.0, 127.0')
class TestStatsWidgetWithScatters(TestCaseQt):
+
+ SCATTER_LEGEND = 'scatter plot'
+
def setUp(self):
TestCaseQt.setUp(self)
self.scatterPlot = Plot2D()
self.scatterPlot.addScatter([0, 1, 2, 20, 50, 60],
[2, 3, 4, 26, 69, 6],
[5, 6, 7, 10, 90, 20],
- legend='scatter plot')
+ legend=self.SCATTER_LEGEND)
self.widget = StatsWidget.StatsTable(plot=self.scatterPlot)
mystats = statshandler.StatsHandler((
@@ -526,33 +524,89 @@ class TestStatsWidgetWithScatters(TestCaseQt):
TestCaseQt.tearDown(self)
def testStats(self):
- columnsIndex = self.widget._columns_index
- itemLegend = self.widget._lgdAndKindToItems[('scatter plot', 'scatter')]['legend']
- itemMin = self.widget.item(itemLegend.row(), columnsIndex['min'])
- itemMax = self.widget.item(itemLegend.row(), columnsIndex['max'])
- itemDelta = self.widget.item(itemLegend.row(), columnsIndex['delta'])
- itemCoordsMin = self.widget.item(itemLegend.row(),
- columnsIndex['coords min'])
- itemCoordsMax = self.widget.item(itemLegend.row(),
- columnsIndex['coords max'])
- self.assertTrue(itemMin.text() == '5')
- self.assertTrue(itemMax.text() == '90')
- self.assertTrue(itemDelta.text() == '85')
- self.assertTrue(itemCoordsMin.text() == '0, 2')
- self.assertTrue(itemCoordsMax.text() == '50, 69')
+ scatter = self.scatterPlot._getItem(
+ kind='scatter', legend=self.SCATTER_LEGEND)
+ tableItems = self.widget._itemToTableItems(scatter)
+ self.assertEqual(tableItems['legend'].text(), self.SCATTER_LEGEND)
+ self.assertEqual(tableItems['min'].text(), '5')
+ self.assertEqual(tableItems['coords min'].text(), '0, 2')
+ self.assertEqual(tableItems['max'].text(), '90')
+ self.assertEqual(tableItems['coords max'].text(), '50, 69')
+ self.assertEqual(tableItems['delta'].text(), '85')
class TestEmptyStatsWidget(TestCaseQt):
def test(self):
widget = StatsWidget.StatsWidget()
widget.show()
+ self.qWaitForWindowExposed(widget)
+
+
+# skip unit test for pyqt4 because there is some unrealised widget without
+# apparent reason
+@unittest.skipIf(qt.qVersion().split('.')[0] == '4', reason='PyQt4 not tested')
+class TestLineWidget(TestCaseQt):
+ """Some test for the StatsLineWidget."""
+ def setUp(self):
+ TestCaseQt.setUp(self)
+
+ mystats = statshandler.StatsHandler((
+ (stats.StatMin(), statshandler.StatFormatter()),
+ ))
+
+ self.plot = Plot1D()
+ self.plot.show()
+ x = range(20)
+ y = range(20)
+ self.plot.addCurve(x, y, legend='curve0')
+ y = range(12, 32)
+ self.plot.addCurve(x, y, legend='curve1')
+ y = range(-2, 18)
+ self.plot.addCurve(x, y, legend='curve2')
+ self.widget = StatsWidget.BasicGridStatsWidget(plot=self.plot,
+ kind='curve',
+ stats=mystats)
+
+ def tearDown(self):
+ self.qapp.processEvents()
+ self.plot.setAttribute(qt.Qt.WA_DeleteOnClose)
+ self.plot.close()
+ self.widget.setPlot(None)
+ self.widget._statQlineEdit.clear()
+ self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
+ self.widget.close()
+ self.widget = None
+ self.plot = None
+ TestCaseQt.tearDown(self)
+
+ def test(self):
+ self.widget.setStatsOnVisibleData(False)
+ self.qapp.processEvents()
+ self.plot.setActiveCurve(legend='curve0')
+ self.assertTrue(self.widget._statQlineEdit['min'].text() == '0.000')
+ self.plot.setActiveCurve(legend='curve1')
+ self.assertTrue(self.widget._statQlineEdit['min'].text() == '12.000')
+ self.plot.getXAxis().setLimitsConstraints(minPos=2, maxPos=5)
+ self.widget.setStatsOnVisibleData(True)
+ self.qapp.processEvents()
+ self.assertTrue(self.widget._statQlineEdit['min'].text() == '14.000')
+ self.plot.setActiveCurve(None)
+ self.assertTrue(self.plot.getActiveCurve() is None)
+ self.widget.setStatsOnVisibleData(False)
+ self.qapp.processEvents()
+ self.assertFalse(self.widget._statQlineEdit['min'].text() == '14.000')
+ self.widget.setKind('image')
+ self.plot.addImage(numpy.arange(100*100).reshape(100, 100) + 0.312)
+ self.qapp.processEvents()
+ self.assertTrue(self.widget._statQlineEdit['min'].text() == '0.312')
def suite():
test_suite = unittest.TestSuite()
for TestClass in (TestStats, TestStatsHandler, TestStatsWidgetWithScatters,
TestStatsWidgetWithImages, TestStatsWidgetWithCurves,
- TestStatsFormatter, TestEmptyStatsWidget):
+ TestStatsFormatter, TestEmptyStatsWidget,
+ TestLineWidget):
test_suite.addTest(
unittest.defaultTestLoader.loadTestsFromTestCase(TestClass))
return test_suite