38 Initialization and execution of a CANAPASS supervisor
41 canapassSupervisor.py <parameters_filename> [options]
43 with 'parameters_filename' the path to the parameters file
46 -h, --help Show this help message and exit
47 -f, --freq freq change the frequency of the loop
48 -d, --delay delay change the delay of the loop
54 from collections
import OrderedDict
57 import astropy.io.fits
as pfits
58 from threading
import Thread
59 from subprocess
import Popen, PIPE
65 from typing
import Any, Dict, Tuple, Callable, List
77 def __init__(self, config_file: str =
None, cacao: bool =
True) ->
None:
78 CompassSupervisor.__init__(self, config_file=config_file, cacao=cacao)
81 """ Returns the configuration in use, in a supervisor specific format """
82 return CompassSupervisor.get_config(self)
85 aodict = OrderedDict()
90 if (root.config.p_tel
is not None):
91 aodict.update({
"teldiam": root.config.p_tel.diam})
92 aodict.update({
"telobs": root.config.p_tel.cobs})
93 aodict.update({
"pixsize": root.config.p_geom._pixsize})
95 aodict.update({
"r0": root.config.p_atmos.r0})
96 aodict.update({
"Fe": 1 / root.config.p_loop.ittime})
97 aodict.update({
"nbTargets": len(root.config.p_targets)})
99 aodict.update({
"nbTargets": 1})
102 aodict.update({
"nbWfs": len(root.config.p_wfss)})
103 aodict.update({
"nbCam": aodict[
"nbWfs"]})
104 aodict.update({
"nbOffaxis": 0})
105 aodict.update({
"nbNgsWFS": 1})
106 aodict.update({
"nbLgsWFS": 0})
107 aodict.update({
"nbFigSensor": 0})
108 aodict.update({
"nbSkyWfs": aodict[
"nbWfs"]})
109 aodict.update({
"nbOffNgs": 0})
112 aodict.update({
"nbDms": len(root.config.p_dms)})
113 aodict.update({
"Nactu": root.rtc.d_control[0].nactu})
115 aodict.update({
"list_NgsOffAxis": []})
116 aodict.update({
"list_Fig": []})
117 aodict.update({
"list_Cam": [0]})
118 aodict.update({
"list_SkyWfs": [0]})
119 aodict.update({
"list_ITS": []})
120 aodict.update({
"list_Woofer": []})
121 aodict.update({
"list_Tweeter": []})
122 aodict.update({
"list_Steering": []})
124 listOfNstatesPerController = []
125 listOfcontrolLawTypePerController = []
126 for control
in self.
config.p_controllers:
127 listOfNstatesPerController.append(control.nstates)
128 listOfcontrolLawTypePerController.append(control.type)
129 aodict.update({
"list_nstatesPerController": listOfNstatesPerController})
130 aodict.update({
"list_controllerType": listOfcontrolLawTypePerController})
138 pyrModulationList = []
155 for i
in range(aodict[
"nbWfs"]):
158 dataDict[
"wfsValid_" + str(i)] = root.config.p_wfss[i]._isvalid
160 xytab = np.zeros((2, root.config.p_wfss[i]._validsubsx.shape[0]))
161 xytab[0, :] = root.config.p_wfss[i]._validsubsx
162 xytab[1, :] = root.config.p_wfss[i]._validsubsy
163 dataDict[
"wfsValidXY_" + str(i)] = xytab
167 pixsize.append(root.config.p_wfss[i].pixsize)
169 if (root.config.p_centroiders[i].type == "maskedpix"):
174 root.config.p_wfss[i]._nvalid * factor) # slopes per wfs
176 listCentroType.append(
177 root.config.p_centroiders[i].
179 NsubapList.append(root.config.p_wfss[i]._nvalid)
180 listWfsType.append(root.config.p_wfss[i].type)
181 xPosList.append(root.config.p_wfss[i].xpos)
182 yPosList.append(root.config.p_wfss[i].ypos)
183 fstopsize.append(root.config.p_wfss[i].fssize)
184 fstoptype.append(root.config.p_wfss[i].fstop)
185 nxsubList.append(root.config.p_wfss[i].nxsub)
186 nysubList.append(root.config.p_wfss[i].nxsub)
187 lambdaList.append(root.config.p_wfss[i].Lambda)
188 if (root.config.p_wfss[i].dms_seen
is not None):
189 dms_seen.append(list(root.config.p_wfss[i].dms_seen))
190 noise.append(root.config.p_wfss[i].noise)
192 if (root.config.p_centroiders[i].type == CentroiderType.MASKEDPIX):
193 NslopesList.append(root.config.p_wfss[i]._nvalid * 4)
195 NslopesList.append(root.config.p_wfss[i]._nvalid * 2)
197 if (root.config.p_wfss[i].type ==
"pyrhr"):
198 pyrModulationList.append(root.config.p_wfss[i].pyr_ampl)
199 pyr_npts.append(root.config.p_wfss[i].pyr_npts)
200 pyr_pupsep.append(root.config.p_wfss[i].pyr_pup_sep)
203 pyrModulationList.append(0)
206 npixPerSub.append(root.config.p_wfss[i].npix)
208 confname = filepath.split("/")[-1].split('.conf')[0]
209 print(filepath.split(".conf")[0] + '_wfsConfig.fits')
211 filepath.split(".conf")[0] + '_wfsConfig.fits', overwrite=True)
212 new_hduwfsSubapXY.writeto(
213 filepath.split(".conf")[0] + '_wfsValidXYConfig.fits', overwrite=True)
215 if (len(dms_seen) != 0):
216 aodict.update({
"listWFS_dms_seen": dms_seen})
218 aodict.update({
"listWFS_NslopesList": NslopesList})
219 aodict.update({
"listWFS_NsubapList": NsubapList})
220 aodict.update({
"listWFS_CentroType": listCentroType})
221 aodict.update({
"listWFS_WfsType": listWfsType})
222 aodict.update({
"listWFS_pixarc": pixsize})
223 aodict.update({
"listWFS_pyrModRadius": pyrModulationList})
224 aodict.update({
"listWFS_pyrModNPts": pyr_npts})
225 aodict.update({
"listWFS_pyrPupSep": pyr_pupsep})
226 aodict.update({
"listWFS_fstopsize": fstopsize})
227 aodict.update({
"listWFS_fstoptype": fstoptype})
228 aodict.update({
"listWFS_NsubX": nxsubList})
229 aodict.update({
"listWFS_NsubY": nysubList})
230 aodict.update({
"listWFS_Nsub": nysubList})
231 aodict.update({
"listWFS_NpixPerSub": npixPerSub})
232 aodict.update({
"listWFS_Lambda": lambdaList})
233 if (len(noise) != 0):
234 aodict.update({
"listWFS_noise": noise})
245 for j
in range(aodict[
"nbDms"]):
246 listDmsType.append(root.config.p_dms[j].type)
248 root.config.p_dms[j].nact)
249 Nactu.append(root.config.p_dms[j]._ntotact)
250 unitPerVolt.append(root.config.p_dms[j].unitpervolt)
251 push4imat.append(root.config.p_dms[j].push4imat)
252 coupling.append(root.config.p_dms[j].coupling)
254 if (root.config.p_dms[j]._i1
is
256 if (root.config.p_dms[j].type !=
'tt'):
257 tmpdata = np.zeros((4, len(root.config.p_dms[j]._i1)))
258 tmpdata[0, :] = root.config.p_dms[j]._j1
259 tmpdata[1, :] = root.config.p_dms[j]._i1
260 tmpdata[2, :] = root.config.p_dms[j]._xpos
261 tmpdata[3, :] = root.config.p_dms[j]._ypos
263 tmpdata = np.zeros((4, 2))
265 dataDict[
"dmData" + str(j)] = tmpdata
267 new_hdudmsl.append(pfits.ImageHDU(tmpdata)) # Valid subap array
268 new_hdudmsl[j].header["DATATYPE"] = "valid_dm%d" % j
273 push4iMatArcSec.append(tmp)
276 if (len(push4iMatArcSec) != 0):
277 aodict.update({
"listDMS_push4iMat": push4imat})
278 aodict.update({
"listDMS_unitPerVolt": unitPerVolt})
279 aodict.update({
"listDMS_Nxactu": NactuX})
280 aodict.update({
"listDMS_Nyactu": NactuX})
281 aodict.update({
"listDMS_Nactu": Nactu})
283 aodict.update({
"listDMS_type": listDmsType})
284 aodict.update({
"listDMS_coupling": coupling})
286 if (root.config.p_targets
is not None):
287 listTargetsLambda = []
290 listTargetsDmsSeen = []
292 listTARGETS_pixsize = []
293 for k
in range(aodict[
"nbTargets"]):
294 listTargetsLambda.append(root.config.p_targets[k].Lambda)
295 listTargetsXpos.append(root.config.p_targets[k].xpos)
296 listTargetsYpos.append(root.config.p_targets[k].ypos)
297 listTargetsMag.append(root.config.p_targets[k].mag)
298 listTargetsDmsSeen.append(list(root.config.p_targets[k].dms_seen))
299 PSFPixsize = (root.config.p_targets[k].Lambda * 1e-6) / (
300 root.config.p_geom._pixsize *
301 root.config.p_geom.get_ipupil().shape[0]) * 206265.
302 listTARGETS_pixsize.append(PSFPixsize)
304 aodict.update({
"listTARGETS_Lambda": listTargetsLambda})
305 aodict.update({
"listTARGETS_Xpos": listTargetsXpos})
306 aodict.update({
"listTARGETS_Ypos": listTargetsYpos})
307 aodict.update({
"listTARGETS_Mag": listTargetsMag})
308 aodict.update({
"listTARGETS_DmsSeen": listTargetsDmsSeen})
309 aodict.update({
"listTARGETS_pixsize": listTARGETS_pixsize})
312 Nslopes = sum(NslopesList)
313 Nsubap = sum(NsubapList)
314 aodict.update({
"Nslopes": Nslopes})
315 aodict.update({
"Nsubap": Nsubap})
316 return aodict, dataDict
319 """ Load the configuration for the compass supervisor
321 CompassSupervisor.load_config(self, config_file)
322 print(
"switching to a generic controller")
323 self.
config.p_controllers[0].type = scons.ControllerType.GENERIC
354 if __name__ ==
'__main__':
355 from docopt
import docopt
356 arguments = docopt(__doc__)
358 if (arguments[
"--freq"]):
359 print(
"Warning changed frequency loop to: ", arguments[
"--freq"])
360 supervisor.config.p_loop.set_ittime(1 / float(arguments[
"--freq"]))
361 if (arguments[
"--delay"]):
362 print(
"Warning changed delay loop to: ", arguments[
"--delay"])
363 supervisor.config.p_controllers[0].set_delay(float(arguments[
"--delay"]))
367 from subprocess
import Popen, PIPE
368 from hraa.server.pyroServer
import PyroServer
370 p = Popen(
"whoami", shell=
True, stdout=PIPE, stderr=PIPE)
371 out, err = p.communicate()
374 raise ValueError(
"ERROR CANNOT RECOGNIZE USER")
376 user = out.split(b
"\n")[0].decode(
"utf-8")
377 print(
"User is " + user)
378 server = PyroServer()
379 server.add_device(supervisor,
"waoconfig_" + user)
382 raise EnvironmentError(
383 "Missing dependencies (code HRAA or Pyro4 or Dill Serializer)")