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

Public Member Functions

None __init__ (self, Any config_file=None, bool brahma=False, str devices=None)
 
def updateForever (self, state)
 METHODS #. More...
 
None add_dispDock (self, str name, parent, str type="pg_image")
 
None load_config (self)
 Callback when 'LOAD' button is hit. More...
 
None aoLoopClicked (self, bool pressed)
 
None aoLoopOpen (self, bool pressed)
 
None init_config (self)
 
None init_configThread (self)
 
None init_configFinished (self)
 
None updateDisplay (self)
 
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

 brahma
 
 devices
 
 uiBench
 
 supervisor
 ATTRIBUTES #. More...
 
 config
 
 stop
 
 nbiter
 
 refreshTime
 
 loopThread
 
 assistant
 
 defaultParPath
 
 defaultAreaPath
 
 dispStatsInTerminal
 
 nwfs
 
- 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 86 of file widget_bench.py.

Constructor & Destructor Documentation

◆ __init__()

None shesha.widgets.widget_bench.widgetBenchWindow.__init__ (   self,
Any   config_file = None,
bool   brahma = False,
str   devices = None 
)

Definition at line 88 of file widget_bench.py.

88  def __init__(self, config_file: Any = None, brahma: bool = False,
89  devices: str = None) -> None:
90  WidgetBase.__init__(self)
91  BenchClassTemplate.__init__(self)
92 
93  self.brahma = brahma
94  self.devices = devices
95 
96  self.uiBench = BenchWindowTemplate()
97  self.uiBench.setupUi(self)
98 
99 
102 
103  self.supervisor = None
104  self.config = None
105  self.stop = False # type: bool # Request quit
106 
107  self.uiBench.wao_nbiters.setValue(1000) # Default GUI nIter box value
108  self.nbiter = self.uiBench.wao_nbiters.value()
109  self.refreshTime = 0 # type: float # System time at last display refresh
110  self.loopThread = None # type: QThread
111  self.assistant = None # type: Any
112 
113 
117  self.defaultParPath = os.environ["SHESHA_ROOT"] + "/data/par/bench-config"
118  self.defaultAreaPath = os.environ["SHESHA_ROOT"] + "/data/layouts"
119  self.loadDefaultConfig()
120 
121  self.uiBench.wao_run.setCheckable(True)
122  self.uiBench.wao_run.clicked[bool].connect(self.aoLoopClicked)
123  self.uiBench.wao_open_loop.setCheckable(True)
124  self.uiBench.wao_open_loop.clicked[bool].connect(self.aoLoopOpen)
125  self.uiBench.wao_next.clicked.connect(self.loop_once)
126 
127  self.uiBench.wao_forever.stateChanged.connect(self.updateForever)
128 
129  self.dispStatsInTerminal = False
130 
131  self.uiBench.wao_run.setDisabled(True)
132  self.uiBench.wao_next.setDisabled(True)
133  self.uiBench.wao_unzoom.setDisabled(True)
134 
135  self.addDockWidget(Qt.DockWidgetArea(1), self.uiBase.wao_ConfigDock)
136  self.addDockWidget(Qt.DockWidgetArea(1), self.uiBase.wao_DisplayDock)
137  self.uiBase.wao_ConfigDock.setFloating(False)
138  self.uiBase.wao_DisplayDock.setFloating(False)
139 
140  self.adjustSize()
141 
142  if config_file is not None:
143  self.uiBase.wao_selectConfig.clear()
144  self.uiBase.wao_selectConfig.addItem(config_file)
145  self.load_config()
146  self.init_config()
147 

Member Function Documentation

◆ add_dispDock()

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

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 158 of file widget_bench.py.

158  def add_dispDock(self, name: str, parent, type: str = "pg_image") -> None:
159  d = WidgetBase.add_dispDock(self, name, parent, type)
160  if type == "SR":
161  d.addWidget(self.uiBench.wao_Strehl)
162 

◆ aoLoopClicked()

None shesha.widgets.widget_bench.widgetBenchWindow.aoLoopClicked (   self,
bool  pressed 
)

Definition at line 207 of file widget_bench.py.

207  def aoLoopClicked(self, pressed: bool) -> None:
208  if pressed:
209  self.stop = False
210  self.refreshTime = time.time()
211  self.nbiter = self.uiBench.wao_nbiters.value()
212  if self.dispStatsInTerminal:
213  if self.uiBench.wao_forever.isChecked():
214  print("LOOP STARTED")
215  else:
216  print("LOOP STARTED FOR %d iterations" % self.nbiter)
217  self.run()
218  else:
219  self.stop = True
220 
Here is the call graph for this function:

◆ aoLoopOpen()

None shesha.widgets.widget_bench.widgetBenchWindow.aoLoopOpen (   self,
bool  pressed 
)

Definition at line 221 of file widget_bench.py.

221  def aoLoopOpen(self, pressed: bool) -> None:
222  if (pressed):
223  self.supervisor.open_loop()
224  self.uiAO.wao_open_loop.setText("Close Loop")
225  else:
226  self.supervisor.close_loop()
227  self.uiAO.wao_open_loop.setText("Open Loop")
228 

◆ init_config()

None shesha.widgets.widget_bench.widgetBenchWindow.init_config (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 229 of file widget_bench.py.

229  def init_config(self) -> None:
230  WidgetBase.init_config(self)
231 
Here is the caller graph for this function:

◆ init_configFinished()

None shesha.widgets.widget_bench.widgetBenchWindow.init_configFinished (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 241 of file widget_bench.py.

241  def init_configFinished(self) -> None:
242  # Thread carmaWrap context reload:
243  try:
244  self.supervisor.force_context()
245  except:
246  print('Warning: could not call supervisor.force_context().')
247 
248  for i in range(self.nwfs):
249  if self.config.p_wfss[i].type == WFSType.SH:
250  key = "wfs_%d" % i
251  self.addSHGrid(self.docks[key].widgets[0],
252  self.config.p_wfss[i].get_validsub(),
253  self.config.p_wfss[i].npix, self.config.p_wfss[i].npix)
254 
255  self.updateDisplay()
256 
257  self.uiBench.wao_run.setDisabled(False)
258  self.uiBench.wao_next.setDisabled(False)
259  self.uiBench.wao_open_loop.setDisabled(False)
260  self.uiBench.wao_unzoom.setDisabled(False)
261 
262  WidgetBase.init_configFinished(self)
263 
Here is the call graph for this function:

◆ init_configThread()

None shesha.widgets.widget_bench.widgetBenchWindow.init_configThread (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 232 of file widget_bench.py.

232  def init_configThread(self) -> None:
233  # self.uiBench.wao_deviceNumber.setDisabled(True)
234  # self.config.p_loop.devices = self.uiBench.wao_deviceNumber.value() # using GUI value
235  # gpudevice = "ALL" # using all GPU avalaible
236  # gpudevice = np.array([2, 3], dtype=np.int32)
237  # gpudevice = np.arange(4, dtype=np.int32) # using 4 GPUs: 0-3
238  # gpudevice = 0 # using 1 GPU : 0
239  self.supervisor.init_config()
240 
Here is the call graph for this function:

◆ load_config()

None shesha.widgets.widget_bench.widgetBenchWindow.load_config (   self)

Callback when 'LOAD' button is hit.

Definition at line 166 of file widget_bench.py.

166  '''
167  WidgetBase.load_config(self)
168  config_file = str(self.uiBase.wao_selectConfig.currentText())
169  sys.path.insert(0, self.defaultParPath)
170 
171  self.supervisor = Supervisor(config_file, self.brahma)
172 
173  self.config = self.supervisor.get_config()
174 
175  # if self.devices:
176  # self.config.p_loop.set_devices([
177  # int(device) for device in self.devices.split(",")
178  # ])
179 
180  try:
181  sys.path.remove(self.defaultParPath)
182  except:
183  pass
184 
185  try:
186  self.nwfs = len(self.config.p_wfss)
187  except:
188  self.nwfs = 1 # Default. config may very well not define p_wfss
189  for wfs in range(self.nwfs):
190  name = 'slpComp_%d' % wfs
191  self.add_dispDock(name, self.wao_graphgroup_cb, "MPL")
192  name = 'wfs_%d' % wfs
193  self.add_dispDock(name, self.wao_imagesgroup_cb)
194 
195  self.uiBench.wao_run.setDisabled(True)
196  self.uiBench.wao_next.setDisabled(True)
197  self.uiBench.wao_unzoom.setDisabled(True)
198 
199  self.uiBase.wao_init.setDisabled(False)
200 
201  if (hasattr(self.config, "layout")):
202  area_filename = self.defaultAreaPath + "/" + self.config.layout + ".area"
203  self.loadArea(filename=area_filename)
204 
205  self.adjustSize()
206 

◆ loop_once()

None shesha.widgets.widget_bench.widgetBenchWindow.loop_once (   self)

Definition at line 311 of file widget_bench.py.

311  def loop_once(self) -> None:
312  if not self.loopLock.acquire(False):
313  print("Display locked")
314  return
315  else:
316  try:
317  start = time.time()
318  self.supervisor.single_next()
319  loopTime = time.time() - start
320  refreshDisplayTime = 1. / self.uiBase.wao_frameRate.value()
321 
322  if (time.time() - self.refreshTime > refreshDisplayTime):
323  currentFreq = 1 / loopTime
324  self.uiBench.wao_currentFreq.setValue(currentFreq)
325  self.refreshTime = start
326  except:
327  pass
328  finally:
329  self.loopLock.release()
330 
Here is the caller graph for this function:

◆ run()

def shesha.widgets.widget_bench.widgetBenchWindow.run (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 331 of file widget_bench.py.

331  def run(self):
332  WidgetBase.run(self)
333  if not self.uiBench.wao_forever.isChecked():
334  self.nbiter -= 1
335 
336  if self.nbiter <= 0:
337  self.stop = True
338  self.uiBench.wao_run.setChecked(False)
339 
340 

◆ updateDisplay()

None shesha.widgets.widget_bench.widgetBenchWindow.updateDisplay (   self)

Reimplemented from shesha.widgets.widget_base.WidgetBase.

Definition at line 264 of file widget_bench.py.

264  def updateDisplay(self) -> None:
265  if (self.supervisor is None) or (not self.supervisor.is_init()) or (
266  not self.uiBase.wao_Display.isChecked()):
267  # print("Widget not fully initialized")
268  return
269  if not self.loopLock.acquire(False):
270  return
271  else:
272  try:
273  for key, dock in self.docks.items():
274  if key == "Strehl":
275  continue
276  elif dock.isVisible():
277  index = int(key.split("_")[-1])
278  data = None
279  if "wfs" in key:
280  data = self.supervisor.wfs.get_wfs_image(index)
281  if (data is not None):
282  autoscale = True # self.uiBench.actionAuto_Scale.isChecked()
283  # if (autoscale):
284  # # inits levels
285  # self.hist.setLevels(data.min(), data.max())
286  self.imgs[key].setImage(data, autoLevels=autoscale)
287  # self.p1.autoRange()
288 
289  elif "slp" in key: # Slope display
290  if (self.config.p_wfss[index].type == WFSType.PYRHR or
291  self.config.p_wfss[index].type == WFSType.PYRLR):
292  raise RuntimeError("PYRHR not usable")
293  self.imgs[key].canvas.axes.clear()
294  x, y = self.supervisor.config.p_wfss[index].get_validsub()
295 
296  nssp = x.size
297  centroids = self.supervisor.rtc.get_slopes()
298  vx = centroids[:nssp]
299  vy = centroids[nssp:]
300 
301  offset = (self.supervisor.config.p_wfss[index].npix - 1) / 2
302  self.imgs[key].canvas.axes.quiver(
303  x + offset, y + offset, vy, vx, angles='xy',
304  scale_units='xy',
305  scale=1) # wao.supervisor.config.p_wfss[0].pixsize)
306  self.imgs[key].canvas.draw()
307 
308  finally:
309  self.loopLock.release()
310 
Here is the caller graph for this function:

◆ updateForever()

def shesha.widgets.widget_bench.widgetBenchWindow.updateForever (   self,
  state 
)

METHODS #.

Definition at line 155 of file widget_bench.py.

155  def updateForever(self, state):
156  self.uiBench.wao_nbiters.setDisabled(state)
157 

Member Data Documentation

◆ assistant

shesha.widgets.widget_bench.widgetBenchWindow.assistant

Definition at line 110 of file widget_bench.py.

◆ brahma

shesha.widgets.widget_bench.widgetBenchWindow.brahma

Definition at line 92 of file widget_bench.py.

◆ config

shesha.widgets.widget_bench.widgetBenchWindow.config

Definition at line 103 of file widget_bench.py.

◆ defaultAreaPath

shesha.widgets.widget_bench.widgetBenchWindow.defaultAreaPath

Definition at line 117 of file widget_bench.py.

◆ defaultParPath

shesha.widgets.widget_bench.widgetBenchWindow.defaultParPath
            CONNECTED BUTTONS                         #

Default path for config files

Definition at line 116 of file widget_bench.py.

◆ devices

shesha.widgets.widget_bench.widgetBenchWindow.devices

Definition at line 93 of file widget_bench.py.

◆ dispStatsInTerminal

shesha.widgets.widget_bench.widgetBenchWindow.dispStatsInTerminal

Definition at line 128 of file widget_bench.py.

◆ loopThread

shesha.widgets.widget_bench.widgetBenchWindow.loopThread

Definition at line 109 of file widget_bench.py.

◆ nbiter

shesha.widgets.widget_bench.widgetBenchWindow.nbiter

Definition at line 107 of file widget_bench.py.

◆ nwfs

shesha.widgets.widget_bench.widgetBenchWindow.nwfs

Definition at line 186 of file widget_bench.py.

◆ refreshTime

shesha.widgets.widget_bench.widgetBenchWindow.refreshTime

Definition at line 108 of file widget_bench.py.

◆ stop

shesha.widgets.widget_bench.widgetBenchWindow.stop

Definition at line 104 of file widget_bench.py.

◆ supervisor

shesha.widgets.widget_bench.widgetBenchWindow.supervisor

ATTRIBUTES #.

Definition at line 102 of file widget_bench.py.

◆ uiBench

shesha.widgets.widget_bench.widgetBenchWindow.uiBench

Definition at line 95 of file widget_bench.py.


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