%pylab inline
import numpy as np
import matplotlib.pyplot as plt
from rayopt import *
np.set_printoptions(precision=3)
Populating the interactive namespace from numpy and matplotlib
from sqlalchemy import func
l = Library.one()
q = l.session.query(library.Material
).filter(func.abs(library.Material.nd - 1.7725) < .0001
).filter(func.abs(library.Material.vd - 49.61) < .01)
for g in q:
print(g.name, g.catalog.source, g.catalog.name)
O_S-LAH66 oslo OHARA S-LAH66 oslo OHARA N-LAF34 oslo SCHOTT H_TAF1 oslo HOYA TAF1 oslo HOYA E-LASF016 oslo HIKARI K_ELASF016 oslo HIKARI K-LASFN7 oslo SUMITA K-LaSFn7 oslo SUMITA U_LASFN7 oslo SUMITA H-LAF50A oslo CDGM E-LASF016 zemax HIKARI H-LAF50A zemax CDGM N-LAF34 zemax SCHOTT
columns = "radius roc distance material".split()
text = """
30 50. 5. air
27 85. 2.04 HIKARI/E-SK16
15.2 16.45 8.32 air
17 61.18 1.7 HIKARI/E-LASF09
13 20.15 10.316 air
11 -204. 3.43 HIKARI/E-LAF02
11 -31.26 0.25 air
11 -27. 2.78 HIKARI/E-LASF016
8 11.48 4.93 HIKARI/E-SF10
8 -55.84 5.865 air
6 59.67 2.57 HIKARI/E-KF6
6 -14.2 1.41 HIKARI/E-LASF05
6 -76. 3.66 air
6 0 6.467 air
9 -1732 1.49 HIKARI/E-SF03
9 29.9 4.02 HIKARI/E-FK01
9 -21.55 .19 air
10 44.74 3.21 HIKARI/E-LAK7
10 -44.74 41.1 air
20 0 0 air
"""
s = system_from_text(text, columns, shifts={"distance": 1})
s.description = "Nikon AF DX Fisheye-Nikkor 10.5mm f/2.8G ED"
s.object = InfiniteConjugate(angle_deg=91., projection="equisolid",
pupil=dict(radius=10.5/2.8/2, aim=True))
s.fields = 0, .7, 1.
s.stop = 13
s.update()
print(s)
System: Nikon AF DX Fisheye-Nikkor 10.5mm f/2.8G ED Scale: 1.0 mm Wavelengths: 588, 656, 486 nm Fields: 0, 0.7, 1 Object: Semi-Angle: 91 deg Projection: equisolid Pupil: Pupil Distance: 20.9267 Refractive Index: 1.00028 Aim: True Radius: 1.875 Image: Radius: 20 Update Radius: True Pupil: Pupil Distance: -63.1559 Refractive Index: 1.00028 Update Radius: True Radius: 11.2843 Stop: 13 Elements: # T Distance Rad Curv Diameter Material n nd Vd 0 S 0 50 60 basic/air 1.000 1.000 89.30 1 S 5 85 54 HIKARI/E-SK16 1.620 1.620 60.29 2 S 2.04 16.45 30.4 basic/air 1.000 1.000 89.30 3 S 8.32 61.18 34 HIKARI/E-LASF09 1.816 1.816 46.62 4 S 1.7 20.15 26 basic/air 1.000 1.000 89.30 5 S 10.316 -204 22 HIKARI/E-LAF02 1.720 1.720 43.68 6 S 3.43 -31.26 22 basic/air 1.000 1.000 89.30 7 S 0.25 -27 22 HIKARI/E-LASF016 1.772 1.772 49.61 8 S 2.78 11.48 16 HIKARI/E-SF10 1.728 1.728 28.46 9 S 4.93 -55.84 16 basic/air 1.000 1.000 89.30 10 S 5.865 59.67 12 HIKARI/E-KF6 1.517 1.517 52.30 11 S 2.57 -14.2 12 HIKARI/E-LASF05 1.835 1.835 42.72 12 S 1.41 -76 12 basic/air 1.000 1.000 89.30 13 S 3.66 inf 12 basic/air 1.000 1.000 89.30 14 S 6.467 -1732 18 HIKARI/E-SF03 1.847 1.847 23.78 15 S 1.49 29.9 18 HIKARI/E-FK01 1.497 1.497 81.63 16 S 4.02 -21.55 18 basic/air 1.000 1.000 89.30 17 S 0.19 44.74 20 HIKARI/E-LAK7 1.652 1.652 58.54 18 S 3.21 -44.74 20 basic/air 1.000 1.000 89.30 19 S 41.1 inf 40 basic/air 1.000 1.000 89.30
/home/rj/work/nist/pyrayopt/rayopt/utils.py:56: RuntimeWarning: invalid value encountered in sqrt u1 = u/np.sqrt(1 - u2)
Analysis(s)
/home/rj/work/nist/pyrayopt/rayopt/utils.py:56: RuntimeWarning: invalid value encountered in sqrt u1 = u/np.sqrt(1 - u2) /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:497: RuntimeWarning: invalid value encountered in sqrt g = np.sqrt(np.square(d) - e*f) /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: Nikon AF DX Fisheye-Nikkor 10.5mm f/2.8G ED Scale: 1.0 mm Wavelengths: 588, 656, 486 nm Fields: 0, 0.7, 1 Object: Semi-Angle: 91 deg Projection: equisolid Pupil: Pupil Distance: 20.9267 Refractive Index: 1.00028 Aim: True Radius: 1.875 Image: Radius: 20 Update Radius: True Pupil: Pupil Distance: -63.1559 Refractive Index: 1.00028 Update Radius: True Radius: 11.2843 Stop: 13 Elements: # T Distance Rad Curv Diameter Material n nd Vd 0 S 0 50 60 basic/air 1.000 1.000 89.30 1 S 5 85 54 HIKARI/E-SK16 1.620 1.620 60.29 2 S 2.04 16.45 30.4 basic/air 1.000 1.000 89.30 3 S 8.32 61.18 34 HIKARI/E-LASF09 1.816 1.816 46.62 4 S 1.7 20.15 26 basic/air 1.000 1.000 89.30 5 S 10.316 -204 22 HIKARI/E-LAF02 1.720 1.720 43.68 6 S 3.43 -31.26 22 basic/air 1.000 1.000 89.30 7 S 0.25 -27 22 HIKARI/E-LASF016 1.772 1.772 49.61 8 S 2.78 11.48 16 HIKARI/E-SF10 1.728 1.728 28.46 9 S 4.93 -55.84 16 basic/air 1.000 1.000 89.30 10 S 5.865 59.67 12 HIKARI/E-KF6 1.517 1.517 52.30 11 S 2.57 -14.2 12 HIKARI/E-LASF05 1.835 1.835 42.72 12 S 1.41 -76 12 basic/air 1.000 1.000 89.30 13 S 3.66 inf 12 basic/air 1.000 1.000 89.30 14 S 6.467 -1732 18 HIKARI/E-SF03 1.847 1.847 23.78 15 S 1.49 29.9 18 HIKARI/E-FK01 1.497 1.497 81.63 16 S 4.02 -21.55 18 basic/air 1.000 1.000 89.30 17 S 0.19 44.74 20 HIKARI/E-LAK7 1.652 1.652 58.54 18 S 3.21 -44.74 20 basic/air 1.000 1.000 89.30 19 S 41.08 inf 40 basic/air 1.000 1.000 89.30 lagrange: nan track length: 62.648 object, image height: [ nan nan] front, back focal length (from PP): [ nan nan] entry, exit pupil height: [ nan nan] entry, exit pupil distance: [ nan nan] front, back focal distance: [ nan nan] front, back principal distance: [ nan nan] front, back nodal distance: [ nan nan] front, back numerical aperture: [ 0. 0.175] front, back f number: [ nan nan] front, back working f number: [ inf 2.864] front, back airy radius: [ inf 0.002] transverse, angular magnification: [ -0. nan] # T path n axial y axial nu chief y chief nu 0 S 0 1 1.875 0 nan 1 1 S 5 1.62 1.875 -0.01368 nan nan 2 S 7.04 1 1.858 0.05636 nan nan 3 S 15.36 1.816 2.327 0.02534 nan nan 4 S 17.06 1 2.35 0.1205 nan nan 5 S 27.38 1.72 3.593 0.1332 nan nan 6 S 30.81 1 3.858 0.04432 nan nan 7 S 31.06 1.772 3.869 0.155 nan nan 8 S 33.84 1.728 4.112 0.1708 nan nan 9 S 38.77 1 4.6 0.1109 nan nan 10 S 44.63 1.517 5.25 0.06537 nan nan 11 S 47.2 1.835 5.361 0.1852 nan nan 12 S 48.61 1 5.503 0.1248 nan nan 13 S 52.27 1 5.959 0.1248 nan nan 14 S 58.74 1.847 6.766 0.1281 nan nan 15 S 60.23 1.497 6.869 0.2084 nan nan 16 S 64.25 1 7.429 0.03717 nan nan 17 S 64.44 1.652 7.436 -0.07109 nan nan 18 S 67.65 1 7.298 -0.1773 nan nan 19 S 108.7 1 0.01171 -0.1773 nan nan # T SA3 CMA3 AST3 PTZ3 DIS3 TACHC TCHC 0 S nan nan nan nan nan nan nan 1 S nan nan nan nan nan nan nan 2 S nan nan nan nan nan nan nan 3 S nan nan nan nan nan nan nan 4 S nan nan nan nan nan nan nan 5 S nan nan nan nan nan nan nan 6 S nan nan nan nan nan nan nan 7 S nan nan nan nan nan nan nan 8 S nan nan nan nan nan nan nan 9 S nan nan nan nan nan nan nan 10 S nan nan nan nan nan nan nan 11 S nan nan nan nan nan nan nan 12 S nan nan nan nan nan nan nan 13 S nan nan nan nan nan nan nan 14 S nan nan nan nan nan nan nan 15 S nan nan nan nan nan nan nan 16 S nan nan nan nan nan nan nan 17 S nan nan nan nan nan nan nan 18 S nan nan nan nan nan nan nan 19 S nan nan nan nan nan nan nan nan nan nan nan nan nan nan
<rayopt.analysis.Analysis at 0x7f763037c940>
import copy
r = System(copy.deepcopy(s[:s.stop + 1]))
r.reverse()
#r.insert(0, Spheroid(material=air, radius=r[0].radius))
#r[1].distance = .1
r.stop = 0
r.object = FiniteConjugate(radius=r[r.stop].radius)
r.image = FiniteConjugate(radius=r[-1].radius)
r.update()
/home/rj/work/nist/pyrayopt/rayopt/pupils.py:90: RuntimeWarning: invalid value encountered in double_scalars return self.radius/self.distance /home/rj/work/nist/pyrayopt/rayopt/conjugates.py:135: RuntimeWarning: divide by zero encountered in double_scalars return self.radius/self.pupil.distance
r.plot(plt.gca())
print(str(r))
System: Scale: 1.0 mm Wavelengths: 588, 656, 486 nm Fields: 0 Object: Radius: 6 Pupil: Pupil Distance: 0 Refractive Index: 1.00028 Radius: 0 Image: Radius: 30 Pupil: Pupil Distance: -20.9267 Refractive Index: 1.00028 Radius: 0 Stop: 0 Elements: # T Distance Rad Curv Diameter Material n nd Vd 0 S 0 inf 12 basic/air 1.000 1.000 89.30 1 S 3.66 76 12 HIKARI/E-LASF05 1.835 1.835 42.72 2 S 1.41 14.2 12 HIKARI/E-KF6 1.517 1.517 52.30 3 S 2.57 -59.67 12 basic/air 1.000 1.000 89.30 4 S 5.865 55.84 16 HIKARI/E-SF10 1.728 1.728 28.46 5 S 4.93 -11.48 16 HIKARI/E-LASF016 1.772 1.772 49.61 6 S 2.78 27 22 basic/air 1.000 1.000 89.30 7 S 0.25 31.26 22 HIKARI/E-LAF02 1.720 1.720 43.68 8 S 3.43 204 22 basic/air 1.000 1.000 89.30 9 S 10.316 -20.15 26 HIKARI/E-LASF09 1.816 1.816 46.62 10 S 1.7 -61.18 34 basic/air 1.000 1.000 89.30 11 S 8.32 -16.45 30.4 HIKARI/E-SK16 1.620 1.620 60.29 12 S 2.04 -85 54 basic/air 1.000 1.000 89.30 13 S 5 -50 60 None nan nan nan
n, m = 31, 7
g = GeometricTrace(r)
y = np.linspace(-1, 1, n)*r[r.stop].radius
y = np.c_[0*y, y][:, None, :]
u = np.linspace(0, 1, m)*.43
u = np.r_[u, u + 1e-3]
u = np.c_[0*u, u][None, :, :]
y, u = np.broadcast_arrays(y, u)
y, u = y.reshape(-1, 2), u.reshape(-1, 2)
g.rays_given(y, u)
g.propagate(clip=True)
/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
fig, ax = plt.subplots(figsize=(10, 10))
r.plot(ax)
#g.plot(ax)
y = g.y[-1].reshape(n, 2, m, 3)
u = g.u[-1].reshape(n, 2, m, 3)
l = (y[:, 1, :, 1] - y[:, 0, :, 1])*u[:, 1, :, 2]
l += (y[:, 0, :, 2] - y[:, 1, :, 2])*u[:, 1, :, 1]
l /= u[:, 0, :, 1]*u[:, 1, :, 2] - u[:, 0, :, 2]*u[:, 1, :, 1]
i = r[-1].from_normal(y + l[:, None, :, None]*u) + r.origins[-1]
ax.plot(i[:, 0, :, 2], i[:, 0, :, 1], "r-");
ax.plot(i[n//2, 0, :, 2], i[n//2, 0, :, 1], "r.");
#i = np.r_[r[-1].from_normal(y) + r.origins[-1], i].reshape(2, -1, 3)
#ax.plot(i[:, :, 2], i[:, :, 1], "r-");