COMPASS  5.0.0
End-to-end AO simulation tool using GPU acceleration
roket_widget.py
1 """
2 Created on Tue Feb 2 09:39:35 2016
3 
4 @author: fferreira
5 
6 To launch it :
7 
8  - locally :
9  bokeh serve --show bokeh_display.py
10  - as a server :
11  bokeh serve --port 8081 --host hippo6.obspm.fr:8081 bokeh_display.py
12  then, open a web browser and connect to http://hippo6.obspm.fr:8081/bokeh_display.py
13 """
14 
15 import numpy as np
16 import glob
17 import os, sys
18 
19 import h5py
20 import pandas
21 import datetime
22 
23 from bokeh.plotting import Figure, figure
24 from bokeh.models import Range1d, ColumnDataSource, HoverTool
25 from bokeh.models.widgets import Select, Slider, CheckboxButtonGroup, Panel, Tabs, Button, Dialog, Paragraph, RadioButtonGroup, TextInput
26 from bokeh.io import curdoc
27 from bokeh.models.layouts import HBox, VBox
28 from bokeh.models.widgets import DataTable, DateFormatter, TableColumn
29 from bokeh.client import push_session
30 
31 import matplotlib.pyplot as plt
32 import matplotlib as mpl
33 from scipy.sparse import csr_matrix
34 
35 sys.path.insert(0, os.environ["SHESHA_ROOT"] + "/test/gamora/")
36 import gamora
37 
38 
39 
46 
47  def __del__(self):
48  files = glob.glob("/home/fferreira/public_html/roket_display*")
49  for f in files:
50  os.remove(f)
51 
52  def __init__(self):
53 
54  self.datapath = "/home/fferreira/Data/correlation/"
55  self.covmat = None
56  self.files = glob.glob(self.datapath + "roket_*.h5")
57  self.files.sort()
58  self.f_list = []
59  for f in self.files:
60  self.f_list.append(f.split('/')[-1])
61 
62  self.f = h5py.File(self.files[0], mode='r+')
63 
64  self.Lambda_tar = self.f.attrs["target.Lambda"][0]
65  self.Btt = self.f["Btt"][:]
66 
67  self.IF = csr_matrix((self.f["IF.data"][:], self.f["IF.indices"][:],
68  self.f["IF.indptr"][:]))
69  self.IF = self.IF.T
70  #self.TT = self.f["TT"][:]
71  self.P = self.f["P"][:] #/np.sqrt(self.IF.shape[0])
72 
73  self.indx_pup = self.f["indx_pup"][:]
74  self.pup = np.zeros((self.f["dm_dim"].value, self.f["dm_dim"].value))
75 
76  self.niter = self.f["noise"][:].shape[1]
77  self.nactus = self.f["noise"][:].shape[0]
78  self.nmodes = self.P.shape[0]
79  self.swap = np.arange(self.nmodes) - 2
80  self.swap[0:2] = [self.nmodes - 2, self.nmodes - 1]
81 
82  self.plot_type = ["Commands", "Variance"]
83  self.coms_list = [
84  "noise", "aliasing", "tomography", "filtered modes", "bandwidth",
85  "non linearity"
86  ]
87 
88  self.cov = self.f["cov"][:]
89  self.cor = self.f["cor"][:]
90  self.psf_compass = np.fft.fftshift(self.f["psf"][:])
91  self.psf_fitting = np.fft.fftshift(self.f["psfortho"][:])
92  self.psf = None
93  self.otftel = None
94  self.otf2 = None
95  self.gamora = None
96  self.basis = ["Actuators", "Btt"]
97  self.url = "http://hippo6.obspm.fr/~fferreira/roket_display"
98  self.old = None
99 
100 
107  self.dialog = Dialog(closable=False, visible=False, title="Dialog Box",
108  content="")
109 
110  # Tab 1
111  self.comsTags = Paragraph(text="Commands type", height=25)
112  self.coms = CheckboxButtonGroup(labels=self.coms_list, active=[0])
113  self.DB_select = Select(title="Database", value=self.f_list[0],
114  options=self.f_list)
115  self.DB_button = Button(label="Load DB", type="success")
116  self.plot_select = Select(title="Plot type", value=self.plot_type[1],
117  options=self.plot_type)
118  self.basis_select1 = Select(title="Basis", value=self.basis[0],
119  options=self.basis)
120  self.iter_select = Slider(title="Iteration number", start=1, end=self.niter,
121  step=1)
122  self.plusTag = Paragraph(text="Add :", height=25)
123  self.plus_select = CheckboxButtonGroup(
124  labels=self.coms_list + ["fitting", "CORRECT"],
125  active=[0, 1, 2, 3, 4, 5, 6])
126  self.moinsTag = Paragraph(text="Substract :", height=25)
127  self.moins_select = CheckboxButtonGroup(labels=self.coms_list + ["fitting"],
128  active=[])
129  self.diff_button = Button(label="Sum !", type="success")
130  # Tab 2
131  self.A = Select(title="Commands A", value=self.coms_list[0],
132  options=self.coms_list)
133  self.B = Select(title="Commands B", value=self.coms_list[0],
134  options=self.coms_list)
135  self.basis_select2 = Select(title="Basis", value=self.basis[0],
136  options=self.basis)
137  self.power = Slider(title="Abs(covmat)**X", start=0.1, end=1., step=0.1,
138  value=1.)
139  self.cmin = Slider(title="vmin", start=1, end=10, step=1)
140  self.cmax = Slider(title="vmax", start=1, end=10, step=1)
141  self.rescale = Button(label="Rescale !", type="primary")
142  self.draw = Button(label="Draw !", type="success")
143  self.diag = Button(label="Plot diag !", type="primary")
144  self.cut = Button(label="Cut !", type="primary")
145  self.axiscut = Slider(title="X/Y cut", start=0, end=1, step=1)
146  self.XY = RadioButtonGroup(labels=["X", "Y"], active=0)
147  self.DataTableItems = [
148  "Type", "Noise", "Truncature", "Aliasing", "FilteredModes", "Bandwidth",
149  "Tomography"
150  ]
151  self.ParamTableItems = list(self.f.attrs.keys())
152 
153  self.table_cov_source = ColumnDataSource(
154  data=dict(Type=[], Noise=[], Truncature=[], Aliasing=[],
155  FilteredModes=[], Bandwidth=[], Tomography=[]))
156  self.table_cor_source = ColumnDataSource(
157  data=dict(Type=[], Noise=[], Truncature=[], Aliasing=[],
158  FilteredModes=[], Bandwidth=[], Tomography=[]))
159 
160  self.table_param_source = ColumnDataSource(data=dict(Parameter=[], Value=[]))
161 
162  self.cov_table, self.cor_table, self.param_table = self.createDataTables()
163  self.pcov_source = ColumnDataSource(
164  data=dict(image=[], x=[], y=[], dw=[], dh=[]))
165  self.pcor_source = ColumnDataSource(
166  data=dict(image=[], x=[], y=[], dw=[], dh=[]))
167  self.xdr4 = Range1d(start=0, end=6)
168  self.ydr4 = Range1d(start=0, end=6)
169  self.pcov = figure(x_range=self.xdr4, y_range=self.ydr4, x_axis_location="above")
170  self.pcov.image("image", "x", "y", "dw", "dh", palette="Spectral11",
171  source=self.pcov_source)
172  self.pcor = figure(x_range=self.xdr4, y_range=self.ydr4, x_axis_location="above")
173  self.pcor.image("image", "x", "y", "dw", "dh", palette="Spectral11",
174  source=self.pcor_source)
175 
176  self.updateDataTables()
177  # Tab 3
178  self.basis_select3 = Select(title="Basis", value=self.basis[0],
179  options=self.basis)
180  self.modes_select = Slider(title="Mode #", value=0, start=0, end=self.nmodes,
181  step=1)
182  #self.modes_select = TextInput(value="0:"+str(self.nmodes-1),title="Enter a mode to display")
183  self.draw_mode = Button(label="Draw !", type="success")
184  self.inc_mode = Button(label="+", type="primary")
185  self.desinc_mode = Button(label="-", type="primary")
186  # Tab 4
187  self.independence = CheckboxButtonGroup(labels=["Independence"], active=[])
188  self.psf_display_select = Select(
189  title="PSF display", value="COMPASS", options=[
190  "COMPASS", "ROKET", "Vii", "Fitting", "OTF Telescope", "OTF res"
191  ])
192  self.psf_rec_methods_select = Select(title="Reconstruction method", value="Vii",
193  options=["Vii", "ROKET"])
194  self.gamora_tag = Paragraph(text="PSF reconstruction :", height=25)
195  self.psf_display_tag = Paragraph(text="PSF display :", height=25)
196  self.error_select = CheckboxButtonGroup(labels=self.coms_list + ["fitting"],
197  active=[0, 1, 2, 3, 4, 5, 6])
198  self.gamora_comp = Button(label="Reconstruct !", type="primary")
199  self.psf_display = Button(label="Display", type="primary")
200  self.colors = {
201  "filtered modes": "green",
202  "bandwidth": "orange",
203  "noise": "red",
204  "tomography": "purple",
205  "non linearity": "cyan",
206  "aliasing": "blue"
207  }
208 
209  self.source1 = ColumnDataSource(data=dict(x=[], y=[], color=[], typec=[]))
210  self.source2 = ColumnDataSource(data=dict(x=[], y=[], color=[]))
211  self.source3 = ColumnDataSource(data=dict(x=[], y=[], color=[]))
212  self.sourcepsf = ColumnDataSource(data=dict(x=[], y=[], color=[]))
213 
214  self.hover = HoverTool(tooltips=[("x", "@x"), ("y", "@y"), ("type", "@typec")])
215  self.hoverlog = HoverTool(tooltips=[("x", "@x"), ("y", "@y"), ("type",
216  "@typec")])
217  TOOLS = "resize,save,pan,box_zoom,tap, box_select, wheel_zoom, lasso_select,reset"
218 
219  self.plog = Figure(plot_height=600, plot_width=800, y_range=[1e-6, 10],
220  y_axis_type="log", tools=[TOOLS, self.hoverlog])
221  self.psum = Figure(plot_height=600, plot_width=800)
222  for c in self.colors:
223  self.plog.line(legend=c, line_color=self.colors[c])
224 
225  self.plog.multi_line("x", "y", color="color", source=self.source1)
226  self.psum.line(legend="Image SR", line_color="red")
227  self.psum.line(legend="Phase SR ", line_color="purple")
228  self.psum.line(legend="Var(X+Y)", line_color="blue")
229  self.psum.line(legend="Var(X)+var(Y)", line_color="green")
230 
231  self.psum.multi_line("x", "y", color="color", source=self.source3)
232  self.psum.yaxis.axis_label = "Strehl Ratio"
233 
234  self.xdr = Range1d(start=0, end=self.nactus)
235  self.ydr = Range1d(start=self.nactus, end=0)
236  self.p2 = figure(x_range=self.xdr, y_range=self.ydr, x_axis_location="above")
237  self.p2.image_url(url=[], x=0, y=0, w=self.nactus, h=self.nactus)
238  self.p3 = Figure(plot_height=600, plot_width=800)
239  self.p3.line(x="x", y="y", source=self.source2)
240 
241  self.xdr2 = Range1d(start=0, end=self.pup.shape[0])
242  self.ydr2 = Range1d(start=self.pup.shape[1], end=0)
243  self.pmodes = figure(x_range=self.xdr2, y_range=self.ydr2,
244  x_axis_location="above")
245  self.pmodes.image_url(url=[], x=0, y=0, w=self.pup.shape[0], h=self.pup.shape[1])
246 
248 
249  self.xdr3 = Range1d(start=0, end=self.psf_compass.shape[0])
250  self.ydr3 = Range1d(start=self.psf_compass.shape[1], end=0)
251  self.ppsf = figure(x_range=self.xdr3, y_range=self.ydr3, x_axis_location="above")
252  self.ppsf.image_url(url=[], x=0, y=0, w=self.psf_compass.shape[0],
253  h=self.psf_compass.shape[1])
254  self.pcutpsf = Figure(plot_height=600, plot_width=800, y_range=[1e-9, 1],
255  y_axis_type="log")
256  self.pcutpsf.line(legend="COMPASS", line_color="blue")
257  self.pcutpsf.line(legend="PSF rec", line_color="red")
258  self.pcutpsf.multi_line("x", "y", color="color", source=self.sourcepsf)
259 
260  self.buttons = [self.coms]
261  for control in self.control_plot:
262  control.on_change('value', self.update)
263  for button in self.buttons:
264  button.on_change('active', self.update)
265 
266  self.draw.on_click(self.update_matrix2)
267  self.draw_mode.on_click(self.update_mode)
268  self.rescale.on_click(self.rescale_matrix)
269  self.diag.on_click(self.get_diag)
270  self.cut.on_click(self.cut_matrix)
271  self.inc_mode.on_click(self.mode_increment)
272  self.desinc_mode.on_click(self.mode_desincrement)
273  self.diff_button.on_click(self.plot_sum)
274  self.DB_button.on_click(self.loadDB)
275  self.gamora_comp.on_click(self.gamora_call)
276  self.psf_display.on_click(self.update_psf)
277 
278  self.inputs = HBox(
279  VBox(self.DB_select, self.DB_button, self.comsTags, self.coms,
280  self.plot_select, self.basis_select1, self.iter_select,
281  self.plusTag, self.plus_select, self.moinsTag, self.moins_select,
282  self.diff_button), width=350)
283  self.inputs2 = HBox(
284  VBox(self.DB_select, self.DB_button, self.basis_select2, self.A, self.B,
285  self.power, self.draw, self.cmax, self.cmin, self.rescale,
286  self.axiscut, self.XY, self.cut, self.diag)) #, width=350)
287  self.inputs3 = HBox(
288  VBox(
289  self.DB_select, self.DB_button, self.basis_select3,
290  VBox(
291  VBox(
292  HBox(
293  self.modes_select,
294  HBox(self.desinc_mode, self.inc_mode,
295  height=40))), self.draw_mode)))
296  self.inputs4 = HBox(
297  VBox(
298  HBox(self.DB_select, self.DB_button), self.gamora_tag,
300  self.independence, self.gamora_comp, self.psf_display_tag,
301  self.psf_display_select, self.psf_display), width=350)
302  self.tab1 = Panel(
303  child=HBox(self.inputs, VBox(self.plog, self.psum)), title="Breakdown")
304  self.tab2 = Panel(
305  child=HBox(
306  VBox(
307  HBox(self.inputs2, self.p2, self.p3),
308  HBox(self.cov_table, self.pcov),
309  HBox(self.cor_table, self.pcor))), title="Cov/cor")
310  self.tab3 = Panel(child=HBox(self.inputs3, self.pmodes), title="Basis")
311  self.tab4 = Panel(
312  child=HBox(self.inputs4, VBox(self.ppsf, self.pcutpsf)), title="PSF")
313  self.tab5 = Panel(
314  child=HBox(VBox(HBox(self.DB_select, self.DB_button), self.param_table)),
315  title="Parameters")
316  self.tabs = Tabs(tabs=[self.tab1, self.tab2, self.tab4, self.tab3, self.tab5])
317 
318  curdoc().clear()
319  self.update(None, None, None)
320 
321  curdoc().add_root(self.tabs) #hplot(inputs,p))#, p, p2)
322  curdoc().add_root(self.dialog)
323 
324 
331  def loadDB(self):
332  self.dialog.visible = False
333  self.dialog.content = "Loading database..."
334  self.dialog.visible = True
335 
336  self.f = h5py.File(self.datapath + str(self.DB_select.value), mode='r+')
337  self.Lambda_tar = self.f.attrs["target.Lambda"][0]
338  self.Btt = self.f["Btt"][:]
339 
340  self.IF = csr_matrix((self.f["IF.data"][:], self.f["IF.indices"][:],
341  self.f["IF.indptr"][:]))
342  self.IF = self.IF.T
343  #self.TT = self.f["TT"][:]
344  self.P = self.f["P"][:] #/np.sqrt(self.IF.shape[0])
345  #self.modes = self.IF.dot(self.Btt)#np.dot(self.f["IF"][:],self.Btt)
346  # self.modes = self.modes[:,self.swap]
347 
348  self.indx_pup = self.f["indx_pup"][:]
349  self.pup = np.zeros((self.f["dm_dim"].value, self.f["dm_dim"].value))
350 
351  self.niter = self.f["noise"][:].shape[1]
352  self.nactus = self.f["noise"][:].shape[0]
353  self.nmodes = self.P.shape[0]
354  self.cov = self.f["cov"][:]
355  self.cor = self.f["cor"][:]
356  self.psf_compass = np.fft.fftshift(self.f["psf"][:])
357  self.psf_fitting = np.fft.fftshift(self.f["psfortho"][:])
358  self.psf = None
359  self.otftel = None
360  self.otf2 = None
361  self.gamora = None
362 
363  self.plot_type = ["Commands", "Variance"]
364 
365  #self.cov_table, self.cor_table = self.createDataTables()
366  self.updateDataTables()
367  self.update(None, None, None)
368 
369  print("DB loaded")
370  self.dialog.visible = False
371 
372  def update(self, attrname, old, new):
373  # plot_val = plot_type.value
374  self.source1.data = dict(x=[], y=[], color=[], typec=[])
375 
376  coms_active = self.coms.active
377  plot_val = self.plot_select.value
378  basis_val = self.basis_select1.value
379  iteration = int(self.iter_select.value)
380 
381  yi = []
382  xi = []
383  typec = []
384  coloris = []
385  for jj in coms_active:
386  j = self.coms_list[jj]
387  data = self.f[j][:]
388  if (plot_val == b"Commands"):
389  if (basis_val == b"Actuators"):
390  yi.append(data[:, iteration].tolist())
391  self.plog.xaxis.axis_label = "Actuators"
392  elif (basis_val == b"Btt"):
393  yi.append(np.dot(self.P, data[:, iteration])[self.swap].tolist())
394  self.plog.xaxis.axis_label = "Modes"
395  xi.append(list(range(len(data[:, iteration]))))
396  typec.append([j] * len(data[:, iteration]))
397  coloris.append(self.colors[j])
398  self.plog.yaxis.axis_label = "Volts"
399 
400  elif (plot_val == b"Variance"):
401  if (basis_val == b"Actuators"):
402  yi.append(np.var(data, axis=1).tolist())
403  self.plog.xaxis.axis_label = "Actuators"
404  elif (basis_val == b"Btt"):
405  yi.append(np.var(np.dot(self.P, data), axis=1)[self.swap].tolist())
406  self.plog.xaxis.axis_label = "Modes"
407  xi.append(list(range(len(np.var(data, axis=1)))))
408  typec.append([j] * len(np.var(data, axis=1)))
409  coloris.append(self.colors[j])
410  self.plog.yaxis.axis_label = "Variance"
411 
412  self.source1.data = dict(x=xi, y=yi, color=coloris, typec=typec)
413 
414  print("Plots updated")
415 
416  def gamora_call(self):
417  self.dialog.visible = False
418  psf_type = self.psf_rec_methods_select.value
419  err_active = self.error_select.active
420  err = self.f["noise"][:] * 0.
421  covmodes = err.dot(err.T)
422  independence = self.independence.active
423  fiterr = False
424  self.dialog.content = "Computing covariance matrix..."
425  self.dialog.visible = True
426  for k in err_active:
427  if (self.error_select.labels[k] == b"fitting"):
428  fiterr = True
429  else:
430  if (independence):
431  data = self.f[self.error_select.labels[k]][:]
432  covmodes += data.dot(data.T) / err.shape[1]
433  else:
434  err += self.f[self.error_select.labels[k]][:]
435 
436  if (psf_type == b"Vii"):
437  self.dialog.content = "Reconstructing PSF with Vii (may take a while)..."
438 
439  if (independence):
440  self.otftel, self.otf2, self.psf, self.gamora = gamora.psf_rec_Vii(
441  self.datapath + str(self.DB_select.value), fitting=fiterr,
442  covmodes=covmodes)
443  else:
444  self.otftel, self.otf2, self.psf, self.gamora = gamora.psf_rec_Vii(
445  self.datapath + str(self.DB_select.value), err=err,
446  fitting=fiterr)
447  if (psf_type == b"ROKET"):
448  self.dialog.content = "Reconstructing PSF from ROKET file (may take a while)..."
449  self.dialog.visible = True
450  self.psf, self.gamora = gamora.psf_rec_roket_file(
451  self.datapath + str(self.DB_select.value), err=err)
452  else:
453  self.dialog.content = "PSF reconstruction is available with Vii or ROKET methods only"
454  self.dialog.visible = True
455 
456  self.update_psf()
457  self.sourcepsf.data = dict(
458  x=[
459  list(range(self.psf_compass.shape[0])),
460  list(range(self.psf.shape[0]))
461  ], y=[
462  self.psf_compass[self.psf_compass.shape[0] / 2, :],
463  self.psf[self.psf.shape[0] / 2, :]
464  ], color=["blue", "red"])
465  self.dialog.visible = False
466 
467  def update_psf(self):
468  self.dialog.visible = False
469  self.dialog.content = "Updating PSF display..."
470  self.dialog.visible = True
471  psf_type = self.psf_display_select.value
472  image = None
473  if (psf_type == b"COMPASS"):
474  image = np.log10(self.psf_compass)
475  if (psf_type == b"Vii" or psf_type == b"ROKET"):
476  image = np.log10(self.psf)
477  if (psf_type == b"Fitting"):
478  image = np.log10(self.psf_fitting)
479  if (psf_type == b"OTF Telescope"):
480  image = np.fft.fftshift(self.otftel)
481  if (psf_type == b"OTF res"):
482  image = np.fft.fftshift(self.otf2)
483 
484  if (image is not None):
485  if (self.old):
486  os.remove(self.old)
487 
488  time = str(datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%f'))
489  self.old = "/home/fferreira/public_html/roket_display" + time + ".png"
490  mpl.image.imsave(self.old, image)
491  self.ppsf.image_url(
492  url=dict(value=self.url + time + ".png"), x=0, y=0, w=image.shape[0],
493  h=image.shape[0])
494 
495  self.dialog.visible = False
496 
497  def rescale_matrix(self):
498  self.dialog.visible = False
499  vmin = self.cmin.value
500  vmax = self.cmax.value
501  self.dialog.content = "Updating matrix..."
502  self.dialog.visible = True
503  if (self.old):
504  os.remove(self.old)
505  time = str(datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%f'))
506  self.old = "/home/fferreira/public_html/roket_display" + time + ".png"
507  mpl.image.imsave(self.old, self.covmat, vmin=vmin, vmax=vmax)
508  self.p2.image_url(
509  url=dict(value=self.url + time + ".png"), x=0, y=0,
510  w=self.covmat.shape[0], h=self.covmat.shape[0])
511  self.dialog.visible = False
512 
513  def get_diag(self):
514  x = np.arange(self.covmat.shape[0])
515  y = np.diag(self.covmat)
516  self.source2.data = dict(x=x, y=y)
517 
518  def cut_matrix(self):
519  XorY = self.XY.labels[self.XY.active]
520  ax = self.axiscut.value
521  if (XorY == b"X"):
522  data = self.covmat[ax, :]
523  else:
524  data = self.covmat[:, ax]
525  x = np.arange(data.size)
526  self.source2.data = dict(x=x, y=data)
527 
528  def update_matrix2(self):
529  self.dialog.visible = False
530  if (self.old):
531  os.remove(self.old)
532  #self.draw.disabled = True
533  A_val = self.A.value
534  B_val = self.B.value
535  basis = self.basis_select2.value
536  powa = self.power.value
537  self.dialog.content = "Computing and loading matrix..."
538  self.dialog.visible = True
539 
540  A_cov = self.f[A_val][:]
541  B_cov = self.f[B_val][:]
542  A_cov -= np.tile(np.mean(A_cov, axis=1), (A_cov.shape[1], 1)).T
543  B_cov -= np.tile(np.mean(B_cov, axis=1), (B_cov.shape[1], 1)).T
544  if (basis == b"Btt"):
545  A_cov = np.dot(self.P, A_cov)
546  B_cov = np.dot(self.P, B_cov)
547  print("Values ok")
548  self.covmat = (np.dot(A_cov, B_cov.T) / B_cov.shape[1])
549  print("dot product ok")
550  if (powa != 1):
551  self.covmat = np.abs(self.covmat)**powa * np.sign(self.covmat)
552  print("scale adjusted")
553  self.cmin.start = self.covmat.min()
554  self.cmin.end = self.covmat.max()
555  self.cmin.value = self.cmin.start
556  self.cmin.step = (self.cmin.end - self.cmin.start) / 100.
557  self.cmax.start = self.covmat.min()
558  self.cmax.end = self.covmat.max()
559  self.cmax.value = self.cmax.end
560  self.cmax.step = self.cmin.step
561  self.axiscut.end = self.covmat.shape[0]
562  time = str(datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%f'))
563  self.old = "/home/fferreira/public_html/roket_display" + time + ".png"
564  mpl.image.imsave(self.old, self.covmat)
565  self.p2.image_url(
566  url=dict(value=self.url + time + ".png"), x=0, y=0,
567  w=self.covmat.shape[0], h=self.covmat.shape[0])
568 
569  #self.sourceC.data = dict(url=[self.url],x=0,y=covmat.shape[0],dw=covmat.shape[0],dh=covmat.shape[0])
570  #self.draw.disabled = False
571  print("Matrix updated2")
572  self.dialog.visible = False
573 
574  def update_mode(self):
575  self.dialog.visible = False
576  if (self.old):
577  os.remove(self.old)
578  N = self.modes_select.value
579  if (N >= self.nmodes):
580  N = self.nmodes - 1
581  self.modes_select.value = N
582  basis = self.basis_select3.value
583  self.dialog.content = "Loading..."
584  self.dialog.visible = True
585 
586  if (basis == b"Actuators"):
587  pup = self.pup.flatten()
588  pup[self.indx_pup] = self.IF[:, N].toarray() #self.f["IF"][:][:,N]
589  self.pup = pup.reshape(self.pup.shape)
590  elif (basis == b"Btt"):
591  pup = self.pup.flatten()
592  pup[self.indx_pup] = self.IF[:, N - 2].dot(self.Btt)
593  self.pup = pup.reshape(self.pup.shape)
594  time = str(datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%f'))
595  self.old = "/home/fferreira/public_html/roket_display" + time + ".png"
596  mpl.image.imsave(self.old, self.pup)
597  self.pmodes.image_url(
598  url=dict(value=self.url + time + ".png"), x=0, y=0, w=self.pup.shape[0],
599  h=self.pup.shape[0])
600 
601  #self.sourceC.data = dict(url=[self.url],x=0,y=covmat.shape[0],dw=covmat.shape[0],dh=covmat.shape[0])
602  #self.draw.disabled = False
603  print("Mode updated")
604  self.dialog.visible = False
605 
606  def mode_increment(self):
607  if (self.modes_select.value < self.nmodes - 1):
608  self.modes_select.value = self.modes_select.value + 1
609  else:
610  self.modes_select.value = self.nmodes - 1
611 
612  def mode_desincrement(self):
613  if (self.modes_select.value > 0):
614  self.modes_select.value = self.modes_select.value - 1
615  else:
616  self.modes_select.value = 0
617 
618  def plot_sum(self):
619 
620  self.dialog.visible = False
621  self.dialog.content = "Computing..."
622  self.dialog.visible = True
623 
624  plus = self.plus_select.active
625  moins = self.moins_select.active
626  basis_val = self.basis_select1.value
627  plot_val = self.plot_select.value
628  iteration = int(self.iter_select.value)
629 
630  if (plot_val == b"Commands"):
631  data = np.zeros(self.nactus)
632  x = list(range(self.nactus))
633  elif (plot_val == b"Variance"):
634  data = np.zeros((self.nmodes, self.niter)) #self.nmodes)
635  data2 = np.zeros(self.nmodes)
636  x = list(range(self.nmodes))
637  fitp = False
638  fitm = False
639  for i in plus:
640  self.dialog.content = "Computing " + self.plus_select.labels[i]
641  if (self.plus_select.labels[i] != "CORRECT"):
642  if (self.plus_select.labels[i] == b"fitting"):
643  fitp = True
644  else:
645  if (plot_val == b"Commands"):
646  data += np.dot(self.P,
647  self.f[self.coms_list[i]][:][:, iteration])
648  elif (plot_val == b"Variance"):
649  data += np.dot(self.P, self.f[self.coms_list[i]][:])
650  data2 += np.var(
651  np.dot(self.P, self.f[self.coms_list[i]][:]), axis=1)
652  else:
653  theta = np.arctan(
654  self.f.attrs["wfs.ypos"][0] / self.f.attrs["wfs.xpos"][0])
655  theta -= (self.f.attrs["winddir"][0] * np.pi / 180.)
656  r0 = self.f.attrs["r0"] * (self.f.attrs["target.Lambda"][0] /
657  self.f.attrs["wfs.Lambda"][0])**(6. / 5.)
658  RASC = 180 / np.pi * 3600.
659  Dtomo = 0
660  Dbp = 0
661  Dcov = 0
662  dt = self.f.attrs["ittime"]
663  g = self.f.attrs["gain"][0]
664  for k in range(self.f.attrs["nscreens"]):
665  H = self.f.attrs["atm.alt"][k]
666  v = self.f.attrs["windspeed"][k]
667  frac = self.f.attrs["frac"][k]
668  htheta = np.sqrt(self.f.attrs["wfs.xpos"][0]**2 +
669  self.f.attrs["wfs.ypos"][0]**2) / RASC * H
670  Dtomo += 6.88 * (htheta / r0)**(5. / 3.)
671  Dbp += 6.88 * (v * dt / g / r0)**(5. / 3.)
672  rho = np.sqrt(htheta**2 + (v * dt / g)**2 -
673  2 * htheta * v * dt / g * np.cos(np.pi - theta))
674  Dcov += 6.88 * (rho / r0)**(5. / 3.)
675  covar = (Dbp + Dtomo - Dcov) * 0.5 * frac
676 
677  data2 += 2 * covar / (2 * np.pi / self.Lambda_tar)**2 / self.nmodes
678  #data2 += 2*np.sqrt(np.var(np.dot(self.P,self.f["tomography"]),axis=1))*np.sqrt(np.var(np.dot(self.P,self.f["bandwidth"]),axis=1))*np.cos(theta)
679  for i in moins:
680  if (self.plus_select.labels[i] == b"fitting"):
681  fitm = True
682  else:
683  if (plot_val == b"Commands"):
684  data -= np.dot(self.P, self.f[self.coms_list[i]][:][:, iteration])
685  elif (plot_val == b"Variance"):
686  data -= np.dot(self.P, self.f[self.coms_list[i]][:])
687  data2 -= np.var(np.dot(self.P, self.f[self.coms_list[i]][:]), axis=1)
688 
689 
690 # if(basis_val == b"Btt"):
691 # data = np.dot(self.P,data)
692 # data2 = np.dot(self.P,data2)
693  if (plot_val == b"Variance"):
694  data = np.var(data, axis=1)
695  data = np.cumsum(data[self.swap])
696  # theta = np.arctan(self.f.attrs["wfs.ypos"][0]/self.f.attrs["wfs.xpos"][0])
697  # if(np.sign(self.f.attrs["wfs.ypos"][0])<0):
698  # theta += np.pi*0.
699  # theta -= (self.f.attrs["winddir"][0] * np.pi/180.)
700  # data2 += 2*np.sqrt(np.var(np.dot(self.P,self.f["tomography"]),axis=1))*np.sqrt(np.var(np.dot(self.P,self.f["bandwidth"]),axis=1))*np.cos(theta)
701  data2 = np.cumsum(data2[self.swap])
702  data2 = np.exp(-data2 * (2 * np.pi / self.Lambda_tar)**2)
703  print("data2 : ", data2)
704  data = np.exp(-data * (2 * np.pi / self.Lambda_tar)**2)
705  if (fitp and list(self.f.keys()).count("fitting")):
706  data *= np.exp(-self.f["fitting"].value)
707  data2 *= np.exp(-self.f["fitting"].value)
708  print("data2 : ", data2)
709  if (fitm and list(self.f.keys()).count("fitting")):
710  data /= np.exp(-self.f["fitting"].value)
711  data2 /= np.exp(-self.f["fitting"].value)
712  if (list(self.f.keys()).count("SR2")):
713  self.source3.data = dict(
714  x=[x, x, x, x], y=[
715  data,
716  np.ones(len(x)) * self.f["SR"].value,
717  np.ones(len(x)) * self.f["SR2"].value, data2
718  ], color=["blue", "red", "purple", "green"])
719  else:
720  if (list(self.f.keys()).count("SR")):
721  self.source3.data = dict(
722  x=[x, x,
723  x], y=[data,
724  np.ones(len(x)) * self.f["SR"].value, data2],
725  color=["blue", "red", "green"])
726  else:
727  self.source3.data = dict(x=x, y=data)
728  print("Sum plotted")
729  self.dialog.visible = False
730 
731  def cov_cor(self):
732  cov = np.zeros((6, 6))
733  bufdict = {
734  "0": self.f["noise"][:],
735  "1": self.f["non linearity"][:],
736  "2": self.f["aliasing"][:],
737  "3": self.f["filtered modes"][:],
738  "4": self.f["bandwidth"][:],
739  "5": self.f["tomography"][:]
740  }
741  for i in range(cov.shape[0]):
742  for j in range(cov.shape[1]):
743  if (j >= i):
744  tmpi = self.P.dot(bufdict[str(i)])
745  tmpj = self.P.dot(bufdict[str(j)])
746  cov[i, j] = np.sum(
747  np.mean(tmpi * tmpj, axis=1) -
748  np.mean(tmpi, axis=1) * np.mean(tmpj, axis=1))
749  else:
750  cov[i, j] = cov[j, i]
751 
752  s = np.reshape(np.diag(cov), (cov.shape[0], 1))
753  sst = np.dot(s, s.T)
754  cor = cov / np.sqrt(sst)
755 
756  return cov, cor
757 
758  def createDataTables(self):
759 
760  tmp = [TableColumn(field="Type", title="Covariance")]
761  for item in self.DataTableItems[1:]:
762  tmp.append(TableColumn(field=item, title=item))
763  columns = tmp
764 
765  cov_table = DataTable(source=self.table_cov_source, columns=columns, width=1200,
766  height=280)
767  tmp[0] = TableColumn(field="Type", title="Correlation")
768  cor_table = DataTable(source=self.table_cor_source, columns=columns, width=1200,
769  height=280)
770 
771  tmp = [
772  TableColumn(field="Parameter", title="Parameter"),
773  TableColumn(field="Value", title="Value")
774  ]
775  param_table = DataTable(source=self.table_param_source, columns=tmp, width=700,
776  height=500)
777 
778  return cov_table, cor_table, param_table
779 
780  def updateDataTables(self):
781  self.table_cov_source.data = dict(
782  Type=self.DataTableItems[1:], Noise=self.cov[:, 0],
783  Truncature=self.cov[:, 1], Aliasing=self.cov[:, 2],
784  FilteredModes=self.cov[:, 3], Bandwidth=self.cov[:, 4],
785  Tomography=self.cov[:, 5])
786  self.table_cor_source.data = dict(
787  Type=self.DataTableItems[1:], Noise=self.cor[:, 0],
788  Truncature=self.cor[:, 1], Aliasing=self.cor[:, 2],
789  FilteredModes=self.cor[:, 3], Bandwidth=self.cor[:, 4],
790  Tomography=self.cor[:, 5])
791  params = list(self.f.attrs.keys())
792  params.sort()
793  values = []
794  for k in params:
795  values.append(self.f.attrs[k])
796  self.table_param_source.data = dict(Parameter=params, Value=values)
797 
798  self.pcov_source.data = dict(image=[self.cov], x=[0], y=[0], dw=[6], dh=[6],
799  palette="Spectral11")
800  self.pcor_source.data = dict(image=[self.cor], x=[0], y=[0], dw=[6], dh=[6],
801  palette="Spectral11")
802 
803 files = glob.glob("/home/fferreira/public_html/roket_display*")
804 for f in files:
805  os.remove(f)
806 
807 disp = html_display()
808 
809 # initial load of the data
roket_widget.html_display.psf_display_select
psf_display_select
Definition: roket_widget.py:188
roket_widget.html_display.plus_select
plus_select
Definition: roket_widget.py:123
roket_widget.html_display.comsTags
comsTags
Definition: roket_widget.py:111
roket_widget.html_display.update_matrix2
def update_matrix2(self)
Definition: roket_widget.py:528
roket_widget.html_display.draw_mode
draw_mode
Definition: roket_widget.py:183
roket_widget.html_display.diff_button
diff_button
Definition: roket_widget.py:129
roket_widget.html_display.moinsTag
moinsTag
Definition: roket_widget.py:126
roket_widget.html_display.psf_display_tag
psf_display_tag
Definition: roket_widget.py:195
roket_widget.html_display.covmat
covmat
Definition: roket_widget.py:55
roket_widget.html_display.gamora_call
def gamora_call(self)
Definition: roket_widget.py:416
roket_widget.html_display.source1
source1
Definition: roket_widget.py:209
roket_widget.html_display.colors
colors
Definition: roket_widget.py:200
roket_widget.html_display.DB_button
DB_button
Definition: roket_widget.py:115
roket_widget.html_display.IF
IF
Definition: roket_widget.py:67
roket_widget.html_display.pmodes
pmodes
Definition: roket_widget.py:243
roket_widget.html_display.pcutpsf
pcutpsf
Definition: roket_widget.py:254
roket_widget.html_display.table_cov_source
table_cov_source
Definition: roket_widget.py:153
roket_widget.html_display.p2
p2
Definition: roket_widget.py:236
roket_widget.html_display.table_param_source
table_param_source
Definition: roket_widget.py:160
roket_widget.html_display.cmin
cmin
Definition: roket_widget.py:139
roket_widget.html_display.moins_select
moins_select
Definition: roket_widget.py:127
roket_widget.html_display.ydr2
ydr2
Definition: roket_widget.py:242
roket_widget.html_display.rescale
rescale
Definition: roket_widget.py:141
roket_widget.html_display.plot_type
plot_type
Definition: roket_widget.py:82
roket_widget.html_display.tabs
tabs
Definition: roket_widget.py:316
roket_widget.html_display.loadDB
def loadDB(self)
Definition: roket_widget.py:331
roket_widget.html_display.tab4
tab4
Definition: roket_widget.py:311
roket_widget.html_display.cor
cor
Definition: roket_widget.py:89
roket_widget.html_display.old
old
Definition: roket_widget.py:98
roket_widget.html_display.indx_pup
indx_pup
Definition: roket_widget.py:73
roket_widget.html_display.niter
niter
Definition: roket_widget.py:76
roket_widget.html_display.power
power
Definition: roket_widget.py:137
roket_widget.html_display.get_diag
def get_diag(self)
Definition: roket_widget.py:513
roket_widget.html_display.gamora_tag
gamora_tag
Definition: roket_widget.py:194
roket_widget.html_display.pcov_source
pcov_source
Definition: roket_widget.py:163
roket_widget.html_display.tab5
tab5
Definition: roket_widget.py:313
roket_widget.html_display.basis_select1
basis_select1
Definition: roket_widget.py:118
roket_widget.html_display.inputs
inputs
Definition: roket_widget.py:278
roket_widget.html_display.p3
p3
Definition: roket_widget.py:238
roket_widget.html_display.A
A
Definition: roket_widget.py:131
roket_widget.html_display.f_list
f_list
Definition: roket_widget.py:58
roket_widget.html_display.table_cor_source
table_cor_source
Definition: roket_widget.py:156
roket_widget.html_display.dialog
dialog
Definition: roket_widget.py:107
roket_widget.html_display
Definition: roket_widget.py:45
roket_widget.html_display.sourcepsf
sourcepsf
Definition: roket_widget.py:212
roket_widget.html_display.diag
diag
Definition: roket_widget.py:143
roket_widget.html_display.gamora_comp
gamora_comp
Definition: roket_widget.py:198
roket_widget.html_display.B
B
Definition: roket_widget.py:133
roket_widget.html_display.ParamTableItems
ParamTableItems
Definition: roket_widget.py:151
roket_widget.html_display.ppsf
ppsf
Definition: roket_widget.py:251
roket_widget.html_display.basis_select2
basis_select2
Definition: roket_widget.py:135
roket_widget.html_display.tab3
tab3
Definition: roket_widget.py:310
roket_widget.html_display.swap
swap
Definition: roket_widget.py:79
roket_widget.html_display.XY
XY
Definition: roket_widget.py:146
roket_widget.html_display.files
files
Definition: roket_widget.py:56
roket_widget.html_display.datapath
datapath
Definition: roket_widget.py:54
roket_widget.html_display.pcor
pcor
Definition: roket_widget.py:172
roket_widget.html_display.independence
independence
Definition: roket_widget.py:187
roket_widget.html_display.error_select
error_select
Definition: roket_widget.py:196
roket_widget.html_display.nactus
nactus
Definition: roket_widget.py:77
roket_widget.html_display.param_table
param_table
Definition: roket_widget.py:162
roket_widget.html_display.control_plot
control_plot
Definition: roket_widget.py:247
roket_widget.html_display.mode_desincrement
def mode_desincrement(self)
Definition: roket_widget.py:612
roket_widget.html_display.nmodes
nmodes
Definition: roket_widget.py:78
roket_widget.html_display.hoverlog
hoverlog
Definition: roket_widget.py:215
roket_widget.html_display.inputs2
inputs2
Definition: roket_widget.py:283
roket_widget.html_display.psf_fitting
psf_fitting
Definition: roket_widget.py:91
roket_widget.html_display.mode_increment
def mode_increment(self)
Definition: roket_widget.py:606
roket_widget.html_display.hover
hover
Definition: roket_widget.py:214
roket_widget.html_display.gamora
gamora
Definition: roket_widget.py:95
roket_widget.html_display.updateDataTables
def updateDataTables(self)
Definition: roket_widget.py:780
roket_widget.html_display.plusTag
plusTag
Definition: roket_widget.py:122
roket_widget.html_display.inputs3
inputs3
Definition: roket_widget.py:287
roket_widget.html_display.update_psf
def update_psf(self)
Definition: roket_widget.py:467
roket_widget.html_display.update
def update(self, attrname, old, new)
Definition: roket_widget.py:372
roket_widget.html_display.otftel
otftel
Definition: roket_widget.py:93
roket_widget.html_display.ydr4
ydr4
Definition: roket_widget.py:168
roket_widget.html_display.xdr4
xdr4
Definition: roket_widget.py:167
roket_widget.html_display.buttons
buttons
Definition: roket_widget.py:260
roket_widget.html_display.coms_list
coms_list
Definition: roket_widget.py:83
roket_widget.html_display.axiscut
axiscut
Definition: roket_widget.py:145
roket_widget.html_display.P
P
Definition: roket_widget.py:71
roket_widget.html_display.Lambda_tar
Lambda_tar
Definition: roket_widget.py:64
roket_widget.html_display.modes_select
modes_select
Definition: roket_widget.py:180
roket_widget.html_display.psf_rec_methods_select
psf_rec_methods_select
Definition: roket_widget.py:192
roket_widget.html_display.psf_compass
psf_compass
Definition: roket_widget.py:90
roket_widget.html_display.xdr3
xdr3
Definition: roket_widget.py:249
roket_widget.html_display.otf2
otf2
Definition: roket_widget.py:94
roket_widget.html_display.Btt
Btt
Definition: roket_widget.py:65
roket_widget.html_display.plog
plog
Definition: roket_widget.py:219
roket_widget.html_display.source3
source3
Definition: roket_widget.py:211
roket_widget.html_display.cov_cor
def cov_cor(self)
Definition: roket_widget.py:731
roket_widget.html_display.basis
basis
Definition: roket_widget.py:96
roket_widget.html_display.plot_select
plot_select
Definition: roket_widget.py:116
roket_widget.html_display.cov
cov
Definition: roket_widget.py:88
roket_widget.html_display.__init__
def __init__(self)
Definition: roket_widget.py:52
roket_widget.html_display.cmax
cmax
Definition: roket_widget.py:140
roket_widget.html_display.plot_sum
def plot_sum(self)
Definition: roket_widget.py:618
roket_widget.html_display.__del__
def __del__(self)
Definition: roket_widget.py:47
roket_widget.html_display.xdr
xdr
Definition: roket_widget.py:234
roket_widget.html_display.coms
coms
Definition: roket_widget.py:112
roket_widget.html_display.tab1
tab1
Definition: roket_widget.py:302
roket_widget.html_display.url
url
Definition: roket_widget.py:97
roket_widget.html_display.inc_mode
inc_mode
Definition: roket_widget.py:184
roket_widget.html_display.draw
draw
Definition: roket_widget.py:142
roket_widget.html_display.source2
source2
Definition: roket_widget.py:210
roket_widget.html_display.psf_display
psf_display
Definition: roket_widget.py:199
roket_widget.html_display.basis_select3
basis_select3
Definition: roket_widget.py:178
roket_widget.html_display.cut_matrix
def cut_matrix(self)
Definition: roket_widget.py:518
roket_widget.html_display.pcor_source
pcor_source
Definition: roket_widget.py:165
roket_widget.html_display.psum
psum
Definition: roket_widget.py:221
roket_widget.html_display.xdr2
xdr2
Definition: roket_widget.py:241
roket_widget.html_display.update_mode
def update_mode(self)
Definition: roket_widget.py:574
roket_widget.html_display.inputs4
inputs4
Definition: roket_widget.py:296
roket_widget.html_display.psf
psf
Definition: roket_widget.py:92
roket_widget.html_display.ydr3
ydr3
Definition: roket_widget.py:250
roket_widget.html_display.pcov
pcov
Definition: roket_widget.py:169
roket_widget.html_display.ydr
ydr
Definition: roket_widget.py:235
roket_widget.html_display.tab2
tab2
Definition: roket_widget.py:304
roket_widget.html_display.iter_select
iter_select
Definition: roket_widget.py:120
roket_widget.html_display.desinc_mode
desinc_mode
Definition: roket_widget.py:185
roket_widget.html_display.f
f
Definition: roket_widget.py:62
roket_widget.html_display.DB_select
DB_select
Definition: roket_widget.py:113
roket_widget.html_display.createDataTables
def createDataTables(self)
Definition: roket_widget.py:758
roket_widget.html_display.cut
cut
Definition: roket_widget.py:144
roket_widget.html_display.rescale_matrix
def rescale_matrix(self)
Definition: roket_widget.py:497
roket_widget.html_display.DataTableItems
DataTableItems
Definition: roket_widget.py:147
roket_widget.html_display.pup
pup
Definition: roket_widget.py:74