summaryrefslogtreecommitdiff
path: root/silx/gui/plot/test/testCurvesROIWidget.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/plot/test/testCurvesROIWidget.py')
-rw-r--r--silx/gui/plot/test/testCurvesROIWidget.py469
1 files changed, 0 insertions, 469 deletions
diff --git a/silx/gui/plot/test/testCurvesROIWidget.py b/silx/gui/plot/test/testCurvesROIWidget.py
deleted file mode 100644
index 6a0ab8c..0000000
--- a/silx/gui/plot/test/testCurvesROIWidget.py
+++ /dev/null
@@ -1,469 +0,0 @@
-# coding: utf-8
-# /*##########################################################################
-#
-# Copyright (c) 2016-2020 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
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# ###########################################################################*/
-"""Basic tests for CurvesROIWidget"""
-
-__authors__ = ["T. Vincent", "P. Knobel", "H. Payno"]
-__license__ = "MIT"
-__date__ = "16/11/2017"
-
-
-import logging
-import os.path
-import unittest
-from collections import OrderedDict
-import numpy
-
-from silx.gui import qt
-from silx.gui.plot import items
-from silx.gui.plot import Plot1D
-from silx.test.utils import temp_dir
-from silx.gui.utils.testutils import TestCaseQt, SignalListener
-from silx.gui.plot import PlotWindow, CurvesROIWidget
-from silx.gui.plot.CurvesROIWidget import ROITable
-from silx.gui.utils.testutils import getQToolButtonFromAction
-from silx.gui.plot.PlotInteraction import ItemsInteraction
-
-_logger = logging.getLogger(__name__)
-
-
-class TestCurvesROIWidget(TestCaseQt):
- """Basic test for CurvesROIWidget"""
-
- def setUp(self):
- super(TestCurvesROIWidget, self).setUp()
- self.plot = PlotWindow()
- self.plot.show()
- self.qWaitForWindowExposed(self.plot)
-
- self.widget = self.plot.getCurvesRoiDockWidget()
-
- self.widget.show()
- self.qWaitForWindowExposed(self.widget)
-
- def tearDown(self):
- self.plot.setAttribute(qt.Qt.WA_DeleteOnClose)
- self.plot.close()
- del self.plot
-
- self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
- self.widget.close()
- del self.widget
-
- super(TestCurvesROIWidget, self).tearDown()
-
- def testDummyAPI(self):
- """Simple test of the getRois and setRois API"""
- roi_neg = CurvesROIWidget.ROI(name='negative', fromdata=-20,
- todata=-10, type_='X')
- roi_pos = CurvesROIWidget.ROI(name='positive', fromdata=10,
- todata=20, type_='X')
-
- self.widget.roiWidget.setRois((roi_pos, roi_neg))
-
- rois_defs = self.widget.roiWidget.getRois()
- self.widget.roiWidget.setRois(rois=rois_defs)
-
- def testWithCurves(self):
- """Plot with curves: test all ROI widget buttons"""
- for offset in range(2):
- self.plot.addCurve(numpy.arange(1000),
- offset + numpy.random.random(1000),
- legend=str(offset))
-
- # Add two ROI
- self.mouseClick(self.widget.roiWidget.addButton, qt.Qt.LeftButton)
- self.qWait(200)
- self.mouseClick(self.widget.roiWidget.addButton, qt.Qt.LeftButton)
- self.qWait(200)
-
- # Change active curve
- self.plot.setActiveCurve(str(1))
-
- # Delete a ROI
- self.mouseClick(self.widget.roiWidget.delButton, qt.Qt.LeftButton)
- self.qWait(200)
-
- with temp_dir() as tmpDir:
- self.tmpFile = os.path.join(tmpDir, 'test.ini')
-
- # Save ROIs
- self.widget.roiWidget.save(self.tmpFile)
- self.assertTrue(os.path.isfile(self.tmpFile))
- self.assertEqual(len(self.widget.getRois()), 2)
-
- # Reset ROIs
- self.mouseClick(self.widget.roiWidget.resetButton,
- qt.Qt.LeftButton)
- self.qWait(200)
- rois = self.widget.getRois()
- self.assertEqual(len(rois), 1)
- roiID = list(rois.keys())[0]
- self.assertEqual(rois[roiID].getName(), 'ICR')
-
- # Load ROIs
- self.widget.roiWidget.load(self.tmpFile)
- self.assertEqual(len(self.widget.getRois()), 2)
-
- del self.tmpFile
-
- def testMiddleMarker(self):
- """Test with middle marker enabled"""
- self.widget.roiWidget.roiTable.setMiddleROIMarkerFlag(True)
-
- # Add a ROI
- self.mouseClick(self.widget.roiWidget.addButton, qt.Qt.LeftButton)
-
- for roiID in self.widget.roiWidget.roiTable._markersHandler._roiMarkerHandlers:
- handler = self.widget.roiWidget.roiTable._markersHandler._roiMarkerHandlers[roiID]
- assert handler.getMarker('min')
- xleftMarker = handler.getMarker('min').getXPosition()
- xMiddleMarker = handler.getMarker('middle').getXPosition()
- xRightMarker = handler.getMarker('max').getXPosition()
- thValue = xleftMarker + (xRightMarker - xleftMarker) / 2.
- self.assertAlmostEqual(xMiddleMarker, thValue)
-
- def testAreaCalculation(self):
- """Test result of area calculation"""
- x = numpy.arange(100.)
- y = numpy.arange(100.)
-
- # Add two curves
- self.plot.addCurve(x, y, legend="positive")
- self.plot.addCurve(-x, y, legend="negative")
-
- # Make sure there is an active curve and it is the positive one
- self.plot.setActiveCurve("positive")
-
- # Add two ROIs
- roi_neg = CurvesROIWidget.ROI(name='negative', fromdata=-20,
- todata=-10, type_='X')
- roi_pos = CurvesROIWidget.ROI(name='positive', fromdata=10,
- todata=20, type_='X')
-
- self.widget.roiWidget.setRois((roi_pos, roi_neg))
-
- posCurve = self.plot.getCurve('positive')
- negCurve = self.plot.getCurve('negative')
-
- self.assertEqual(roi_pos.computeRawAndNetArea(posCurve),
- (numpy.trapz(y=[10, 20], x=[10, 20]),
- 0.0))
- self.assertEqual(roi_pos.computeRawAndNetArea(negCurve),
- (0.0, 0.0))
- self.assertEqual(roi_neg.computeRawAndNetArea(posCurve),
- ((0.0), 0.0))
- self.assertEqual(roi_neg.computeRawAndNetArea(negCurve),
- ((-150.0), 0.0))
-
- def testCountsCalculation(self):
- """Test result of count calculation"""
- x = numpy.arange(100.)
- y = numpy.arange(100.)
-
- # Add two curves
- self.plot.addCurve(x, y, legend="positive")
- self.plot.addCurve(-x, y, legend="negative")
-
- # Make sure there is an active curve and it is the positive one
- self.plot.setActiveCurve("positive")
-
- # Add two ROIs
- roi_neg = CurvesROIWidget.ROI(name='negative', fromdata=-20,
- todata=-10, type_='X')
- roi_pos = CurvesROIWidget.ROI(name='positive', fromdata=10,
- todata=20, type_='X')
-
- self.widget.roiWidget.setRois((roi_pos, roi_neg))
-
- posCurve = self.plot.getCurve('positive')
- negCurve = self.plot.getCurve('negative')
-
- self.assertEqual(roi_pos.computeRawAndNetCounts(posCurve),
- (y[10:21].sum(), 0.0))
- self.assertEqual(roi_pos.computeRawAndNetCounts(negCurve),
- (0.0, 0.0))
- self.assertEqual(roi_neg.computeRawAndNetCounts(posCurve),
- ((0.0), 0.0))
- self.assertEqual(roi_neg.computeRawAndNetCounts(negCurve),
- (y[10:21].sum(), 0.0))
-
- def testDeferedInit(self):
- """Test behavior of the deferedInit"""
- x = numpy.arange(100.)
- y = numpy.arange(100.)
- self.plot.addCurve(x=x, y=y, legend="name", replace="True")
- roisDefs = OrderedDict([
- ["range1",
- OrderedDict([["from", 20], ["to", 200], ["type", "energy"]])],
- ["range2",
- OrderedDict([["from", 300], ["to", 500], ["type", "energy"]])]
- ])
-
- roiWidget = self.plot.getCurvesRoiDockWidget().roiWidget
- self.plot.getCurvesRoiDockWidget().setRois(roisDefs)
- self.assertEqual(len(roiWidget.getRois()), len(roisDefs))
- self.plot.getCurvesRoiDockWidget().setVisible(True)
- self.assertEqual(len(roiWidget.getRois()), len(roisDefs))
-
- def testDictCompatibility(self):
- """Test that ROI api is valid with dict and not information is lost"""
- roiDict = {'from': 20, 'to': 200, 'type': 'energy', 'comment': 'no',
- 'name': 'myROI', 'calibration': [1, 2, 3]}
- roi = CurvesROIWidget.ROI._fromDict(roiDict)
- self.assertEqual(roi.toDict(), roiDict)
-
- def testShowAllROI(self):
- """Test the show allROI action"""
- x = numpy.arange(100.)
- y = numpy.arange(100.)
- self.plot.addCurve(x=x, y=y, legend="name", replace="True")
-
- roisDefsDict = {
- "range1": {"from": 20, "to": 200,"type": "energy"},
- "range2": {"from": 300, "to": 500, "type": "energy"}
- }
-
- roisDefsObj = (
- CurvesROIWidget.ROI(name='range3', fromdata=20, todata=200,
- type_='energy'),
- CurvesROIWidget.ROI(name='range4', fromdata=300, todata=500,
- type_='energy')
- )
- self.widget.roiWidget.showAllMarkers(True)
- roiWidget = self.plot.getCurvesRoiDockWidget().roiWidget
- roiWidget.setRois(roisDefsDict)
- markers = [item for item in self.plot.getItems()
- if isinstance(item, items.MarkerBase)]
- self.assertEqual(len(markers), 2*3)
-
- markersHandler = self.widget.roiWidget.roiTable._markersHandler
- roiWidget.showAllMarkers(True)
- ICRROI = markersHandler.getVisibleRois()
- self.assertEqual(len(ICRROI), 2)
-
- roiWidget.showAllMarkers(False)
- ICRROI = markersHandler.getVisibleRois()
- self.assertEqual(len(ICRROI), 1)
-
- roiWidget.setRois(roisDefsObj)
- self.qapp.processEvents()
- markers = [item for item in self.plot.getItems()
- if isinstance(item, items.MarkerBase)]
- self.assertEqual(len(markers), 2*3)
-
- markersHandler = self.widget.roiWidget.roiTable._markersHandler
- roiWidget.showAllMarkers(True)
- ICRROI = markersHandler.getVisibleRois()
- self.assertEqual(len(ICRROI), 2)
-
- roiWidget.showAllMarkers(False)
- ICRROI = markersHandler.getVisibleRois()
- self.assertEqual(len(ICRROI), 1)
-
- def testRoiEdition(self):
- """Make sure if the ROI object is edited the ROITable will be updated
- """
- roi = CurvesROIWidget.ROI(name='linear', fromdata=0, todata=5)
- self.widget.roiWidget.setRois((roi, ))
-
- x = (0, 1, 1, 2, 2, 3)
- y = (1, 1, 2, 2, 1, 1)
- self.plot.addCurve(x=x, y=y, legend='linearCurve')
- self.plot.setActiveCurve(legend='linearCurve')
- self.widget.calculateROIs()
-
- roiTable = self.widget.roiWidget.roiTable
- indexesColumns = CurvesROIWidget.ROITable.COLUMNS_INDEX
- itemRawCounts = roiTable.item(0, indexesColumns['Raw Counts'])
- itemNetCounts = roiTable.item(0, indexesColumns['Net Counts'])
-
- self.assertTrue(itemRawCounts.text() == '8.0')
- self.assertTrue(itemNetCounts.text() == '2.0')
-
- itemRawArea = roiTable.item(0, indexesColumns['Raw Area'])
- itemNetArea = roiTable.item(0, indexesColumns['Net Area'])
-
- self.assertTrue(itemRawArea.text() == '4.0')
- self.assertTrue(itemNetArea.text() == '1.0')
-
- roi.setTo(2)
- itemRawArea = roiTable.item(0, indexesColumns['Raw Area'])
- self.assertTrue(itemRawArea.text() == '3.0')
- roi.setFrom(1)
- itemRawArea = roiTable.item(0, indexesColumns['Raw Area'])
- self.assertTrue(itemRawArea.text() == '2.0')
-
- def testRemoveActiveROI(self):
- """Test widget behavior when removing the active ROI"""
- roi = CurvesROIWidget.ROI(name='linear', fromdata=0, todata=5)
- self.widget.roiWidget.setRois((roi,))
-
- self.widget.roiWidget.roiTable.setActiveRoi(None)
- self.assertEqual(len(self.widget.roiWidget.roiTable.selectedItems()), 0)
- self.widget.roiWidget.setRois((roi,))
- self.plot.setActiveCurve(legend='linearCurve')
- self.widget.calculateROIs()
-
- def testEmitCurrentROI(self):
- """Test behavior of the CurvesROIWidget.sigROISignal"""
- roi = CurvesROIWidget.ROI(name='linear', fromdata=0, todata=5)
- self.widget.roiWidget.setRois((roi,))
- signalListener = SignalListener()
- self.widget.roiWidget.sigROISignal.connect(signalListener.partial())
- self.widget.show()
- self.qapp.processEvents()
- self.assertEqual(signalListener.callCount(), 0)
- self.assertIs(self.widget.roiWidget.roiTable.activeRoi, roi)
- roi.setFrom(0.0)
- self.qapp.processEvents()
- self.assertEqual(signalListener.callCount(), 0)
- roi.setFrom(0.3)
- self.qapp.processEvents()
- self.assertEqual(signalListener.callCount(), 1)
-
-
-class TestRoiWidgetSignals(TestCaseQt):
- """Test Signals emitted by the RoiWidgetSignals"""
-
- def setUp(self):
- self.plot = Plot1D()
- x = range(20)
- y = range(20)
- self.plot.addCurve(x, y, legend='curve0')
- self.listener = SignalListener()
- self.curves_roi_widget = self.plot.getCurvesRoiWidget()
- self.curves_roi_widget.sigROISignal.connect(self.listener)
- assert self.curves_roi_widget.isVisible() is False
- assert self.listener.callCount() == 0
- self.plot.show()
- self.qWaitForWindowExposed(self.plot)
-
- toolButton = getQToolButtonFromAction(self.plot.getRoiAction())
- self.mouseClick(widget=toolButton, button=qt.Qt.LeftButton)
-
- self.curves_roi_widget.show()
- self.qWaitForWindowExposed(self.curves_roi_widget)
-
- def tearDown(self):
- self.plot = None
-
- def testSigROISignalAddRmRois(self):
- """Test SigROISignal when adding and removing ROIS"""
- self.assertEqual(self.listener.callCount(), 1)
- self.listener.clear()
-
- roi1 = CurvesROIWidget.ROI(name='linear', fromdata=0, todata=5)
- self.curves_roi_widget.roiTable.registerROI(roi1)
- self.assertEqual(self.listener.callCount(), 1)
- self.assertTrue(self.listener.arguments()[0][0]['current'] == 'linear')
- self.listener.clear()
-
- roi2 = CurvesROIWidget.ROI(name='linear2', fromdata=0, todata=5)
- self.curves_roi_widget.roiTable.registerROI(roi2)
- self.assertEqual(self.listener.callCount(), 1)
- self.assertTrue(self.listener.arguments()[0][0]['current'] == 'linear2')
- self.listener.clear()
-
- self.curves_roi_widget.roiTable.removeROI(roi2)
- self.assertEqual(self.listener.callCount(), 1)
- self.assertTrue(self.curves_roi_widget.roiTable.activeRoi == roi1)
- self.assertTrue(self.listener.arguments()[0][0]['current'] == 'linear')
- self.listener.clear()
-
- self.curves_roi_widget.roiTable.deleteActiveRoi()
- self.assertEqual(self.listener.callCount(), 1)
- self.assertTrue(self.curves_roi_widget.roiTable.activeRoi is None)
- self.assertTrue(self.listener.arguments()[0][0]['current'] is None)
- self.listener.clear()
-
- self.curves_roi_widget.roiTable.registerROI(roi1)
- self.assertEqual(self.listener.callCount(), 1)
- self.assertTrue(self.listener.arguments()[0][0]['current'] == 'linear')
- self.assertTrue(self.curves_roi_widget.roiTable.activeRoi == roi1)
- self.listener.clear()
- self.qapp.processEvents()
-
- self.curves_roi_widget.roiTable.removeROI(roi1)
- self.qapp.processEvents()
- self.assertEqual(self.listener.callCount(), 1)
- self.assertTrue(self.listener.arguments()[0][0]['current'] == 'ICR')
- self.listener.clear()
-
- def testSigROISignalModifyROI(self):
- """Test SigROISignal when modifying it"""
- self.curves_roi_widget.roiTable.setMiddleROIMarkerFlag(True)
- roi1 = CurvesROIWidget.ROI(name='linear', fromdata=2, todata=5)
- self.curves_roi_widget.roiTable.registerROI(roi1)
- self.curves_roi_widget.roiTable.setActiveRoi(roi1)
-
- # test modify the roi2 object
- self.listener.clear()
- roi1.setFrom(0.56)
- self.assertEqual(self.listener.callCount(), 1)
- self.listener.clear()
- roi1.setTo(2.56)
- self.assertEqual(self.listener.callCount(), 1)
- self.listener.clear()
- roi1.setName('linear2')
- self.assertEqual(self.listener.callCount(), 1)
- self.listener.clear()
- roi1.setType('new type')
- self.assertEqual(self.listener.callCount(), 1)
-
- # modify roi limits (from the gui)
- roi_marker_handler = self.curves_roi_widget.roiTable._markersHandler.getMarkerHandler(roi1.getID())
- for marker_type in ('min', 'max', 'middle'):
- with self.subTest(marker_type=marker_type):
- self.listener.clear()
- marker = roi_marker_handler.getMarker(marker_type)
- self.qapp.processEvents()
- items_interaction = ItemsInteraction(plot=self.plot)
- x_pix, y_pix = self.plot.dataToPixel(marker.getXPosition(), 1)
- items_interaction.beginDrag(x_pix, y_pix)
- self.qapp.processEvents()
- items_interaction.endDrag(x_pix+10, y_pix)
- self.qapp.processEvents()
- self.assertEqual(self.listener.callCount(), 1)
-
- def testSetActiveCurve(self):
- """Test sigRoiSignal when set an active curve"""
- roi1 = CurvesROIWidget.ROI(name='linear', fromdata=2, todata=5)
- self.curves_roi_widget.roiTable.registerROI(roi1)
- self.curves_roi_widget.roiTable.setActiveRoi(roi1)
- self.listener.clear()
- self.plot.setActiveCurve('curve0')
- self.assertEqual(self.listener.callCount(), 0)
-
-
-def suite():
- test_suite = unittest.TestSuite()
- for TestClass in (TestCurvesROIWidget,):
- test_suite.addTest(
- unittest.defaultTestLoader.loadTestsFromTestCase(TestClass))
- return test_suite
-
-
-if __name__ == '__main__':
- unittest.main(defaultTest='suite')