async def _recompute_vanilla_argument(self, name): try: arginfo, _ = await self.manager.examine_arginfo(self.expurl) except Exception: logger.error( "Could not recompute argument '%s' of '%s'", name, self.expurl, exc_info=True) return argument = self.manager.get_submission_arguments(self.expurl)[name] procdesc = arginfo[name][0] state = procdesc_to_entry(procdesc).default_state(procdesc) argument["desc"] = procdesc argument["state"] = state widgets = self._arg_to_widgets[name] widgets["entry"].deleteLater() widgets["entry"] = procdesc_to_entry(procdesc)(argument) widgets["fix_layout"].deleteLater() widgets["fix_layout"] = LayoutWidget() widgets["fix_layout"].addWidget(widgets["entry"]) self.setItemWidget(widgets["widget_item"], 1, widgets["fix_layout"]) self.updateGeometries()
async def _recompute_argument(self, name): try: expdesc = await self.manager.compute_expdesc(self.expurl) except: logger.error("Could not recompute argument '%s' of '%s'", name, self.expurl, exc_info=True) return argument = self.manager.get_submission_arguments(self.expurl)[name] procdesc = expdesc["arginfo"][name][0] state = procdesc_to_entry(procdesc).default_state(procdesc) argument["desc"] = procdesc argument["state"] = state # Qt needs a setItemWidget() to handle layout correctly, # simply replacing the entry inside the LayoutWidget # results in a bug. widgets = self._arg_to_widgets[name] widgets["entry"].deleteLater() widgets["entry"] = procdesc_to_entry(procdesc)(argument) widgets["disable_other_scans"].setVisible( isinstance(widgets["entry"], ScanEntry)) widgets["fix_layout"].deleteLater() widgets["fix_layout"] = LayoutWidget() widgets["fix_layout"].addWidget(widgets["entry"]) self.setItemWidget(widgets["widget_item"], 1, widgets["fix_layout"]) self.updateGeometries()
def submit(self, expurl): file, class_name, _ = self.resolve_expurl(expurl) scheduling = self.get_submission_scheduling(expurl) options = self.get_submission_options(expurl) arguments = self.get_submission_arguments(expurl) argument_values = dict() for name, argument in arguments.items(): entry_cls = procdesc_to_entry(argument["desc"]) argument_values[name] = entry_cls.state_to_value(argument["state"]) expid = { "log_level": options["log_level"], "file": file, "class_name": class_name, "arguments": argument_values, } if "repo_rev" in options: expid["repo_rev"] = options["repo_rev"] asyncio.ensure_future(self._submit_task( expurl, scheduling["pipeline_name"], expid, scheduling["priority"], scheduling["due_date"], scheduling["flush"]))
def simulate_clicked(self): try: logger.info("Running simulate for experiment: '%s'", self.expurl) # resolve the expurl file_path, class_, _ = self.manager.resolve_expurl(self.expurl) # get the submission arguments (scan ranges, etc.) arguments = self.manager.get_submission_arguments(self.expurl) argument_values = dict() for name, argument in arguments.items(): entry_cls = procdesc_to_entry(argument["desc"]) argument_values[name] = entry_cls.state_to_value(argument["state"]) # run the simulation # for development convenience, always reload the latest simulated_pulse_sequence.py sim_mod_name = "simulated_pulse_sequence" if sim_mod_name in sys.modules: importlib.reload(sys.modules[sim_mod_name]) from multiprocessing import Process, Pool import simulated_pulse_sequence if not self.manager.simulation_process_pool: self.manager.simulation_process_pool = Pool(processes=1) self.manager.simulation_process_pool.apply_async(simulated_pulse_sequence.run_simulation, (file_path, class_, argument_values)) except: # May happen when experiment has been removed # from repository/explist logger.error("Failed to simulate '%s'", self.expurl, exc_info=True)
def initialize_submission_arguments(self, arginfo): arguments = OrderedDict() for name, (procdesc, group) in arginfo.items(): state = procdesc_to_entry(procdesc).default_state(procdesc) arguments[name] = { "desc": procdesc, "group": group, "state": state # mutated by entries } return arguments
def initialize_submission_arguments(self, expurl, arginfo): arguments = OrderedDict() for name, (procdesc, group, tooltip) in arginfo.items(): state = procdesc_to_entry(procdesc).default_state(procdesc) arguments[name] = { "desc": procdesc, "group": group, "tooltip": tooltip, "state": state, # mutated by entries } self.submission_arguments[expurl] = arguments return arguments
async def _recompute_argument(self, name): try: arginfo = await self._dock.compute_arginfo() except: logger.error("Could not recompute argument '%s' of '%s'", name, self._dock.expurl, exc_info=True) return argument = self._dock.arguments[name] procdesc = arginfo[name][0] state = procdesc_to_entry(procdesc).default_state(procdesc) argument["desc"] = procdesc argument["state"] = state widgets = self._arg_to_widgets[name] widgets["entry"].deleteLater() widgets["entry"] = procdesc_to_entry(procdesc)(argument) widgets["fix_layout"] = LayoutWidget() widgets["fix_layout"].addWidget(widgets["entry"]) self.setItemWidget(widgets["widget_item"], 1, widgets["fix_layout"]) self.updateGeometries()
def _make_vanilla_argument_item(self, name, argument): if name in self._arg_to_widgets: logger.warning("Argument with name '%s' already exists, skipping.", name) return widgets = dict() self._arg_to_widgets[name] = widgets entry = procdesc_to_entry(argument["desc"])(argument) widget_item = QtWidgets.QTreeWidgetItem([name]) if argument["tooltip"]: widget_item.setToolTip(1, argument["tooltip"]) widgets["entry"] = entry widgets["widget_item"] = widget_item for col in range(3): widget_item.setBackground(col, self._bg_gradient) font = widget_item.font(0) font.setBold(True) widget_item.setFont(0, font) if argument["group"] is None: self.addTopLevelItem(widget_item) else: self._ensure_group_widget(argument["group"]).addChild(widget_item) fix_layout = LayoutWidget() widgets["fix_layout"] = fix_layout fix_layout.addWidget(entry) self.setItemWidget(widget_item, 1, fix_layout) buttons = LayoutWidget() recompute_argument = QtWidgets.QToolButton() recompute_argument.setToolTip("Re-run the experiment's build " "method and take the default value") recompute_argument.setIcon(self._default_value_icon) recompute_argument.clicked.connect( partial(self._recompute_vanilla_argument_clicked, name)) buttons.addWidget(recompute_argument) buttons.layout.setColumnStretch(0, 0) buttons.layout.setColumnStretch(1, 1) self.setItemWidget(widget_item, 2, buttons)
def _run_clicked(self): class_name, file = self.expurl.split("@", maxsplit=1) expid = { "repo_rev": "N/A", "file": file, "class_name": class_name, "log_level": self.options["log_level"], "arguments": { name: procdesc_to_entry(argument["desc"]).state_to_value( argument["state"]) for name, argument in self.arguments.items()}, } self._run_task = asyncio.ensure_future(self._get_run_task(expid)) self._run.setEnabled(False) self._terminate.setEnabled(True) def done(fut): logger.debug("Analysis done") self._run_task = None self._run.setEnabled(True) self._terminate.setEnabled(False) self._run_task.add_done_callback(done)
def _run_clicked(self): class_name, file = self.expurl.split("@", maxsplit=1) expid = { "repo_rev": "N/A", "file": file, "class_name": class_name, "log_level": self.options["log_level"], "arguments": { name: procdesc_to_entry(argument["desc"]).state_to_value( argument["state"]) for name, argument in self.arguments.items() }, } self._run_task = asyncio.ensure_future(self._get_run_task(expid)) self._run.setEnabled(False) self._terminate.setEnabled(True) def done(fut): logger.debug("Analysis done") self._run_task = None self._run.setEnabled(True) self._terminate.setEnabled(False) self._run_task.add_done_callback(done)
def __init__(self, dock): QtWidgets.QTreeWidget.__init__(self) self.setColumnCount(3) self.header().setStretchLastSection(False) try: set_resize_mode = self.header().setSectionResizeMode except AttributeError: set_resize_mode = self.header().setResizeMode set_resize_mode(0, QtWidgets.QHeaderView.ResizeToContents) set_resize_mode(1, QtWidgets.QHeaderView.Stretch) set_resize_mode(2, QtWidgets.QHeaderView.ResizeToContents) self.header().setVisible(False) self.setSelectionMode(self.NoSelection) self.setHorizontalScrollMode(self.ScrollPerPixel) self.setVerticalScrollMode(self.ScrollPerPixel) self.setStyleSheet("QTreeWidget {background: " + self.palette().midlight().color().name() + " ;}") self.viewport().installEventFilter(_WheelFilter(self.viewport())) self._groups = dict() self._arg_to_widgets = dict() self._dock = dock if not self._dock.arguments: self.addTopLevelItem(QtWidgets.QTreeWidgetItem(["No arguments"])) gradient = QtGui.QLinearGradient( 0, 0, 0, QtGui.QFontMetrics(self.font()).lineSpacing()*2.5) gradient.setColorAt(0, self.palette().base().color()) gradient.setColorAt(1, self.palette().midlight().color()) for name, argument in self._dock.arguments.items(): widgets = dict() self._arg_to_widgets[name] = widgets entry = procdesc_to_entry(argument["desc"])(argument) widget_item = QtWidgets.QTreeWidgetItem([name]) if argument["tooltip"]: widget_item.setToolTip(0, argument["tooltip"]) widgets["entry"] = entry widgets["widget_item"] = widget_item for col in range(3): widget_item.setBackground(col, gradient) font = widget_item.font(0) font.setBold(True) widget_item.setFont(0, font) if argument["group"] is None: self.addTopLevelItem(widget_item) else: self._get_group(argument["group"]).addChild(widget_item) fix_layout = LayoutWidget() widgets["fix_layout"] = fix_layout fix_layout.addWidget(entry) self.setItemWidget(widget_item, 1, fix_layout) recompute_argument = QtWidgets.QToolButton() recompute_argument.setToolTip("Re-run the experiment's build " "method and take the default value") recompute_argument.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_argument.clicked.connect( partial(self._recompute_argument_clicked, name)) fix_layout = LayoutWidget() fix_layout.addWidget(recompute_argument) self.setItemWidget(widget_item, 2, fix_layout) widget_item = QtWidgets.QTreeWidgetItem() self.addTopLevelItem(widget_item) recompute_arguments = QtWidgets.QPushButton("Recompute all arguments") recompute_arguments.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_arguments.clicked.connect(self._recompute_arguments_clicked) load = QtWidgets.QPushButton("Set arguments from HDF5") load.setToolTip("Set arguments from currently selected HDF5 file") load.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogApplyButton)) load.clicked.connect(self._load_clicked) buttons = LayoutWidget() buttons.addWidget(recompute_arguments, 1, 1) buttons.addWidget(load, 1, 2) for i, s in enumerate((1, 0, 0, 1)): buttons.layout.setColumnStretch(i, s) self.setItemWidget(widget_item, 1, buttons)
def __init__(self, manager, dock, expurl): self.manager = manager self.expurl = expurl QtWidgets.QTreeWidget.__init__(self) self.setColumnCount(3) self.header().setStretchLastSection(False) if hasattr(self.header(), "setSectionResizeMode"): set_resize_mode = self.header().setSectionResizeMode else: set_resize_mode = self.header().setResizeMode set_resize_mode(0, QtWidgets.QHeaderView.ResizeToContents) set_resize_mode(1, QtWidgets.QHeaderView.Stretch) set_resize_mode(2, QtWidgets.QHeaderView.ResizeToContents) self.header().setVisible(False) self.setSelectionMode(self.NoSelection) self.setHorizontalScrollMode(self.ScrollPerPixel) self.setVerticalScrollMode(self.ScrollPerPixel) self.setStyleSheet("QTreeWidget {background: " + self.palette().midlight().color().name() + " ;}") self.viewport().installEventFilter(_WheelFilter(self.viewport())) self._groups = dict() self._arg_to_widgets = dict() arguments = self.manager.get_submission_arguments(self.expurl) if not arguments: self.addTopLevelItem(QtWidgets.QTreeWidgetItem(["No arguments"])) gradient = QtGui.QLinearGradient( 0, 0, 0, QtGui.QFontMetrics(self.font()).lineSpacing() * 2.5) gradient.setColorAt(0, self.palette().base().color()) gradient.setColorAt(1, self.palette().midlight().color()) for name, argument in arguments.items(): widgets = dict() self._arg_to_widgets[name] = widgets entry = procdesc_to_entry(argument["desc"])(argument) widget_item = QtWidgets.QTreeWidgetItem([name]) if argument["tooltip"]: widget_item.setToolTip(0, argument["tooltip"]) widgets["entry"] = entry widgets["widget_item"] = widget_item for col in range(3): widget_item.setBackground(col, gradient) font = widget_item.font(0) font.setBold(True) widget_item.setFont(0, font) if argument["group"] is None: self.addTopLevelItem(widget_item) else: self._get_group(argument["group"]).addChild(widget_item) fix_layout = LayoutWidget() widgets["fix_layout"] = fix_layout fix_layout.addWidget(entry) self.setItemWidget(widget_item, 1, fix_layout) recompute_argument = QtWidgets.QToolButton() recompute_argument.setToolTip("Re-run the experiment's build " "method and take the default value") recompute_argument.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_argument.clicked.connect( partial(self._recompute_argument_clicked, name)) tool_buttons = LayoutWidget() tool_buttons.addWidget(recompute_argument, 1) disable_other_scans = QtWidgets.QToolButton() widgets["disable_other_scans"] = disable_other_scans disable_other_scans.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogResetButton)) disable_other_scans.setToolTip("Disable all other scans in " "this experiment") disable_other_scans.clicked.connect( partial(self._disable_other_scans, name)) tool_buttons.layout.setRowStretch(0, 1) tool_buttons.layout.setRowStretch(3, 1) tool_buttons.addWidget(disable_other_scans, 2) if not isinstance(entry, ScanEntry): disable_other_scans.setVisible(False) self.setItemWidget(widget_item, 2, tool_buttons) widget_item = QtWidgets.QTreeWidgetItem() self.addTopLevelItem(widget_item) recompute_arguments = QtWidgets.QPushButton("Recompute all arguments") recompute_arguments.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_arguments.clicked.connect(dock._recompute_arguments_clicked) load_hdf5 = QtWidgets.QPushButton("Load HDF5") load_hdf5.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOpenButton)) load_hdf5.clicked.connect(dock._load_hdf5_clicked) buttons = LayoutWidget() buttons.addWidget(recompute_arguments, 1, 1) buttons.addWidget(load_hdf5, 1, 2) buttons.layout.setColumnStretch(0, 1) buttons.layout.setColumnStretch(1, 0) buttons.layout.setColumnStretch(2, 0) buttons.layout.setColumnStretch(3, 1) self.setItemWidget(widget_item, 1, buttons)
def __init__(self, dock): QtWidgets.QTreeWidget.__init__(self) self.setColumnCount(3) self.header().setStretchLastSection(False) try: set_resize_mode = self.header().setSectionResizeMode except AttributeError: set_resize_mode = self.header().setResizeMode set_resize_mode(0, QtWidgets.QHeaderView.ResizeToContents) set_resize_mode(1, QtWidgets.QHeaderView.Stretch) set_resize_mode(2, QtWidgets.QHeaderView.ResizeToContents) self.header().setVisible(False) self.setSelectionMode(self.NoSelection) self.setHorizontalScrollMode(self.ScrollPerPixel) self.setVerticalScrollMode(self.ScrollPerPixel) self.setStyleSheet("QTreeWidget {background: " + self.palette().midlight().color().name() + " ;}") self.viewport().installEventFilter(_WheelFilter(self.viewport())) self._groups = dict() self._arg_to_widgets = dict() self._dock = dock if not self._dock.arguments: self.addTopLevelItem(QtWidgets.QTreeWidgetItem(["No arguments"])) gradient = QtGui.QLinearGradient( 0, 0, 0, QtGui.QFontMetrics(self.font()).lineSpacing() * 2.5) gradient.setColorAt(0, self.palette().base().color()) gradient.setColorAt(1, self.palette().midlight().color()) for name, argument in self._dock.arguments.items(): widgets = dict() self._arg_to_widgets[name] = widgets entry = procdesc_to_entry(argument["desc"])(argument) widget_item = QtWidgets.QTreeWidgetItem([name]) if argument["tooltip"]: widget_item.setToolTip(0, argument["tooltip"]) widgets["entry"] = entry widgets["widget_item"] = widget_item for col in range(3): widget_item.setBackground(col, gradient) font = widget_item.font(0) font.setBold(True) widget_item.setFont(0, font) if argument["group"] is None: self.addTopLevelItem(widget_item) else: self._get_group(argument["group"]).addChild(widget_item) fix_layout = LayoutWidget() widgets["fix_layout"] = fix_layout fix_layout.addWidget(entry) self.setItemWidget(widget_item, 1, fix_layout) recompute_argument = QtWidgets.QToolButton() recompute_argument.setToolTip("Re-run the experiment's build " "method and take the default value") recompute_argument.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_argument.clicked.connect( partial(self._recompute_argument_clicked, name)) fix_layout = LayoutWidget() fix_layout.addWidget(recompute_argument) self.setItemWidget(widget_item, 2, fix_layout) widget_item = QtWidgets.QTreeWidgetItem() self.addTopLevelItem(widget_item) recompute_arguments = QtWidgets.QPushButton("Recompute all arguments") recompute_arguments.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_arguments.clicked.connect(self._recompute_arguments_clicked) load = QtWidgets.QPushButton("Set arguments from HDF5") load.setToolTip("Set arguments from currently selected HDF5 file") load.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogApplyButton)) load.clicked.connect(self._load_clicked) buttons = LayoutWidget() buttons.addWidget(recompute_arguments, 1, 1) buttons.addWidget(load, 1, 2) for i, s in enumerate((1, 0, 0, 1)): buttons.layout.setColumnStretch(i, s) self.setItemWidget(widget_item, 1, buttons)
def __init__(self, manager, dock, expurl): self.manager = manager self.expurl = expurl QtWidgets.QTreeWidget.__init__(self) self.setColumnCount(3) self.header().setStretchLastSection(False) if hasattr(self.header(), "setSectionResizeMode"): set_resize_mode = self.header().setSectionResizeMode else: set_resize_mode = self.header().setResizeMode set_resize_mode(0, QtWidgets.QHeaderView.ResizeToContents) set_resize_mode(1, QtWidgets.QHeaderView.Stretch) set_resize_mode(2, QtWidgets.QHeaderView.ResizeToContents) self.header().setVisible(False) self.setSelectionMode(self.NoSelection) self.setHorizontalScrollMode(self.ScrollPerPixel) self.setVerticalScrollMode(self.ScrollPerPixel) self.setStyleSheet("QTreeWidget {background: " + self.palette().midlight().color().name() + " ;}") self.viewport().installEventFilter(_WheelFilter(self.viewport())) self._groups = dict() self._arg_to_widgets = dict() arguments = self.manager.get_submission_arguments(self.expurl) if not arguments: self.addTopLevelItem(QtWidgets.QTreeWidgetItem(["No arguments"])) gradient = QtGui.QLinearGradient( 0, 0, 0, QtGui.QFontMetrics(self.font()).lineSpacing()*2.5) gradient.setColorAt(0, self.palette().base().color()) gradient.setColorAt(1, self.palette().midlight().color()) for name, argument in arguments.items(): widgets = dict() self._arg_to_widgets[name] = widgets entry = procdesc_to_entry(argument["desc"])(argument) widget_item = QtWidgets.QTreeWidgetItem([name]) if argument["tooltip"]: widget_item.setToolTip(0, argument["tooltip"]) widgets["entry"] = entry widgets["widget_item"] = widget_item for col in range(3): widget_item.setBackground(col, gradient) font = widget_item.font(0) font.setBold(True) widget_item.setFont(0, font) if argument["group"] is None: self.addTopLevelItem(widget_item) else: self._get_group(argument["group"]).addChild(widget_item) fix_layout = LayoutWidget() widgets["fix_layout"] = fix_layout fix_layout.addWidget(entry) self.setItemWidget(widget_item, 1, fix_layout) recompute_argument = QtWidgets.QToolButton() recompute_argument.setToolTip("Re-run the experiment's build " "method and take the default value") recompute_argument.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_argument.clicked.connect( partial(self._recompute_argument_clicked, name)) tool_buttons = LayoutWidget() tool_buttons.addWidget(recompute_argument, 1) disable_other_scans = QtWidgets.QToolButton() widgets["disable_other_scans"] = disable_other_scans disable_other_scans.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogResetButton)) disable_other_scans.setToolTip("Disable all other scans in " "this experiment") disable_other_scans.clicked.connect( partial(self._disable_other_scans, name)) tool_buttons.layout.setRowStretch(0, 1) tool_buttons.layout.setRowStretch(3, 1) tool_buttons.addWidget(disable_other_scans, 2) if not isinstance(entry, ScanEntry): disable_other_scans.setVisible(False) self.setItemWidget(widget_item, 2, tool_buttons) widget_item = QtWidgets.QTreeWidgetItem() self.addTopLevelItem(widget_item) recompute_arguments = QtWidgets.QPushButton("Recompute all arguments") recompute_arguments.setIcon( QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_BrowserReload)) recompute_arguments.clicked.connect(dock._recompute_arguments_clicked) load_hdf5 = QtWidgets.QPushButton("Load HDF5") load_hdf5.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOpenButton)) load_hdf5.clicked.connect(dock._load_hdf5_clicked) buttons = LayoutWidget() buttons.addWidget(recompute_arguments, 1, 1) buttons.addWidget(load_hdf5, 1, 2) buttons.layout.setColumnStretch(0, 1) buttons.layout.setColumnStretch(1, 0) buttons.layout.setColumnStretch(2, 0) buttons.layout.setColumnStretch(3, 1) self.setItemWidget(widget_item, 1, buttons)