{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Optical Prescription Report\n", "\n", "Optiland features a powerful, automated **Prescription Report Generator** that automatically extracts and formats system properties, surface geometry, materials, and aberrations into standard professional reports." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optional Dependencies\n", "\n", "To use all rendering options of the prescription generator, you must install the optional dependencies:\n", "- **All Features** (Console and PDF): `pip install optiland[prescription]`\n", "- **Console-only** (Requires `rich`): `pip install optiland[prescription-console]`\n", "- **PDF-only** (Requires `reportlab`): `pip install optiland[prescription-pdf]`" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from optiland.samples.objectives import CookeTriplet\n", "from optiland.prescription import Prescription" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading a Sample System\n", "\n", "Let's load the classic Cooke Triplet objective lens sample system." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "lens = CookeTriplet()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Printing the Prescription to the Console\n", "\n", "To view the report instantly inside your console or terminal, use the `.view()` method. This utilizes the `rich` library to draw clean, beautifully formatted tables and sections." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\n", "│ Optical Prescription — Unnamed System │\n", "╰──────────────────────────────────────── Generated: 2026-05-20 15:35 UTC ────────────────────────────────────────╯\n", "\n" ], "text/plain": [ "\u001b[48;5;18m╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m\n", "\u001b[48;5;18m│\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription — Unnamed System\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m│\u001b[0m\n", "\u001b[48;5;18m╰─\u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m Generated: 2026-05-20 15:35 UTC \u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m─╯\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────────── System Overview ─────────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────────── \u001b[0m\u001b[1mSystem Overview\u001b[0m\u001b[92m ─────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" Name (unnamed) \n",
" Surfaces 6 \n",
" Stop Surface 4.0000 \n",
" Aperture Type EPDAperture \n",
" Aperture Value 10.0000 \n",
" Object Distance ∞ \n",
" Image Distance 42.2078 \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mName \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m(unnamed) \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mSurfaces \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m6 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mStop Surface \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m4.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mAperture Type \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37mEPDAperture\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mAperture Value \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mObject Distance\u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m∞ \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mImage Distance \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m42.2078 \u001b[0m\u001b[37m \u001b[0m \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" Wavelengths\n",
"\n"
],
"text/plain": [
"\u001b[1m Wavelengths\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" \n",
" # Wavelength (µm) Primary \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 1 0.4800 \n",
" 2 0.5500 ✓ \n",
" 3 0.6500 \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[1;35m \u001b[0m\u001b[1;35m#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mWavelength (µm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mPrimary\u001b[0m\u001b[1;35m \u001b[0m \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 1 0.4800 \n",
" \u001b[2m \u001b[0m\u001b[2m2\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.5500 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m✓ \u001b[0m\u001b[2m \u001b[0m \n",
" 3 0.6500 \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" Fields\n",
"\n"
],
"text/plain": [
"\u001b[1m Fields\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
" \n",
" # Type X Y Weight \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 1 AngleField 0.0000 0.0000 1.0000 \n",
" 2 AngleField 0.0000 14.0000 1.0000 \n",
" 3 AngleField 0.0000 20.0000 1.0000 \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[1;35m \u001b[0m\u001b[1;35m#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mType \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mX \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mY \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mWeight\u001b[0m\u001b[1;35m \u001b[0m \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 1 AngleField 0.0000 0.0000 1.0000 \n",
" \u001b[2m \u001b[0m\u001b[2m2\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mAngleField\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m14.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000\u001b[0m\u001b[2m \u001b[0m \n",
" 3 AngleField 0.0000 20.0000 1.0000 \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"───────────────────────────────────────────── First-Order Properties ──────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m ──────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" Effective Focal Length (EFL) 49.9998 \n",
" Front Focal Length (FFL) -49.9998 \n",
" Back Focal Length (BFL) 0.2071 \n",
" Front Principal Plane (P1) 12.6541 \n",
" Back Principal Plane (P2) -49.7927 \n",
" Front Nodal Plane (N1) 12.6541 \n",
" Back Nodal Plane (N2) -49.7927 \n",
" Image-Space F/# 5.0000 \n",
" Entrance Pupil Diameter 10.0000 \n",
" Entrance Pupil Location 11.5122 \n",
" Exit Pupil Diameter 10.2337 \n",
" Exit Pupil Location -50.9613 \n",
" Transverse Magnification -0.0000 \n",
" Lagrange Invariant -1.8199 \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mEffective Focal Length (EFL)\u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m49.9998 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mFront Focal Length (FFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.9998\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mBack Focal Length (BFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m0.2071 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mFront Principal Plane (P1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mBack Principal Plane (P2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mFront Nodal Plane (N1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mBack Nodal Plane (N2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mImage-Space F/# \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m5.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m11.5122 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.2337 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-50.9613\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mTransverse Magnification \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-0.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mLagrange Invariant \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-1.8199 \u001b[0m\u001b[37m \u001b[0m \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"───────────────────────────────────────────── Surface Data — Geometry ─────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mSurface Data — Geometry\u001b[0m\u001b[92m ─────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" S# Type Radius (mm) Thickness (mm) Conic Stop Comment \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 0 Plane ∞ ∞ — \n",
" 1 standard 22.0136 3.2590 0.0000 \n",
" 2 standard -435.7604 6.0076 0.0000 \n",
" 3 standard -22.2133 1.0000 0.0000 \n",
" 4 standard 20.2919 4.7504 0.0000 ✓ \n",
" 5 standard 79.6836 2.9521 0.0000 \n",
" 6 standard -18.3953 42.2078 0.0000 \n",
" 7 standard ∞ 0.0000 — \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[1;35m \u001b[0m\u001b[1;35mS#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mType \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mRadius (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mThickness (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mConic \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mStop\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mComment\u001b[0m\u001b[1;35m \u001b[0m \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 0 Plane ∞ ∞ — \n",
" \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m22.0136 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m3.2590 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" 2 standard -435.7604 6.0076 0.0000 \n",
" \u001b[2m \u001b[0m\u001b[2m3 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-22.2133 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" 4 standard 20.2919 4.7504 0.0000 ✓ \n",
" \u001b[2m \u001b[0m\u001b[2m5 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m79.6836 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m2.9521 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" 6 standard -18.3953 42.2078 0.0000 \n",
" \u001b[2m \u001b[0m\u001b[2m7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m∞ \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"──────────────────────────────────────────── Surface Data — Materials ─────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m──────────────────────────────────────────── \u001b[0m\u001b[1mSurface Data — Materials\u001b[0m\u001b[92m ─────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" S# Material nd Vd Semi-Diameter (mm) Coating \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 0 Air 1.0000 — — — \n",
" 1 SK16 1.6204 60.2809 — — \n",
" 2 Air 1.0000 — — — \n",
" 3 F2 1.6200 36.3665 — — \n",
" 4 Air 1.0000 — — — \n",
" 5 SK16 1.6204 60.2809 — — \n",
" 6 Air 1.0000 — — — \n",
" 7 Air 1.0000 — — — \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[1;35m \u001b[0m\u001b[1;35mS#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mMaterial\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mnd \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mVd \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSemi-Diameter (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mCoating\u001b[0m\u001b[1;35m \u001b[0m \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 0 Air 1.0000 — — — \n",
" \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mSK16 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.6204\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m60.2809\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n",
" 2 Air 1.0000 — — — \n",
" \u001b[2m \u001b[0m\u001b[2m3 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mF2 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.6200\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m36.3665\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n",
" 4 Air 1.0000 — — — \n",
" \u001b[2m \u001b[0m\u001b[2m5 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mSK16 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.6204\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m60.2809\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n",
" 6 Air 1.0000 — — — \n",
" \u001b[2m \u001b[0m\u001b[2m7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mAir \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"───────────────────────────────────────── Seidel Aberration Coefficients ──────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────── \u001b[0m\u001b[1mSeidel Aberration Coefficients\u001b[0m\u001b[92m ──────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" S# SI (Sph) SII (Coma) SIII (Astig) SIV (Petz) SV (Dist) CL (LCA) CT (TCA) \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 1 -0.013855 -0.010591 -0.008096 -0.057727 -0.050318 -0.014412 -0.011017 \n",
" 2 -0.011256 0.035011 -0.108897 -0.002916 0.347781 -0.010088 0.031376 \n",
" 3 0.052115 -0.081389 0.127106 0.057268 -0.287939 0.031745 -0.049577 \n",
" 4 0.024135 0.043874 0.079756 0.062690 0.258946 0.021172 0.038488 \n",
" 5 -0.004080 -0.016132 -0.063784 -0.015948 -0.315255 -0.006189 -0.024472 \n",
" 6 -0.054020 0.030462 -0.017178 -0.069082 0.048643 -0.017462 0.009847 \n",
" Total -0.006960 0.001235 0.008907 -0.025716 0.001859 0.004767 -0.005356 \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[1;35m \u001b[0m\u001b[1;35mS# \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSI (Sph) \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSII (Coma)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSIII (Astig)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSIV (Petz)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mSV (Dist)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mCL (LCA) \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mCT (TCA) \u001b[0m\u001b[1;35m \u001b[0m \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 1 -0.013855 -0.010591 -0.008096 -0.057727 -0.050318 -0.014412 -0.011017 \n",
" \u001b[2m \u001b[0m\u001b[2m2 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.011256\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.035011 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.108897 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.002916 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.347781 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.010088\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.031376 \u001b[0m\u001b[2m \u001b[0m \n",
" 3 0.052115 -0.081389 0.127106 0.057268 -0.287939 0.031745 -0.049577 \n",
" \u001b[2m \u001b[0m\u001b[2m4 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.024135 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.043874 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.079756 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.062690 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.258946 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.021172 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.038488 \u001b[0m\u001b[2m \u001b[0m \n",
" 5 -0.004080 -0.016132 -0.063784 -0.015948 -0.315255 -0.006189 -0.024472 \n",
" \u001b[2m \u001b[0m\u001b[2m6 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.054020\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.030462 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.017178 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.069082 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.048643 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.017462\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.009847 \u001b[0m\u001b[2m \u001b[0m \n",
" Total -0.006960 0.001235 0.008907 -0.025716 0.001859 0.004767 -0.005356 \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"prescription = Prescription(lens)\n",
"prescription.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explaining Report Sections\n",
"\n",
"By default, the report generates five standard sections:\n",
"1. **System Overview**: General details, wavelengths, and field definitions.\n",
"2. **First-Order Properties**: Paraxial parameters (EFL, F-Number, magnification, pupil parameters).\n",
"3. **Surface Data - Geometry**: Radii of curvature, thicknesses, stop designations, and conic constants.\n",
"4. **Surface Data - Materials**: Material names and corresponding refractive indices ($n_d$, $V_d$).\n",
"5. **Seidel Aberration Coefficients**: Monochromatic and chromatic Seidel aberrations per surface and system totals.\n",
"\n",
"### Customizing Sections\n",
"You can customize and re-order the sections included in your report by passing a list of section instances to the `Prescription` constructor:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\n", "│ Optical Prescription — Unnamed System │\n", "╰──────────────────────────────────────── Generated: 2026-05-20 15:35 UTC ────────────────────────────────────────╯\n", "\n" ], "text/plain": [ "\u001b[48;5;18m╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m\n", "\u001b[48;5;18m│\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription — Unnamed System\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m│\u001b[0m\n", "\u001b[48;5;18m╰─\u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m Generated: 2026-05-20 15:35 UTC \u001b[0m\u001b[48;5;18m───────────────────────────────────────\u001b[0m\u001b[48;5;18m─╯\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
───────────────────────────────────────────── First-Order Properties ──────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m ──────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" Effective Focal Length (EFL) 49.9998 \n",
" Front Focal Length (FFL) -49.9998 \n",
" Back Focal Length (BFL) 0.2071 \n",
" Front Principal Plane (P1) 12.6541 \n",
" Back Principal Plane (P2) -49.7927 \n",
" Front Nodal Plane (N1) 12.6541 \n",
" Back Nodal Plane (N2) -49.7927 \n",
" Image-Space F/# 5.0000 \n",
" Entrance Pupil Diameter 10.0000 \n",
" Entrance Pupil Location 11.5122 \n",
" Exit Pupil Diameter 10.2337 \n",
" Exit Pupil Location -50.9613 \n",
" Transverse Magnification -0.0000 \n",
" Lagrange Invariant -1.8199 \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mEffective Focal Length (EFL)\u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m49.9998 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mFront Focal Length (FFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.9998\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mBack Focal Length (BFL) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m0.2071 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mFront Principal Plane (P1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mBack Principal Plane (P2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mFront Nodal Plane (N1) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m12.6541 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mBack Nodal Plane (N2) \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-49.7927\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mImage-Space F/# \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m5.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mEntrance Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m11.5122 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Diameter \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m10.2337 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mExit Pupil Location \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-50.9613\u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mTransverse Magnification \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-0.0000 \u001b[0m\u001b[37m \u001b[0m \n",
" \u001b[2;36m \u001b[0m\u001b[2;36mLagrange Invariant \u001b[0m\u001b[2;36m \u001b[0m \u001b[37m \u001b[0m\u001b[37m-1.8199 \u001b[0m\u001b[37m \u001b[0m \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"───────────────────────────────────────────── Surface Data — Geometry ─────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[92m───────────────────────────────────────────── \u001b[0m\u001b[1mSurface Data — Geometry\u001b[0m\u001b[92m ─────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n",
" S# Type Radius (mm) Thickness (mm) Conic Stop Comment \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 0 Plane ∞ ∞ — \n",
" 1 standard 22.0136 3.2590 0.0000 \n",
" 2 standard -435.7604 6.0076 0.0000 \n",
" 3 standard -22.2133 1.0000 0.0000 \n",
" 4 standard 20.2919 4.7504 0.0000 ✓ \n",
" 5 standard 79.6836 2.9521 0.0000 \n",
" 6 standard -18.3953 42.2078 0.0000 \n",
" 7 standard ∞ 0.0000 — \n",
" \n",
"\n"
],
"text/plain": [
" \n",
" \u001b[1;35m \u001b[0m\u001b[1;35mS#\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mType \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mRadius (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mThickness (mm)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mConic \u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mStop\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mComment\u001b[0m\u001b[1;35m \u001b[0m \n",
" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ \n",
" 0 Plane ∞ ∞ — \n",
" \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m22.0136 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m3.2590 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" 2 standard -435.7604 6.0076 0.0000 \n",
" \u001b[2m \u001b[0m\u001b[2m3 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-22.2133 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" 4 standard 20.2919 4.7504 0.0000 ✓ \n",
" \u001b[2m \u001b[0m\u001b[2m5 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m79.6836 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m2.9521 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" 6 standard -18.3953 42.2078 0.0000 \n",
" \u001b[2m \u001b[0m\u001b[2m7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mstandard\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m∞ \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m— \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n",
" \n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from optiland.prescription.sections import FirstOrderSection, SurfaceGeometryTableSection\n",
"\n",
"# Create a prescription containing only first-order and surface geometry data\n",
"custom_sections = [\n",
" FirstOrderSection(),\n",
" SurfaceGeometryTableSection()\n",
"]\n",
"\n",
"custom_prescription = Prescription(lens, sections=custom_sections)\n",
"custom_prescription.view()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saving and Exporting Reports\n",
"\n",
"You can save the report to a file using the `.save(path)` method. The file output format is automatically inferred from the file extension:\n",
"- **Plain Text (`.txt`, `.log`, etc.)**: Renders standard plain-text tables.\n",
"- **PDF (`.pdf`)**: Generates a professional PDF document."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Export as plain-text\n",
"prescription.save(\"cooke_triplet_prescription.txt\")\n",
"\n",
"# Export as a formatted PDF document\n",
"prescription.save(\"cooke_triplet_prescription.pdf\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}