COMPASS  5.0.0
End-to-end AO simulation tool using GPU acceleration
widget_ao.py
1 #!/usr/bin/env python
2 
38 """
39 Widget to simulate a closed loop
40 
41 Usage:
42  widget_ao.py [<parameters_filename>] [options]
43 
44 with 'parameters_filename' the path to the parameters file
45 
46 Options:
47  -h --help Show this help message and exit
48  --cacao Distribute data with cacao
49  --expert Display expert panel
50  -d, --devices devices Specify the devices
51  -i, --interactive keep the script interactive
52 """
53 
54 import os, sys
55 
56 import numpy as np
57 import time
58 
59 import pyqtgraph as pg
60 from pyqtgraph.dockarea import Dock, DockArea
61 
62 from shesha.util.tools import plsh, plpyr
63 from shesha.util.utilities import load_config_from_file
64 
65 import warnings
66 
67 from PyQt5 import QtGui, QtWidgets
68 from PyQt5.uic import loadUiType
69 from PyQt5.QtCore import QThread, QTimer, Qt
70 
71 from subprocess import Popen, PIPE
72 
73 from typing import Any, Dict, Tuple, Callable, List
74 
75 from docopt import docopt
76 from collections import deque
77 
78 from shesha.widgets.widget_base import WidgetBase, uiLoader
79 
80 AOWindowTemplate, AOClassTemplate = uiLoader('widget_ao')
81 
82 from shesha.supervisor.compassSupervisor import CompassSupervisor, scons
83 
84 # For debug
85 # from IPython.core.debugger import Pdb
86 # then add this line to create a breakpoint
87 # Pdb().set_trace()
88 
89 
91 
92  def __init__(self, config_file: Any = None, cacao: bool = False,
93  expert: bool = False, devices: str = None,
94  hide_histograms: bool = False) -> None:
95  WidgetBase.__init__(self, hide_histograms=hide_histograms)
96  AOClassTemplate.__init__(self)
97 
98  self.cacao = cacao
99  self.rollingWindow = 100
100  self.SRLE = deque(maxlen=self.rollingWindow)
101  self.SRSE = deque(maxlen=self.rollingWindow)
102  self.numiter = deque(maxlen=self.rollingWindow)
103  self.expert = expert
104  self.devices = devices
105 
106  self.uiAO = AOWindowTemplate()
107  self.uiAO.setupUi(self)
108 
109 
112 
113  self.supervisor = None
114  self.config = None
115  self.stop = False # type: bool # Request quit
116 
117  self.uiAO.wao_nbiters.setValue(1000) # Default GUI nIter box value
118  self.nbiter = self.uiAO.wao_nbiters.value()
119  self.refreshTime = 0 # type: float # System time at last display refresh
120  self.assistant = None # type: Any
121 
122 
125 
126  # Default path for config files
127  self.defaultParPath = os.environ["SHESHA_ROOT"] + "/data/par/par4bench"
128  self.defaultAreaPath = os.environ["SHESHA_ROOT"] + "/data/layouts"
129  self.loadDefaultConfig()
130 
131  self.uiAO.wao_run.setCheckable(True)
132  self.uiAO.wao_run.clicked[bool].connect(self.aoLoopClicked)
133  self.uiAO.wao_open_loop.setCheckable(True)
134  self.uiAO.wao_open_loop.clicked[bool].connect(self.aoLoopOpen)
135  self.uiAO.wao_next.clicked.connect(self.loop_once)
136  self.uiAO.wao_resetSR.clicked.connect(self.resetSR)
137  # self.uiAO.wao_actionHelp_Contents.triggered.connect(self.on_help_triggered)
138 
139  self.uiAO.wao_allTarget.stateChanged.connect(self.updateAllTarget)
140  self.uiAO.wao_forever.stateChanged.connect(self.updateForever)
141 
142  self.uiAO.wao_atmosphere.clicked[bool].connect(self.enable_atmos)
143  self.dispStatsInTerminal = False
144  self.uiAO.wao_clearSR.clicked.connect(self.clearSR)
145  # self.uiAO.actionStats_in_Terminal.toggled.connect(self.updateStatsInTerminal)
146 
147  self.uiAO.wao_run.setDisabled(True)
148  self.uiAO.wao_next.setDisabled(True)
149  self.uiAO.wao_unzoom.setDisabled(True)
150  self.uiAO.wao_resetSR.setDisabled(True)
151 
152  p1 = self.uiAO.wao_SRPlotWindow.addPlot(title='SR evolution')
153  self.curveSRSE = p1.plot(pen=(255, 0, 0), symbolBrush=(255, 0, 0), name="SR SE")
154  self.curveSRLE = p1.plot(pen=(0, 0, 255), symbolBrush=(0, 0, 255), name="SR LE")
155 
156  self.SRCrossX = {} # type: Dict[str, pg.ScatterPlotItem]
157  self.SRCrossY = {} # type: Dict[str, pg.ScatterPlotItem]
158  self.SRcircles = {} # type: Dict[str, pg.ScatterPlotItem]
159  self.PyrEdgeX = {} # type: Dict[str, pg.ScatterPlotItem]
160  self.PyrEdgeY = {} # type: Dict[str, pg.ScatterPlotItem]
161 
162  self.natm = 0
163  self.nwfs = 0
164  self.ndm = 0
165  self.ntar = 0
166  self.PSFzoom = 50
167  self.firstTime = 1
168  self.uiAO.wao_SRDock.setVisible(False)
169 
170  self.addDockWidget(Qt.DockWidgetArea(1), self.uiBase.wao_ConfigDock)
171  self.addDockWidget(Qt.DockWidgetArea(1), self.uiBase.wao_DisplayDock)
172  self.uiBase.wao_ConfigDock.setFloating(False)
173  self.uiBase.wao_DisplayDock.setFloating(False)
174 
175  if expert:
176  from shesha.widgets.widget_ao_expert import WidgetAOExpert
177  self.expertWidget = WidgetAOExpert()
178  # self.expertWidget.setupUi(self)
179  self.addDockWidget(
180  Qt.DockWidgetArea(1), self.expertWidget.uiExpert.wao_expertDock)
181  self.expertWidget.uiExpert.wao_expertDock.setFloating(False)
182 
183  self.adjustSize()
184 
185  if config_file is not None:
186  self.uiBase.wao_selectConfig.clear()
187  self.uiBase.wao_selectConfig.addItem(config_file)
188  self.load_config(config_file=config_file)
189  self.init_config()
190 
191  # def on_help_triggered(self, i: Any=None) -> None:
192  # if i is None:
193  # return
194  # if not self.assistant or \
195  # not self.assistant.poll():
196 
197  # helpcoll = os.environ["COMPASS_ROOT"] + "/doc/COMPASS.qhc"
198  # cmd = "assistant -enableRemoteControl -collectionFile %s" % helpcoll
199  # self.assistant = Popen(cmd, shell=True, stdin=PIPE)
200 
201 
204 
205  # def updateStatsInTerminal(self, state):
206  # self.dispStatsInTerminal = state
207 
208  def updateAllTarget(self, state):
209  self.uiAO.wao_resetSR_tarNum.setDisabled(state)
210 
211  def updateForever(self, state):
212  self.uiAO.wao_nbiters.setDisabled(state)
213 
214  def enable_atmos(self, atmos):
215  self.supervisor.atmos.enable_atmos(atmos)
216 
217  def resetSR(self) -> None:
218  if self.uiAO.wao_allTarget.isChecked():
219  for t in range(len(self.config.p_targets)):
220  self.supervisor.target.reset_strehl(t)
221  else:
222  tarnum = self.uiAO.wao_resetSR_tarNum.value()
223  print("Reset SR on target %d" % tarnum)
224  self.supervisor.target.reset_strehl(tarnum)
225 
226  def add_dispDock(self, name: str, parent, type: str = "pg_image") -> None:
227  d = WidgetBase.add_dispDock(self, name, parent, type)
228  if type == "SR":
229  d.addWidget(self.uiAO.wao_Strehl)
230 
231  def load_config(self, *args, config_file=None, supervisor=None, **kwargs) -> None:
232  '''
233  Callback when 'LOAD' button is hit
234  * required to catch positionals, as by default
235  if a positional is allowed the QPushButton will send a boolean value
236  and hence overwrite supervisor...
237  '''
238 
239  WidgetBase.load_config(self)
240  for key, pgpl in self.SRcircles.items():
241  self.viewboxes[key].removeItem(pgpl)
242 
243  for key, pgpl in self.SRCrossX.items():
244  self.viewboxes[key].removeItem(pgpl)
245 
246  for key, pgpl in self.SRCrossY.items():
247  self.viewboxes[key].removeItem(pgpl)
248 
249  for key, pgpl in self.PyrEdgeX.items():
250  self.viewboxes[key].removeItem(pgpl)
251 
252  for key, pgpl in self.PyrEdgeY.items():
253  self.viewboxes[key].removeItem(pgpl)
254 
255  if config_file is None:
256  config_file = str(self.uiBase.wao_selectConfig.currentText())
257  sys.path.insert(0, self.defaultParPath)
258 
259  if supervisor is None:
260  self.config = load_config_from_file(config_file)
261  else:
262  self.supervisor = supervisor
263  self.config = self.supervisor.get_config()
264 
265  if self.devices:
266  self.config.p_loop.set_devices([
267  int(device) for device in self.devices.split(",")
268  ])
269 
270  try:
271  sys.path.remove(self.defaultParPath)
272  except:
273  pass
274 
275  self.SRcircles.clear()
276  self.SRCrossX.clear()
277  self.SRCrossY.clear()
278  self.PyrEdgeX.clear()
279  self.PyrEdgeY.clear()
280 
281  self.natm = len(self.config.p_atmos.alt)
282  for atm in range(self.natm):
283  name = 'atm_%d' % atm
284  self.add_dispDock(name, self.wao_phasesgroup_cb)
285 
286  self.nwfs = len(self.config.p_wfss)
287  for wfs in range(self.nwfs):
288  name = 'wfs_%d' % wfs
289  self.add_dispDock(name, self.wao_phasesgroup_cb)
290  name = 'slpComp_%d' % wfs
291  self.add_dispDock(name, self.wao_graphgroup_cb, "MPL")
292  name = 'slpGeom_%d' % wfs
293  self.add_dispDock(name, self.wao_graphgroup_cb, "MPL")
294  if self.config.p_wfss[wfs].type == scons.WFSType.SH:
295  name = 'SH_%d' % wfs
296  self.add_dispDock(name, self.wao_imagesgroup_cb)
297  elif self.config.p_wfss[
298  wfs].type == scons.WFSType.PYRHR or self.config.p_wfss[
299  wfs].type == scons.WFSType.PYRLR:
300  name = 'pyrFocalPlane_%d' % wfs
301  self.add_dispDock(name, self.wao_imagesgroup_cb)
302  name = 'pyrHR_%d' % wfs
303  self.add_dispDock(name, self.wao_imagesgroup_cb)
304  name = 'pyrLR_%d' % wfs
305  self.add_dispDock(name, self.wao_imagesgroup_cb)
306  else:
307  raise "Analyser unknown"
308 
309  self.ndm = len(self.config.p_dms)
310  for dm in range(self.ndm):
311  name = 'dm_%d' % dm
312  self.add_dispDock(name, self.wao_phasesgroup_cb)
313 
314  self.ntar = len(self.config.p_targets)
315  for tar in range(self.ntar):
316  name = 'tar_%d' % tar
317  self.add_dispDock(name, self.wao_phasesgroup_cb)
318  for tar in range(self.ntar):
319  name = 'psfSE_%d' % tar
320  self.add_dispDock(name, self.wao_imagesgroup_cb)
321  for tar in range(self.ntar):
322  name = 'psfLE_%d' % tar
323  self.add_dispDock(name, self.wao_imagesgroup_cb)
324 
325  self.add_dispDock("Strehl", self.wao_graphgroup_cb, "SR")
326 
327  self.uiAO.wao_resetSR_tarNum.setValue(0)
328  self.uiAO.wao_resetSR_tarNum.setMaximum(len(self.config.p_targets) - 1)
329 
330  self.uiAO.wao_dispSR_tar.setValue(0)
331  self.uiAO.wao_dispSR_tar.setMaximum(len(self.config.p_targets) - 1)
332 
333  self.uiAO.wao_run.setDisabled(True)
334  self.uiAO.wao_next.setDisabled(True)
335  self.uiAO.wao_unzoom.setDisabled(True)
336  self.uiAO.wao_resetSR.setDisabled(True)
337 
338  self.uiBase.wao_init.setDisabled(False)
339 
340  if self.expert:
341  self.expertWidget.setSupervisor(self.supervisor)
342  self.expertWidget.updatePanels()
343 
344  if (hasattr(self.config, "layout")):
345  area_filename = self.defaultAreaPath + "/" + self.config.layout + ".area"
346  self.loadArea(filename=area_filename)
347 
348  self.adjustSize()
349 
350  def aoLoopClicked(self, pressed: bool) -> None:
351  if pressed:
352  self.stop = False
353  self.refreshTime = time.time()
354  self.nbiter = self.uiAO.wao_nbiters.value()
355  if self.dispStatsInTerminal:
356  if self.uiAO.wao_forever.isChecked():
357  print("LOOP STARTED")
358  else:
359  print("LOOP STARTED FOR %d iterations" % self.nbiter)
360  self.run()
361  else:
362  self.stop = True
363 
364  def aoLoopOpen(self, pressed: bool) -> None:
365  if (pressed):
366  self.supervisor.rtc.close_loop()
367  self.uiAO.wao_open_loop.setText("Open Loop")
368  else:
369  self.supervisor.rtc.open_loop()
370  self.uiAO.wao_open_loop.setText("Close Loop")
371 
372  def init_config(self) -> None:
373  WidgetBase.init_config(self)
374 
375  def init_configThread(self) -> None:
376  self.uiAO.wao_deviceNumber.setDisabled(True)
377  self.supervisor = CompassSupervisor(self.config)
378 
379  def init_configFinished(self) -> None:
380  # Thread carmaWrap context reload:
381  self.supervisor.force_context()
382 
383  for i in range(self.natm):
384  key = "atm_%d" % i
385  data = self.supervisor.atmos.get_atmos_layer(i)
386  cx, cy = self.circleCoords(self.config.p_geom.pupdiam / 2, 1000,
387  data.shape[0], data.shape[1])
388  self.SRcircles[key] = pg.ScatterPlotItem(cx, cy, pen='r', size=1)
389  self.viewboxes[key].addItem(self.SRcircles[key])
390  self.SRcircles[key].setPoints(cx, cy)
391 
392  for i in range(self.nwfs):
393  key = "wfs_%d" % i
394  data = self.supervisor.wfs.get_wfs_phase(i)
395  cx, cy = self.circleCoords(self.config.p_geom.pupdiam / 2, 1000,
396  data.shape[0], data.shape[1])
397  self.SRcircles[key] = pg.ScatterPlotItem(cx, cy, pen='r', size=1)
398  self.viewboxes[key].addItem(self.SRcircles[key])
399  self.SRcircles[key].setPoints(cx, cy)
400  key = 'slpComp_%d' % i
401  key = 'slpGeom_%d' % i
402 
403  # if self.config.p_wfss[i].type == scons.WFSType.SH:
404  # key = "SH_%d" % i
405  # self.addSHGrid(self.docks[key].widgets[0],
406  # self.config.p_wfss[i].get_validsub(), 8, 8)
407 
408  for i in range(self.ndm):
409  key = "dm_%d" % i
410  dm_type = self.config.p_dms[i].type
411  alt = self.config.p_dms[i].alt
412  data = self.supervisor.dms.get_dm_shape(i)
413  cx, cy = self.circleCoords(self.config.p_geom.pupdiam / 2, 1000,
414  data.shape[0], data.shape[1])
415  self.SRcircles[key] = pg.ScatterPlotItem(cx, cy, pen='r', size=1)
416  self.viewboxes[key].addItem(self.SRcircles[key])
417  self.SRcircles[key].setPoints(cx, cy)
418 
419  for i in range(len(self.config.p_targets)):
420  key = "tar_%d" % i
421  data = self.supervisor.target.get_tar_phase(i)
422  cx, cy = self.circleCoords(self.config.p_geom.pupdiam / 2, 1000,
423  data.shape[0], data.shape[1])
424  self.SRcircles[key] = pg.ScatterPlotItem(cx, cy, pen='r', size=1)
425  self.viewboxes[key].addItem(self.SRcircles[key])
426  self.SRcircles[key].setPoints(cx, cy)
427 
428  data = self.supervisor.target.get_tar_image(i)
429  for psf in ["psfSE_", "psfLE_"]:
430  key = psf + str(i)
431  Delta = 5
432  self.SRCrossX[key] = pg.PlotCurveItem(
433  np.array([
434  data.shape[0] / 2 + 0.5 - Delta,
435  data.shape[0] / 2 + 0.5 + Delta
436  ]), np.array([data.shape[1] / 2 + 0.5, data.shape[1] / 2 + 0.5]),
437  pen='r')
438  self.SRCrossY[key] = pg.PlotCurveItem(
439  np.array([data.shape[0] / 2 + 0.5, data.shape[0] / 2 + 0.5]),
440  np.array([
441  data.shape[1] / 2 + 0.5 - Delta,
442  data.shape[1] / 2 + 0.5 + Delta
443  ]), pen='r')
444  # Put image in plot area
445  self.viewboxes[key].addItem(self.SRCrossX[key])
446  # Put image in plot area
447  self.viewboxes[key].addItem(self.SRCrossY[key])
448 
449  for i in range(len(self.config.p_wfss)):
450  if (self.config.p_wfss[i].type == scons.WFSType.PYRHR or
451  self.config.p_wfss[i].type == scons.WFSType.PYRLR):
452  key = "pyrFocalPlane_%d" % i
453  data = self.supervisor.wfs.get_pyr_focal_plane(i)
454  Delta = len(data) / 2
455  self.PyrEdgeX[key] = pg.PlotCurveItem(
456  np.array([
457  data.shape[0] / 2 + 0.5 - Delta,
458  data.shape[0] / 2 + 0.5 + Delta
459  ]), np.array([data.shape[1] / 2 + 0.5, data.shape[1] / 2 + 0.5]),
460  pen='b')
461  self.PyrEdgeY[key] = pg.PlotCurveItem(
462  np.array([data.shape[0] / 2 + 0.5, data.shape[0] / 2 + 0.5]),
463  np.array([
464  data.shape[1] / 2 + 0.5 - Delta,
465  data.shape[1] / 2 + 0.5 + Delta
466  ]), pen='b')
467  # Put image in plot area
468  self.viewboxes[key].addItem(self.PyrEdgeX[key])
469  # Put image in plot area
470  self.viewboxes[key].addItem(self.PyrEdgeY[key])
471 
472  print(self.supervisor)
473 
474  if self.expert:
475  self.expertWidget.displayRtcMatrix()
476 
477  self.updateDisplay()
478 
479  self.uiAO.wao_run.setDisabled(False)
480  self.uiAO.wao_next.setDisabled(False)
481  self.uiAO.wao_open_loop.setDisabled(False)
482  self.uiAO.wao_unzoom.setDisabled(False)
483  self.uiAO.wao_resetSR.setDisabled(False)
484 
485  WidgetBase.init_configFinished(self)
486 
487  def circleCoords(self, ampli: float, npts: int, datashape0: int,
488  datashape1: int) -> Tuple[float, float]:
489  cx = ampli * np.sin((np.arange(npts) + 1) * 2. * np.pi / npts) + datashape0 / 2
490  cy = ampli * np.cos((np.arange(npts) + 1) * 2. * np.pi / npts) + datashape1 / 2
491  return cx, cy
492 
493  def clearSR(self):
494  self.SRLE = deque(maxlen=20)
495  self.SRSE = deque(maxlen=20)
496  self.numiter = deque(maxlen=20)
497 
498  def updateSRDisplay(self, SRLE, SRSE, numiter):
499  self.SRLE.append(SRLE)
500  self.SRSE.append(SRSE)
501  self.numiter.append(numiter)
502  self.curveSRSE.setData(self.numiter, self.SRSE)
503  self.curveSRLE.setData(self.numiter, self.SRLE)
504 
505  def updateDisplay(self) -> None:
506  if (self.supervisor is None or self.supervisor.is_init is False):
507  # print("Widget not fully initialized")
508  return
509  if not self.loopLock.acquire(False):
510  return
511  else:
512  try:
513  for key, dock in self.docks.items():
514  if key == "Strehl":
515  continue
516  elif dock.isVisible():
517  index = int(key.split("_")[-1])
518  data = None
519  if "atm" in key:
520  data = self.supervisor.atmos.get_atmos_layer(index)
521  if "wfs" in key:
522  data = self.supervisor.wfs.get_wfs_phase(index)
523  if "dm" in key:
524  dm_type = self.config.p_dms[index].type
525  alt = self.config.p_dms[index].alt
526  data = self.supervisor.dms.get_dm_shape(index)
527  if "tar" in key:
528  data = self.supervisor.target.get_tar_phase(index)
529  if "psfLE" in key:
530  data = self.supervisor.target.get_tar_image(index, expo_type="le")
531  if "psfSE" in key:
532  data = self.supervisor.target.get_tar_image(index, expo_type="se")
533 
534  if "psf" in key:
535  if (self.uiAO.actionPSF_Log_Scale.isChecked()):
536  if np.any(data <= 0):
537  # warnings.warn("\nZeros founds, filling with min nonzero value.\n")
538  data[data <= 0] = np.min(data[data > 0])
539  data = np.log10(data)
540  if (self.supervisor.get_frame_counter() < 10):
541  self.viewboxes[key].setRange(
542  xRange=(data.shape[0] / 2 + 0.5 - self.PSFzoom,
543  data.shape[0] / 2 + 0.5 + self.PSFzoom),
544  yRange=(data.shape[1] / 2 + 0.5 - self.PSFzoom,
545  data.shape[1] / 2 + 0.5 + self.PSFzoom),
546  )
547 
548  if "SH" in key:
549  data = self.supervisor.wfs.get_wfs_image(index)
550  if "pyrLR" in key:
551  data = self.supervisor.wfs.get_wfs_image(index)
552  if "pyrHR" in key:
553  data = self.supervisor.wfs.get_pyrhr_image(index)
554  if "pyrFocalPlane" in key:
555  data = self.supervisor.wfs.get_pyr_focal_plane(index)
556 
557  if (data is not None):
558  autoscale = True # self.uiAO.actionAuto_Scale.isChecked()
559  # if (autoscale):
560  # # inits levels
561  # self.hist.setLevels(data.min(), data.max())
562  self.imgs[key].setImage(data, autoLevels=autoscale)
563  # self.p1.autoRange()
564  elif "slp" in key: # Slope display
565  self.imgs[key].canvas.axes.clear()
566  if "Geom" in key:
567  slopes = self.supervisor.rtc.get_slopes_geom()
568  x, y, vx, vy = plsh(
569  slopes, self.config.p_wfss[index].nxsub,
570  self.config.p_tel.cobs, returnquiver=True
571  ) # Preparing mesh and vector for display
572  if "Comp" in key:
573  centroids = self.supervisor.rtc.get_slopes()
574  nmes = [
575  2 * p_wfs._nvalid for p_wfs in self.config.p_wfss
576  ]
577  first_ind = np.sum(nmes[:index], dtype=np.int32)
578  if (self.config.p_wfss[index].type == scons.WFSType.PYRHR
579  or self.config.p_wfss[index].type == scons.
580  WFSType.PYRLR):
581  #TODO: DEBUG...
582  plpyr(
583  centroids[first_ind:first_ind + nmes[index]],
584  np.stack([
585  wao.config.p_wfss[index]._validsubsx,
586  wao.config.p_wfss[index]._validsubsy
587  ]))
588  else:
589  x, y, vx, vy = plsh(
590  centroids[first_ind:first_ind + nmes[index]],
591  self.config.p_wfss[index].nxsub,
592  self.config.p_tel.cobs, returnquiver=True
593  ) # Preparing mesh and vector for display
594  self.imgs[key].canvas.axes.quiver(x, y, vx, vy)
595  self.imgs[key].canvas.draw()
596  self.firstTime = 1
597  finally:
598  self.loopLock.release()
599 
600  def updateSRSE(self, SRSE):
601  self.uiAO.wao_strehlSE.setText(SRSE)
602 
603  def updateSRLE(self, SRLE):
604  self.uiAO.wao_strehlLE.setText(SRLE)
605 
606  def updateCurrentLoopFrequency(self, freq):
607  self.uiAO.wao_currentFreq.setValue(freq)
608 
609  def loop_once(self) -> None:
610  if not self.loopLock.acquire(False):
611  print("Display locked")
612  return
613  else:
614  try:
615  start = time.time()
616  self.supervisor.next()
617  for t in range(len(self.supervisor.config.p_targets)):
618  self.supervisor.target.comp_tar_image(t)
619  loopTime = time.time() - start
620 
621  refreshDisplayTime = 1. / self.uiBase.wao_frameRate.value()
622 
623  if (time.time() - self.refreshTime > refreshDisplayTime):
624  signal_le = ""
625  signal_se = ""
626  for t in range(len(self.config.p_targets)):
627  SR = self.supervisor.target.get_strehl(t)
628  # TODO: handle that !
629  if (t == self.uiAO.wao_dispSR_tar.value()
630  ): # Plot on the wfs selected
631  self.updateSRDisplay(SR[1], SR[0],
632  self.supervisor.get_frame_counter())
633  signal_se += "%1.2f " % SR[0]
634  signal_le += "%1.2f " % SR[1]
635 
636  currentFreq = 1 / loopTime
637  refreshFreq = 1 / (time.time() - self.refreshTime)
638 
639  self.updateSRSE(signal_se)
640  self.updateSRLE(signal_le)
641  self.updateCurrentLoopFrequency(currentFreq)
642 
643  if (self.dispStatsInTerminal):
644  self.printInPlace(
645  "iter #%d SR: (L.E, S.E.)= (%s, %s) running at %4.1fHz (real %4.1fHz)"
646  % (self.supervisor.get_frame_counter(), signal_le,
647  signal_se, refreshFreq, currentFreq))
648 
649  self.refreshTime = start
650  except Exception as e:
651  print(e)
652  print("error!!")
653  finally:
654  self.loopLock.release()
655 
656  def run(self):
657  WidgetBase.run(self)
658  if not self.uiAO.wao_forever.isChecked():
659  self.nbiter -= 1
660 
661  if self.nbiter <= 0:
662  self.stop = True
663  self.uiAO.wao_run.setChecked(False)
664 
665 
666 if __name__ == '__main__':
667  arguments = docopt(__doc__)
668  app = QtWidgets.QApplication(sys.argv)
669  app.setStyle('cleanlooks')
670  wao = widgetAOWindow(arguments["<parameters_filename>"], cacao=arguments["--cacao"],
671  expert=arguments["--expert"], devices=arguments["--devices"])
672  wao.show()
673  if arguments["--interactive"]:
674  from shesha.util.ipython_embed import embed
675  embed(os.path.basename(__file__), locals())
shesha.supervisor.compassSupervisor
Initialization and execution of a COMPASS supervisor.
Definition: compassSupervisor.py:1
shesha.widgets.widget_base.WidgetBase.wao_graphgroup_cb
wao_graphgroup_cb
Definition: widget_base.py:322
shesha.widgets.widget_ao.widgetAOWindow.updateSRSE
def updateSRSE(self, SRSE)
Definition: widget_ao.py:600
shesha.widgets.widget_ao.widgetAOWindow.firstTime
firstTime
Definition: widget_ao.py:165
shesha.util.tools
Imported from CANARY.
Definition: tools.py:1
shesha.widgets.widget_ao.widgetAOWindow.SRcircles
SRcircles
Definition: widget_ao.py:156
shesha.widgets.widget_ao.AOWindowTemplate
AOWindowTemplate
Definition: widget_ao.py:80
shesha.widgets.widget_base.WidgetBase.loadArea
def loadArea(self, widget=None, filename=None)
Definition: widget_base.py:197
shesha.widgets.widget_ao.widgetAOWindow.ntar
ntar
Definition: widget_ao.py:163
shesha.widgets.widget_ao.widgetAOWindow.SRSE
SRSE
Definition: widget_ao.py:99
shesha.widgets.widget_ao.widgetAOWindow.stop
stop
Definition: widget_ao.py:113
shesha.widgets.widget_base.WidgetBase.wao_phasesgroup_cb
wao_phasesgroup_cb
Definition: widget_base.py:317
shesha.widgets.widget_ao.widgetAOWindow.SRCrossX
SRCrossX
Definition: widget_ao.py:154
shesha.util.utilities
Basic utilities function.
Definition: utilities.py:1
shesha.widgets.widget_ao.widgetAOWindow.devices
devices
Definition: widget_ao.py:102
shesha.widgets.widget_ao.widgetAOWindow.updateForever
def updateForever(self, state)
Definition: widget_ao.py:211
shesha.widgets.widget_ao.widgetAOWindow.run
def run(self)
Definition: widget_ao.py:656
shesha.widgets.widget_ao.widgetAOWindow.refreshTime
refreshTime
Definition: widget_ao.py:117
shesha.widgets.widget_ao.widgetAOWindow.__init__
None __init__(self, Any config_file=None, bool cacao=False, bool expert=False, str devices=None, bool hide_histograms=False)
Definition: widget_ao.py:92
shesha.widgets.widget_ao.widgetAOWindow.updateCurrentLoopFrequency
def updateCurrentLoopFrequency(self, freq)
Definition: widget_ao.py:606
shesha.widgets.widget_ao.widgetAOWindow.nwfs
nwfs
Definition: widget_ao.py:161
shesha.widgets.widget_base.WidgetBase.printInPlace
None printInPlace(self, str text)
Definition: widget_base.py:390
shesha.widgets.widget_ao.widgetAOWindow.SRCrossY
SRCrossY
Definition: widget_ao.py:155
shesha.widgets.widget_ao.widgetAOWindow.enable_atmos
def enable_atmos(self, atmos)
Definition: widget_ao.py:214
shesha.widgets.widget_ao.widgetAOWindow.clearSR
def clearSR(self)
Definition: widget_ao.py:493
shesha.widgets.widget_ao.widgetAOWindow.load_config
None load_config(self, *args, config_file=None, supervisor=None, **kwargs)
Definition: widget_ao.py:237
shesha.widgets.widget_ao.widgetAOWindow.curveSRSE
curveSRSE
Definition: widget_ao.py:151
shesha.widgets.widget_ao.widgetAOWindow.PyrEdgeX
PyrEdgeX
Definition: widget_ao.py:157
shesha.widgets.widget_ao.widgetAOWindow.circleCoords
Tuple[float, float] circleCoords(self, float ampli, int npts, int datashape0, int datashape1)
Definition: widget_ao.py:487
shesha.widgets.widget_ao.widgetAOWindow.add_dispDock
None add_dispDock(self, str name, parent, str type="pg_image")
Definition: widget_ao.py:226
shesha.widgets.widget_base.WidgetBase.docks
docks
Definition: widget_base.py:125
shesha.widgets.widget_ao.widgetAOWindow.updateSRDisplay
def updateSRDisplay(self, SRLE, SRSE, numiter)
Definition: widget_ao.py:498
shesha.widgets.widget_ao.widgetAOWindow.resetSR
None resetSR(self)
Definition: widget_ao.py:217
shesha.widgets.widget_ao.widgetAOWindow.updateAllTarget
def updateAllTarget(self, state)
METHODS #.
Definition: widget_ao.py:208
shesha.widgets.widget_base
Abstract Widget base.
Definition: widget_base.py:1
shesha.widgets.widget_ao.widgetAOWindow.aoLoopOpen
None aoLoopOpen(self, bool pressed)
Definition: widget_ao.py:364
shesha.widgets.widget_ao.widgetAOWindow.init_configThread
None init_configThread(self)
Definition: widget_ao.py:375
shesha.widgets.widget_base.WidgetBase.loopLock
loopLock
Definition: widget_base.py:95
shesha.widgets.widget_base.WidgetBase.viewboxes
viewboxes
Definition: widget_base.py:126
shesha.widgets.widget_ao.widgetAOWindow.SRLE
SRLE
Definition: widget_ao.py:98
shesha.widgets.widget_ao.widgetAOWindow.PyrEdgeY
PyrEdgeY
Definition: widget_ao.py:158
shesha.widgets.widget_ao.widgetAOWindow.aoLoopClicked
None aoLoopClicked(self, bool pressed)
Definition: widget_ao.py:350
carma_utils::split
void split(std::vector< std::string > &tokens, const std::string &text, char sep)
Definition: carma_utils.h:94
shesha.widgets.widget_base.WidgetBase.imgs
imgs
Definition: widget_base.py:127
shesha.widgets.widget_ao.widgetAOWindow.defaultAreaPath
defaultAreaPath
Definition: widget_ao.py:126
shesha.widgets.widget_ao.widgetAOWindow.supervisor
supervisor
ATTRIBUTES #.
Definition: widget_ao.py:111
shesha.widgets.widget_ao.widgetAOWindow.dispStatsInTerminal
dispStatsInTerminal
Definition: widget_ao.py:141
shesha.widgets.widget_ao.AOClassTemplate
AOClassTemplate
Definition: widget_ao.py:80
shesha.util.ipython_embed
Definition: ipython_embed.py:1
shesha.widgets.widget_ao.widgetAOWindow.updateSRLE
def updateSRLE(self, SRLE)
Definition: widget_ao.py:603
shesha.widgets.widget_ao.widgetAOWindow.expert
expert
Definition: widget_ao.py:101
shesha.widgets.widget_base.WidgetBase.uiBase
uiBase
Definition: widget_base.py:84
shesha.widgets.widget_ao.widgetAOWindow.rollingWindow
rollingWindow
Definition: widget_ao.py:97
shesha.widgets.widget_ao.widgetAOWindow.assistant
assistant
Definition: widget_ao.py:118
shesha.widgets.widget_ao.widgetAOWindow.defaultParPath
defaultParPath
CONNECTED BUTTONS #.
Definition: widget_ao.py:125
shesha.widgets.widget_base.WidgetBase
Definition: widget_base.py:79
shesha.widgets.widget_ao.widgetAOWindow.loop_once
None loop_once(self)
Definition: widget_ao.py:609
shesha.widgets.widget_ao.widgetAOWindow.updateDisplay
None updateDisplay(self)
Definition: widget_ao.py:505
shesha.widgets.widget_ao.widgetAOWindow.nbiter
nbiter
Definition: widget_ao.py:116
shesha.supervisor.compassSupervisor.CompassSupervisor
This class implements generic supervisor to handle compass simulation.
Definition: compassSupervisor.py:57
shesha.widgets.widget_ao.widgetAOWindow.init_config
None init_config(self)
Definition: widget_ao.py:372
shesha.widgets.widget_ao.widgetAOWindow.natm
natm
Definition: widget_ao.py:160
shesha.widgets.widget_ao.widgetAOWindow.init_configFinished
None init_configFinished(self)
Definition: widget_ao.py:379
shesha.widgets.widget_base.WidgetBase.wao_imagesgroup_cb
wao_imagesgroup_cb
Definition: widget_base.py:328
shesha.widgets.widget_ao.widgetAOWindow
Definition: widget_ao.py:90
shesha.widgets.widget_ao_expert
Definition: widget_ao_expert.py:1
shesha.widgets.widget_ao.widgetAOWindow.cacao
cacao
Definition: widget_ao.py:96
shesha.widgets.widget_ao.widgetAOWindow.expertWidget
expertWidget
Definition: widget_ao.py:175
shesha.widgets.widget_ao.widgetAOWindow.ndm
ndm
Definition: widget_ao.py:162
shesha.widgets.widget_ao.widgetAOWindow.config
config
Definition: widget_ao.py:112
shesha.widgets.widget_ao.widgetAOWindow.curveSRLE
curveSRLE
Definition: widget_ao.py:152
shesha.widgets.widget_base.WidgetBase.loadDefaultConfig
None loadDefaultConfig(self)
Definition: widget_base.py:340
shesha.widgets.widget_ao.widgetAOWindow.numiter
numiter
Definition: widget_ao.py:100
shesha.widgets.widget_ao.widgetAOWindow.uiAO
uiAO
Definition: widget_ao.py:104
shesha.widgets.widget_ao.widgetAOWindow.PSFzoom
PSFzoom
Definition: widget_ao.py:164