COMPASS  5.0.0
End-to-end AO simulation tool using GPU acceleration
widget_canapass.py
1 
37 """
38 Widget to simulate a closed loop using CANAPASS
39 
40 Usage:
41  widget_canapass.py [<parameters_filename>]
42 
43 with 'parameters_filename' the path to the parameters file
44 
45 Options:
46  -h --help Show this help message and exit
47  -i, --interactive keep the script interactive
48 """
49 
50 import os, sys
51 import numpy as np
52 import time
53 
54 import pyqtgraph as pg
55 from shesha.util.tools import plsh, plpyr
56 from tqdm import trange
57 import astropy.io.fits as pfits
58 from PyQt5 import QtWidgets
59 from shesha.supervisor.canapassSupervisor import CanapassSupervisor
60 
61 from typing import Any, Dict, Tuple, Callable, List
62 from docopt import docopt
63 
64 from shesha.widgets.widget_ao import widgetAOWindow, widgetAOWindow
65 
66 global server
67 server = None
68 
69 
71 
72  def __init__(self, config_file: Any = None, cacao: bool = False,
73  expert: bool = False) -> None:
74  widgetAOWindow.__init__(self, config_file, cacao, hide_histograms=True)
75  #Pyro.core.ObjBase.__init__(self)
76 
77  self.CB = {}
78  self.wpyr = None
79  self.current_buffer = 1
80 
86  self.uiAO.actionShow_Pyramid_Tools.toggled.connect(self.show_pyr_tools)
87  self.wpyrNbBuffer = 1
88 
91  def init_configThread(self) -> None:
92  self.uiAO.wao_deviceNumber.setDisabled(True)
94 
95  def init_config(self) -> None:
96  widgetAOWindow.init_config(self)
97  global server
98  server = self.start_pyro_server()
99 
100  def load_config(self, *args, config_file=None, supervisor=None) -> None:
101  '''
102  Callback when 'LOAD' button is hit
103  '''
104  if supervisor is None:
105  supervisor = CanapassSupervisor(config_file)
106 
107  widgetAOWindow.load_config(self, args, config_file=config_file,
108  supervisor=supervisor)
109 
110  def loop_once(self) -> None:
111  widgetAOWindow.loop_once(self)
112  if (self.uiAO.actionShow_Pyramid_Tools.isChecked()): # PYR only
113  self.wpyr.Fe = 1 / self.config.p_loop.ittime # needs Fe for PSD...
114  if (self.wpyr.CBNumber == 1):
115  self.ai = self.compute_modal_residuals()
116  self.set_pyr_tools_params(self.ai)
117  else:
118  if (self.current_buffer == 1): # First iter of the CB
119  aiVect = self.compute_modal_residuals()
120  self.ai = aiVect[np.newaxis, :]
121  self.current_buffer += 1 # Keep going
122 
123  else: # Keep filling the CB
124  aiVect = self.compute_modal_residuals()
125  self.ai = np.concatenate((self.ai, aiVect[np.newaxis, :]))
126  if (self.current_buffer < self.wpyr.CBNumber):
127  self.current_buffer += 1 # Keep going
128  else:
129  self.current_buffer = 1 # reset buffer
130  self.set_pyr_tools_params(self.ai) # display
131 
132  def next(self, nbIters):
133  ''' Move atmos -> get_slopes -> applyControl ; One integrator step '''
134  for i in trange(nbIters):
135  self.supervisor.next()
136 
137  def initPyrTools(self):
138  ADOPTPATH = os.getenv("ADOPTPATH")
139  sys.path.append(ADOPTPATH + "/widgets")
140  from pyrStats import widget_pyrStats
141  print("OK Pyramid Tools Widget initialized")
142  self.wpyr = widget_pyrStats()
143  self.wpyrNbBuffer = self.wpyr.CBNumber
144  self.wpyr.show()
145 
146  def set_pyr_tools_params(self, ai):
147  self.wpyr.pup = self.supervisor.config.p_geom._spupil
148  self.wpyr.phase = self.supervisor.target.get_tar_phase(0, pupil=True)
149  self.wpyr.updateResiduals(ai)
150  if (self.phase_to_modes is None):
151  print('computing phase 2 Modes basis')
152  self.phase_to_modes = self.supervisor.basis.compute_phase_to_modes(self.modal_basis)
153  self.wpyr.phase_to_modes = self.phase_to_modes
154 
155  def show_pyr_tools(self):
156  if (self.wpyr is None):
157  try:
158  print("Lauching pyramid widget...")
159  self.initPyrTools()
160  print("Done")
161  except:
162  raise ValueError("ERROR: ADOPT not found. Cannot launch Pyramid tools")
163  else:
164  if (self.uiAO.actionShow_Pyramid_Tools.isChecked()):
165  self.wpyr.show()
166  else:
167  self.wpyr.hide()
168 
169  def getAi(self):
170  return self.wpyr.ai
171 
172  def start_pyro_server(self):
173  try:
174  from subprocess import Popen, PIPE
175  from hraa.server.pyroServer import PyroServer
176 
177  # Init looper
178  wao_loop = loopHandler(self)
179 
180  # Find username
181  p = Popen("whoami", shell=True, stdout=PIPE, stderr=PIPE)
182  out, err = p.communicate()
183  if (err != b''):
184  print(err)
185  raise Exception("ERROR CANNOT RECOGNIZE USER")
186  else:
187  user = out.split(b"\n")[0].decode("utf-8")
188  print("User is " + user)
189 
190  server = PyroServer()
191  server.add_device(self.supervisor, "waoconfig_" + user)
192  server.add_device(wao_loop, "waoloop_" + user)
193  server.start()
194  except:
195  raise Exception("Error could not connect to Pyro server.\n It can be:\n - Missing dependencies? (check if Pyro4 is installed)\n - pyro server not running")
196 
197  return server
198 
199 
201 
202  def __init__(self, wao):
203  self.wao = wao
204 
205  def start(self):
206  self.wao.aoLoopClicked(True)
207  self.wao.uiAO.wao_run.setChecked(True)
208 
209  def stop(self):
210  self.wao.aoLoopClicked(False)
211  self.wao.uiAO.wao_run.setChecked(False)
212 
213  def alive(self):
214  return "alive"
215 
216 
217 if __name__ == '__main__':
218  arguments = docopt(__doc__)
219  app = QtWidgets.QApplication(sys.argv)
220  app.setStyle('cleanlooks')
221  wao = widgetCanapassWindowPyro(arguments["<parameters_filename>"], cacao=True)
222  wao.show()
223  # if arguments["--interactive"]:
224  # from shesha.util.ipython_embed import embed
225  # from os.path import basename
226  # embed(basename(__file__), locals())
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.initPyrTools
def initPyrTools(self)
Definition: widget_canapass.py:137
shesha.widgets.widget_canapass.loopHandler.start
def start(self)
Definition: widget_canapass.py:205
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.set_pyr_tools_params
def set_pyr_tools_params(self, ai)
Definition: widget_canapass.py:146
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.init_config
None init_config(self)
Definition: widget_canapass.py:95
shesha.util.tools
Imported from CANARY.
Definition: tools.py:1
shesha.supervisor.canapassSupervisor.CanapassSupervisor
Definition: canapassSupervisor.py:75
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.wpyrNbBuffer
wpyrNbBuffer
Definition: widget_canapass.py:86
shesha.widgets.widget_ao
Widget to simulate a closed loop.
Definition: widget_ao.py:1
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.phase_to_modes
phase_to_modes
Definition: widget_canapass.py:152
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.show_pyr_tools
def show_pyr_tools(self)
Definition: widget_canapass.py:155
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.wpyr
wpyr
Definition: widget_canapass.py:77
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.__init__
None __init__(self, Any config_file=None, bool cacao=False, bool expert=False)
Definition: widget_canapass.py:72
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.getAi
def getAi(self)
Definition: widget_canapass.py:169
shesha.widgets.widget_canapass.loopHandler.stop
def stop(self)
Definition: widget_canapass.py:209
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.load_config
None load_config(self, *args, config_file=None, supervisor=None)
Callback when 'LOAD' button is hit.
Definition: widget_canapass.py:103
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.current_buffer
current_buffer
Definition: widget_canapass.py:78
shesha.widgets.widget_canapass.widgetCanapassWindowPyro
Definition: widget_canapass.py:70
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.loop_once
None loop_once(self)
Definition: widget_canapass.py:110
shesha.supervisor.canapassSupervisor
Initialization and execution of a CANAPASS supervisor.
Definition: canapassSupervisor.py:1
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.next
def next(self, nbIters)
Move atmos -> get_slopes -> applyControl ; One integrator step.
Definition: widget_canapass.py:133
shesha.widgets.widget_canapass.loopHandler
Definition: widget_canapass.py:200
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.ai
ai
Definition: widget_canapass.py:115
shesha.widgets.widget_canapass.loopHandler.wao
wao
Definition: widget_canapass.py:203
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.CB
CB
Definition: widget_canapass.py:76
shesha.widgets.widget_canapass.loopHandler.alive
def alive(self)
Definition: widget_canapass.py:213
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.init_configThread
None init_configThread(self)
Definition: widget_canapass.py:91
shesha.widgets.widget_canapass.loopHandler.__init__
def __init__(self, wao)
Definition: widget_canapass.py:202
shesha.widgets.widget_ao.widgetAOWindow.supervisor
supervisor
ATTRIBUTES #.
Definition: widget_ao.py:111
shesha.widgets.widget_ao.widgetAOWindow
Definition: widget_ao.py:90
shesha.widgets.widget_canapass.widgetCanapassWindowPyro.start_pyro_server
def start_pyro_server(self)
Definition: widget_canapass.py:172
shesha.widgets.widget_ao.widgetAOWindow.config
config
Definition: widget_ao.py:112
shesha.widgets.widget_ao.widgetAOWindow.uiAO
uiAO
Definition: widget_ao.py:104