Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: afa8148b2bd6
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: cabcdb37849e
Choose a head ref
  • 2 commits
  • 2 files changed
  • 1 contributor

Commits on Nov 30, 2015

  1. Copy the full SHA
    24a33be View commit details
  2. Copy the full SHA
    cabcdb3 View commit details
Showing with 104 additions and 36 deletions.
  1. +102 −34 artiq/gui/experiments.py
  2. +2 −2 artiq/gui/log.py
136 changes: 102 additions & 34 deletions artiq/gui/experiments.py
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@
from pyqtgraph import dockarea

from artiq.gui.scan import ScanController
from artiq.gui.log import log_level_to_name


logger = logging.getLogger(__name__)
@@ -37,7 +38,7 @@ def __init__(self, argument):
QtGui.QCheckBox.__init__(self)
self.setChecked(argument["state"])
def update(checked):
argument["state"] = checked
argument["state"] = bool(checked)
self.stateChanged.connect(update)

@staticmethod
@@ -175,47 +176,112 @@ def restore_state(self, state):

class _ExperimentDock(dockarea.Dock):
def __init__(self, manager, expname):
dockarea.Dock.__init__(self, "Experiment: " + expname,
dockarea.Dock.__init__(self, "Exp: " + expname,
closable=True, size=(1500, 500))
self.layout.setSpacing(5)
self.layout.setContentsMargins(5, 5, 5, 5)

self.manager = manager
self.expname = expname

self.argeditor = _ArgumentEditor(
manager.get_submission_arguments(expname))
self.addWidget(self.argeditor, 0, 0, colspan=4)

self.datetime = QtGui.QDateTimeEdit()
self.datetime.setDisplayFormat("MMM d yyyy hh:mm:ss")
self.datetime.setDate(QtCore.QDate.currentDate())
self.datetime.dateTimeChanged.connect(
lambda: self.datetime_en.setChecked(True))
self.datetime_en = QtGui.QCheckBox("Due date:")
self.addWidget(self.datetime_en, 1, 0, colspan=2)
self.addWidget(self.datetime, 1, 2, colspan=2)

self.pipeline = QtGui.QLineEdit()
self.pipeline.setText("main")
self.addWidget(QtGui.QLabel("Pipeline:"), 2, 0, colspan=2)
self.addWidget(self.pipeline, 2, 2, colspan=2)

self.priority = QtGui.QSpinBox()
self.priority.setRange(-99, 99)
self.addWidget(QtGui.QLabel("Priority:"), 3, 0)
self.addWidget(self.priority, 3, 1)

self.flush = QtGui.QCheckBox("Flush")
self.flush.setToolTip("Flush the pipeline before starting the experiment")
self.addWidget(self.flush, 3, 2)

self.log_level = QtGui.QComboBox()
self.log_level.addItems(["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"])
self.log_level.setCurrentIndex(1)
self.log_level.setToolTip("Minimum level for log entry production")
self.addWidget(self.log_level, 3, 3)
self.addWidget(self.argeditor, 0, 0, colspan=5)

scheduling = manager.get_submission_scheduling(expname)
options = manager.get_submission_options(expname)

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():
scheduling["pipeline_name"] = pipeline_name.text()
pipeline_name.editingFinished.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)

repo_rev = QtGui.QLineEdit()
repo_rev.setPlaceholderText("HEAD")
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():
t = repo_rev.text()
if t:
options["repo_rev"] = t
else:
options["repo_rev"] = None
repo_rev.editingFinished.connect(update_repo_rev)

submit = QtGui.QPushButton("Submit")
submit.setToolTip("Schedule the selected experiment (Ctrl+Return)")
self.addWidget(submit, 4, 0, colspan=4)
submit.setSizePolicy(QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Expanding)
self.addWidget(submit, 1, 4, rowspan=3)
submit.clicked.connect(self.submit_clicked)

def submit_clicked(self):
@@ -257,6 +323,7 @@ def get_submission_scheduling(self, expname):
if expname in self.submission_scheduling:
return self.submission_scheduling[expname]
else:
# mutated by _ExperimentDock
scheduling = {
"pipeline_name": "main",
"priority": 0,
@@ -270,11 +337,12 @@ def get_submission_options(self, expname):
if expname in self.submission_options:
return self.submission_options[expname]
else:
# mutated by _ExperimentDock
options = {
"log_level": logging.WARNING,
"repo_rev": None
}
self.submission_options = options
self.submission_options[expname] = options
return options

def get_submission_arguments(self, expname):
4 changes: 2 additions & 2 deletions artiq/gui/log.py
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@
QSortFilterProxyModel = QtGui.QSortFilterProxyModel


def _level_to_name(level):
def log_level_to_name(level):
if level >= logging.CRITICAL:
return "CRITICAL"
if level >= logging.ERROR:
@@ -108,7 +108,7 @@ def data(self, index, role):
v = self.entries[index.row()]
column = index.column()
if column == 0:
return _level_to_name(v[0])
return log_level_to_name(v[0])
elif column == 1:
return v[1]
elif column == 2: