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

Public Member Functions

None __init__ (self, Any config_file=None, bool cacao=False, bool expert=False, str devices=None, bool hide_histograms=False)
 
def updateAllTarget (self, state)
 METHODS #. More...
 
def updateForever (self, state)
 
def enable_atmos (self, atmos)
 
None resetSR (self)
 
None add_dispDock (self, str name, parent, str type="pg_image")
 
None load_config (self, *args, config_file=None, supervisor=None, **kwargs)
 
None aoLoopClicked (self, bool pressed)
 
None aoLoopOpen (self, bool pressed)
 
None init_config (self)
 
None init_configThread (self)
 
None init_configFinished (self)
 
Tuple[float, float] circleCoords (self, float ampli, int npts, int datashape0, int datashape1)
 
def clearSR (self)
 
def updateSRDisplay (self, SRLE, SRSE, numiter)
 
None updateDisplay (self)
 
def updateSRSE (self, SRSE)
 
def updateSRLE (self, SRLE)
 
def updateCurrentLoopFrequency (self, freq)
 
None loop_once (self)
 
def run (self)
 
- Public Member Functions inherited from shesha.widgets.widget_base.WidgetBase
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)
 
None load_config (self, *args, **kwargs)
 Callback when 'LOAD' button is hit. More...
 
None loadDefaultConfig (self)
 
def addSHGrid (self, pg_image, valid_sub, sspsize, pitch)
 
None printInPlace (self, str text)
 

Public Attributes

 cacao
 
 rollingWindow
 
 SRLE
 
 SRSE
 
 numiter
 
 expert
 
 devices
 
 uiAO
 
 supervisor
 ATTRIBUTES #. More...
 
 config
 
 stop
 
 nbiter
 
 refreshTime
 
 assistant
 
 defaultParPath
 CONNECTED BUTTONS #. More...
 
 defaultAreaPath
 
 dispStatsInTerminal
 
 curveSRSE
 
 curveSRLE
 
 SRCrossX
 
 SRCrossY
 
 SRcircles
 
 PyrEdgeX
 
 PyrEdgeY
 
 natm
 
 nwfs
 
 ndm
 
 ntar
 
 PSFzoom
 
 firstTime
 
 expertWidget
 
- Public Attributes inherited from shesha.widgets.widget_base.WidgetBase
 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 90 of file widget_ao.py.

Constructor & Destructor Documentation

◆ __init__()

None shesha.widgets.widget_ao.widgetAOWindow.__init__ (   self,
Any   config_file = None,
bool   cacao = False,
bool   expert = False,
str   devices = None,
bool   hide_histograms = False 
)

Definition at line 92 of file widget_ao.py.

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 

Member Function Documentation

◆ add_dispDock()

None shesha.widgets.widget_ao.widgetAOWindow.add_dispDock (   self,
str  name,
  parent,
str   type = "pg_image" 
)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 226 of file widget_ao.py.

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 
Here is the caller graph for this function:

◆ aoLoopClicked()

None shesha.widgets.widget_ao.widgetAOWindow.aoLoopClicked (   self,
bool  pressed 
)

Definition at line 350 of file widget_ao.py.

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 
Here is the call graph for this function:

◆ aoLoopOpen()

None shesha.widgets.widget_ao.widgetAOWindow.aoLoopOpen (   self,
bool  pressed 
)

Definition at line 364 of file widget_ao.py.

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 

◆ circleCoords()

Tuple[float, float] shesha.widgets.widget_ao.widgetAOWindow.circleCoords (   self,
float  ampli,
int  npts,
int  datashape0,
int  datashape1 
)

Definition at line 487 of file widget_ao.py.

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 
Here is the caller graph for this function:

◆ clearSR()

def shesha.widgets.widget_ao.widgetAOWindow.clearSR (   self)

Definition at line 493 of file widget_ao.py.

493  def clearSR(self):
494  self.SRLE = deque(maxlen=20)
495  self.SRSE = deque(maxlen=20)
496  self.numiter = deque(maxlen=20)
497 

◆ enable_atmos()

def shesha.widgets.widget_ao.widgetAOWindow.enable_atmos (   self,
  atmos 
)

Definition at line 214 of file widget_ao.py.

214  def enable_atmos(self, atmos):
215  self.supervisor.atmos.enable_atmos(atmos)
216 

◆ init_config()

None shesha.widgets.widget_ao.widgetAOWindow.init_config (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Reimplemented in shesha.widgets.widget_canapass.widgetCanapassWindowPyro.

Definition at line 372 of file widget_ao.py.

372  def init_config(self) -> None:
373  WidgetBase.init_config(self)
374 

◆ init_configFinished()

None shesha.widgets.widget_ao.widgetAOWindow.init_configFinished (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 379 of file widget_ao.py.

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 
Here is the call graph for this function:

◆ init_configThread()

None shesha.widgets.widget_ao.widgetAOWindow.init_configThread (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Reimplemented in shesha.widgets.widget_canapass.widgetCanapassWindowPyro.

Definition at line 375 of file widget_ao.py.

375  def init_configThread(self) -> None:
376  self.uiAO.wao_deviceNumber.setDisabled(True)
377  self.supervisor = CompassSupervisor(self.config)
378 

◆ load_config()

None shesha.widgets.widget_ao.widgetAOWindow.load_config (   self,
args,
  config_file = None,
  supervisor = None,
**  kwargs 
)

Definition at line 237 of file widget_ao.py.

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 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ loop_once()

None shesha.widgets.widget_ao.widgetAOWindow.loop_once (   self)

Reimplemented in shesha.widgets.widget_canapass.widgetCanapassWindowPyro.

Definition at line 609 of file widget_ao.py.

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 
Here is the call graph for this function:
Here is the caller graph for this function:

◆ resetSR()

None shesha.widgets.widget_ao.widgetAOWindow.resetSR (   self)

Definition at line 217 of file widget_ao.py.

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 

◆ run()

def shesha.widgets.widget_ao.widgetAOWindow.run (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 656 of file widget_ao.py.

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 
Here is the caller graph for this function:

◆ updateAllTarget()

def shesha.widgets.widget_ao.widgetAOWindow.updateAllTarget (   self,
  state 
)

METHODS #.

Definition at line 208 of file widget_ao.py.

208  def updateAllTarget(self, state):
209  self.uiAO.wao_resetSR_tarNum.setDisabled(state)
210 

◆ updateCurrentLoopFrequency()

def shesha.widgets.widget_ao.widgetAOWindow.updateCurrentLoopFrequency (   self,
  freq 
)

Definition at line 606 of file widget_ao.py.

606  def updateCurrentLoopFrequency(self, freq):
607  self.uiAO.wao_currentFreq.setValue(freq)
608 
Here is the caller graph for this function:

◆ updateDisplay()

None shesha.widgets.widget_ao.widgetAOWindow.updateDisplay (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 505 of file widget_ao.py.

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 
Here is the caller graph for this function:

◆ updateForever()

def shesha.widgets.widget_ao.widgetAOWindow.updateForever (   self,
  state 
)

Definition at line 211 of file widget_ao.py.

211  def updateForever(self, state):
212  self.uiAO.wao_nbiters.setDisabled(state)
213 

◆ updateSRDisplay()

def shesha.widgets.widget_ao.widgetAOWindow.updateSRDisplay (   self,
  SRLE,
  SRSE,
  numiter 
)

Definition at line 498 of file widget_ao.py.

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 
Here is the caller graph for this function:

◆ updateSRLE()

def shesha.widgets.widget_ao.widgetAOWindow.updateSRLE (   self,
  SRLE 
)

Definition at line 603 of file widget_ao.py.

603  def updateSRLE(self, SRLE):
604  self.uiAO.wao_strehlLE.setText(SRLE)
605 
Here is the caller graph for this function:

◆ updateSRSE()

def shesha.widgets.widget_ao.widgetAOWindow.updateSRSE (   self,
  SRSE 
)

Definition at line 600 of file widget_ao.py.

600  def updateSRSE(self, SRSE):
601  self.uiAO.wao_strehlSE.setText(SRSE)
602 
Here is the caller graph for this function:

Member Data Documentation

◆ assistant

shesha.widgets.widget_ao.widgetAOWindow.assistant

Definition at line 118 of file widget_ao.py.

◆ cacao

shesha.widgets.widget_ao.widgetAOWindow.cacao

Definition at line 96 of file widget_ao.py.

◆ config

shesha.widgets.widget_ao.widgetAOWindow.config

Definition at line 112 of file widget_ao.py.

◆ curveSRLE

shesha.widgets.widget_ao.widgetAOWindow.curveSRLE

Definition at line 152 of file widget_ao.py.

◆ curveSRSE

shesha.widgets.widget_ao.widgetAOWindow.curveSRSE

Definition at line 151 of file widget_ao.py.

◆ defaultAreaPath

shesha.widgets.widget_ao.widgetAOWindow.defaultAreaPath

Definition at line 126 of file widget_ao.py.

◆ defaultParPath

shesha.widgets.widget_ao.widgetAOWindow.defaultParPath

CONNECTED BUTTONS #.

Definition at line 125 of file widget_ao.py.

◆ devices

shesha.widgets.widget_ao.widgetAOWindow.devices

Definition at line 102 of file widget_ao.py.

◆ dispStatsInTerminal

shesha.widgets.widget_ao.widgetAOWindow.dispStatsInTerminal

Definition at line 141 of file widget_ao.py.

◆ expert

shesha.widgets.widget_ao.widgetAOWindow.expert

Definition at line 101 of file widget_ao.py.

◆ expertWidget

shesha.widgets.widget_ao.widgetAOWindow.expertWidget

Definition at line 175 of file widget_ao.py.

◆ firstTime

shesha.widgets.widget_ao.widgetAOWindow.firstTime

Definition at line 165 of file widget_ao.py.

◆ natm

shesha.widgets.widget_ao.widgetAOWindow.natm

Definition at line 160 of file widget_ao.py.

◆ nbiter

shesha.widgets.widget_ao.widgetAOWindow.nbiter

Definition at line 116 of file widget_ao.py.

◆ ndm

shesha.widgets.widget_ao.widgetAOWindow.ndm

Definition at line 162 of file widget_ao.py.

◆ ntar

shesha.widgets.widget_ao.widgetAOWindow.ntar

Definition at line 163 of file widget_ao.py.

◆ numiter

shesha.widgets.widget_ao.widgetAOWindow.numiter

Definition at line 100 of file widget_ao.py.

◆ nwfs

shesha.widgets.widget_ao.widgetAOWindow.nwfs

Definition at line 161 of file widget_ao.py.

◆ PSFzoom

shesha.widgets.widget_ao.widgetAOWindow.PSFzoom

Definition at line 164 of file widget_ao.py.

◆ PyrEdgeX

shesha.widgets.widget_ao.widgetAOWindow.PyrEdgeX

Definition at line 157 of file widget_ao.py.

◆ PyrEdgeY

shesha.widgets.widget_ao.widgetAOWindow.PyrEdgeY

Definition at line 158 of file widget_ao.py.

◆ refreshTime

shesha.widgets.widget_ao.widgetAOWindow.refreshTime

Definition at line 117 of file widget_ao.py.

◆ rollingWindow

shesha.widgets.widget_ao.widgetAOWindow.rollingWindow

Definition at line 97 of file widget_ao.py.

◆ SRcircles

shesha.widgets.widget_ao.widgetAOWindow.SRcircles

Definition at line 156 of file widget_ao.py.

◆ SRCrossX

shesha.widgets.widget_ao.widgetAOWindow.SRCrossX

Definition at line 154 of file widget_ao.py.

◆ SRCrossY

shesha.widgets.widget_ao.widgetAOWindow.SRCrossY

Definition at line 155 of file widget_ao.py.

◆ SRLE

shesha.widgets.widget_ao.widgetAOWindow.SRLE

Definition at line 98 of file widget_ao.py.

◆ SRSE

shesha.widgets.widget_ao.widgetAOWindow.SRSE

Definition at line 99 of file widget_ao.py.

◆ stop

shesha.widgets.widget_ao.widgetAOWindow.stop

Definition at line 113 of file widget_ao.py.

◆ supervisor

shesha.widgets.widget_ao.widgetAOWindow.supervisor

ATTRIBUTES #.

Definition at line 111 of file widget_ao.py.

◆ uiAO

shesha.widgets.widget_ao.widgetAOWindow.uiAO

Definition at line 104 of file widget_ao.py.


The documentation for this class was generated from the following file:
shesha.widgets.widget_ao_expert
Definition: widget_ao_expert.py:1