async def _load_hdf5_task(self): try: filename = await get_open_file_name( self.manager.main_window, "Load HDF5", self.hdf5_load_directory, "HDF5 files (*.h5 *.hdf5);;All files (*.*)") except asyncio.CancelledError: return self.hdf5_load_directory = os.path.dirname(filename) try: with h5py.File(filename, "r") as f: expid = f["expid"][()] expid = pyon.decode(expid) arguments = expid["arguments"] except: logger.error("Could not retrieve expid from HDF5 file", exc_info=True) return try: self.log_level.setCurrentIndex( log_levels.index(log_level_to_name(expid["log_level"]))) if ("repo_rev" in expid and expid["repo_rev"] != "N/A" and hasattr(self, "repo_rev")): self.repo_rev.setText(expid["repo_rev"]) except: logger.error("Could not set submission options from HDF5 expid", exc_info=True) return await self._recompute_arguments_task(arguments)
async def _load_hdf5_task(self): try: filename = await get_open_file_name( self.manager.main_window, "Load HDF5", self.hdf5_load_directory, "HDF5 files (*.h5 *.hdf5);;All files (*.*)") except asyncio.CancelledError: return self.hdf5_load_directory = os.path.dirname(filename) try: with h5py.File(filename, "r") as f: expid = f["expid"][()] expid = pyon.decode(expid) arguments = expid["arguments"] except: logger.error("Could not retrieve expid from HDF5 file", exc_info=True) return try: self.log_level.setCurrentIndex(log_levels.index( log_level_to_name(expid["log_level"]))) if ("repo_rev" in expid and expid["repo_rev"] != "N/A" and hasattr(self, "repo_rev")): self.repo_rev.setText(expid["repo_rev"]) except: logger.error("Could not set submission options from HDF5 expid", exc_info=True) return await self._recompute_arguments_task(arguments)
async def load_hdf5_task(self, filename=None): if filename is None: if self._area.dataset is None: return filename = self._area.dataset try: with h5py.File(filename, "r") as f: expid = f["expid"][()] expid = pyon.decode(expid) arguments = expid["arguments"] except: logger.error("Could not retrieve expid from HDF5 file", exc_info=True) return try: self.log_level.setCurrentIndex( log_levels.index(log_level_to_name(expid["log_level"]))) except: logger.error("Could not set submission options from HDF5 expid", exc_info=True) return await self._recompute_arguments(arguments)
async def load_hdf5_task(self, filename=None): if filename is None: if self._area.dataset is None: return filename = self._area.dataset try: with h5py.File(filename, "r") as f: expid = f["expid"][()] expid = pyon.decode(expid) arguments = expid["arguments"] except: logger.error("Could not retrieve expid from HDF5 file", exc_info=True) return try: self.log_level.setCurrentIndex(log_levels.index( log_level_to_name(expid["log_level"]))) except: logger.error("Could not set submission options from HDF5 expid", exc_info=True) return await self._recompute_arguments(arguments)
def data(self, index, role): if index.isValid(): if role == QtCore.Qt.FontRole and index.column() == 1: return self.fixed_font elif role == QtCore.Qt.BackgroundRole: level = self.entries[index.row()][0] if level >= logging.ERROR: return self.error_bg elif level >= logging.WARNING: return self.warning_bg else: return self.white elif role == QtCore.Qt.ForegroundRole: level = self.entries[index.row()][0] if level <= logging.DEBUG: return self.debug_fg else: return self.black elif role == QtCore.Qt.DisplayRole: v = self.entries[index.row()] column = index.column() if column == 0: return v[1] else: return v[3] elif role == QtCore.Qt.ToolTipRole: v = self.entries[index.row()] return log_level_to_name(v[0]) + ", " + time.strftime("%m/%d %H:%M:%S", time.localtime(v[2]))
def data(self, index, role): if not index.isValid(): return item = index.internalPointer() if item.parent is self: msgnum = item.row else: msgnum = item.parent.row if role == QtCore.Qt.FontRole and index.column() == 1: return self.fixed_font elif role == QtCore.Qt.BackgroundRole: level = self.entries[msgnum][0] if level >= logging.ERROR: return self.error_bg elif level >= logging.WARNING: return self.warning_bg else: return self.white elif role == QtCore.Qt.ForegroundRole: level = self.entries[msgnum][0] if level <= logging.DEBUG: return self.debug_fg else: return self.black elif role == QtCore.Qt.DisplayRole: v = self.entries[msgnum] column = index.column() if item.parent is self: if column == 0: return v[1] else: return v[3][0] else: if column == 0: return "" else: return v[3][item.row + 1] elif role == QtCore.Qt.ToolTipRole: v = self.entries[msgnum] if item.parent is self: lineno = 0 else: lineno = item.row + 1 return (log_level_to_name(v[0]) + ", " + time.strftime("%m/%d %H:%M:%S", time.localtime(v[2])) + "\n" + v[3][lineno])
def data(self, index, role): if not index.isValid(): return item = index.internalPointer() if item.parent is self: msgnum = item.row else: msgnum = item.parent.row if role == QtCore.Qt.FontRole and index.column() == 1: return self.fixed_font elif role == QtCore.Qt.BackgroundRole: level = self.entries[msgnum][0] if level >= logging.ERROR: return self.error_bg elif level >= logging.WARNING: return self.warning_bg else: return self.white elif role == QtCore.Qt.ForegroundRole: level = self.entries[msgnum][0] if level <= logging.DEBUG: return self.debug_fg else: return self.black elif role == QtCore.Qt.DisplayRole: v = self.entries[msgnum] column = index.column() if item.parent is self: if column == 0: return v[1] else: return v[3][0] else: if column == 0: return "" else: return v[3][item.row+1] elif role == QtCore.Qt.ToolTipRole: v = self.entries[msgnum] if item.parent is self: lineno = 0 else: lineno = item.row + 1 return (log_level_to_name(v[0]) + ", " + time.strftime("%m/%d %H:%M:%S", time.localtime(v[2])) + "\n" + v[3][lineno])
def __init__(self, area, expurl, arguments): QtWidgets.QMdiSubWindow.__init__(self) self.setWindowTitle(expurl) self.setWindowIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_FileDialogContentsView)) self.setAcceptDrops(True) self.layout = QtWidgets.QGridLayout() top_widget = QtWidgets.QWidget() top_widget.setLayout(self.layout) self.setWidget(top_widget) self.layout.setSpacing(5) self.layout.setContentsMargins(5, 5, 5, 5) self._area = area self.expurl = expurl self.arguments = arguments self.argeditor = _ArgumentEditor(self) self.layout.addWidget(self.argeditor, 0, 0, 1, 5) self.layout.setRowStretch(0, 1) self.options = {"log_level": logging.WARNING} self._run_task = None log_level = QtWidgets.QComboBox() log_level.addItems(log_levels) log_level.setCurrentIndex(1) log_level.setToolTip("Minimum level for log entry production") log_level_label = QtWidgets.QLabel("Logging level:") log_level_label.setToolTip("Minimum level for log message production") self.layout.addWidget(log_level_label, 3, 0) self.layout.addWidget(log_level, 3, 1) log_level.setCurrentIndex(log_levels.index( log_level_to_name(self.options["log_level"]))) def update_log_level(index): self.options["log_level"] = getattr(logging, log_level.currentText()) log_level.currentIndexChanged.connect(update_log_level) self.log_level = log_level run = QtWidgets.QPushButton("Analyze") run.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOkButton)) run.setToolTip("Run analysis stage (Ctrl+Return)") run.setShortcut("CTRL+RETURN") run.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(run, 1, 4, 2, 1) run.clicked.connect(self.run_clicked) self._run = run terminate = QtWidgets.QPushButton("Terminate") terminate.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogCancelButton)) terminate.setToolTip("Terminate analysis (Ctrl+Backspace)") terminate.setShortcut("CTRL+BACKSPACE") terminate.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(terminate, 3, 4) terminate.clicked.connect(self.terminate_clicked) terminate.setEnabled(False) self._terminate = terminate
def __init__(self, manager, expurl): QtWidgets.QMdiSubWindow.__init__(self) qfm = QtGui.QFontMetrics(self.font()) self.resize(100 * qfm.averageCharWidth(), 30 * qfm.lineSpacing()) self.setWindowTitle(expurl) self.setWindowIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_FileDialogContentsView)) self.layout = QtWidgets.QGridLayout() top_widget = QtWidgets.QWidget() top_widget.setLayout(self.layout) self.setWidget(top_widget) self.layout.setSpacing(5) self.layout.setContentsMargins(5, 5, 5, 5) self.manager = manager self.expurl = expurl self.argeditor = _ArgumentEditor(self.manager, self, self.expurl) self.layout.addWidget(self.argeditor, 0, 0, 1, 5) self.layout.setRowStretch(0, 1) scheduling = manager.get_submission_scheduling(expurl) options = manager.get_submission_options(expurl) datetime = QtWidgets.QDateTimeEdit() datetime.setDisplayFormat("MMM d yyyy hh:mm:ss") datetime_en = QtWidgets.QCheckBox("Due date:") self.layout.addWidget(datetime_en, 1, 0) self.layout.addWidget(datetime, 1, 1) if scheduling["due_date"] is None: datetime.setDate(QtCore.QDate.currentDate()) else: datetime.setDateTime( QtCore.QDateTime.fromMSecsSinceEpoch(scheduling["due_date"] * 1000)) datetime_en.setChecked(scheduling["due_date"] is not None) def update_datetime(dt): scheduling["due_date"] = dt.toMSecsSinceEpoch() / 1000 datetime_en.setChecked(True) datetime.dateTimeChanged.connect(update_datetime) def update_datetime_en(checked): if checked: due_date = datetime.dateTime().toMSecsSinceEpoch() / 1000 else: due_date = None scheduling["due_date"] = due_date datetime_en.stateChanged.connect(update_datetime_en) self.pipeline_name = QtWidgets.QLineEdit() pipeline_name = self.pipeline_name self.layout.addWidget(QtWidgets.QLabel("Pipeline:"), 1, 2) self.layout.addWidget(pipeline_name, 1, 3) pipeline_name.setText(scheduling["pipeline_name"]) def update_pipeline_name(text): scheduling["pipeline_name"] = text pipeline_name.textChanged.connect(update_pipeline_name) self.priority = QtWidgets.QSpinBox() priority = self.priority priority.setRange(-99, 99) self.layout.addWidget(QtWidgets.QLabel("Priority:"), 2, 0) self.layout.addWidget(priority, 2, 1) priority.setValue(scheduling["priority"]) def update_priority(value): scheduling["priority"] = value priority.valueChanged.connect(update_priority) self.flush = QtWidgets.QCheckBox("Flush") flush = self.flush flush.setToolTip("Flush the pipeline (of current- and higher-priority " "experiments) before starting the experiment") self.layout.addWidget(flush, 2, 2, 1, 2) flush.setChecked(scheduling["flush"]) def update_flush(checked): scheduling["flush"] = bool(checked) flush.stateChanged.connect(update_flush) log_level = QtWidgets.QComboBox() log_level.addItems(log_levels) log_level.setCurrentIndex(1) log_level.setToolTip("Minimum level for log entry production") log_level_label = QtWidgets.QLabel("Logging level:") log_level_label.setToolTip("Minimum level for log message production") self.layout.addWidget(log_level_label, 3, 0) self.layout.addWidget(log_level, 3, 1) log_level.setCurrentIndex( log_levels.index(log_level_to_name(options["log_level"]))) def update_log_level(index): options["log_level"] = getattr(logging, log_level.currentText()) log_level.currentIndexChanged.connect(update_log_level) self.log_level = log_level if "repo_rev" in options: repo_rev = QtWidgets.QLineEdit() repo_rev.setPlaceholderText("current") repo_rev_label = QtWidgets.QLabel("Revision:") repo_rev_label.setToolTip("Experiment repository revision " "(commit ID) to use") self.layout.addWidget(repo_rev_label, 3, 2) self.layout.addWidget(repo_rev, 3, 3) if options["repo_rev"] is not None: repo_rev.setText(options["repo_rev"]) def update_repo_rev(text): if text: options["repo_rev"] = text else: options["repo_rev"] = None repo_rev.textChanged.connect(update_repo_rev) self.repo_rev = repo_rev submit = QtWidgets.QPushButton("Submit") submit.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOkButton)) submit.setToolTip("Schedule the experiment (Ctrl+Return)") submit.setShortcut("CTRL+RETURN") submit.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(submit, 1, 4, 2, 1) submit.clicked.connect(self.submit_clicked) reqterm = QtWidgets.QPushButton("Terminate instances") reqterm.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogCancelButton)) reqterm.setToolTip("Request termination of instances (Ctrl+Backspace)") reqterm.setShortcut("CTRL+BACKSPACE") reqterm.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(reqterm, 3, 4) reqterm.clicked.connect(self.reqterm_clicked) self.hdf5_load_directory = os.path.expanduser("~")
def __init__(self, manager, expurl): QtWidgets.QMdiSubWindow.__init__(self) qfm = QtGui.QFontMetrics(self.font()) self.resize(100*qfm.averageCharWidth(), 30*qfm.lineSpacing()) self.setWindowTitle(expurl) self.setWindowIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_FileDialogContentsView)) self.layout = QtWidgets.QGridLayout() top_widget = QtWidgets.QWidget() top_widget.setLayout(self.layout) self.setWidget(top_widget) self.layout.setSpacing(5) self.layout.setContentsMargins(5, 5, 5, 5) self.manager = manager self.expurl = expurl self.argeditor = _ArgumentEditor(self.manager, self, self.expurl) self.layout.addWidget(self.argeditor, 0, 0, 1, 5) self.layout.setRowStretch(0, 1) scheduling = manager.get_submission_scheduling(expurl) options = manager.get_submission_options(expurl) datetime = QtWidgets.QDateTimeEdit() datetime.setDisplayFormat("MMM d yyyy hh:mm:ss") datetime_en = QtWidgets.QCheckBox("Due date:") self.layout.addWidget(datetime_en, 1, 0) self.layout.addWidget(datetime, 1, 1) if scheduling["due_date"] is None: datetime.setDate(QtCore.QDate.currentDate()) else: datetime.setDateTime(QtCore.QDateTime.fromMSecsSinceEpoch( scheduling["due_date"]*1000)) datetime_en.setChecked(scheduling["due_date"] is not None) def update_datetime(dt): scheduling["due_date"] = dt.toMSecsSinceEpoch()/1000 datetime_en.setChecked(True) datetime.dateTimeChanged.connect(update_datetime) def update_datetime_en(checked): if checked: due_date = datetime.dateTime().toMSecsSinceEpoch()/1000 else: due_date = None scheduling["due_date"] = due_date datetime_en.stateChanged.connect(update_datetime_en) self.pipeline_name = QtWidgets.QLineEdit() pipeline_name = self.pipeline_name self.layout.addWidget(QtWidgets.QLabel("Pipeline:"), 1, 2) self.layout.addWidget(pipeline_name, 1, 3) pipeline_name.setText(scheduling["pipeline_name"]) def update_pipeline_name(text): scheduling["pipeline_name"] = text pipeline_name.textChanged.connect(update_pipeline_name) self.priority = QtWidgets.QSpinBox() priority = self.priority priority.setRange(-99, 99) self.layout.addWidget(QtWidgets.QLabel("Priority:"), 2, 0) self.layout.addWidget(priority, 2, 1) priority.setValue(scheduling["priority"]) def update_priority(value): scheduling["priority"] = value priority.valueChanged.connect(update_priority) self.flush = QtWidgets.QCheckBox("Flush") flush = self.flush flush.setToolTip("Flush the pipeline (of current- and higher-priority " "experiments) before starting the experiment") self.layout.addWidget(flush, 2, 2, 1, 2) flush.setChecked(scheduling["flush"]) def update_flush(checked): scheduling["flush"] = bool(checked) flush.stateChanged.connect(update_flush) log_level = QtWidgets.QComboBox() log_level.addItems(log_levels) log_level.setCurrentIndex(1) log_level.setToolTip("Minimum level for log entry production") log_level_label = QtWidgets.QLabel("Logging level:") log_level_label.setToolTip("Minimum level for log message production") self.layout.addWidget(log_level_label, 3, 0) self.layout.addWidget(log_level, 3, 1) log_level.setCurrentIndex(log_levels.index( log_level_to_name(options["log_level"]))) def update_log_level(index): options["log_level"] = getattr(logging, log_level.currentText()) log_level.currentIndexChanged.connect(update_log_level) self.log_level = log_level if "repo_rev" in options: repo_rev = QtWidgets.QLineEdit() repo_rev.setPlaceholderText("current") repo_rev_label = QtWidgets.QLabel("Revision:") repo_rev_label.setToolTip("Experiment repository revision " "(commit ID) to use") self.layout.addWidget(repo_rev_label, 3, 2) self.layout.addWidget(repo_rev, 3, 3) if options["repo_rev"] is not None: repo_rev.setText(options["repo_rev"]) def update_repo_rev(text): if text: options["repo_rev"] = text else: options["repo_rev"] = None repo_rev.textChanged.connect(update_repo_rev) self.repo_rev = repo_rev submit = QtWidgets.QPushButton("Submit") submit.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOkButton)) submit.setToolTip("Schedule the experiment (Ctrl+Return)") submit.setShortcut("CTRL+RETURN") submit.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(submit, 1, 4, 2, 1) submit.clicked.connect(self.submit_clicked) reqterm = QtWidgets.QPushButton("Terminate instances") reqterm.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogCancelButton)) reqterm.setToolTip("Request termination of instances (Ctrl+Backspace)") reqterm.setShortcut("CTRL+BACKSPACE") reqterm.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(reqterm, 3, 4) reqterm.clicked.connect(self.reqterm_clicked) self.hdf5_load_directory = os.path.expanduser("~")
def __init__(self, area, expurl, arguments): QtWidgets.QMdiSubWindow.__init__(self) qfm = QtGui.QFontMetrics(self.font()) self.resize(100 * qfm.averageCharWidth(), 30 * qfm.lineSpacing()) self.setWindowTitle(expurl) self.setWindowIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_FileDialogContentsView)) self.setAcceptDrops(True) self.layout = QtWidgets.QGridLayout() top_widget = QtWidgets.QWidget() top_widget.setLayout(self.layout) self.setWidget(top_widget) self.layout.setSpacing(5) self.layout.setContentsMargins(5, 5, 5, 5) self._area = area self._run_task = None self.expurl = expurl self.arguments = arguments self.options = {"log_level": logging.WARNING} self.argeditor = _ArgumentEditor(self) self.layout.addWidget(self.argeditor, 0, 0, 1, 5) self.layout.setRowStretch(0, 1) log_level = QtWidgets.QComboBox() log_level.addItems(log_levels) log_level.setCurrentIndex(1) log_level.setToolTip("Minimum level for log entry production") log_level_label = QtWidgets.QLabel("Logging level:") log_level_label.setToolTip("Minimum level for log message production") self.layout.addWidget(log_level_label, 3, 0) self.layout.addWidget(log_level, 3, 1) log_level.setCurrentIndex( log_levels.index(log_level_to_name(self.options["log_level"]))) def update_log_level(index): self.options["log_level"] = getattr(logging, log_level.currentText()) log_level.currentIndexChanged.connect(update_log_level) self.log_level = log_level run = QtWidgets.QPushButton("Analyze") run.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOkButton)) run.setToolTip("Run analysis stage (Ctrl+Return)") run.setShortcut("CTRL+RETURN") run.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(run, 2, 4) run.clicked.connect(self._run_clicked) self._run = run terminate = QtWidgets.QPushButton("Terminate") terminate.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogCancelButton)) terminate.setToolTip("Terminate analysis (Ctrl+Backspace)") terminate.setShortcut("CTRL+BACKSPACE") terminate.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(terminate, 3, 4) terminate.clicked.connect(self._terminate_clicked) terminate.setEnabled(False) self._terminate = terminate
def __init__(self, manager, expurl): QtWidgets.QMdiSubWindow.__init__(self) qfm = QtGui.QFontMetrics(self.font()) self.resize(100*qfm.averageCharWidth(), 30*qfm.lineSpacing()) self.setWindowTitle(expurl.split("/")[-1]) self.setWindowIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_FileDialogContentsView)) self.layout = QtWidgets.QGridLayout() top_widget = QtWidgets.QSplitter() top_widget.setHandleWidth(1) self.setWidget(top_widget) self.layout.setSpacing(1) self.layout.setContentsMargins(1, 1, 1, 1) self.manager = manager self.expurl = expurl self.argeditor = _ArgumentEditor(self.manager, self, self.expurl) self.layout.addWidget(self.argeditor, 0, 0, 1, 5) self.layout.setRowStretch(0, 1) scheduling = manager.get_submission_scheduling(expurl) options = manager.get_submission_options(expurl) datetime = QtWidgets.QDateTimeEdit() datetime.setDisplayFormat("MMM d yyyy hh:mm:ss") datetime_en = QtWidgets.QCheckBox("Due date:") self.layout.addWidget(datetime_en, 1, 0) self.layout.addWidget(datetime, 1, 1) if scheduling["due_date"] is None: datetime.setDate(QtCore.QDate.currentDate()) else: datetime.setDateTime(QtCore.QDateTime.fromMSecsSinceEpoch( scheduling["due_date"]*1000)) datetime_en.setChecked(scheduling["due_date"] is not None) def update_datetime(dt): scheduling["due_date"] = dt.toMSecsSinceEpoch()/1000 datetime_en.setChecked(True) datetime.dateTimeChanged.connect(update_datetime) def update_datetime_en(checked): if checked: due_date = datetime.dateTime().toMSecsSinceEpoch()/1000 else: due_date = None scheduling["due_date"] = due_date datetime_en.stateChanged.connect(update_datetime_en) self.pipeline_name = QtWidgets.QLineEdit() pipeline_name = self.pipeline_name self.layout.addWidget(QtWidgets.QLabel("Pipeline:"), 1, 2) self.layout.addWidget(pipeline_name, 1, 3) pipeline_name.setText(scheduling["pipeline_name"]) def update_pipeline_name(text): scheduling["pipeline_name"] = text pipeline_name.textChanged.connect(update_pipeline_name) self.priority = QtWidgets.QSpinBox() priority = self.priority priority.setRange(-99, 99) self.layout.addWidget(QtWidgets.QLabel("Priority:"), 2, 0) self.layout.addWidget(priority, 2, 1) # HACK: We want experiments submitted manually through the # GUI to default to a priority value of 2. It seems like # artiq.language.environment.HasEnvironment.set_default_scheduling # should be able to do this, but it is not currently working. priority.setValue(2)#scheduling["priority"]) def update_priority(value): scheduling["priority"] = value priority.valueChanged.connect(update_priority) self.flush = QtWidgets.QCheckBox("Flush") flush = self.flush flush.setToolTip("Flush the pipeline (of current- and higher-priority " "experiments) before starting the experiment") self.layout.addWidget(flush, 2, 2, 1, 2) flush.setChecked(scheduling["flush"]) def update_flush(checked): scheduling["flush"] = bool(checked) flush.stateChanged.connect(update_flush) log_level = QtWidgets.QComboBox() log_level.addItems(log_levels) log_level.setCurrentIndex(1) log_level.setToolTip("Minimum level for log entry production") log_level_label = QtWidgets.QLabel("Logging level:") log_level_label.setToolTip("Minimum level for log message production") self.layout.addWidget(log_level_label, 3, 0) self.layout.addWidget(log_level, 3, 1) log_level.setCurrentIndex(log_levels.index( log_level_to_name(options["log_level"]))) def update_log_level(index): options["log_level"] = getattr(logging, log_level.currentText()) log_level.currentIndexChanged.connect(update_log_level) self.log_level = log_level self.periodic_schedule_checkbox = QtWidgets.QCheckBox("Schedule Periodically") self.periodic_schedule_checkbox.stateChanged.connect(self.schedule_periodic) self.periodic_schedule_checkbox.setToolTip("Schedule an experiment to run periodically.") self.periodic_schedule_spinbox = QtWidgets.QDoubleSpinBox() self.periodic_schedule_spinbox.setValue(10.0) self.periodic_schedule_spinbox.setRange(0.166, 1440.) self.periodic_schedule_spinbox.setSingleStep(.0167) self.periodic_schedule_spinbox.setSuffix(" minutes") self.periodic_schedule_priority_spinbox = QtWidgets.QSpinBox() self.periodic_schedule_priority_spinbox.setValue(2) self.periodic_schedule_priority_spinbox.setToolTip("Priority for periodic experiments.") self.periodic_schedule_priority_spinbox.setRange(2, 1000) self.layout.addWidget(self.periodic_schedule_checkbox, 4, 0) self.layout.addWidget(self.periodic_schedule_spinbox, 4, 1) self.layout.addWidget(QtWidgets.QLabel("Periodic Priority: "), 4, 2) self.layout.addWidget(self.periodic_schedule_priority_spinbox, 4, 3) if "repo_rev" in options: repo_rev = QtWidgets.QLineEdit() repo_rev.setPlaceholderText("current") repo_rev_label = QtWidgets.QLabel("Revision:") repo_rev_label.setToolTip("Experiment repository revision " "(commit ID) to use") self.layout.addWidget(repo_rev_label, 3, 2) self.layout.addWidget(repo_rev, 3, 3) if options["repo_rev"] is not None: repo_rev.setText(options["repo_rev"]) def update_repo_rev(text): if text: options["repo_rev"] = text else: options["repo_rev"] = None repo_rev.textChanged.connect(update_repo_rev) self.repo_rev = repo_rev submit = QtWidgets.QPushButton("Submit") submit.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogOkButton)) submit.setToolTip("Schedule the experiment (Ctrl+Return)") submit.setShortcut("CTRL+RETURN") submit.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(submit, 1, 4, 2, 1) submit.clicked.connect(self.submit_clicked) simulate = QtWidgets.QPushButton("Simulate") simulate.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_ComputerIcon)) simulate.setToolTip("Simulate the experiment") simulate.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(simulate, 3, 4, 1, 1) simulate.clicked.connect(self.simulate_clicked) reqterm = QtWidgets.QPushButton("Terminate instances") reqterm.setIcon(QtWidgets.QApplication.style().standardIcon( QtWidgets.QStyle.SP_DialogCancelButton)) reqterm.setToolTip("Request termination of instances (Ctrl+Backspace)") reqterm.setShortcut("CTRL+BACKSPACE") reqterm.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(reqterm, 4, 4) reqterm.clicked.connect(self.reqterm_clicked) self.hdf5_load_directory = os.path.expanduser("~") accessed_params = None try: file, class_, _ = manager.resolve_expurl(expurl) file = os.path.join(os.path.expanduser("~"), "artiq-work", file) with open(file) as f: expsource = imp.load_source(file, '', f) mod = getattr(expsource, class_) mod.set_global_params() accessed_params = mod.accessed_params except: logger.info("No accessed params found for " + expurl, exc_info=True) # only add parameter editor if the experiment has specified accessed params if accessed_params: d_accessed_parameter_editor = parameter_editor.ParameterEditorDock( acxn=None, name="Accessed Parameters", accessed_params=accessed_params, expand_accessed_params=False) d_accessed_parameter_editor.setFeatures(QtGui.QDockWidget.NoDockWidgetFeatures) d_accessed_parameter_editor.setTitleBarWidget(QtGui.QWidget()) # hides title bar # d_accessed_parameter_editor.setMinimumWidth(500) # self.layout.addWidget(d_accessed_parameter_editor, 0, 5, -1, 1) # self.layout.setColumnStretch(5, 2) # self.layout.setColumnMinimumWidth(5, 150) self.layout.setRowStretch(0, 10) self.layout.setHorizontalSpacing(3) widget1 = QtWidgets.QWidget() widget1.setLayout(self.layout) widget1.setContentsMargins(0, 0, 0, 0) widget2 = d_accessed_parameter_editor widget2.setContentsMargins(0, 0, 0, 0) top_widget.addWidget(widget1) top_widget.addWidget(widget2) top_widget.setStretchFactor(2, 1)
def __init__(self, manager, expurl): dockarea.Dock.__init__(self, "Exp: " + expurl, closable=True) self.setMinimumSize(QtCore.QSize(740, 470)) self.layout.setSpacing(5) self.layout.setContentsMargins(5, 5, 5, 5) self.manager = manager self.expurl = expurl self.argeditor = _ArgumentEditor(self.manager, self, self.expurl) self.addWidget(self.argeditor, 0, 0, colspan=5) self.layout.setRowStretch(0, 1) scheduling = manager.get_submission_scheduling(expurl) options = manager.get_submission_options(expurl) datetime = QtGui.QDateTimeEdit() datetime.setDisplayFormat("MMM d yyyy hh:mm:ss") datetime_en = QtGui.QCheckBox("Due date:") self.addWidget(datetime_en, 1, 0) self.addWidget(datetime, 1, 1) if scheduling["due_date"] is None: datetime.setDate(QtCore.QDate.currentDate()) else: datetime.setDateTime(QtCore.QDateTime.fromMSecsSinceEpoch(scheduling["due_date"] * 1000)) datetime_en.setChecked(scheduling["due_date"] is not None) def update_datetime(dt): scheduling["due_date"] = dt.toMSecsSinceEpoch() / 1000 datetime_en.setChecked(True) datetime.dateTimeChanged.connect(update_datetime) def update_datetime_en(checked): if checked: due_date = datetime.dateTime().toMSecsSinceEpoch() / 1000 else: due_date = None scheduling["due_date"] = due_date datetime_en.stateChanged.connect(update_datetime_en) pipeline_name = QtGui.QLineEdit() self.addWidget(QtGui.QLabel("Pipeline:"), 1, 2) self.addWidget(pipeline_name, 1, 3) pipeline_name.setText(scheduling["pipeline_name"]) def update_pipeline_name(text): scheduling["pipeline_name"] = text pipeline_name.textEdited.connect(update_pipeline_name) priority = QtGui.QSpinBox() priority.setRange(-99, 99) self.addWidget(QtGui.QLabel("Priority:"), 2, 0) self.addWidget(priority, 2, 1) priority.setValue(scheduling["priority"]) def update_priority(value): scheduling["priority"] = value priority.valueChanged.connect(update_priority) flush = QtGui.QCheckBox("Flush") flush.setToolTip("Flush the pipeline before starting the experiment") self.addWidget(flush, 2, 2, colspan=2) flush.setChecked(scheduling["flush"]) def update_flush(checked): scheduling["flush"] = bool(checked) flush.stateChanged.connect(update_flush) log_level = QtGui.QComboBox() log_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] log_level.addItems(log_levels) log_level.setCurrentIndex(1) log_level.setToolTip("Minimum level for log entry production") log_level_label = QtGui.QLabel("Logging level:") log_level_label.setToolTip("Minimum level for log message production") self.addWidget(log_level_label, 3, 0) self.addWidget(log_level, 3, 1) log_level.setCurrentIndex(log_levels.index(log_level_to_name(options["log_level"]))) def update_log_level(index): options["log_level"] = getattr(logging, log_level.currentText()) log_level.currentIndexChanged.connect(update_log_level) if "repo_rev" in options: repo_rev = QtGui.QLineEdit() repo_rev.setPlaceholderText("current") repo_rev_label = QtGui.QLabel("Revision:") repo_rev_label.setToolTip("Experiment repository revision " "(commit ID) to use") self.addWidget(repo_rev_label, 3, 2) self.addWidget(repo_rev, 3, 3) if options["repo_rev"] is not None: repo_rev.setText(options["repo_rev"]) def update_repo_rev(text): if text: options["repo_rev"] = text else: options["repo_rev"] = None repo_rev.textEdited.connect(update_repo_rev) submit = QtGui.QPushButton("Submit") submit.setIcon(QtGui.QApplication.style().standardIcon(QtGui.QStyle.SP_DialogOkButton)) submit.setToolTip("Schedule the experiment (Ctrl+Return)") submit.setShortcut("CTRL+RETURN") submit.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.addWidget(submit, 1, 4, rowspan=2) submit.clicked.connect(self.submit_clicked) reqterm = QtGui.QPushButton("Terminate instances") reqterm.setIcon(QtGui.QApplication.style().standardIcon(QtGui.QStyle.SP_DialogCancelButton)) reqterm.setToolTip("Request termination of instances (Ctrl+Backspace)") reqterm.setShortcut("CTRL+BACKSPACE") reqterm.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.addWidget(reqterm, 3, 4) reqterm.clicked.connect(self.reqterm_clicked)