Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ extend-ignore-names = ['allKeys',
'isClean',
'mergeWith',
'mouseDoubleClickEvent',
'paintEvent',
'resizeEvent',
'rowCount',
'setClean',
Expand Down
4 changes: 1 addition & 3 deletions rascal2/core/writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,7 @@ def write_result_to_zipped_csvs(filename, results):
if not isinstance(results, BayesResults):
return

procedure_field = (
"nestedSamplerOutput" if results.nestedSamplerOutput.nestSamples.shape != (1, 2) else "dreamOutput"
)
procedure_field = "nestedSamplerOutput" if results.from_procedure() == "ns" else "dreamOutput"
for inner_class in ["predictionIntervals", "confidenceIntervals", procedure_field]:
subclass = getattr(results, inner_class)

Expand Down
8 changes: 8 additions & 0 deletions rascal2/static/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -455,3 +455,11 @@ MultiSelectList QToolButton {
padding: 0;
margin: 0;
}

/*****************************
LabeledSlider Styles
*****************************/

LabeledSlider{
border: 1px solid #999;
}
16 changes: 12 additions & 4 deletions rascal2/ui/presenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,22 +170,30 @@ def interrupt_terminal(self):
"""Sends an interrupt signal to the RAT runner."""
self.runner.interrupt()

def quick_run(self):
"""Run rat calculation with calculate procedure.
def quick_run(self, project=None):
"""Run rat calculation with calculate procedure on the given project.
The project in the MainWindowModel is used if no project is provided.

Parameters
----------
project : Optional[ratapi.Project]
The project to use for run

Returns
-------
results : Union[ratapi.outputs.Results, ratapi.outputs.BayesResults]
The calculation results.
"""
if project is None:
project = self.model.project
if ratapi.wrappers.MatlabWrapper.loader is None and any(
[file.language == "matlab" for file in self.model.project.custom_files]
):
matlab_helper = MatlabHelper()
result = get_matlab_engine(matlab_helper.ready_event, matlab_helper.engine_output)
if isinstance(result, Exception):
raise result
return rat.run(self.model.project, rat.Controls(display="off"))[1]
return rat.run(project, rat.Controls(display="off"))[1]

def run(self):
"""Run rat using multiprocessing."""
Expand Down Expand Up @@ -242,7 +250,7 @@ def handle_event(self):
case LogData():
self.view.logging.log(event.level, event.msg)

def edit_project(self, updated_project: dict, preview: bool = False) -> None:
def edit_project(self, updated_project: dict, preview: bool = True) -> None:
"""Edit the Project with a dictionary of attributes.

Parameters
Expand Down
103 changes: 30 additions & 73 deletions rascal2/ui/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from rascal2.dialogs.settings_dialog import SettingsDialog
from rascal2.dialogs.startup_dialog import PROJECT_FILES, LoadDialog, LoadR1Dialog, NewProjectDialog, StartupDialog
from rascal2.settings import MDIGeometries, Settings, get_global_settings
from rascal2.widgets import ControlsWidget, PlotWidget, SlidersViewWidget, TerminalWidget
from rascal2.widgets import ControlsWidget, PlotWidget, TerminalWidget
from rascal2.widgets.project import ProjectWidget
from rascal2.widgets.startup import StartUpWidget

Expand All @@ -22,13 +22,8 @@ class MainWindowView(QtWidgets.QMainWindow):

def __init__(self):
super().__init__()
# Public interface
self.disabled_elements = []
self.show_sliders = False # no one displays sliders initially except got from configuration
# (not implemented yet)

self.setWindowTitle(MAIN_WINDOW_TITLE)

window_icon = QtGui.QIcon(path_for("logo.png"))

self.undo_stack = QtGui.QUndoStack(self)
Expand All @@ -43,22 +38,12 @@ def __init__(self):
self.plot_widget = PlotWidget(self)
self.terminal_widget = TerminalWidget()
self.controls_widget = ControlsWidget(self)
self.sliders_view_widget = SlidersViewWidget(self)
self.project_widget = ProjectWidget(self)

## protected interface and public properties construction

# define menu controlling switch between table and slider views
self._sliders_menu_control_text = {
"ShowSliders": "&Show Sliders", # if state is show sliders, click will show them
"HideSliders": "&Hide Sliders",
} # if state is show table, click will show sliders
self.disabled_elements = []

self.create_actions()

main_menu = self.menuBar()
self.add_submenus(main_menu)

self.create_menus()
self.create_toolbar()
self.create_status_bar()

Expand Down Expand Up @@ -172,30 +157,22 @@ def create_actions(self):
self.settings_action.setEnabled(False)
self.disabled_elements.append(self.settings_action)

open_help_action = QtGui.QAction("&Help", self)
open_help_action.setStatusTip("Open Documentation")
open_help_action.setIcon(QtGui.QIcon(path_for("help.png")))
open_help_action.triggered.connect(self.open_docs)
self.open_help_action = open_help_action

# done this way expecting the value "show_sliders" being stored
# in configuration in a future + "show_sliders" is public for this reason
if self.show_sliders:
# if show_sliders state is True, action will be hide
show_or_hide_slider_action = QtGui.QAction(self._sliders_menu_control_text["HideSliders"], self)
else:
# if display_sliders state is False, action will be show
show_or_hide_slider_action = QtGui.QAction(self._sliders_menu_control_text["ShowSliders"], self)
show_or_hide_slider_action.setStatusTip("Show or Hide Sliders")
show_or_hide_slider_action.triggered.connect(lambda: self.show_or_hide_sliders(None))
self._show_or_hide_slider_action = show_or_hide_slider_action
self._show_or_hide_slider_action.setEnabled(False)
self.disabled_elements.append(self._show_or_hide_slider_action)

open_about_action = QtGui.QAction("&About", self)
open_about_action.setStatusTip("Report RAT version&info")
open_about_action.triggered.connect(self.open_about_info)
self.open_about_action = open_about_action
self.open_help_action = QtGui.QAction("&Help", self)
self.open_help_action.setStatusTip("Open Documentation")
self.open_help_action.setIcon(QtGui.QIcon(path_for("help.png")))
self.open_help_action.triggered.connect(self.open_docs)

self.toggle_slider_action = QtGui.QAction("Show &Sliders", self)
self.toggle_slider_action.setProperty("show_text", "Show &Sliders")
self.toggle_slider_action.setProperty("hide_text", "Hide &Sliders")
self.toggle_slider_action.setStatusTip("Show or Hide Sliders")
self.toggle_slider_action.triggered.connect(self.toggle_sliders)
self.toggle_slider_action.setEnabled(False)
self.disabled_elements.append(self.toggle_slider_action)

self.open_about_action = QtGui.QAction("&About", self)
self.open_about_action.setStatusTip("Report RAT version&info")
self.open_about_action.triggered.connect(self.open_about_info)

self.exit_action = QtGui.QAction("E&xit", self)
self.exit_action.setStatusTip(f"Quit {MAIN_WINDOW_TITLE}")
Expand Down Expand Up @@ -231,13 +208,12 @@ def create_actions(self):
self.setup_matlab_action.setStatusTip("Set the path of the MATLAB executable")
self.setup_matlab_action.triggered.connect(lambda: self.show_settings_dialog(tab_name="Matlab"))

def add_submenus(self, main_menu: QtWidgets.QMenuBar):
def create_menus(self):
"""Add sub menus to the main menu bar"""

main_menu = self.menuBar()
main_menu.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.PreventContextMenu)

file_menu = main_menu.addMenu("&File")
file_menu.setObjectName("&File")
file_menu.addAction(self.new_project_action)
file_menu.addSeparator()
file_menu.addAction(self.open_project_action)
Expand All @@ -253,56 +229,37 @@ def add_submenus(self, main_menu: QtWidgets.QMenuBar):
file_menu.addAction(self.exit_action)

edit_menu = main_menu.addMenu("&Edit")
edit_menu.setObjectName("&Edit")
edit_menu.addAction(self.undo_action)
edit_menu.addAction(self.redo_action)
edit_menu.addAction(self.undo_view_action)

windows_menu = main_menu.addMenu("&Windows")
windows_menu.setObjectName("&Windows")
windows_menu.addAction(self.tile_windows_action)
windows_menu.addAction(self.reset_windows_action)
windows_menu.addAction(self.save_default_windows_action)
windows_menu.setEnabled(False)
self.disabled_elements.append(windows_menu)

tools_menu = main_menu.addMenu("&Tools")
tools_menu.setObjectName("&Tools")
tools_menu.addAction(self._show_or_hide_slider_action)
tools_menu.addAction(self.toggle_slider_action)
tools_menu.addSeparator()
tools_menu.addAction(self.clear_terminal_action)
tools_menu.addSeparator()
tools_menu.addAction(self.setup_matlab_action)

help_menu = main_menu.addMenu("&Help")
help_menu.setObjectName("&Help")
help_menu.addAction(self.open_about_action)
help_menu.addAction(self.open_help_action)

def show_or_hide_sliders(self, do_show_sliders=None):
"""Depending on current state, show or hide sliders for
table properties within Project class view.

Parameters:
-----------

do_show_sliders: bool,default None
if provided, sets self.show_sliders logical variable into the requested state
(True/False), forcing sliders widget to appear/disappear. if None, applies not to current state.
"""
if do_show_sliders is None:
self.show_sliders = not self.show_sliders
else:
self.show_sliders = do_show_sliders

if self.show_sliders:
self._show_or_hide_slider_action.setText(self._sliders_menu_control_text["HideSliders"])
self.sliders_view_widget.show()
self.project_widget.setWindowTitle("Sliders View")
self.project_widget.stacked_widget.setCurrentIndex(2)
def toggle_sliders(self):
"""Toggles sliders for the fitted parameters in project class view."""
show_text = self.toggle_slider_action.property("show_text")
if self.toggle_slider_action.text() == show_text:
hide_text = self.toggle_slider_action.property("hide_text")
self.toggle_slider_action.setText(hide_text)
self.project_widget.show_slider_view()
else:
self._show_or_hide_slider_action.setText(self._sliders_menu_control_text["ShowSliders"])
self.sliders_view_widget.hide()
self.toggle_slider_action.setText(show_text)
self.project_widget.show_project_view()

def open_about_info(self):
Expand Down
4 changes: 2 additions & 2 deletions rascal2/widgets/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from rascal2.widgets.controls import ControlsWidget
from rascal2.widgets.inputs import AdaptiveDoubleSpinBox, MultiSelectComboBox, MultiSelectList, get_validated_input
from rascal2.widgets.plot import PlotWidget
from rascal2.widgets.sliders_view import SlidersViewWidget
from rascal2.widgets.project.slider_view import SliderViewWidget
from rascal2.widgets.terminal import TerminalWidget

__all__ = [
Expand All @@ -12,5 +12,5 @@
"MultiSelectList",
"PlotWidget",
"TerminalWidget",
"SlidersViewWidget",
"SliderViewWidget",
]
14 changes: 6 additions & 8 deletions rascal2/widgets/plot.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,14 +244,12 @@ def update_figure_size(self):

def show_result_summary(self, results):
"""Show log z and log z error in summary label"""
if isinstance(results, ratapi.outputs.BayesResults):
samples = results.nestedSamplerOutput.nestSamples
if samples.shape != (1, 2):
self.result_summary.setText(
f"log (Z) = {results.nestedSamplerOutput.logZ:.5f}\n"
f"log (Z) error = {results.nestedSamplerOutput.logZErr:.5f}"
)
self.result_summary.setVisible(True)
if isinstance(results, ratapi.outputs.BayesResults) and results.from_procedure() == "ns":
self.result_summary.setText(
f"log (Z) = {results.nestedSamplerOutput.logZ:.5f}\n"
f"log (Z) error = {results.nestedSamplerOutput.logZErr:.5f}"
)
self.result_summary.setVisible(True)

def make_interaction_layout(self):
"""Make layout with pan, zoom, and reset button.
Expand Down
27 changes: 24 additions & 3 deletions rascal2/widgets/project/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from rascal2.config import path_for
from rascal2.widgets.project.lists import ContrastWidget, DataWidget
from rascal2.widgets.project.slider_view import SliderViewWidget
from rascal2.widgets.project.tables import (
BackgroundsFieldWidget,
CustomFileWidget,
Expand Down Expand Up @@ -41,6 +42,7 @@ def __init__(self, parent):
self.parent_model = self.parent.presenter.model

self.parent_model.project_updated.connect(self.update_project_view)
self.parent_model.project_updated.connect(self.update_slider_view)
self.parent_model.controls_updated.connect(self.handle_controls_update)

self.tabs = {
Expand Down Expand Up @@ -72,7 +74,6 @@ def __init__(self, parent):
self.stacked_widget = QtWidgets.QStackedWidget()
self.stacked_widget.addWidget(project_view)
self.stacked_widget.addWidget(project_edit)
self.stacked_widget.addWidget(self.parent.sliders_view_widget)

layout = QtWidgets.QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
Expand All @@ -85,8 +86,8 @@ def create_project_view(self) -> QtWidgets.QWidget:
main_layout = QtWidgets.QVBoxLayout()
main_layout.setSpacing(20)

show_sliders_button = QtWidgets.QPushButton("Show sliders", self, objectName="ShowSliders")
show_sliders_button.clicked.connect(lambda: self.parent.show_or_hide_sliders(True))
show_sliders_button = QtWidgets.QPushButton("Show sliders", self)
show_sliders_button.clicked.connect(self.parent.toggle_sliders)

self.edit_project_button = QtWidgets.QPushButton("Edit Project", self, icon=QtGui.QIcon(path_for("edit.png")))
self.edit_project_button.clicked.connect(self.show_edit_view)
Expand Down Expand Up @@ -246,6 +247,26 @@ def create_edit_view(self) -> QtWidgets.QWidget:

return edit_project_widget

def show_slider_view(self):
"""Create slider view and make it visible."""
if self.stacked_widget.count() == 3:
# 3 widgets means slider view already exist
# (with project view and edit view) so delete before replacing with new one
old_slider_widget = self.stacked_widget.widget(2)
self.stacked_widget.removeWidget(old_slider_widget)
old_slider_widget.deleteLater()
slider_view = SliderViewWidget(create_draft_project(self.parent_model.project), self.parent)
self.stacked_widget.addWidget(slider_view)
self.stacked_widget.setCurrentIndex(2)

def update_slider_view(self):
"""Update the slider view if the project changes when it is opened."""
if self.stacked_widget.currentIndex() == 2:
# slider view is the 3rd widget in the layout
widget = self.stacked_widget.widget(2)
widget.draft_project = create_draft_project(self.parent_model.project)
widget.initialize()

def update_project_view(self, update_tab_index=None) -> None:
"""Updates the project view."""

Expand Down
Loading
Loading