def _apodization_function(R, NA, n, apodization='sine', ns=None): from PYME.misc import snells t_ = np.arcsin(np.minimum(R, 1)) if apodization is None: M = 1.0 * (R < (NA / n)) # NA/lambda elif apodization == 'sine': M = 1.0 * (R < (NA / n)) * np.sqrt(np.cos(t_)) elif apodization == 'empirical': r_ = np.minimum(R, 1) M = 1.0 * (R < (NA / n)) * (1 - 0.65 * t_) * (1 - np.exp(-10 * ((NA / n) - r_))) else: M = 1.0 * (R < (NA / n)) # NA/lambda r = R / R[abs(M) > 0].max() if (ns is None) or (ns == n): T = 1.0 * M else: #find angles t_t = np.minimum(r * np.arcsin(NA / n), np.pi / 2) #corresponding angle in sample with mismatch t_i = snells.theta_t(t_t, n, ns) #Transmission at interface (average of S and P) T = 0.5 * (snells.Ts(t_i, ns, n) + snells.Tp(t_i, ns, n)) #concentration of high np.angle rays: T = T * 1.0 / (n * np.cos(t_t) / np.sqrt(ns * 2 - (n * np.sin(t_t)) ** 2)) return M*T
def GenZernikeDAPSF(zs, dx = 5, X=None, Y=None, zernikeCoeffs = {}, lamb=700, n=1.51, NA = 1.47, ns=1.51,field_x=0, field_y=0, apertureNA=1.5, apertureZGradient = 0, apodizisation=None, vect=True): from PYME.misc import zernike, snells X, Y, R, FP, F, u, v = GenWidefieldAPA(dx, X = X, Y=Y, lamb=lamb, n = n, NA = NA, field_x=field_x, field_y=field_y, apertureNA=apertureNA, apertureZGradient = apertureZGradient, apodizisation=apodizisation) theta = angle(X + 1j*Y) r = R/R[abs(F)>0].max() if ns == n: T = 1.0*F else: #find angles t_t = np.minimum(r*arcsin(NA/n), np.pi/2) #corresponding angle in sample with mismatch t_i = snells.theta_t(t_t, n, ns) #Transmission at interface (average of S and P) T = 0.5*(snells.Ts(t_i, ns, n) + snells.Tp(t_i, ns, n)) #concentration of high angle rays: T = T*F/(n*np.cos(t_t)/np.sqrt(ns*2 - (n*np.sin(t_t))**2)) #imshow(T*(-t_i + snells.theta_t(t_t+.001, n, ns))) #imshow(F) #colorbar() #figure() #imshow(T, clim=(.8, 1.2)) #colorbar() #figure() #imshow(T*(-t_i + snells.theta_t(t_t+.01, n, ns))) #imshow(t_i - t_t) ang = 0 for i, c in zernikeCoeffs.items(): ang = ang + c*zernike.zernike(i, r, theta) #clf() #imshow(angle(exp(1j*ang))) F = T*exp(-1j*ang) #figure() #imshow(angle(F)) if vect: return PsfFromPupilVectFP(X,Y,R, FP, u,v, n, F, zs) else: return PsfFromPupilFP(X,Y,R, FP, u,v, n, F, zs)