Skip to content

Commit

Permalink
ref: move qmap to separate class and cleanup head a little
Browse files Browse the repository at this point in the history
  • Loading branch information
paulmueller committed Sep 2, 2019
1 parent ac48ec3 commit ad68882
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 272 deletions.
91 changes: 12 additions & 79 deletions pyjibe/fd/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,20 @@
from . import export
from .mpl_indent import MPLIndentation
from .mpl_edelta import MPLEDelta
from .mpl_qmap import MPLQMap

from . import rating_scheme


# load QWidget from ui file
ui_path = pkg_resources.resource_filename("pyjibe.fd",
"base_design.ui")
UiForceDistanceCore = uic.loadUiType(ui_path)[0]

dlg_autosave_path = pkg_resources.resource_filename("pyjibe.fd",
"dlg_autosave_design.ui")
DlgAutosave = uic.loadUiType(dlg_autosave_path)[0]


class UiForceDistanceBase(UiForceDistanceCore):
class UiForceDistanceBase(QtWidgets.QWidget):
_instance_counter = 0

def __init__(self, parent_widget):
def __init__(self, *args, **kwargs):
"""Base class derived from Qt designer
To reduce the number of lines in a file, the UI for
Expand All @@ -41,18 +37,17 @@ def __init__(self, parent_widget):
- `UiIndentation` contains logic parts of the code that are not
part of the UI.
"""
super(UiForceDistanceCore, self).__init__()
self.setupUi(parent_widget)
self.parent_widget = parent_widget

super(UiForceDistanceBase, self).__init__(*args, **kwargs)
path_ui = pkg_resources.resource_filename("pyjibe.fd",
"base_design.ui")
uic.loadUi(path_ui, self)
UiForceDistanceBase._instance_counter += 1
title = "{} #{}".format(self.parent_widget.windowTitle(),
title = "{} #{}".format(self.parent().windowTitle(),
self._instance_counter)
self.parent_widget.setWindowTitle(title)
self.parent().setWindowTitle(title)

self.mpl_curve_setup()
self.mpl_edelta_setup()
self.mpl_qmap_setup()
self.data_set = nanite.IndentationGroup()

# initial values, sources, drains for indentation depth
Expand Down Expand Up @@ -302,33 +297,14 @@ def mpl_edelta_setup(self):
self.edelta_mpllayout.addWidget(self.mpl_edelta.canvas)
self.edelta_mpllayout.addWidget(self.mpl_edelta.toolbar)

def mpl_qmap_setup(self):
"""Setup the matplotlib interface for 2D map plotting"""
self.mpl_qmap = MPLQMap()
self.mpl_qmap.add_toolbar(self.qmap_mplwidget)
self.qmap_mpllayout.addWidget(self.mpl_qmap.canvas)
self.qmap_mpllayout.addWidget(self.mpl_qmap.toolbar)
# set colormaps
cmaps = ["viridis", "plasma", "afmhot", "seismic"]
for cm in cmaps:
self.qmpa_cmap_cb.addItem(cm)
self.qmpa_cmap_cb.setCurrentIndex(0)
self.qmap_data_cb.currentIndexChanged.connect(
self.on_qmap_data_changed)
self.qmpa_cmap_cb.currentIndexChanged.connect(
self.on_qmap_cmap_changed)
self.qmap_sp_range1.valueChanged.connect(self.on_qmap_min_max_changed)
self.qmap_sp_range2.valueChanged.connect(self.on_qmap_min_max_changed)
self.mpl_qmap.connect_curve_selection_event(self.on_qmap_selection)

def on_cb_rating_scheme(self):
scheme_id = self.cb_rating_scheme.currentIndex()
schemes = rating_scheme.get_rating_schemes()
if len(schemes) == scheme_id:
search_dir = ""
exts_str = "Training set zip file (*.zip)"
tsz, _e = QtWidgets.QFileDialog.getOpenFileName(
self.parent_widget, "Import a training set",
self.parent(), "Import a training set",
search_dir, exts_str)
if tsz:
idx = rating_scheme.import_training_set(tsz)
Expand All @@ -343,49 +319,6 @@ def on_mpl_curve_update(self):
fdist = self.current_curve
self.mpl_curve_update(fdist)

def on_qmap_cmap_changed(self):
"""colormap selection changed"""
self.mpl_qmap_update()

def on_qmap_data_changed(self):
"""data column selection changed"""
# set previous spin control values if existent
self.qmap_sp_range1.blockSignals(True)
self.qmap_sp_range2.blockSignals(True)
if hasattr(self, "_cache_qmap_spin_ctl"):
data = self.qmap_data_cb.currentIndex()
if data in self._cache_qmap_spin_ctl:
vmin, vmax = self._cache_qmap_spin_ctl[data]
else:
vmin = vmax = 0
self.qmap_sp_range1.setValue(vmin)
self.qmap_sp_range2.setValue(vmax)
self.qmap_sp_range1.blockSignals(False)
self.qmap_sp_range2.blockSignals(False)
self.mpl_qmap_update()

def on_qmap_min_max_changed(self):
"""min or max spin controls changed"""
# store spin control values for data column
vmin = self.qmap_sp_range1.value()
vmax = self.qmap_sp_range2.value()
data = self.qmap_data_cb.currentIndex()
if not hasattr(self, "_cache_qmap_spin_ctl"):
self._cache_qmap_spin_ctl = {}
self._cache_qmap_spin_ctl[data] = (vmin, vmax)
self.mpl_qmap_update()

def on_qmap_selection(self, idx):
"""Show the curve indexed in the current qmap"""
# Get the qmap name
cc = self.current_curve
# idx is `enum` and curves are sorted
curves = [ci for ci in self.data_set if ci.path == cc.path]
fdist = curves[idx]
idcurve = self.data_set.index(fdist)
item = self.list_curves.topLevelItem(idcurve)
self.list_curves.setCurrentItem(item)

def on_delta_guess(self):
"""Guess the optimal indentation depth for the current curve"""
fdist = self.current_curve
Expand Down Expand Up @@ -475,7 +408,7 @@ def on_delta_change_spin(self, value):
def on_export_fit_results(self):
"""Saves all fit results"""
fname, _e = QtWidgets.QFileDialog.getSaveFileName(
self.parent_widget,
self.parent(),
"Save fit results",
"fit_results_{:03d}.tsv".format(
self._instance_counter),
Expand All @@ -494,7 +427,7 @@ def on_export_fit_results(self):
def on_export_edelta(self):
"""Saves all edelta curves"""
fname, _e = QtWidgets.QFileDialog.getSaveFileName(
self.parent_widget,
self.parent(),
"Save E(δ) curves",
"",
"Tab Separated Values (*.tsv)"
Expand Down
147 changes: 8 additions & 139 deletions pyjibe/fd/base_design.ui
Original file line number Diff line number Diff line change
Expand Up @@ -1092,151 +1092,14 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_qmap">
<widget class="TabQMap" name="tab_qmap">
<attribute name="title">
<string>QMap</string>
</attribute>
<attribute name="toolTip">
<string>quantitative imaging</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<property name="spacing">
<number>5</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_14">
<item>
<widget class="QLabel" name="label_15">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>QMap data</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>Color map</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_17">
<property name="text">
<string>Data range</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_15">
<property name="leftMargin">
<number>0</number>
</property>
<item>
<widget class="QComboBox" name="qmap_data_cb">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="qmpa_cmap_cb"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QDoubleSpinBox" name="qmap_sp_range1">
<property name="decimals">
<number>10</number>
</property>
<property name="minimum">
<double>-1000000000.000000000000000</double>
</property>
<property name="maximum">
<double>1000000000.000000000000000</double>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="qmap_sp_range2">
<property name="decimals">
<number>10</number>
</property>
<property name="minimum">
<double>-100000000.000000000000000</double>
</property>
<property name="maximum">
<double>100000000.000000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="widget_5" native="true">
<layout class="QVBoxLayout" name="verticalLayout_12">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="qmap_mplwidget" native="true">
<layout class="QVBoxLayout" name="qmap_mpllayout">
<property name="spacing">
<number>7</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
</item>
</layout>
<layout class="QVBoxLayout" name="verticalLayout_10"/>
</widget>
</widget>
</item>
Expand Down Expand Up @@ -1451,6 +1314,12 @@
<header>pyjibe.fd.tab_preprocess</header>
<container>1</container>
</customwidget>
<customwidget>
<class>TabQMap</class>
<extends>QWidget</extends>
<header>pyjibe.fd.tab_qmap</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
Expand Down
42 changes: 3 additions & 39 deletions pyjibe/fd/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -336,48 +336,12 @@ def mpl_edelta_update(self):
self.mpl_edelta.update(fdist, delta_opt)

def mpl_qmap_update(self):
fdist = self.current_curve
# Only update if we are on the right tab
if self.tabs.currentWidget() == self.tab_qmap:
# Build list of possible selections
selist = nanite.qmap.available_features

# Get plotting parameter and check if it makes sense
feature = self.qmap_data_cb.currentText()
if not feature or feature not in selist:
# Use a default plotting map
feature = "data min height"

# Make sure that we have a valid property to plot
assert feature in selist

# Update dropdown menu with possible selections
# disable signals while updating the combobox
self.qmap_data_cb.blockSignals(True)
# remove all items
for _i in range(self.qmap_data_cb.count()):
self.qmap_data_cb.removeItem(0)
# add new items
for item in selist:
self.qmap_data_cb.addItem(item)
self.qmap_data_cb.setCurrentIndex(selist.index(feature))
self.qmap_data_cb.blockSignals(False)

fdist = self.current_curve
# Get all selected curves with the same path
curves = self.selected_curves.subgroup_with_path(fdist.path)

if len(curves) > 1:
# Get map data
qmap = nanite.QMap(curves)
# update plot
self.mpl_qmap.update(qmap=qmap,
feature=feature,
cmap=self.qmpa_cmap_cb.currentText(),
vmin=self.qmap_sp_range1.value(),
vmax=self.qmap_sp_range2.value())
self.mpl_qmap.set_selection_by_index(curves.index(fdist))
else:
self.mpl_qmap.reset()
fdist_map = self.selected_curves.subgroup_with_path(fdist.path)
self.tab_qmap.update_qmap(fdist_map, fdist_map.index(fdist))

def on_curve_list(self):
"""Called when a new curve is selected"""
Expand Down

0 comments on commit ad68882

Please sign in to comment.