-
Notifications
You must be signed in to change notification settings - Fork 61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NA difference with Oslo #154
Comments
Hello @yohann95, from rayoptics.environment import * Create an empty model and fill in by scriptingopm = OpticalModel()
sm = opm['seq_model']
osp = opm['optical_spec']
pm = opm['parax_model']
em = opm['ele_model']
pt = opm['part_tree']
ar = opm['analysis_results'] opm.system_spec.dimensions = 'mm'
opm.radius_mode = True
osp['pupil'] = PupilSpec(osp, key=['object', 'epd'], value=2*12.)
osp['fov'] = FieldSpec(osp, key=['object', 'angle'], value=0.)
osp['wvls'] = WvlSpec([(800., 1.)], ref_wl=0)
sm.gaps[0].thi=1e10
sm.add_surface([1e10, 0.])
sm.set_stop()
sm.add_surface([11.325, 9.45, 1.755])
sm.ifcs[sm.cur_surface].profile = EvenPolynomial(
r=11.325,cc=-0.63,coefs=[0., 5.0056e-06, -2.968e-08, -2.3959e-10, -6.0923e-13])
sm.add_surface([1e10, 9.6154])
opm.update_model() layout_plt = plt.figure(FigureClass=InteractiveLayout, opt_model=opm, is_dark=False).plot() listobj(osp)
pm.first_order_data()
pm.list_model()
ray-optics NA calculationThe paraxial slope in image space is 0.8, in agreement with Oslo. The NA is defined as NA = n sin(theta) ray-optics calculates the (paraxial) NA by converting the slope to an angle and taking the sine of that. For high NA systems, such as yours, the sine and tangent differ substantially. slope = pm.ax[-1][mc.slp]
angle = math.atan(slope)
NA = math.sin(angle)
print(f"{slope=:8.4f} {angle=:8.4f} {NA=:8.4f}")
While this may have some logic to it, it may not be right. I did a quick bookshelf survey and Shannon clearly states paraxial NA = n * slp I'll change ray-optics to match OSLO's and Shannon's definition of paraxial NA. Real ray NATo calculate the real ray NA, trace an axial marginal ray. f0 = osp['fov'].fields[0]
wvl = osp['wvls'].central_wvl
marg_ray, err = trace_ray(opm, [0, 1], f0, wvl,
output_filter=None, rayerr_filter=None)
list_ray(marg_ray)
The "real" NA is the sine of the image space marginal ray angle. For the axial marginal ray, this is equal to the M direction consine. print(f"real ray NA={marg_ray.ray[-1].d[1]:8.4f}")
The transverse ray aberration curves show high order coma, so the system isn't aplanatic. ta_plt = plt.figure(FigureClass=RayFanFigure, opt_model=opm, data_type='Ray',
scale_type=Fit.All_Same, dpi=130).plot() Hope this helps. Feel free to ask further questions. Mike Hayford |
Hello Mike, |
Hello Mike,
First thank you for your return by email. I ask my next question here.
I have noticed a big difference between the NA given by ray-optics and given by Oslo for high NA aspheric lenses. I the example here, Oslo gives 0.8 and ray-optics gives 0.67. What is the reason for that ?
from rayoptics.environment import OpticalModel, PupilSpec, FieldSpec, WvlSpec, EvenPolynomial
opm = OpticalModel()
opm.system_spec.dimensions = 'mm'
opm.radius_mode = True
sm = opm['seq_model']
osp = opm['optical_spec']
pm = opm['parax_model']
ar = opm['analysis_results']
osp['pupil'] = PupilSpec(osp, key=['object', 'epd'], value=2*12.)
osp['fov'] = FieldSpec(osp, key=['object', 'angle'], value=0.)
osp['wvls'] = WvlSpec([(800., 1.)], ref_wl=0)
sm.gaps[0].thi=1e10
sm.add_surface([1e10, 0.])
sm.set_stop()
sm.add_surface([11.325, 9.45, 1.755])
sm.ifcs[sm.cur_surface].profile = EvenPolynomial(
r=11.325,cc=-0.63,coefs=[0., 5.0056e-06, -2.968e-08, -2.3959e-10, -6.0923e-13])
sm.add_surface([1e10, 9.6154])
opm.update_model()
print('NA = %.3f'%abs(ar['parax_data'].fod.img_na))
The text was updated successfully, but these errors were encountered: