COMPASS  5.0.0
End-to-end AO simulation tool using GPU acceleration
shesha.widgets.widget_base.WidgetBase Class Reference
Inheritance diagram for shesha.widgets.widget_base.WidgetBase:
Collaboration diagram for shesha.widgets.widget_base.WidgetBase:

Public Member Functions

None __init__ (self, parent=None, hide_histograms=False)
 
None gui_timer_config (self, state)
 
None closeEvent (self, Any event)
 
None quitGUI (self, Any event=None)
 
def saveArea (self, widget, filename=None)
 METHODS #. More...
 
def showDock (self, name)
 
def restoreMyState (self, state)
 
def loadArea (self, widget=None, filename=None)
 
None addConfigFromFile (self)
 
def update_displayDock (self)
 
Dock add_dispDock (self, str name, parent, str type="pg_image")
 
None load_config (self, *args, **kwargs)
 Callback when 'LOAD' button is hit. More...
 
None loadDefaultConfig (self)
 
None init_config (self)
 
None init_configThread (self)
 
None init_configFinished (self)
 
None updateDisplay (self)
 
def addSHGrid (self, pg_image, valid_sub, sspsize, pitch)
 
None printInPlace (self, str text)
 
def run (self)
 

Public Attributes

 uiBase
 
 gui_timer
 ATTRIBUTES #. More...
 
 loopLock
 
 hide_histograms
 
 area
 PYQTGRAPH DockArea INIT #. More...
 
 gridSH
 
 defaultParPath
 
 defaultAreaPath
 
 disp_checkboxes
 
 docks
 
 viewboxes
 
 imgs
 
 hists
 
 PupilLines
 
 wao_phasesgroup_cb
 
 wao_graphgroup_cb
 
 wao_imagesgroup_cb
 
 thread
 

Detailed Description

Definition at line 79 of file widget_base.py.

Constructor & Destructor Documentation

◆ __init__()

None shesha.widgets.widget_base.WidgetBase.__init__ (   self,
  parent = None,
  hide_histograms = False 
)

Definition at line 81 of file widget_base.py.

81  def __init__(self, parent=None, hide_histograms=False) -> None:
82  BaseClassTemplate.__init__(self, parent=parent)
83 
84  self.uiBase = BaseWidgetTemplate()
85  self.uiBase.setupUi(self)
86 
87 
90 
91  self.gui_timer = QTimer() # type: QTimer
92  self.gui_timer.timeout.connect(self.updateDisplay)
93  if self.uiBase.wao_Display.isChecked():
94  self.gui_timer.start(1000. / self.uiBase.wao_frameRate.value())
95  self.loopLock = threading.Lock(
96  ) # type: Threading.Lock # Asynchronous loop / display safe-threading
97  self.hide_histograms = hide_histograms
98 
101 
102  self.area = DockArea()
103  self.uiBase.wao_DisplayDock.setWidget(self.area)
104  self.gridSH = []
105 
106 
110  self.defaultParPath = "."
111  self.defaultAreaPath = "."
112  self.uiBase.wao_load_config.clicked.connect(self.load_config)
113  self.uiBase.wao_loadArea.clicked.connect(self.loadArea)
114  self.uiBase.wao_saveArea.clicked.connect(self.saveArea)
115  self.uiBase.wao_init.clicked.connect(self.init_config)
116  self.uiBase.wao_configFromFile.clicked.connect(self.addConfigFromFile)
117 
118  self.uiBase.wao_Display.stateChanged.connect(self.gui_timer_config)
119  self.uiBase.wao_frameRate.setValue(2)
120 
121  self.uiBase.wao_load_config.setDisabled(False)
122  self.uiBase.wao_init.setDisabled(True)
123 
124  self.disp_checkboxes = []
125  self.docks = {} # type: Dict[str, pg.dockarea.Dock]
126  self.viewboxes = {} # type: Dict[str, pg.ViewBox]
127  self.imgs = {} # type: Dict[str, pg.ImageItem]
128  self.hists = {} # type: Dict[str, pg.HistogramLUTItem]
129 
130  self.PupilLines = None
131  self.adjustSize()
132 

Member Function Documentation

◆ add_dispDock()

Dock shesha.widgets.widget_base.WidgetBase.add_dispDock (   self,
str  name,
  parent,
str   type = "pg_image" 
)

Reimplemented in shesha.widgets.widget_ao.widgetAOWindow, and shesha.widgets.widget_bench.widgetBenchWindow.

Definition at line 252 of file widget_base.py.

252  def add_dispDock(self, name: str, parent, type: str = "pg_image") -> Dock:
253  checkBox = QtGui.QCheckBox(name, parent)
254  checkBox.clicked.connect(self.update_displayDock)
255  checkableAction = QtGui.QWidgetAction(parent)
256  checkableAction.setDefaultWidget(checkBox)
257  parent.addAction(checkableAction)
258  self.disp_checkboxes.append(checkBox)
259 
260  d = Dock(name) # , closable=True)
261  self.docks[name] = d
262  if type == "pg_image":
263  img = pg.ImageItem(border='w')
264  self.imgs[name] = img
265 
266  viewbox = pg.ViewBox()
267 
268  viewbox.setAspectLocked(True)
269  viewbox.addItem(img) # Put image in plot area
270  self.viewboxes[name] = viewbox
271  iv = pg.ImageView(view=viewbox, imageItem=img)
272  viewbox.invertY(False)
273 
274  if (self.hide_histograms):
275  iv.ui.histogram.hide()
276  iv.ui.histogram.autoHistogramRange() # init levels
277  iv.ui.histogram.setMaximumWidth(100)
278  iv.ui.menuBtn.hide()
279  iv.ui.roiBtn.hide()
280  d.addWidget(iv)
281  elif type == "pg_plot":
282  img = pg.PlotItem(border='w')
283  self.imgs[name] = img
284  d.addWidget(img)
285  elif type == "MPL":
286  img = MatplotlibWidget()
287  self.imgs[name] = img
288  d.addWidget(img)
289  # elif type == "SR":
290  # d.addWidget(self.uiBase.wao_Strehl)
291  return d
292 
Here is the call graph for this function:

◆ addConfigFromFile()

None shesha.widgets.widget_base.WidgetBase.addConfigFromFile (   self)

Definition at line 234 of file widget_base.py.

234  '''
235  filepath = QtWidgets.QFileDialog(directory=self.defaultParPath).getOpenFileName(
236  self, "Select parameter file", "",
237  "parameters file (*.py);;hdf5 file (*.h5);;all files (*)")
238 
239  self.uiBase.wao_selectConfig.clear()
240  self.uiBase.wao_selectConfig.addItem(str(filepath[0]))
241 
242  self.load_config(config_file=self.uiBase.wao_selectConfig.currentText())
243 
Here is the call graph for this function:

◆ addSHGrid()

def shesha.widgets.widget_base.WidgetBase.addSHGrid (   self,
  pg_image,
  valid_sub,
  sspsize,
  pitch 
)

Definition at line 373 of file widget_base.py.

373  def addSHGrid(self, pg_image, valid_sub, sspsize, pitch):
374  # First remove the old grid, if any
375  if self.PupilLines is not None:
376  pg_image.removeItem(self.PupilLines)
377 
378  nssp_tot = valid_sub[0].size
379  connect = np.ones((nssp_tot, 5), dtype=bool)
380  connect[:, -1] = 0 # don't draw the segment between each trace
381  roi_x = np.ones((nssp_tot, 5), dtype=int)
382  roi_y = np.ones((nssp_tot, 5), dtype=int)
383  for idx_ssp in range(nssp_tot):
384  (x, y) = (valid_sub[0][idx_ssp], valid_sub[1][idx_ssp])
385  roi_x[idx_ssp, :] = [x, x, x + sspsize, x + sspsize, x]
386  roi_y[idx_ssp, :] = [y, y + sspsize, y + sspsize, y, y]
387  self.PupilLines = PupilBoxes(roi_x, roi_y)
388  pg_image.addItem(self.PupilLines)
389 
Here is the caller graph for this function:

◆ closeEvent()

None shesha.widgets.widget_base.WidgetBase.closeEvent (   self,
Any  event 
)

Definition at line 140 of file widget_base.py.

140  def closeEvent(self, event: Any) -> None:
141  self.quitGUI(event)
142 
Here is the call graph for this function:

◆ gui_timer_config()

None shesha.widgets.widget_base.WidgetBase.gui_timer_config (   self,
  state 
)

Definition at line 133 of file widget_base.py.

133  def gui_timer_config(self, state) -> None:
134  self.uiBase.wao_frameRate.setDisabled(state)
135  if state:
136  self.gui_timer.start(1000. / self.uiBase.wao_frameRate.value())
137  else:
138  self.gui_timer.stop()
139 

◆ init_config()

None shesha.widgets.widget_base.WidgetBase.init_config (   self)

Reimplemented in shesha.widgets.widget_ao.widgetAOWindow, shesha.widgets.widget_bench.widgetBenchWindow, and shesha.widgets.widget_canapass.widgetCanapassWindowPyro.

Definition at line 348 of file widget_base.py.

348  def init_config(self) -> None:
349  self.loopLock.acquire(True)
350  self.uiBase.wao_load_config.setDisabled(True)
351  self.uiBase.wao_init.setDisabled(True)
352  self.thread = WorkerThread(self.init_configThread)
353  self.thread.finished.connect(self.init_configFinished)
354  self.thread.start()
355 

◆ init_configFinished()

None shesha.widgets.widget_base.WidgetBase.init_configFinished (   self)

Reimplemented in shesha.widgets.widget_ao.widgetAOWindow, and shesha.widgets.widget_bench.widgetBenchWindow.

Definition at line 359 of file widget_base.py.

359  def init_configFinished(self) -> None:
360  self.uiBase.wao_load_config.setDisabled(False)
361  self.uiBase.wao_init.setDisabled(False)
362  self.loopLock.release()
363 

◆ init_configThread()

None shesha.widgets.widget_base.WidgetBase.init_configThread (   self)

Reimplemented in shesha.widgets.widget_ao.widgetAOWindow, shesha.widgets.widget_bench.widgetBenchWindow, and shesha.widgets.widget_canapass.widgetCanapassWindowPyro.

Definition at line 356 of file widget_base.py.

356  def init_configThread(self) -> None:
357  pass
358 

◆ load_config()

None shesha.widgets.widget_base.WidgetBase.load_config (   self,
args,
**  kwargs 
)

Callback when 'LOAD' button is hit.

Definition at line 296 of file widget_base.py.

296  '''
297  for groupbox in [
298  self.uiBase.wao_phasesgroup_tb, self.uiBase.wao_imagesgroup_tb,
299  self.uiBase.wao_graphgroup_tb
300  ]:
301  layout = groupbox.menu()
302  while layout and not layout.isEmpty():
303  w = layout.children()[0]
304  layout.removeAction(w)
305  w.setParent(None)
306  self.disp_checkboxes.clear()
307 
308  # TODO: remove self.imgs, self.viewboxes and self.docks children
309  for _, dock in self.docks.items():
310  if dock.isVisible():
311  dock.close()
312 
313  self.docks.clear()
314  self.imgs.clear()
315  self.viewboxes.clear()
316 
317  self.wao_phasesgroup_cb = QtGui.QMenu(self)
318  self.uiBase.wao_phasesgroup_tb.setMenu(self.wao_phasesgroup_cb)
319  self.uiBase.wao_phasesgroup_tb.setText('Select')
320  self.uiBase.wao_phasesgroup_tb.setPopupMode(QtWidgets.QToolButton.InstantPopup)
321 
322  self.wao_graphgroup_cb = QtGui.QMenu(self)
323  self.uiBase.wao_graphgroup_tb.setMenu(self.wao_graphgroup_cb)
324  self.uiBase.wao_graphgroup_tb.setText('Select')
325  self.uiBase.wao_graphgroup_tb.setPopupMode(QtWidgets.QToolButton.InstantPopup)
326 
327  self.uiBase.wao_imagesgroup_tb.setText('Select')
328  self.wao_imagesgroup_cb = QtGui.QMenu(self)
329  self.uiBase.wao_imagesgroup_tb.setMenu(self.wao_imagesgroup_cb)
330  self.uiBase.wao_imagesgroup_tb.setPopupMode(QtWidgets.QToolButton.InstantPopup)
331 
332  # self.uiBase.wao_init.setDisabled(False)
333  #
334  # if (hasattr(self.sim.config, "layout")):
335  # area_filename = self.defaultAreaPath + "/" + self.sim.config.layout + ".area"
336  # self.loadArea(filename=area_filename)
337  #
338  # self.adjustSize()
339 
Here is the caller graph for this function:

◆ loadArea()

def shesha.widgets.widget_base.WidgetBase.loadArea (   self,
  widget = None,
  filename = None 
)

Definition at line 197 of file widget_base.py.

197  def loadArea(self, widget=None, filename=None):
198  # close all docks
199  for disp_checkbox in self.disp_checkboxes:
200  disp_checkbox.setChecked(False)
201  for dock in self.docks.values():
202  if dock.isVisible():
203  dock.close()
204 
205  if filename is None:
206  filepath = QtWidgets.QFileDialog(
207  directory=self.defaultAreaPath).getOpenFileName(
208  self, "Select area layout file", "",
209  "area layout file (*.area);;all files (*)")
210  filename = filepath[0]
211 
212  try:
213  with open(filename, "r") as f:
214  st = eval(f.readline())
215 
216  # restore docks from main area
217  if st['main'] is not None:
218  self.restoreMyState(st["main"])
219 
220  # restore docks from floating area
221  for win in st["float"]:
222  self.restoreMyState(win[0]['main'])
223 
224  # rearange dock s as in stored state
225  self.area.restoreState(st)
226  except FileNotFoundError as err:
227  warnings.warn(filename + "not loaded: " + err)
228 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ loadDefaultConfig()

None shesha.widgets.widget_base.WidgetBase.loadDefaultConfig (   self)

Definition at line 340 of file widget_base.py.

340  def loadDefaultConfig(self) -> None:
341  import glob
342  parlist = sorted(glob.glob(self.defaultParPath + "/*.py"))
343  self.uiBase.wao_selectConfig.clear()
344  self.uiBase.wao_selectConfig.addItems([
345  parlist[i].split('/')[-1] for i in range(len(parlist))
346  ])
347 
Here is the call graph for this function:

◆ printInPlace()

None shesha.widgets.widget_base.WidgetBase.printInPlace (   self,
str  text 
)

Definition at line 390 of file widget_base.py.

390  def printInPlace(self, text: str) -> None:
391  # This seems to trigger the GUI and keep it responsive
392  print(text, end='\r', flush=True)
393 
Here is the caller graph for this function:

◆ quitGUI()

None shesha.widgets.widget_base.WidgetBase.quitGUI (   self,
Any   event = None 
)

Definition at line 143 of file widget_base.py.

143  def quitGUI(self, event: Any = None) -> None:
144  reply = QtWidgets.QMessageBox.question(
145  self, 'Message', "Are you sure to quit?", QtWidgets.QMessageBox.Yes |
146  QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
147 
148  if reply == QtWidgets.QMessageBox.Yes:
149  if event:
150  event.accept()
151  quit()
152  else:
153  if event:
154  event.ignore()
155 
Here is the caller graph for this function:

◆ restoreMyState()

def shesha.widgets.widget_base.WidgetBase.restoreMyState (   self,
  state 
)

Definition at line 188 of file widget_base.py.

188  def restoreMyState(self, state):
189  typ, contents, _ = state
190 
191  if typ == 'dock':
192  self.showDock(contents)
193  else:
194  for o in contents:
195  self.restoreMyState(o)
196 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

def shesha.widgets.widget_base.WidgetBase.run (   self)

Reimplemented in shesha.widgets.widget_ao.widgetAOWindow, and shesha.widgets.widget_bench.widgetBenchWindow.

Definition at line 394 of file widget_base.py.

394  def run(self):
395  self.loop_once()
396  if not self.stop:
397  QTimer.singleShot(0, self.run) # Update loop
398 
399 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ saveArea()

def shesha.widgets.widget_base.WidgetBase.saveArea (   self,
  widget,
  filename = None 
)

METHODS #.

Definition at line 165 of file widget_base.py.

165  '''
166  if filename is None:
167  filepath = QtWidgets.QFileDialog(
168  directory=self.defaultAreaPath).getSaveFileName(
169  self, "Select area layout file", "",
170  "area layout file (*.area);;all files (*)")
171  filename = filepath[0]
172 
173  try:
174  with open(filename, "w+") as f:
175  st = self.area.saveState()
176  f.write(str(st))
177  except FileNotFoundError as err:
178  warnings.warn(filename + " not loaded: " + err)
179 

◆ showDock()

def shesha.widgets.widget_base.WidgetBase.showDock (   self,
  name 
)

Definition at line 180 of file widget_base.py.

180  def showDock(self, name):
181  for disp_checkbox in self.disp_checkboxes:
182  if disp_checkbox.text() == name:
183  disp_checkbox.setChecked(True)
184  break
185  if name in self.docks.keys():
186  self.area.addDock(self.docks[name])
187 
Here is the caller graph for this function:

◆ update_displayDock()

def shesha.widgets.widget_base.WidgetBase.update_displayDock (   self)

Definition at line 244 of file widget_base.py.

244  def update_displayDock(self):
245  guilty_guy = self.sender().text()
246  state = self.sender().isChecked()
247  if state:
248  self.area.addDock(self.docks[guilty_guy])
249  elif self.docks[guilty_guy].isVisible():
250  self.docks[guilty_guy].close()
251 
Here is the caller graph for this function:

◆ updateDisplay()

None shesha.widgets.widget_base.WidgetBase.updateDisplay (   self)

Reimplemented in shesha.widgets.widget_ao.widgetAOWindow, and shesha.widgets.widget_bench.widgetBenchWindow.

Definition at line 364 of file widget_base.py.

364  def updateDisplay(self) -> None:
365  if not self.loopLock.acquire(False):
366  return
367  else:
368  try:
369  pass
370  finally:
371  self.loopLock.release()
372 
Here is the caller graph for this function:

Member Data Documentation

◆ area

shesha.widgets.widget_base.WidgetBase.area

PYQTGRAPH DockArea INIT #.

Definition at line 102 of file widget_base.py.

◆ defaultAreaPath

shesha.widgets.widget_base.WidgetBase.defaultAreaPath

Definition at line 111 of file widget_base.py.

◆ defaultParPath

shesha.widgets.widget_base.WidgetBase.defaultParPath
            CONNECTED BUTTONS                         #

Default path for config files

Definition at line 110 of file widget_base.py.

◆ disp_checkboxes

shesha.widgets.widget_base.WidgetBase.disp_checkboxes

Definition at line 124 of file widget_base.py.

◆ docks

shesha.widgets.widget_base.WidgetBase.docks

Definition at line 125 of file widget_base.py.

◆ gridSH

shesha.widgets.widget_base.WidgetBase.gridSH

Definition at line 104 of file widget_base.py.

◆ gui_timer

shesha.widgets.widget_base.WidgetBase.gui_timer

ATTRIBUTES #.

Definition at line 91 of file widget_base.py.

◆ hide_histograms

shesha.widgets.widget_base.WidgetBase.hide_histograms

Definition at line 97 of file widget_base.py.

◆ hists

shesha.widgets.widget_base.WidgetBase.hists

Definition at line 128 of file widget_base.py.

◆ imgs

shesha.widgets.widget_base.WidgetBase.imgs

Definition at line 127 of file widget_base.py.

◆ loopLock

shesha.widgets.widget_base.WidgetBase.loopLock

Definition at line 95 of file widget_base.py.

◆ PupilLines

shesha.widgets.widget_base.WidgetBase.PupilLines

Definition at line 130 of file widget_base.py.

◆ thread

shesha.widgets.widget_base.WidgetBase.thread

Definition at line 352 of file widget_base.py.

◆ uiBase

shesha.widgets.widget_base.WidgetBase.uiBase

Definition at line 84 of file widget_base.py.

◆ viewboxes

shesha.widgets.widget_base.WidgetBase.viewboxes

Definition at line 126 of file widget_base.py.

◆ wao_graphgroup_cb

shesha.widgets.widget_base.WidgetBase.wao_graphgroup_cb

Definition at line 322 of file widget_base.py.

◆ wao_imagesgroup_cb

shesha.widgets.widget_base.WidgetBase.wao_imagesgroup_cb

Definition at line 328 of file widget_base.py.

◆ wao_phasesgroup_cb

shesha.widgets.widget_base.WidgetBase.wao_phasesgroup_cb

Definition at line 317 of file widget_base.py.


The documentation for this class was generated from the following file:
carma_utils::split
void split(std::vector< std::string > &tokens, const std::string &text, char sep)
Definition: carma_utils.h:94