Contents

Kidger triplet

rd = [ 0 18.609 460.967 -29.934 18.605 0 67.594 -22.162 0];
th = [ 0 2.5 5.157 1 1.207 4.007 2.5 41.60525 0];
rn = [ 1  1.620408 1 1.636355 1 1 1.620408 1 1];
sa = [ 0  7  7 5.1 5.1 5 6.2 6.2 0];
gn = char('SK16','F6','SK16');
ast = 6;

pya = [50/8 0];
pyc = [-5.12787 tan(22*pi/180)];

load ZEMAX

This is the paraxial raytrace from Kidger. The setting allows the real chief ray to pass through the center of the pupil.

cv = curvature(rd);
pya = parax(pya,cv,th,rn);
pyc = parax(pyc,cv,th,rn);

[pya pyc]
ans =

    6.2500         0   -5.1279    0.4040
    6.2500   -0.1286   -5.1279    0.3548
    5.9285   -0.2004   -4.2408    0.5693
    4.8951   -0.0589   -1.3050    0.3309
    4.8362    0.0691   -0.9741    0.5082
    4.9196    0.0691   -0.3606    0.5082
    5.1965    0.0132    1.6758    0.3041
    5.2295   -0.1250    2.4361    0.4246
    0.0287   -0.1250   20.1034    0.4246

This paraxial raytrace sets the stop per the lens drawing/specifications

k = -pyc(ast,1)/pya(ast,1)
pyc = pyc + k*pya;
[pya pyc]
k =

    0.0733


ans =

    6.2500         0   -4.6697    0.4040
    6.2500   -0.1286   -4.6697    0.3454
    5.9285   -0.2004   -3.8062    0.5546
    4.8951   -0.0589   -0.9462    0.3266
    4.8362    0.0691   -0.6195    0.5133
    4.9196    0.0691         0    0.5133
    5.1965    0.0132    2.0567    0.3051
    5.2295   -0.1250    2.8195    0.4155
    0.0287   -0.1250   20.1055    0.4155

exercise 1

trig_ray(pya(1),0,cv,th,rn);

[Y U] = trig_ray(pya(1),0,cv,th,rn);
fprintf('marginal ray error %g mm\n',Y);
fprintf('marginal focus %g mm\n',-Y/tan(U));
 1      6.25000      0.00000
 2      6.05374     -0.13374
 3      5.05800     -0.20934
 4      4.93547     -0.05837
 5      4.97870      0.07982
 6      5.31597      0.07982
 7      5.34683      0.01886
 8     -0.00202     -0.12590
marginal ray error -0.00201824 mm
marginal focus -0.0159456 mm

exercise 2

Seidel wavefront coefficients

lambda = 0.58756e-3;
ford(pya, pyc, cv, th, rn, lambda);
L =

    2.5252


W =

         0         0         0         0         0
   11.9025   21.7012    9.8917   60.7667   55.3965
    5.3684  -62.5597  182.2553   88.8742 -517.8351
  -22.6766  146.1077 -235.3472 -152.9207  492.6427
  -11.7029  -68.2875  -99.6162 -106.5180 -310.7718
         0         0         0         0         0
    1.4354   21.3874   79.6660   55.2008  411.2352
   19.3016  -61.6536   49.2338   71.4887 -114.1754
    3.6285   -3.3044  -13.9165   16.8916   16.4921


      W040       W131       W222       W220       W311
      3.63      -3.30     -13.92      16.89      16.49
ZEMAX results
           W040        W131        W222       W220P        W311        W020        W111
TOT      3.6283     -3.3042    -13.9164     23.8497     16.4921     -0.0528      0.1490
          W220S       W220M       W220T
TOT     16.8915      9.9333      2.9751

exercise 3

y = linspace(0,1,51);
% function Y = trig_ray(Qin,Uin,cv,th,rn)
Y = trig_ray(y*pya(1),0,cv,th,rn);

markers are ZEMAX results

fanplot(y,Y,.01);
hold on
plot(z_axial_fan(:,1),z_axial_fan(:,2)*1e-3,'ro');
hold off

exercise 4

y = linspace(-1,1,101);
Y = trig_ray(y*pya(1),0,cv,th,rn);
for k=1:4
   subplot(2,2,k);
   c = polyfit(y,Y,2*k+1);
   plot(y,Y,y,polyval(c,y));
   title(sprintf('order %d',2*k+1));
end

exercise 5

y = z_opdfan(:,1);
opd = z_opdfan(:,2);
table = taylorfit(y,opd);
disp('taylor fit');
show_table(table);
table = zernfit(y,opd);
disp('Zernike fit');
show_table(table);
table = chebyfit(y,opd);
disp('Chebyshev fit');
show_table(table);
taylor fit
           0          2          4          6          8         10
 0    -0.4687
 2    -0.2083    -0.7439
 4    -0.0347    -2.4016     1.8456
 6     0.0021    -3.1426     3.9763    -1.4964
 8    -0.0001    -3.0673     3.5768    -0.8291    -0.3441
10     0.0000    -3.0731     3.6254    -0.9708    -0.1773    -0.0683
Zernike fit
           0          2          4          6          8         10         12
 0    -0.4687
 2    -0.5802    -0.3719
 4    -0.6203    -0.2780     0.3076
 6    -0.6179    -0.2566     0.2886    -0.0748
 8    -0.6176    -0.2560     0.2905    -0.0759    -0.0049
10    -0.6176    -0.2560     0.2906    -0.0758    -0.0050    -0.0003
12    -0.6176    -0.2560     0.2906    -0.0757    -0.0050    -0.0003    -0.0000
Chebyshev fit
           0          2          4          6          8         10         12
 0    -0.4687
 2    -0.5802    -0.3719
 4    -0.5434    -0.2780     0.2307
 6    -0.5458    -0.2846     0.2165    -0.0468
 8    -0.5457    -0.2845     0.2164    -0.0474    -0.0027
10    -0.5457    -0.2845     0.2164    -0.0474    -0.0027    -0.0001
12    -0.5457    -0.2845     0.2164    -0.0474    -0.0027    -0.0001    -0.0000

exercise 6

first verify chief ray passes through center of pupil

y = linspace(-1,1,51);
Uc = 22*pi/180;
%yco = -5.12787;
yco = pyc(2,1);

Y = trig_ray((y*pya(1)+yco)*cos(Uc),Uc,cv(1:ast),th(1:ast),rn(1:ast));
subplot(1,1,1);
fanplot(y,Y,10);

It looks like the paraxial aim criteria is used. Chief ray does not go through center of pupil (no ray aiming)

yzero = interp1(Y,y,0);
fprintf('aim point %g\n', yzero*pya(1)+yco);
aim point -5.12775

trace chief ray to image

YC = trig_ray(yco*cos(Uc),Uc,cv,th,rn);
fprintf('chief ray height at image: %g mm\n',YC);
fprintf('gaussian image height: %g mm\n',pyc(9,1));
fprintf('distortion: %.2f%%\n',(YC-pyc(9,1))/pyc(9,1)*100);
chief ray height at image: 19.9758 mm
gaussian image height: 20.1055 mm
distortion: -0.64%

full-field ray trace

y = linspace(-0.55,1,101);

Y = trig_ray((y*pya(1)+yco)*cos(Uc),Uc,cv,th,rn) - YC;

fanplot(y,Y);
hold on
plot(z_full_field_fan(:,1),z_full_field_fan(:,2)*1e-3,'ro');
hold off;

exercise 7

subplot(2,1,1);
c3 = polyfit(y,Y,3);
yfit = polyval(c3,y);
plot(y,Y,y,yfit);
subplot(2,1,2);
c5 = polyfit(y,Y,5);
yfit=polyval(c5,y);
plot(y,Y,y,yfit);

exercise 8

epsilon = lambda/abs(pya(9,2));
w = polyint(c5)/(-epsilon);
fprintf('W040 %g waves\n',w(3))
fprintf('W131 %g waves\n',w(4))
W040 -3.57332 waves
W131 0.495115 waves

ZEMAX opdfan

y = z_opdfan(10:41,1);
opd = z_opdfan(10:41,3);

w = polyfit(y,opd,8);

fprintf('W040 %g waves\n',w(5));
fprintf('W131 %g waves\n',w(6));
W040 -3.01946 waves
W131 0.513419 waves

on-axis test, compare to Seidel aberrations and on-axis opd fan

y = linspace(-1,1,101);
Y = trig_ray(y*pya(1),0,cv,th,rn);
subplot(1,1,1)
c = polyfit(y,Y,5);
plot(y,Y,y,polyval(c,y));
w = polyint(c)/(-epsilon);
fprintf('W040 %g waves\n',w(3));
W040 4.08932 waves