%pylab inline
import numpy as np
import matplotlib.pyplot as plt
from rayopt import system_from_text, Analysis, FiniteConjugate, InfiniteConjugate
np.set_printoptions(precision=3)
Populating the interactive namespace from numpy and matplotlib
description = "100x, NA=0.95, 0.2mm, flat field, Asoma Y, USP 4505553"
columns = "type roc distance diameter material"
text = """
S 0 0 2 AIR
S -2.3622 100 3 NBFD5
S 2.1018 .4837 3 FDS9
S -19.048 1.1751 3 AIR
A 0 1.5667 1.4 AIR
S 44.066 0 3 LAK14
S 2.7780 .47 3 CAF2
S -2.7783 2.701 3 KZFSN4
S -5.2938 .5288 3 AIR
S 8.7579 .0588 3 CAF2
S -8.7564 1.4576 3 AIR
S 4.7338 .0588 3 CAF2
S -5.0227 2.3913 3 KZFSN5
S 2.9515 .8965 3 PHM51
S -7.6840 2.1552 3 AIR
S 2.5702 .0588 3 FPL51
S 4.5203 1.1507 3 AIR
S 1.0734 .0459 3 SK14
S .8353 1.2473 3 AIR
S 0 .3381 3 AIR
"""
description = "60x, f=3, wd=0.14, NA=1.4, oil immersion, f=3, US5517360"
columns = "type roc distance radius material"
#.15 1.3325/73 S 0 0.0005
text = """
S 0 0 .15 1.521/56.02
S 0 0.17 1 1.51548/43.1
S 0 0.14 0.738 1.51633/64.15
S -1.8192 0.6 1.165 1.883/40.78
S -3.2177 3.84 3.217 AIR
S -20.4857 0.1 4.744 1.56907/71.3
S -8.7588 2.1418 5.181 AIR
S 11.0685 0.3 6.329 1.497/81.61
S -10.4406 5.3 6.251 1.6134/43.84
S 18.9938 1 6.237 1.43875/94.97
S -17.4921 4.5 6.324 AIR
S 25.511 0.15 6.081 1.6765/37.54
S 6.4981 1 5.519 1.43875/94.97
S -16.9602 6.5 5.638 1.74/31.71
S -37.6734 1 5.789 AIR
S 8.7662 0.3 5.971 1.456/90.31
S 145.8837 3.1 5.769 AIR
S 7.866 0.15 5.13 1.618/63.38
S -8.8483 5.734 3.554 1.6765/37.54
S 3.0648 1 2.284 AIR
S -3.4631 3.2 2.127 1.74/31.71
S 270.3729 2.0409 2.839 1.80518/25.43
S -8.4836 6.7011 4.206 AIR
A 0 0 3.9 AIR
"""
tube = """
S 68.7541 56 15 1.48749/70.2
S -37.5679 7.7321 15 1.8061/40.95
S -102.8477 3.4742 15 AIR
S 84.3099 0.6973 15 1.834/37.16
S -50.71 6.0238 15 1.6445/40.82
S 40.6619 3.0298 15 AIR
S 0 126 10 AIR
"""
#text += tube
s = system_from_text(text, columns.split(),
description=description, object=FiniteConjugate(
radius=.15, pupil=dict(radius=4., aim=True)))
s.stop = 3
s.update()
if True:
s.reverse()
s.object = InfiniteConjugate(angle_deg=2, pupil=s.image.pupil)
s[1].distance = 10
#s.stop += 7
#s.object.radius = 5
#s[1].distance = 160
s.update()
print(s)
System: 60x, f=3, wd=0.14, NA=1.4, oil immersion, f=3, US5517360 Scale: 1.0 mm Wavelengths: 588, 656, 486 nm Fields: 0, 0.7, 1 Object: Semi-Angle: 2 deg Pupil: Pupil Distance: 0.6183 Refractive Index: 1.521 Aim: True Radius: 4 Image: Radius: 0.15 Pupil: Pupil Distance: 0.6183 Refractive Index: 1.521 Aim: True Radius: 4 Stop: 3 Elements: # T Distance Rad Curv Diameter Material n nd Vd 0 S 0 inf 7.8 basic/air 1.000 1.000 89.30 1 S 10 8.484 8.412 - 1.805 1.805 25.43 2 S 6.7011 -270.4 5.678 - 1.740 1.740 31.71 3 S 2.0409 3.463 4.254 basic/air 1.000 1.000 89.30 4 S 3.2 -3.065 4.568 - 1.677 1.677 37.54 5 S 1 8.848 7.108 - 1.618 1.618 63.38 6 S 5.734 -7.866 10.26 basic/air 1.000 1.000 89.30 7 S 0.15 -145.9 11.538 - 1.456 1.456 90.31 8 S 3.1 -8.766 11.942 basic/air 1.000 1.000 89.30 9 S 0.3 37.67 11.578 - 1.740 1.740 31.71 10 S 1 16.96 11.276 - 1.439 1.439 94.97 11 S 6.5 -6.498 11.038 - 1.677 1.677 37.54 12 S 1 -25.51 12.162 basic/air 1.000 1.000 89.30 13 S 0.15 17.49 12.648 - 1.439 1.439 94.97 14 S 4.5 -18.99 12.474 - 1.613 1.613 43.84 15 S 1 10.44 12.502 - 1.497 1.497 81.61 16 S 5.3 -11.07 12.658 basic/air 1.000 1.000 89.30 17 S 0.3 8.759 10.362 - 1.569 1.569 71.30 18 S 2.1418 20.49 9.488 basic/air 1.000 1.000 89.30 19 S 0.1 3.218 6.434 - 1.883 1.883 40.78 20 S 3.84 1.819 2.33 - 1.516 1.516 64.15 21 S 0.6 inf 1.476 - 1.515 1.515 43.10 22 S 0.14 inf 2 - 1.521 1.521 56.02 23 S 0.17 inf 0.3 None nan nan nan
from rayopt import ParaxialTrace, GeometricTrace
p = ParaxialTrace(s)
p.update_conjugates()
g = GeometricTrace(s)
g.rays_point((0, 0), distribution="square", nrays=250)
fig, ax = plt.subplots()
ai = s.stop
ax.plot(g.y[ai, :, 0], g.y[ai, :, 1], ".")
ax.set_aspect("equal")
fig, ax = plt.subplots()
s.plot(ax)
g = GeometricTrace(s)
g.rays_point((0, 0))
g.plot(ax)
ax.set_xlim(58, 59)
ax.set_ylim(-2, 2)
(-2, 2)
a = Analysis(s)
#a.figures[0].axes[0].set_xlim(220, 253)
#a.figures[0].axes[0].set_ylim(-7, 7)
#a.figures[0].axes[0].set_xlim(-2, 52)
#a.figures[0].set_figheight(10)
/home/rj/work/nist/pyrayopt/rayopt/paraxial_trace.py:186: RuntimeWarning: divide by zero encountered in true_divide return self.n[(0, -2), ]/(2*na) /home/rj/work/nist/pyrayopt/rayopt/paraxial_trace.py:191: RuntimeWarning: divide by zero encountered in true_divide return 1.22*self.wavelength/(2*na)/self.system.scale /home/rj/work/nist/pyrayopt/rayopt/elements.py:368: RuntimeWarning: invalid value encountered in sqrt g = -a + np.sign(mu)*np.sqrt(np.square(a) - b) /home/rj/work/nist/pyrayopt/rayopt/elements.py:208: RuntimeWarning: invalid value encountered in less_equal good = np.square(y[:, :2]).sum(1) <= self.radius**2
System: 60x, f=3, wd=0.14, NA=1.4, oil immersion, f=3, US5517360 Scale: 1.0 mm Wavelengths: 588, 656, 486 nm Fields: 0, 0.7, 1 Object: Semi-Angle: 2 deg Pupil: Pupil Distance: 0.6183 Refractive Index: 1.521 Aim: True Radius: 4 Image: Radius: 0.15 Pupil: Pupil Distance: 0.6183 Refractive Index: 1.521 Aim: True Radius: 4 Stop: 3 Elements: # T Distance Rad Curv Diameter Material n nd Vd 0 S 0 inf 7.8 basic/air 1.000 1.000 89.30 1 S 10 8.484 8.412 - 1.805 1.805 25.43 2 S 6.7011 -270.4 5.678 - 1.740 1.740 31.71 3 S 2.0409 3.463 4.254 basic/air 1.000 1.000 89.30 4 S 3.2 -3.065 4.568 - 1.677 1.677 37.54 5 S 1 8.848 7.108 - 1.618 1.618 63.38 6 S 5.734 -7.866 10.26 basic/air 1.000 1.000 89.30 7 S 0.15 -145.9 11.538 - 1.456 1.456 90.31 8 S 3.1 -8.766 11.942 basic/air 1.000 1.000 89.30 9 S 0.3 37.67 11.578 - 1.740 1.740 31.71 10 S 1 16.96 11.276 - 1.439 1.439 94.97 11 S 6.5 -6.498 11.038 - 1.677 1.677 37.54 12 S 1 -25.51 12.162 basic/air 1.000 1.000 89.30 13 S 0.15 17.49 12.648 - 1.439 1.439 94.97 14 S 4.5 -18.99 12.474 - 1.613 1.613 43.84 15 S 1 10.44 12.502 - 1.497 1.497 81.61 16 S 5.3 -11.07 12.658 basic/air 1.000 1.000 89.30 17 S 0.3 8.759 10.362 - 1.569 1.569 71.30 18 S 2.1418 20.49 9.488 basic/air 1.000 1.000 89.30 19 S 0.1 3.218 6.434 - 1.883 1.883 40.78 20 S 3.84 1.819 2.33 - 1.516 1.516 64.15 21 S 0.6 inf 1.476 - 1.515 1.515 43.10 22 S 0.14 inf 2 - 1.521 1.521 56.02 23 S 0.17358 inf 0.3 None nan nan nan lagrange: -0.13975 track length: 48.798 object, image height: [ 0.022 0.106] front, back focal length (from PP): [-4.562 3. ] entry, exit pupil height: [ 4. 0.294] entry, exit pupil distance: [-9.382 0.51 ] front, back focal distance: [ 31.384 0.114] front, back principal distance: [ 35.946 -2.886] front, back nodal distance: [ 34.385 -4.448] front, back numerical aperture: [ 0. 1.003] front, back f number: [ 0.57 5.097] front, back working f number: [ inf 0.758] front, back airy radius: [ inf 0.] transverse, angular magnification: [-0. -8.937] # T path n axial y axial nu chief y chief nu 0 S 0 1 4 0 -0.0216 0.03494 1 S 10 1.805 4 -0.3795 0.3277 0.003848 2 S 16.7 1.74 2.591 -0.3801 0.342 0.003765 3 S 18.74 1 2.145 0.07811 0.3464 0.07775 4 S 21.94 1.677 2.395 0.6066 0.5951 0.2091 5 S 22.94 1.618 2.757 0.6248 0.7198 0.2138 6 S 28.68 1 4.971 0.2344 1.478 0.09779 7 S 28.83 1.456 5.006 0.2501 1.492 0.1024 8 S 31.93 1 5.539 -0.03789 1.71 0.01353 9 S 32.23 1.74 5.528 -0.1464 1.714 -0.02013 10 S 33.23 1.439 5.443 -0.04973 1.703 0.01011 11 S 39.73 1.677 5.219 0.1412 1.749 0.07409 12 S 40.73 1 5.303 0.0006398 1.793 0.02657 13 S 40.88 1.439 5.303 -0.1323 1.797 -0.01847 14 S 45.38 1.613 4.889 -0.08733 1.739 -0.002479 15 S 46.38 1.497 4.835 -0.03343 1.737 0.01689 16 S 51.68 1 4.717 -0.2451 1.797 -0.06376 17 S 51.98 1.569 4.643 -0.5466 1.778 -0.1792 18 S 54.12 1 3.897 -0.4384 1.533 -0.1367 19 S 54.22 1.883 3.853 -1.496 1.52 -0.5536 20 S 58.06 1.516 0.8035 -1.334 0.3909 -0.4748 21 S 58.66 1.515 0.2758 -1.334 0.203 -0.4748 22 S 58.8 1.521 0.1526 -1.334 0.1591 -0.4748 23 S 58.97 1.521 0.003548 -1.334 0.1061 -0.4748 # T SA3 CMA3 AST3 PTZ3 DIS3 TACHC TCHC 0 S 0 0 0 0 0 0 0 1 S -0.03932 -0.006134-0.0009569-0.0003894 -0.00021 -0.02511 -0.003917 2 S -0.001408 5.552e-06-2.189e-08-5.688e-07 2.329e-09 -0.003221 1.27e-05 3 S 0.08071 0.02056 0.00524 0.0009095 0.001567 0.01523 0.003882 4 S 0.06199 0.01026 0.001699 0.0009751 0.0004426 0.01374 0.002275 5 S 0.03047 0.009324 0.002853 1.806e-05 0.0008785 0.01116 0.003414 6 S -0.001307-0.0002962 -6.71e-05-0.0003596-9.667e-05 -0.009039 -0.002048 7 S -0.008848 -0.003872 -0.001694 1.59e-05-0.0007343 -0.002634 -0.001153 8 S -0.147 -0.03985 -0.0108-0.0002645 -0.003001 -0.009757 -0.002645 9 S -0.000261-0.0001415-7.677e-05 -8.36e-05-8.698e-05 -0.006124 -0.003322 10 S 0.008534 0.003201 0.001201 5.258e-05 0.0004702 0.01736 0.006514 11 S 0.2136 0.06683 0.02091 0.0001124 0.006575 0.03598 0.01126 12 S -0.004288-0.0009046-0.0001908-0.0001171-6.495e-05 -0.008964 -0.001891 13 S -0.01199 -0.005104 -0.002172-0.0001291-0.0009792 -0.003923 -0.00167 14 S 0.01423 0.004252 0.001271 2.936e-05 0.0003884 0.01019 0.003043 15 S 0.01489 0.006001 0.002419 3.421e-05 0.000989 0.01115 0.004494 16 S -0.1856 -0.06252 -0.02106-0.0002221 -0.007171 -0.009769 -0.003291 17 S 0.003286 0.001605 0.0007842-0.0003066 0.0002333 -0.005108 -0.002495 18 S -0.01968 -0.0049 -0.00122 0.0001311-0.0002711 -0.003731-0.0009289 19 S 0.01383 0.006117 0.002705 -0.001079 0.0007186 -0.02553 -0.01129 20 S -0.02126 -0.004772 -0.001071 0.0005231 -0.000123 -0.002506-0.0005625 21 S-0.0001211-4.312e-05-1.535e-05 -0-5.467e-06 0.0007212 0.0002568 22 S 0.0004332 0.0001542 5.492e-05 0 1.955e-05-0.0002745-9.773e-05 23 S 0 0 0 -0 0-2.196e-05-7.818e-06 0.0009288-0.0002276-0.0002006-0.0001507-0.0004615-0.0001842-0.0001701
from scipy import optimize
curvs = [2, 8, 9, 10, 11, 14, 15, 16, 17, 18]
dist = []
def merit(p):
p = list(p)
for i in curvs:
s[i].curvature = p.pop(0)
for i in dist:
s[i].distance = p.pop(0)
m = []
p = ParaxialTrace(s)
for h in 0., .7, 1.:
t2 = FullTrace(s)
t2.rays_paraxial_point(p, (h, 0), nrays=17,
distribution="tee", aim=False)
t2.propagate(clip=False)
y = t2.y[-1, :, :2]
m.extend((y - y.mean(axis=0)[None, :]).ravel())
return m
p0 = [s[i].curvature for i in curvs]
p0 += [s[i].distance for i in dist]
p, cov, ifo, msg, it = optimize.leastsq(merit, p0,
full_output=True, epsfcn=1e-6, maxfev=300)
print p, msg
merit(p)
None