Source code for madgui.widget.correct.opticstable


from functools import partial

from PyQt5.QtWidgets import QWidget, QAbstractItemView

from madgui.util.qt import load_ui
from madgui.util.unit import change_unit, get_raw_label
from madgui.widget.tableview import TableItem, delegates


[docs]class OpticsTable(QWidget): num_focus_levels = 6 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) load_ui(self, __package__, 'opticstable.ui') self.opticsTable.setSelectionBehavior(QAbstractItemView.SelectRows) self.opticsTable.setSelectionMode(QAbstractItemView.ExtendedSelection) self.readFocusButton.clicked.connect(self.read_focus)
[docs] def setEnabled(self, enabled): self.read1stFocusComboBox.setEnabled(enabled) self.read2ndFocusComboBox.setEnabled(enabled) self.readFocusButton.setEnabled(enabled)
[docs] def set_corrector(self, corrector): self.corrector = corrector self.opticsTable.set_viewmodel(self.get_optic_row, corrector.optics) self.corrector.optics.update_finished.connect(self.on_optics_updated) focus_choices = [ "F{}".format(i+1) for i in range(self.num_focus_levels) ] self.read1stFocusComboBox.addItems(focus_choices) self.read2ndFocusComboBox.addItems(focus_choices) self.read1stFocusComboBox.setCurrentText("F1") self.read2ndFocusComboBox.setCurrentText("F4")
[docs] def get_optic_row(self, i, o) -> ("#", "kL (1)", "kL (2)"): return [ TableItem(i+1), ] + [ TableItem(change_unit(o[par.lower()], info.unit, info.ui_unit), set_value=partial(self.set_optic_value, par), delegate=delegates[float]) for par in self.corrector.selected['optics'] for info in [self.corrector.optic_params[i]] ]
[docs] def set_optic_value(self, par, i, o, value): o[par.lower()] = value
[docs] def read_focus(self): """Update focus level and automatically load QP values.""" foci = [self.read1stFocusComboBox.currentIndex()+1, self.read2ndFocusComboBox.currentIndex()+1] corr = self.corrector ctrl = corr.control # TODO: this should be done with a more generic API # TODO: do this without beamoptikdll to decrease the waiting time acs = ctrl.backend.beamoptikdll values, channels = acs.GetMEFIValue() vacc = acs.GetSelectedVAcc() try: optics = [] for focus in foci: acs.SelectMEFI(vacc, *channels._replace(focus=focus)) optics.append({ par.lower(): ctrl.read_param(par) for par in corr.selected['optics'] }) corr.optics[:] = optics finally: acs.SelectMEFI(vacc, *channels)
[docs] def on_optics_updated(self, *_): self.opticsTable.model().titles[1:] = [ "{}/{}".format(info.name, get_raw_label(info.ui_unit)) for info in self.corrector.optic_params ]