In [1]:
import time
import os
import sys
import numpy as np
import matplotlib
matplotlib.use('nbagg')
#from matplotlib import style
#style.use('ggplot')
import matplotlib.pyplot as plt

import astropy.units as u
from astropy import stats
from astropy.io import fits
from mmtwfs.wfs import *
from mmtwfs.zernike import ZernikeVector
from mmtwfs.telescope import MMT

In [2]:
from scipy import stats, ndimage, optimize
import photutils
from skimage import feature
from skimage.morphology import reconstruction
from skimage.transform import rotate as imrotate

import pathlib

In [3]:
%load_ext autoreload
%autoreload 2

In [4]:
bino = WFSFactory(wfs="binospec")
%cd /Users/tim/MMT/wfsdat/binospec/2017.1113


/Users/tim/MMT/wfsdat/binospec/2017.1113

In [7]:
def proc_file(wfs, mode, file, flipud=True):
    results = wfs.measure_slopes(file, mode=mode, plot=True, flipud=flipud)
    zresults = wfs.fit_wavefront(results, plot=True)
    results['figures']['slopes'].savefig(f"{file}.slopes.pdf")
    zresults['resid_plot'].savefig(f"{file}.residuals.pdf")
    zresults['zernike'].save(filename=f"{file}.sub.zernikes")
    zresults['rot_zernike'].save(filename=f"{file}.rot.zernikes")
    zresults['raw_zernike'].save(filename=f"{file}.raw.zernikes")
    zresults['ref_zernike'].save(filename=f"{file}.ref.zernikes")

In [8]:
bino_file = "/Users/tim/MMT/wfsdat/binospec/2017.1113/wfs_ff_cal_img_2017.1113.111448.fits"

In [9]:
plt.close('all')
results = bino.measure_slopes(bino_file, mode="binospec", plot=True, flipud=True)
results['figures']['slopes'].show()
results['figures']['slopes'].savefig("blah.pdf")



In [10]:
zresults = bino.fit_wavefront(results, plot=True)
zvec = zresults['zernike']
print(zresults['residual_rms'])
#zvec.normalize()
print(zvec)
zresults['resid_plot'].show()


INFO:WFS:guide_phi: 1.4884097433987946 rad rot: 45.23517465 deg
197.26325191894324 nm
Fringe Coefficients
 Z02:       913 nm 	 X Tilt (1, 1)
 Z03:      -514 nm 	 Y Tilt (1, -1)
 Z04: -5.87e+03 nm 	 Defocus (2, 0)
 Z05: -2.88e+03 nm 	 Primary Astig at 45° (2, -2)
 Z06:  -1.2e+03 nm 	 Primary Astig at 0° (2, 2)
 Z07:  1.07e+03 nm 	 Primary Y Coma (3, -1)
 Z08:      -105 nm 	 Primary X Coma (3, 1)
 Z09:       159 nm 	 Y Trefoil (3, -3)
 Z10:       160 nm 	 X Trefoil (3, 3)
 Z11:      -181 nm 	 Primary Spherical (4, 0)
 Z12:       261 nm 	 Secondary Astigmatism at 0° (4, 2)
 Z13:      70.9 nm 	 Secondary Astigmatism at 45° (4, -2)
 Z14:      -113 nm 	 X Tetrafoil (4, 4)
 Z15:      -231 nm 	 Y Tetrafoil (4, -4)
 Z16:     -21.1 nm 	 Secondary X Coma (5, 1)
 Z17:      -177 nm 	 Secondary Y Coma (5, -1)
 Z18:      -148 nm 	 Secondary X Trefoil (5, 3)
 Z19:     -17.1 nm 	 Secondary Y Trefoil (5, -3)
 Z20:     -66.1 nm 	 X Pentafoil (5, 5)
 Z21:       161 nm 	 Y Pentafoil (5, -5)
 Z22:       352 nm 	 Secondary Spherical (6, 0)
 Z23:      31.8 nm 	 Tertiary Astigmatism at 45° (6, -2)
 Z24:       -12 nm 	 Tertiary Astigmatism at 0° (6, 2)
 Z25:      43.6 nm 	 Secondary X Trefoil (6, -4)
 Z26:       271 nm 	 Secondary Y Trefoil (6, 4)
 Z27:       200 nm 	 Y Hexafoil (6, -6)
 Z28:      41.7 nm 	 X Hexafoil (6, 6)
 Z29:     -21.4 nm 	 Tertiary Y Coma (7, -1)
 Z30:      25.4 nm 	 Tertiary X Coma (7, 1)
 Z31:     -49.9 nm 	 Tertiary Y Trefoil (7, -3)
 Z32:       110 nm 	 Tertiary X Trefoil (7, 3)
 Z33:     -47.4 nm 	 Secondary Y Pentafoil (7, -5)
 Z34:      34.8 nm 	 Secondary X Pentafoil (7, 5)
 Z35:      34.5 nm 	 Y Heptafoil (7, -7)
 Z36:     -59.2 nm 	 X Heptafoil (7, 7)
 Z37:      68.8 nm 	 Tertiary Spherical (8, 0)


In [11]:
zresults['zernike'].fringe_bar_chart().show()



In [12]:
x, y, fig = center_pupil(bino_data, bino.pupil_mask(), sigma=10)
plt.scatter(x, y)
fig.show()
x, y


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-12-e34901212ebf> in <module>()
----> 1 x, y, fig = center_pupil(bino_data, bino.pupil_mask(), sigma=10)
      2 plt.scatter(x, y)
      3 fig.show()
      4 x, y

NameError: name 'bino_data' is not defined

In [ ]:
FS = np.fft.fftn(bino_data)
plt.imshow(np.log(np.abs(np.fft.fftshift(FS))**2))
#plt.imshow(np.log(np.abs(FS)**2))
plt.show()

In [ ]:
f = np.fft.fft(x)
n = x.size
freq = np.fft.fftfreq(n, d=2)
plt.plot(np.abs(1/freq), np.abs(f))
plt.show()

In [ ]:
plt.imshow(bino.pupil_mask())
plt.show()

In [ ]:
plt.close('all')

In [ ]:
results.keys()

In [ ]:
plt.imshow(bino_data, origin='lower')
plt.scatter(x, y)
plt.show()

In [ ]:
z = ZernikeVector(Z06=1000)
z

In [ ]:
z.rotate(180 * u.deg)
z

In [ ]:
zz = ZernikeVector(Z10=1000)
zz

In [ ]:
zz.rotate(-90 * u.deg)

zz

In [ ]:
zzz = ZernikeVector(Z06=1000)
zzz.plot_map().show()

In [ ]:
zzz.rotate(45*u.deg)
zzz

In [ ]:
bc = zzz.fringe_bar_chart(title="foo")

In [ ]:
bc.show()

In [ ]:
bc.savefig("blah.pdf")

In [ ]:
p = pathlib.Path(".")

In [ ]:
for f in sorted(p.glob("*.fits")):
    print(f)
    plt.close('all')
    try:
        proc_file(bino, "binospec", str(f))
    except Exception as e:
        print(f"{f} failed: {e}")

In [ ]:
plt.close('all')

In [5]:
zv = ZernikeVector(Z04=2000)

In [6]:
zv


Out[6]:
Fringe Coefficients
 Z04:     2e+03 nm 	 Defocus (2, 0)

In [13]:
results.keys()


Out[13]:
dict_keys(['seeing', 'raw_seeing', 'slopes', 'spots', 'pup_coords', 'apertures', 'xspacing', 'yspacing', 'xcen', 'ycen', 'pup_mask', 'data', 'header', 'rotator', 'mode', 'ref_mask', 'src_mask', 'fwhm', 'figures', 'grid_fit'])

In [16]:
slope_mat = bino.modes['binospec']['zernike_matrix'][1]
pup_coords = results['pup_coords']
slopes = results['slopes']

In [17]:
slopes


Out[17]:
masked_array(data =
 [[-- -- -- -- -- -1.2365940752004292 -0.5749671927518136
  -0.031270005298978276 0.7804670048888056 1.898367607738976
  2.464140735476292 -- -- -1.5041668986469006 -1.0958773951456635
  -0.5738937395303196 -0.09420293024055582 0.8095094684131254
  1.8852564276716066 2.4326725921706043 3.2576515044863186 -- --
  -1.8505887702305017 -1.3103577433707585 -0.7985469860064143
  -0.4349350847232074 0.024192701962874708 0.51821194899685
  1.4210478225177212 2.427325257089933 2.5013351022654433
  3.3152138462535845 -- -1.868390071503427 -1.974076837924855
  -1.407300732184524 -0.5101333172844988 -0.4055279070710469
  0.5484704709576818 1.4165002765054169 2.272095369076851 3.656286023629889
  4.305908540145936 -2.423586955561234 -2.408288251130159
  -1.2627339016458734 -0.5395573864699941 0.5911279087371781
  2.5724524575828696 -1.5387679969595638 -1.0990144004675244
  0.5608824206673262 2.288457078644001 4.671628078353137 4.704035576290607
  -4.4858066089672235 -3.1900417960034986 -2.2762265237518022
  -2.1225364384225145 -1.4049459359880814 -0.3383189065729084
  0.9301335572150151 2.777257867423316 4.4422628678089495 4.786324863967366
  -- -3.0782933214135824 -3.156150521241358 -2.381890585278825
  -2.269071955469542 -1.2792190047577208 -0.2773682036033165
  0.49969415975942866 1.3203138421771428 3.467929000833749
  4.052088598068053 -- -- -3.0793792777128033 -3.31836169983427
  -2.5952012543539524 -1.6057501842295494 0.001372874780258826
  0.962314028904359 2.1836647260081463 3.030807510957004 -- --
  -3.5973771261793672 -3.082741620220105 -1.2914781801408708
  0.028795736926156223 1.018102165416849 2.358528652066809 -- -- -- -- --]
 [-- -- -- -- -- -0.005346207030413552 -0.05862060218449017
  0.23410073224727057 0.294767833895321 0.20605287329152588
  0.21784184362844883 -- -- -0.0008881918940062405 0.23149626180618554
  0.5769085619756851 0.6817551358711711 0.5375094895114358
  0.2685304555402439 0.21194548320428908 -0.06531541235257521 -- --
  0.7141090809349464 0.5335552045360856 0.5175905320231493
  0.44116310958587235 0.4884089842661723 0.2358187312871678
  0.17239629474849494 -0.37059948030236 -1.0428239470205085
  -1.2990348033211063 -- 0.7142819484317897 0.5936503254386594
  0.746471193887345 0.6049803191915544 0.669827800221583
  0.14726322212783316 -1.327860255026252 -1.9988978962361728
  -1.9438725742580232 -1.7403541847711779 0.7296876877861678
  0.006698069217804914 0.051328470484889976 0.03043246491353102
  -2.115107692796613 -2.1324738453100736 -0.3838089027381102
  -1.1078515788274501 -1.4434122340742874 -1.2185041465781126
  -0.8660803233022705 -1.266212890000503 0.8950404208786722
  0.40033445124998934 -0.09039179662548236 -0.8108867084914095
  -1.7611088432295219 -1.535224032550758 -0.9940901682076912
  -0.599135272695321 -0.10742181070702372 -0.4167678567458779 --
  0.4775263378712111 0.3670740141747615 -0.22733053105241652
  -0.9139778630230921 -1.402402334039948 -1.600078494398872
  -0.8571666150202191 -0.16242497517112042 0.7561587774596319
  0.08527206062137793 -- -- 0.9505904272987209 0.8669761268594129
  0.14192751779711443 0.12891803612200192 -0.21812891205718188
  0.16009463830471304 0.564462344912954 0.4615121364413426 -- --
  1.9308362467467646 1.4483609284660588 0.9696203470401201
  0.7659134419104703 1.2433654229695321 1.5055930247305582 -- -- -- -- --]],
             mask =
 [[ True  True  True  True  True False False False False False False  True
   True False False False False False False False False  True  True False
  False False False False False False False False False  True False False
  False False False False False False False False False False False False
  False False False False False False False False False False False False
  False False False False False False False False False False False False
  False False False False False False  True False False False False False
  False False False False False  True  True False False False False False
  False False False  True  True False False False False False False  True
   True  True  True  True]
 [ True  True  True  True  True False False False False False False  True
   True False False False False False False False False  True  True False
  False False False False False False False False False  True False False
  False False False False False False False False False False False False
  False False False False False False False False False False False False
  False False False False False False False False False False False False
  False False False False False False  True False False False False False
  False False False False False  True  True False False False False False
  False False False  True  True False False False False False False  True
   True  True  True  True]],
       fill_value = 1e+20)

In [24]:
arr = zv.array.value
pad = np.zeros(36-len(arr))

In [26]:
len(np.hstack((arr, pad)))


Out[26]:
36

In [ ]: