summaryrefslogtreecommitdiff
path: root/silx/gui/plot/ROIStatsWidget.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/plot/ROIStatsWidget.py')
-rw-r--r--silx/gui/plot/ROIStatsWidget.py780
1 files changed, 0 insertions, 780 deletions
diff --git a/silx/gui/plot/ROIStatsWidget.py b/silx/gui/plot/ROIStatsWidget.py
deleted file mode 100644
index 094d66a..0000000
--- a/silx/gui/plot/ROIStatsWidget.py
+++ /dev/null
@@ -1,780 +0,0 @@
-# coding: utf-8
-# /*##########################################################################
-#
-# Copyright (c) 2016-2018 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.
-#
-# ###########################################################################*/
-"""This module provides widget for displaying statistics relative to a
-Region of interest and an item
-"""
-
-
-__authors__ = ["H. Payno"]
-__license__ = "MIT"
-__date__ = "22/07/2019"
-
-
-from contextlib import contextmanager
-from silx.gui import qt
-from silx.gui import icons
-from silx.gui.plot.StatsWidget import _StatsWidgetBase, StatsTable, _Container
-from silx.gui.plot.StatsWidget import UpdateModeWidget, UpdateMode
-from silx.gui.widgets.TableWidget import TableWidget
-from silx.gui.plot.items.roi import RegionOfInterest
-from silx.gui.plot import items as plotitems
-from silx.gui.plot.items.core import ItemChangedType
-from silx.gui.plot3d import items as plot3ditems
-from silx.gui.plot.CurvesROIWidget import ROI
-from silx.gui.plot import stats as statsmdl
-from collections import OrderedDict
-from silx.utils.proxy import docstring
-import silx.gui.plot.items.marker
-import silx.gui.plot.items.shape
-import functools
-import logging
-
-_logger = logging.getLogger(__name__)
-
-
-class _GetROIItemCoupleDialog(qt.QDialog):
- """
- Dialog used to know which plot item and which roi he wants
- """
- _COMPATIBLE_KINDS = ('curve', 'image', 'scatter', 'histogram')
-
- def __init__(self, parent=None, plot=None, rois=None):
- qt.QDialog.__init__(self, parent=parent)
- assert plot is not None
- assert rois is not None
- self._plot = plot
- self._rois = rois
-
- self.setLayout(qt.QVBoxLayout())
-
- # define the selection widget
- self._selection_widget = qt.QWidget()
- self._selection_widget.setLayout(qt.QHBoxLayout())
- self._kindCB = qt.QComboBox(parent=self)
- self._selection_widget.layout().addWidget(self._kindCB)
- self._itemCB = qt.QComboBox(parent=self)
- self._selection_widget.layout().addWidget(self._itemCB)
- self._roiCB = qt.QComboBox(parent=self)
- self._selection_widget.layout().addWidget(self._roiCB)
- self.layout().addWidget(self._selection_widget)
-
- # define modal buttons
- types = qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel
- self._buttonsModal = qt.QDialogButtonBox(parent=self)
- self._buttonsModal.setStandardButtons(types)
- self.layout().addWidget(self._buttonsModal)
- self._buttonsModal.accepted.connect(self.accept)
- self._buttonsModal.rejected.connect(self.reject)
-
- # connect signal / slot
- self._kindCB.currentIndexChanged.connect(self._updateValidItemAndRoi)
-
- def _getCompatibleRois(self, kind):
- """Return compatible rois for the given item kind"""
- def is_compatible(roi, kind):
- if isinstance(roi, RegionOfInterest):
- return kind in ('image', 'scatter')
- elif isinstance(roi, ROI):
- return kind in ('curve', 'histogram')
- else:
- raise ValueError('kind not managed')
- return list(filter(lambda x: is_compatible(x, kind), self._rois))
-
- def exec_(self):
- self._kindCB.clear()
- self._itemCB.clear()
- # filter kind without any items
- self._valid_kinds = {}
- # key is item type, value kinds
- self._valid_rois = {}
- # key is item type, value rois
- self._kind_name_to_roi = {}
- # key is (kind, roi name) value is roi
- self._kind_name_to_item = {}
- # key is (kind, legend name) value is item
- for kind in _GetROIItemCoupleDialog._COMPATIBLE_KINDS:
- def getItems(kind):
- output = []
- for item in self._plot.getItems():
- type_ = self._plot._itemKind(item)
- if type_ in kind and item.isVisible():
- output.append(item)
- return output
-
- items = getItems(kind=kind)
- rois = self._getCompatibleRois(kind=kind)
- if len(items) > 0 and len(rois) > 0:
- self._valid_kinds[kind] = items
- self._valid_rois[kind] = rois
- for roi in rois:
- name = roi.getName()
- self._kind_name_to_roi[(kind, name)] = roi
- for item in items:
- self._kind_name_to_item[(kind, item.getLegend())] = item
-
- # filter roi according to kinds
- if len(self._valid_kinds) == 0:
- _logger.warning('no couple item/roi detected for displaying stats')
- return self.reject()
-
- for kind in self._valid_kinds:
- self._kindCB.addItem(kind)
- self._updateValidItemAndRoi()
-
- return qt.QDialog.exec_(self)
-
- def _updateValidItemAndRoi(self, *args, **kwargs):
- self._itemCB.clear()
- self._roiCB.clear()
- kind = self._kindCB.currentText()
- for roi in self._valid_rois[kind]:
- self._roiCB.addItem(roi.getName())
- for item in self._valid_kinds[kind]:
- self._itemCB.addItem(item.getLegend())
-
- def getROI(self):
- kind = self._kindCB.currentText()
- roi_name = self._roiCB.currentText()
- return self._kind_name_to_roi[(kind, roi_name)]
-
- def getItem(self):
- kind = self._kindCB.currentText()
- item_name = self._itemCB.currentText()
- return self._kind_name_to_item[(kind, item_name)]
-
-
-class ROIStatsItemHelper(object):
- """Item utils to associate a plot item and a roi
-
- Display on one row statistics regarding the couple
- (Item (plot item) / roi).
-
- :param Item plot_item: item for which we want statistics
- :param Union[ROI,RegionOfInterest]: region of interest to use for
- statistics.
- """
- def __init__(self, plot_item, roi):
- self._plot_item = plot_item
- self._roi = roi
-
- @property
- def roi(self):
- """roi"""
- return self._roi
-
- def roi_name(self):
- if isinstance(self._roi, ROI):
- return self._roi.getName()
- elif isinstance(self._roi, RegionOfInterest):
- return self._roi.getName()
- else:
- raise TypeError('Unmanaged roi type')
-
- @property
- def roi_kind(self):
- """roi class"""
- return self._roi.__class__
-
- # TODO: should call a util function from the wrapper ?
- def item_kind(self):
- """item kind"""
- if isinstance(self._plot_item, plotitems.Curve):
- return 'curve'
- elif isinstance(self._plot_item, plotitems.ImageData):
- return 'image'
- elif isinstance(self._plot_item, plotitems.Scatter):
- return 'scatter'
- elif isinstance(self._plot_item, plotitems.Histogram):
- return 'histogram'
- elif isinstance(self._plot_item, (plot3ditems.ImageData,
- plot3ditems.ScalarField3D)):
- return 'image'
- elif isinstance(self._plot_item, (plot3ditems.Scatter2D,
- plot3ditems.Scatter3D)):
- return 'scatter'
-
- @property
- def item_legend(self):
- """legend of the plot Item"""
- return self._plot_item.getLegend()
-
- def id_key(self):
- """unique key to represent the couple (item, roi)"""
- return (self.item_kind(), self.item_legend, self.roi_kind,
- self.roi_name())
-
-
-class _StatsROITable(_StatsWidgetBase, TableWidget):
- """
- Table sued to display some statistics regarding a couple (item/roi)
- """
- _LEGEND_HEADER_DATA = 'legend'
-
- _KIND_HEADER_DATA = 'kind'
-
- _ROI_HEADER_DATA = 'roi'
-
- sigUpdateModeChanged = qt.Signal(object)
- """Signal emitted when the update mode changed"""
-
- def __init__(self, parent, plot):
- TableWidget.__init__(self, parent)
- _StatsWidgetBase.__init__(self, statsOnVisibleData=False,
- displayOnlyActItem=False)
- self.__region_edition_callback = {}
- """We need to keep trace of the roi signals connection because
- the roi emits the sigChanged during roi edition"""
- self._items = {}
- self.setRowCount(0)
- self.setColumnCount(3)
-
- # Init headers
- headerItem = qt.QTableWidgetItem(self._LEGEND_HEADER_DATA.title())
- headerItem.setData(qt.Qt.UserRole, self._LEGEND_HEADER_DATA)
- self.setHorizontalHeaderItem(0, headerItem)
- headerItem = qt.QTableWidgetItem(self._KIND_HEADER_DATA.title())
- headerItem.setData(qt.Qt.UserRole, self._KIND_HEADER_DATA)
- self.setHorizontalHeaderItem(1, headerItem)
- headerItem = qt.QTableWidgetItem(self._ROI_HEADER_DATA.title())
- headerItem.setData(qt.Qt.UserRole, self._ROI_HEADER_DATA)
- self.setHorizontalHeaderItem(2, headerItem)
-
- self.setSortingEnabled(True)
- self.setPlot(plot)
-
- self.__plotItemToItems = {}
- """Key is plotItem, values is list of __RoiStatsItemWidget"""
- self.__roiToItems = {}
- """Key is roi, values is list of __RoiStatsItemWidget"""
- self.__roisKeyToRoi = {}
-
- def add(self, item):
- assert isinstance(item, ROIStatsItemHelper)
- if item.id_key() in self._items:
- _logger.warning(item.id_key(), 'is already present')
- return None
- self._items[item.id_key()] = item
- self._addItem(item)
- return item
-
- def _addItem(self, item):
- """
- Add a _RoiStatsItemWidget item to the table.
-
- :param item:
- :return: True if successfully added.
- """
- if not isinstance(item, ROIStatsItemHelper):
- # skipped because also receive all new plot item (Marker...) that
- # we don't want to manage in this case.
- return
- # plotItem = item.getItem()
- # roi = item.getROI()
- kind = item.item_kind()
- if kind not in statsmdl.BASIC_COMPATIBLE_KINDS:
- _logger.info("Item has not a supported type: %s", item)
- return False
-
- # register the roi and the kind
- self._registerPlotItem(item)
- self._registerROI(item)
-
- # Prepare table items
- tableItems = [
- qt.QTableWidgetItem(), # Legend
- qt.QTableWidgetItem(), # Kind
- qt.QTableWidgetItem()] # roi
-
- for column in range(3, self.columnCount()):
- header = self.horizontalHeaderItem(column)
- name = header.data(qt.Qt.UserRole)
-
- formatter = self._statsHandler.formatters[name]
- if formatter:
- tableItem = formatter.tabWidgetItemClass()
- else:
- tableItem = qt.QTableWidgetItem()
-
- tooltip = self._statsHandler.stats[name].getToolTip(kind=kind)
- if tooltip is not None:
- tableItem.setToolTip(tooltip)
-
- tableItems.append(tableItem)
-
- # Disable sorting while adding table items
- with self._disableSorting():
- # Add a row to the table
- self.setRowCount(self.rowCount() + 1)
-
- # Add table items to the last row
- row = self.rowCount() - 1
- for column, tableItem in enumerate(tableItems):
- tableItem.setData(qt.Qt.UserRole, _Container(item))
- tableItem.setFlags(
- qt.Qt.ItemIsEnabled | qt.Qt.ItemIsSelectable)
- self.setItem(row, column, tableItem)
-
- # Update table items content
- self._updateStats(item, data_changed=True)
-
- # Listen for item changes
- # Using queued connection to avoid issue with sender
- # being that of the signal calling the signal
- item._plot_item.sigItemChanged.connect(self._plotItemChanged,
- qt.Qt.QueuedConnection)
- return True
-
- def _removeAllItems(self):
- for row in range(self.rowCount()):
- tableItem = self.item(row, 0)
- # item = self._tableItemToItem(tableItem)
- # item.sigItemChanged.disconnect(self._plotItemChanged)
- self.clearContents()
- self.setRowCount(0)
-
- def clear(self):
- self._removeAllItems()
-
- def setStats(self, statsHandler):
- """Set which stats to display and the associated formatting.
-
- :param StatsHandler statsHandler:
- Set the statistics to be displayed and how to format them using
- """
- self._removeAllItems()
- _StatsWidgetBase.setStats(self, statsHandler)
-
- self.setRowCount(0)
- self.setColumnCount(len(self._statsHandler.stats) + 3) # + legend, kind and roi # noqa
-
- for index, stat in enumerate(self._statsHandler.stats.values()):
- headerItem = qt.QTableWidgetItem(stat.name.capitalize())
- headerItem.setData(qt.Qt.UserRole, stat.name)
- if stat.description is not None:
- headerItem.setToolTip(stat.description)
- self.setHorizontalHeaderItem(3 + index, headerItem)
-
- horizontalHeader = self.horizontalHeader()
- if hasattr(horizontalHeader, 'setSectionResizeMode'): # Qt5
- horizontalHeader.setSectionResizeMode(qt.QHeaderView.ResizeToContents)
- else: # Qt4
- horizontalHeader.setResizeMode(qt.QHeaderView.ResizeToContents)
-
- self._updateItemObserve()
-
- def _updateItemObserve(self, *args):
- pass
-
- def _dataChanged(self, item):
- pass
-
- def _updateStats(self, item, data_changed=False, roi_changed=False):
- assert isinstance(item, ROIStatsItemHelper)
- plotItem = item._plot_item
- roi = item._roi
- if item is None:
- return
- plot = self.getPlot()
- if plot is None:
- _logger.info("Plot not available")
- return
-
- row = self._itemToRow(item)
- if row is None:
- _logger.error("This item is not in the table: %s", str(item))
- return
-
- statsHandler = self.getStatsHandler()
- if statsHandler is not None:
- stats = statsHandler.calculate(plotItem, plot,
- onlimits=self._statsOnVisibleData,
- roi=roi, data_changed=data_changed,
- roi_changed=roi_changed)
- else:
- stats = {}
-
- with self._disableSorting():
- for name, tableItem in self._itemToTableItems(item).items():
- if name == self._LEGEND_HEADER_DATA:
- text = self._plotWrapper.getLabel(plotItem)
- tableItem.setText(text)
- elif name == self._KIND_HEADER_DATA:
- tableItem.setText(self._plotWrapper.getKind(plotItem))
- elif name == self._ROI_HEADER_DATA:
- name = roi.getName()
- tableItem.setText(name)
- else:
- value = stats.get(name)
- if value is None:
- _logger.error("Value not found for: %s", name)
- tableItem.setText('-')
- else:
- tableItem.setText(str(value))
-
- @contextmanager
- def _disableSorting(self):
- """Context manager that disables table sorting
-
- Previous state is restored when leaving
- """
- sorting = self.isSortingEnabled()
- if sorting:
- self.setSortingEnabled(False)
- yield
- if sorting:
- self.setSortingEnabled(sorting)
-
- def _itemToRow(self, item):
- """Find the row corresponding to a plot item
-
- :param item: The plot item
- :return: The corresponding row index
- :rtype: Union[int,None]
- """
- for row in range(self.rowCount()):
- tableItem = self.item(row, 0)
- if self._tableItemToItem(tableItem) == item:
- return row
- return None
-
- def _tableItemToItem(self, tableItem):
- """Find the plot item corresponding to a table item
-
- :param QTableWidgetItem tableItem:
- :rtype: QObject
- """
- container = tableItem.data(qt.Qt.UserRole)
- return container()
-
- def _itemToTableItems(self, item):
- """Find all table items corresponding to a plot item
-
- :param item: The plot item
- :return: An ordered dict of column name to QTableWidgetItem mapping
- for the given plot item.
- :rtype: OrderedDict
- """
- result = OrderedDict()
- row = self._itemToRow(item)
- if row is not None:
- for column in range(self.columnCount()):
- tableItem = self.item(row, column)
- if self._tableItemToItem(tableItem) != item:
- _logger.error("Table item/plot item mismatch")
- else:
- header = self.horizontalHeaderItem(column)
- name = header.data(qt.Qt.UserRole)
- result[name] = tableItem
- return result
-
- def _plotItemToItems(self, plotItem):
- """Return all _RoiStatsItemWidget associated to the plotItem
- Needed for updating on itemChanged signal
- """
- if plotItem in self.__plotItemToItems:
- return []
- else:
- return self.__plotItemToItems[plotItem]
-
- def _registerPlotItem(self, item):
- if item._plot_item not in self.__plotItemToItems:
- self.__plotItemToItems[item._plot_item] = set()
- self.__plotItemToItems[item._plot_item].add(item)
-
- def _roiToItems(self, roi):
- """Return all _RoiStatsItemWidget associated to the roi
- Needed for updating on roiChanged signal
- """
- if roi in self.__roiToItems:
- return []
- else:
- return self.__roiToItems[roi]
-
- def _registerROI(self, item):
- if item._roi not in self.__roiToItems:
- self.__roiToItems[item._roi] = set()
- # TODO: normalize also sig name
- if isinstance(item._roi, RegionOfInterest):
- # item connection within sigRegionChanged should only be
- # stopped during the region edition
- self.__region_edition_callback[item._roi] = functools.partial(
- self._updateAllStats, False, True)
- item._roi.sigRegionChanged.connect(self.__region_edition_callback[item._roi])
- item._roi.sigEditingStarted.connect(functools.partial(
- self._startFiltering, item._roi))
- item._roi.sigEditingFinished.connect(functools.partial(
- self._endFiltering, item._roi))
- else:
- item._roi.sigChanged.connect(functools.partial(
- self._updateAllStats, False, True))
- self.__roiToItems[item._roi].add(item)
-
- def _startFiltering(self, roi):
- roi.sigRegionChanged.disconnect(self.__region_edition_callback[roi])
-
- def _endFiltering(self, roi):
- roi.sigRegionChanged.connect(self.__region_edition_callback[roi])
- self._updateAllStats(roi_changed=True)
-
- def unregisterROI(self, roi):
- if roi in self.__roiToItems:
- del self.__roiToItems[roi]
- if isinstance(roi, RegionOfInterest):
- roi.sigRegionEditionStarted.disconnect(functools.partial(
- self._startFiltering, roi))
- roi.sigRegionEditionFinished.disconnect(functools.partial(
- self._startFiltering, roi))
- try:
- roi.sigRegionChanged.disconnect(self._updateAllStats)
- except:
- pass
- else:
- roi.sigChanged.disconnect(self._updateAllStats)
-
- def _plotItemChanged(self, event):
- """Handle modifications of the items.
-
- :param event:
- """
- if event is ItemChangedType.DATA:
- if self.getUpdateMode() is UpdateMode.MANUAL:
- return
- if self._skipPlotItemChangedEvent(event) is True:
- return
- else:
- sender = self.sender()
- for item in self.__plotItemToItems[sender]:
- # TODO: get all concerned items
- self._updateStats(item, data_changed=True)
- # deal with stat items visibility
- if event is ItemChangedType.VISIBLE:
- if len(self._itemToTableItems(item).items()) > 0:
- item_0 = list(self._itemToTableItems(item).values())[0]
- row_index = item_0.row()
- self.setRowHidden(row_index, not item.isVisible())
-
- def _removeItem(self, itemKey):
- if isinstance(itemKey, (silx.gui.plot.items.marker.Marker,
- silx.gui.plot.items.shape.Shape)):
- return
- if itemKey not in self._items:
- _logger.warning('key not recognized. Won\'t remove any item')
- return
- item = self._items[itemKey]
- row = self._itemToRow(item)
- if row is None:
- kind = self._plotWrapper.getKind(item)
- if kind in statsmdl.BASIC_COMPATIBLE_KINDS:
- _logger.error("Removing item that is not in table: %s", str(item))
- return
- item._plot_item.sigItemChanged.disconnect(self._plotItemChanged)
- self.removeRow(row)
- del self._items[itemKey]
-
- def _updateAllStats(self, is_request=False, roi_changed=False):
- """Update stats for all rows in the table
-
- :param bool is_request: True if come from a manual request
- """
- if (self.getUpdateMode() is UpdateMode.MANUAL and
- not is_request and not roi_changed):
- return
-
- with self._disableSorting():
- for row in range(self.rowCount()):
- tableItem = self.item(row, 0)
- item = self._tableItemToItem(tableItem)
- self._updateStats(item, roi_changed=roi_changed,
- data_changed=is_request)
-
- def _plotCurrentChanged(self, *args):
- pass
-
- def _getRoi(self, kind, name):
- """return the roi fitting the requirement kind, name. This information
- is enough to be sure it is unique (in the widget)"""
- for roi in self.__roiToItems:
- roiName = roi.getName()
- if isinstance(roi, kind) and name == roiName:
- return roi
- return None
-
- def _getPlotItem(self, kind, legend):
- """return the plotItem fitting the requirement kind, legend.
- This information is enough to be sure it is unique (in the widget)"""
- for plotItem in self.__plotItemToItems:
- if legend == plotItem.getLegend() and self._plotWrapper.getKind(plotItem) == kind:
- return plotItem
- return None
-
-
-class ROIStatsWidget(qt.QMainWindow):
- """
- Widget used to define stats item for a couple(roi, plotItem).
- Stats will be computing on a given item (curve, image...) in the given
- region of interest.
-
- It also provide an interface for adding and removing items.
-
- .. snapshotqt:: img/ROIStatsWidget.png
- :width: 300px
- :align: center
-
- from silx.gui import qt
- from silx.gui.plot import Plot2D
- from silx.gui.plot.ROIStatsWidget import ROIStatsWidget
- from silx.gui.plot.items.roi import RectangleROI
- import numpy
- plot = Plot2D()
- plot.addImage(numpy.arange(10000).reshape(100, 100), legend='img')
- plot.show()
- rectangleROI = RectangleROI()
- rectangleROI.setGeometry(origin=(0, 100), size=(20, 20))
- rectangleROI.setName('Initial ROI')
- widget = ROIStatsWidget(plot=plot)
- widget.setStats([('sum', numpy.sum), ('mean', numpy.mean)])
- widget.registerROI(rectangleROI)
- widget.addItem(roi=rectangleROI, plotItem=plot.getImage('img'))
- widget.show()
-
- :param Union[qt.QWidget,None] parent: parent qWidget
- :param PlotWindow plot: plot widget containing the items
- :param stats: stats to display
- :param tuple rois: tuple of rois to manage
- """
-
- def __init__(self, parent=None, plot=None, stats=None, rois=None):
- qt.QMainWindow.__init__(self, parent)
-
- toolbar = qt.QToolBar(self)
- icon = icons.getQIcon('add')
- self._rois = list(rois) if rois is not None else []
- self._addAction = qt.QAction(icon, 'add item/roi', toolbar)
- self._addAction.triggered.connect(self._addRoiStatsItem)
- icon = icons.getQIcon('rm')
- self._removeAction = qt.QAction(icon, 'remove item/roi', toolbar)
- self._removeAction.triggered.connect(self._removeCurrentRow)
-
- toolbar.addAction(self._addAction)
- toolbar.addAction(self._removeAction)
- self.addToolBar(toolbar)
-
- self._plot = plot
- self._statsROITable = _StatsROITable(parent=self, plot=self._plot)
- self.setStats(stats=stats)
- self.setCentralWidget(self._statsROITable)
- self.setWindowFlags(qt.Qt.Widget)
-
- # expose API
- self._setUpdateMode = self._statsROITable.setUpdateMode
- self._updateAllStats = self._statsROITable._updateAllStats
-
- # setup
- self._statsROITable.setSelectionBehavior(qt.QTableWidget.SelectRows)
-
- def registerROI(self, roi):
- """For now there is no direct link between roi and plot. That is why
- we need to add/register them to be able to associate them"""
- self._rois.append(roi)
-
- def setPlot(self, plot):
- """Define the plot to interact with
-
- :param Union[PlotWidget,SceneWidget,None] plot:
- The plot containing the items on which statistics are applied
- """
- self._plot = plot
-
- def getPlot(self):
- return self._plot
-
- @docstring(_StatsROITable)
- def setStats(self, stats):
- if stats is not None:
- self._statsROITable.setStats(statsHandler=stats)
-
- @docstring(_StatsROITable)
- def getStatsHandler(self):
- """
-
- :return:
- """
- return self._statsROITable.getStatsHandler()
-
- def _addRoiStatsItem(self):
- """Ask the user what couple ROI / item he want to display"""
- dialog = _GetROIItemCoupleDialog(parent=self, plot=self._plot,
- rois=self._rois)
- if dialog.exec_():
- self.addItem(roi=dialog.getROI(), plotItem=dialog.getItem())
-
- def addItem(self, plotItem, roi):
- """
- Add a row of statitstic regarding the couple (plotItem, roi)
-
- :param Item plotItem: item to use for statistics
- :param roi: region of interest to limit the statistic.
- :type: Union[ROI, RegionOfInterest]
- :return: None of failed to add the item
- :rtype: Union[None,ROIStatsItemHelper]
- """
- statsItem = ROIStatsItemHelper(roi=roi, plot_item=plotItem)
- return self._statsROITable.add(item=statsItem)
-
- def removeItem(self, plotItem, roi):
- """
- Remove the row associated to the couple (plotItem, roi)
-
- :param Item plotItem: item to use for statistics
- :param roi: region of interest to limit the statistic.
- :type: Union[ROI,RegionOfInterest]
- """
- statsItem = ROIStatsItemHelper(roi=roi, plot_item=plotItem)
- self._statsROITable._removeItem(itemKey=statsItem.id_key())
-
- def _removeCurrentRow(self):
- def is1DKind(kind):
- if kind in ('curve', 'histogram', 'scatter'):
- return True
- else:
- return False
-
- currentRow = self._statsROITable.currentRow()
- item_kind = self._statsROITable.item(currentRow, 1).text()
- item_legend = self._statsROITable.item(currentRow, 0).text()
-
- roi_name = self._statsROITable.item(currentRow, 2).text()
- roi_kind = ROI if is1DKind(item_kind) else RegionOfInterest
- roi = self._statsROITable._getRoi(kind=roi_kind, name=roi_name)
- if roi is None:
- _logger.warning('failed to retrieve the roi you want to remove')
- return False
- plot_item = self._statsROITable._getPlotItem(kind=item_kind,
- legend=item_legend)
- if plot_item is None:
- _logger.warning('failed to retrieve the plot item you want to'
- 'remove')
- return False
- return self.removeItem(plotItem=plot_item, roi=roi)