Beispiel #1
0
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
Beispiel #2
0
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)