diff --git a/maoppy/example/fit_muse_simulated_psf.py b/maoppy/example/fit_muse_simulated_psf.py index 7f3fdc84130278c608228cab21479c1bab8a07e2..d6eed79bd09bdd5c96ee7e98e673e4d0a7d1795b 100644 --- a/maoppy/example/fit_muse_simulated_psf.py +++ b/maoppy/example/fit_muse_simulated_psf.py @@ -22,7 +22,7 @@ from maoppy.psffit import psffit from maoppy.instrument import muse_nfm npix = 128 # pixel size of PSF -wvl = 600*1e-9 # wavelength [m] +wvl = 800*1e-9 # wavelength [m] flux = 1e4 ron = muse_nfm.ron @@ -33,25 +33,28 @@ samp = muse_nfm.samp(wvl) # sampling (2.0 for Shannon-Nyquist) Pmodel = Psfao((npix,npix), system=muse_nfm, samp=samp) #%% Generate a MUSE-NFM PSF -r0 = 0.15 # Fried parameter [m] +r0 = 0.12 # Fried parameter [m] b = 1e-2 # Phase PSD background [rad² m²] amp = 3.0 # Phase PSD Moffat amplitude [rad²] alpha = 0.1 # Phase PSD Moffat alpha [1/m] -ratio = 1.0 -theta = 0.0 +ratio = 1.2 # major/minor axis +theta = np.pi/3 # angle [rad] beta = 1.6 # Phase PSD Moffat beta power law param = [r0,b,amp,alpha,ratio,theta,beta] -psf = Pmodel(param,dx=0,dy=0) +dxtrue = 0 +dytrue = 0 + +psf = Pmodel(param,dx=dxtrue,dy=dytrue) noise = ron*np.random.randn(npix,npix) image = flux*psf + bckgd + noise #%% Fit the PSF with Psfao -guess = [0.145,2e-2,1.2,0.08,ratio,theta,1.5] +guess = [0.145,2e-2,1.2,alpha,1,0,1.5] w = np.ones_like(image)/ron**2.0 -fixed = [False,False,False,False,True,True,False] +fixed = [False,False,False,True,False,False,False] out = psffit(image, Pmodel, guess, weights=w, fixed=fixed) @@ -59,14 +62,20 @@ flux_fit, bck_fit = out.flux_bck fitao = flux_fit*out.psf + bck_fit #%% Plots -print(31*'-') -print("%9s %10s %10s"%('','MUSE-NFM','Psfao')) -print(31*'-') -print("%9s %10.4g %10.4g"%('Flux [e-]',flux,flux_fit)) -print("%9s %10.4g %10.4g"%('Bck [e-]',bckgd,bck_fit)) -print("%9s %10.2f %10.2f"%('r0 [cm]',r0*100,out.x[0]*100)) -print("%9s %10.2f %10.2f"%('A [rad²]',amp,out.x[2])) -print(31*'-') +print(42*'-') +print("%9s %10s %10s %10s"%('','TRUE','ESTIM','STD')) +print(42*'-') +for i in range(len(param)): + if not fixed[i]: + print("%9s %10.3f %10.3f %10.3f"%(Pmodel.param_name[i],param[i],out.x[i],out.x_std[i])) +# print("%9s %10.2f %10.2f %10.2f"%('r0 [cm]',r0*100,out.x[0]*100,out.x_std[0]*100)) +# print("%9s %10.2f %10.2f %10.2f"%('A [rad²]',amp,out.x[2],out.x_std[2])) +print(' -'*21) +print("%9s %10.3g %10.3g"%('Flux [e-]',flux,flux_fit)) +print("%9s %10.3g %10.3g"%('Bck [e-]',bckgd,bck_fit)) +print("%9s %10.2f %10.2f %10.2f"%('dx [pix]',dxtrue,out.dxdy[0],out.dxdy_std[0])) +print("%9s %10.2f %10.2f %10.2f"%('dy [pix]',dytrue,out.dxdy[1],out.dxdy_std[1])) +print(42*'-') vmin,vmax = np.arcsinh([image.min(),image.max()]) diff --git a/maoppy/psffit.py b/maoppy/psffit.py index 68c2a36d9946159bf1dc41f743ac5dcffc6e5561..f6561ce5a7f17124e8edcb84186219d636692629 100644 --- a/maoppy/psffit.py +++ b/maoppy/psffit.py @@ -135,7 +135,7 @@ def psffit(psf,model,x0,weights=None,dxdy=(0.,0.),flux_bck=(True,True), x, dxdy = mini2input(y) mm = model(x, dx=dxdy[0], dy=dxdy[1], **kwargs) amp, bck = lsq_flux_bck(mm, psf, weights, background=flux_bck[1], positive_bck=positive_bck) - return np.reshape(sqw * (amp*mm + bck - psf), np.size(psf)) + return 0.5*np.reshape(sqw * (amp*mm + bck - psf), np.size(psf)) cost = CostClass() @@ -178,6 +178,11 @@ def psffit(psf,model,x0,weights=None,dxdy=(0.,0.),flux_bck=(True,True), print("") #finish line of "-" result.x, result.dxdy = mini2input(result.x) #split output between x and dxdy + + std = 1/np.sqrt(np.diag(result.jac.T @ result.jac)) + result.x_std, result.dxdy_std = mini2input(std) + if fixed is not None: + result.x_std[fixed] = 0 m = model(result.x,dx=result.dxdy[0],dy=result.dxdy[1]) amp, bck = lsq_flux_bck(m, psf, weights, background=flux_bck[1], positive_bck=positive_bck)