{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial 1b: Lens Properties and Prescription Reports\n", "\n", "Consolidating paraxial metrics, first-order calculations, and generating console and PDF prescription reports.\n" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "nbsphinx-toctree" ] }, "source": [ "### May 2024" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial describes how to retrieve common optical properties from a lens in Optiland, including:\n", "\n", "- Front and back focal length\n", "- Front and back, principle, focal, and nodal plane locations\n", "- Aperture information, such as F-Number, entrance or exit pupil diameter, etc.\n", "- Locations of entrance/exit pupils\n", "- Optical invariant\n", "- Marginal/chief rays" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:04.267133Z", "iopub.status.busy": "2026-03-24T10:12:04.266739Z", "iopub.status.idle": "2026-03-24T10:12:07.396879Z", "shell.execute_reply": "2026-03-24T10:12:07.396328Z" } }, "outputs": [], "source": [ "from optiland.samples.objectives import CookeTriplet" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:07.398665Z", "iopub.status.busy": "2026-03-24T10:12:07.398410Z", "iopub.status.idle": "2026-03-24T10:12:07.431065Z", "shell.execute_reply": "2026-03-24T10:12:07.430679Z" } }, "outputs": [], "source": [ "lens = CookeTriplet()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:07.433161Z", "iopub.status.busy": "2026-03-24T10:12:07.432942Z", "iopub.status.idle": "2026-03-24T10:12:08.146831Z", "shell.execute_reply": "2026-03-24T10:12:08.146467Z" } }, "outputs": [ { "data": { "text/plain": [ "(
, )" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lens.draw()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:08.148803Z", "iopub.status.busy": "2026-03-24T10:12:08.148639Z", "iopub.status.idle": "2026-03-24T10:12:08.156797Z", "shell.execute_reply": "2026-03-24T10:12:08.156035Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Front focal length: -50.0 mm\n", "Focal length: 50.0 mm\n", "Front focal point: -37.3 mm\n", "Back focal point: 0.2 mm\n", "Front principal plane: 12.7 mm\n", "Back principal plane: -49.8 mm\n", "Front nodal plane: 12.7 mm\n", "Back nodal plane: -49.8 mm\n" ] } ], "source": [ "print(f\"Front focal length: {lens.paraxial.f1():.1f} mm\")\n", "print(f\"Focal length: {lens.paraxial.f2():.1f} mm\")\n", "print(f\"Front focal point: {lens.paraxial.F1():.1f} mm\")\n", "print(f\"Back focal point: {lens.paraxial.F2():.1f} mm\")\n", "print(f\"Front principal plane: {lens.paraxial.P1():.1f} mm\")\n", "print(f\"Back principal plane: {lens.paraxial.P2():.1f} mm\")\n", "print(f\"Front nodal plane: {lens.paraxial.N1():.1f} mm\")\n", "print(f\"Back nodal plane: {lens.paraxial.N2():.1f} mm\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Regarding cardinal points, Optiland defines object space quantities relative to the first lens surface (index 1) and image space quantities relative to the image surface. This applies to the pupil locations too: `EPL()` is relative to surface 1 and `XPL()` is relative to the image surface. If you need the entrance pupil as a global z coordinate, use `lens.paraxial.entrance_pupil_z()`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:08.159012Z", "iopub.status.busy": "2026-03-24T10:12:08.158750Z", "iopub.status.idle": "2026-03-24T10:12:08.162412Z", "shell.execute_reply": "2026-03-24T10:12:08.162061Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Entrance pupil diameter: 10.0 mm\n", "Exit pupil diameter: 10.2 mm\n" ] } ], "source": [ "print(f\"Entrance pupil diameter: {lens.paraxial.EPD():.1f} mm\")\n", "print(f\"Exit pupil diameter: {lens.paraxial.XPD():.1f} mm\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:08.163901Z", "iopub.status.busy": "2026-03-24T10:12:08.163757Z", "iopub.status.idle": "2026-03-24T10:12:08.167749Z", "shell.execute_reply": "2026-03-24T10:12:08.167394Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Entrance pupil position: 11.5 mm\n", "Exit pupil position: -51.0 mm\n" ] } ], "source": [ "print(f\"Entrance pupil position: {lens.paraxial.EPL():.1f} mm\")\n", "print(f\"Exit pupil position: {lens.paraxial.XPL():.1f} mm\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Magnification is generally computed for finite objects and not for systems like the one we're analyzing here. We compute it only as an illustration." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:08.169312Z", "iopub.status.busy": "2026-03-24T10:12:08.169171Z", "iopub.status.idle": "2026-03-24T10:12:08.175123Z", "shell.execute_reply": "2026-03-24T10:12:08.174726Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Image-space F-Number: 5.0\n", "Magnification: -0.0\n", "Invariant: -1.820\n" ] } ], "source": [ "print(f\"Image-space F-Number: {lens.paraxial.FNO():.1f}\")\n", "print(f\"Magnification: {lens.paraxial.magnification():.1f}\")\n", "print(f\"Invariant: {lens.paraxial.invariant():.3f}\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:08.176453Z", "iopub.status.busy": "2026-03-24T10:12:08.176294Z", "iopub.status.idle": "2026-03-24T10:12:08.179409Z", "shell.execute_reply": "2026-03-24T10:12:08.179081Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Marginal Ray: \n", "\tSurface 0: y = 5.000, u = 0.000\n", "\tSurface 1: y = 5.000, u = -0.087\n", "\tSurface 2: y = 4.716, u = -0.148\n", "\tSurface 3: y = 3.826, u = -0.025\n", "\tSurface 4: y = 3.801, u = 0.076\n", "\tSurface 5: y = 4.162, u = 0.027\n", "\tSurface 6: y = 4.242, u = -0.100\n", "\tSurface 7: y = 0.021, u = -0.100\n" ] } ], "source": [ "print(\"Marginal Ray: \")\n", "\n", "ya, ua = lens.paraxial.marginal_ray()\n", "for k in range(len(ya)):\n", " print(f\"\\tSurface {k}: y = {ya[k, 0]:.3f}, u = {ua[k, 0]:.3f}\")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:12:08.180724Z", "iopub.status.busy": "2026-03-24T10:12:08.180571Z", "iopub.status.idle": "2026-03-24T10:12:08.185045Z", "shell.execute_reply": "2026-03-24T10:12:08.184691Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Chief Ray: \n", "\tSurface 0: y = -4.190, u = 0.364\n", "\tSurface 1: y = -4.190, u = 0.297\n", "\tSurface 2: y = -3.221, u = 0.487\n", "\tSurface 3: y = -0.295, u = 0.295\n", "\tSurface 4: y = -0.000, u = 0.479\n", "\tSurface 5: y = 2.275, u = 0.284\n", "\tSurface 6: y = 3.113, u = 0.356\n", "\tSurface 7: y = 18.125, u = 0.356\n" ] } ], "source": [ "print(\"Chief Ray: \")\n", "\n", "yb, ub = lens.paraxial.chief_ray()\n", "for k in range(len(yb)):\n", " print(f\"\\tSurface {k}: y = {yb[k, 0]:.3f}, u = {ub[k, 0]:.3f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n## Part 2: Prescription Generator\n\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "a1000002", "metadata": {}, "outputs": [], "source": [ "from optiland.prescription import Prescription\n", "from optiland.samples.objectives import CookeTriplet" ] }, { "cell_type": "markdown", "id": "a1000003", "metadata": {}, "source": [ "## 1. What is a prescription?\n", "\n", "A prescription summarises an optical system across five sections:\n", "\n", "| Section | Contents |\n", "|---|---|\n", "| **System Overview** | Name, aperture type, fields, wavelengths |\n", "| **First-Order Properties** | EFL, BFL, FFL, magnification, NAs, pupil positions |\n", "| **Surface Geometry Table** | Radius, conic, thickness, aperture stop flag for every surface |\n", "| **Surface Material Table** | Material name, nd, Abbe number, type for every surface |\n", "| **Seidel Aberrations** | W040, W131, W222, W220, W311 and their totals |" ] }, { "cell_type": "markdown", "id": "a1000004", "metadata": {}, "source": [ "## 2. Generating a prescription for a sample lens\n", "\n", "`Prescription(lens).view()` prints a Rich-formatted table to the console.\n", "This requires the optional `rich` package (`pip install rich`)." ] }, { "cell_type": "code", "execution_count": 2, "id": "a1000005", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n",
                            "\u2502 Optical Prescription \u2014 Unnamed System                                                                           \u2502\n",
                            "\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Generated: 2026-05-22 14:59 UTC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n",
                            "
\n" ], "text/plain": [ "\u001b[48;5;18m\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u001b[0m\n", "\u001b[48;5;18m\u2502\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription \u2014 Unnamed System\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m\u2502\u001b[0m\n", "\u001b[48;5;18m\u2570\u2500\u001b[0m\u001b[48;5;18m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[48;5;18m Generated: 2026-05-22 14:59 UTC \u001b[0m\u001b[48;5;18m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[48;5;18m\u2500\u256f\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 System Overview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSystem Overview\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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   \u221e            \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\u221e \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 (\u00b5m)   Primary  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  1   0.4800                     \n",
                            "  2   0.5500            \u2713        \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 (\u00b5m)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mPrimary\u001b[0m\u001b[1;35m \u001b[0m \n", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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\u2713 \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",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 First-Order Properties \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Surface Data \u2014 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSurface Data \u2014 Geometry\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                          \n",
                            "  S#   Type       Radius (mm)   Thickness (mm)   Conic    Stop   Comment  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  0    Plane      \u221e             \u221e                \u2014                        \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   \u2713               \n",
                            "  5    standard   79.6836       2.9521           0.0000                   \n",
                            "  6    standard   -18.3953      42.2078          0.0000                   \n",
                            "  7    standard   \u221e             0.0000           \u2014                        \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 0 Plane \u221e \u221e \u2014 \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 \u2713 \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\u221e \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\u2014 \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": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Surface Data \u2014 Materials \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSurface Data \u2014 Materials\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                   \n",
                            "  S#   Material   nd       Vd        Semi-Diameter (mm)   Coating  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  0    Air        1.0000   \u2014         \u2014                    \u2014        \n",
                            "  1    SK16       1.6204   60.2809   \u2014                    \u2014        \n",
                            "  2    Air        1.0000   \u2014         \u2014                    \u2014        \n",
                            "  3    F2         1.6200   36.3665   \u2014                    \u2014        \n",
                            "  4    Air        1.0000   \u2014         \u2014                    \u2014        \n",
                            "  5    SK16       1.6204   60.2809   \u2014                    \u2014        \n",
                            "  6    Air        1.0000   \u2014         \u2014                    \u2014        \n",
                            "  7    Air        1.0000   \u2014         \u2014                    \u2014        \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 0 Air 1.0000 \u2014 \u2014 \u2014 \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\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \n", " 2 Air 1.0000 \u2014 \u2014 \u2014 \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\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \n", " 4 Air 1.0000 \u2014 \u2014 \u2014 \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\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \n", " 6 Air 1.0000 \u2014 \u2014 \u2014 \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\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Seidel Aberration Coefficients \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSeidel Aberration Coefficients\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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": [ "lens = CookeTriplet()\n", "\n", "p = Prescription(lens)\n", "p.view()" ] }, { "cell_type": "markdown", "id": "a1000006", "metadata": {}, "source": [ "## 3. Prescription output fields \u2014 the Document model\n", "\n", "`Prescription.build()` returns a `Document` object without printing anything.\n", "You can inspect each section programmatically." ] }, { "cell_type": "code", "execution_count": 3, "id": "a1000007", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Document title : Optical Prescription \u2014 Unnamed System\n", "Generated at : 2026-05-22 14:59 UTC\n", "Number of sections: 5\n", " Section: 'System Overview'\n", " Section: 'First-Order Properties'\n", " Section: 'Surface Data \u2014 Geometry'\n", " Section: 'Surface Data \u2014 Materials'\n", " Section: 'Seidel Aberration Coefficients'\n" ] } ], "source": [ "doc = p.build()\n", "\n", "print(\"Document title :\", doc.title)\n", "print(\"Generated at :\", doc.generated_at)\n", "print(\"Number of sections:\", len(doc.sections))\n", "\n", "for section in doc.sections:\n", " print(f\" Section: {section.title!r}\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "a1000008", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Section: First-Order Properties\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" ] } ], "source": [ "# Inspect the first-order properties section (KeyValueBlock rows)\n", "first_order_section = doc.sections[1]\n", "print(f\"Section: {first_order_section.title}\")\n", "for block in first_order_section.blocks:\n", " if hasattr(block, \"rows\"): # KeyValueBlock\n", " for label, value in block.rows:\n", " print(f\" {label}: {value}\")" ] }, { "cell_type": "markdown", "id": "a1000009", "metadata": {}, "source": [ "## 4. Saving to plain text\n", "\n", "`Prescription.save(path)` infers the renderer from the file extension.\n", "Any extension other than `.pdf` produces a plain-text report." ] }, { "cell_type": "code", "execution_count": 5, "id": "a1000010", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n", " OPTICAL PRESCRIPTION \u2014 UNNAMED SYSTEM\n", " Generated: 2026-05-22 14:59 UTC\n", "\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n", "\n", "\u250c\u2500 System Overview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n", " Name (unnamed)\n", " Surfaces 6\n", " Stop Surface 4.0000\n", " Aperture Type EPDAperture\n", " Aperture Value 10.0000\n", " Object Distance \u221e\n", " Image Distance 42.2078\n", "\n", " Wavelengths\n", " # Wavelength (\u00b5m) Primary\n", " \u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", " 1 0.4800 \n", " 2 0.5500 \u2713 \n", " 3 0.6500 \n", "\n", " Fields\n", " # Type X Y Weight\n", " \u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2500\u2500\u2500\u2500\u2500\u2500\n", " 1 AngleField 0.0000 0.0000 1.0000\n", " 2\n" ] } ], "source": [ "p.save(\"cooke_triplet.txt\")\n", "\n", "# Verify the file was written \n", "with open(\"cooke_triplet.txt\", \"r\", encoding=\"utf-8\") as f:\n", " content = f.read()\n", "\n", "print(content[:800]) # print first 800 characters" ] }, { "cell_type": "markdown", "id": "a1000011", "metadata": {}, "source": [ "## 5. Exporting to PDF\n", "\n", "Pass a `.pdf` path to `save()`. This requires the `reportlab` package\n", "(`pip install reportlab`)." ] }, { "cell_type": "code", "execution_count": 6, "id": "a1000012", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PDF saved to cooke_triplet.pdf\n" ] } ], "source": [ "try:\n", " p.save(\"cooke_triplet.pdf\")\n", " print(\"PDF saved to cooke_triplet.pdf\")\n", "except ImportError:\n", " print(\"reportlab not installed \u2014 skipping PDF export.\")\n", " print(\"Install with: pip install reportlab\")" ] }, { "cell_type": "markdown", "id": "a1000013", "metadata": {}, "source": [ "## 6. Custom sections\n", "\n", "The `Prescription` constructor accepts an optional `sections` list. You can pass a subset of\n", "the default sections or combine built-in sections in any order." ] }, { "cell_type": "code", "execution_count": 7, "id": "a1000014", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n",
                            "\u2502 Optical Prescription \u2014 Unnamed System                                                                           \u2502\n",
                            "\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Generated: 2026-05-22 14:59 UTC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n",
                            "
\n" ], "text/plain": [ "\u001b[48;5;18m\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u001b[0m\n", "\u001b[48;5;18m\u2502\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription \u2014 Unnamed System\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m\u2502\u001b[0m\n", "\u001b[48;5;18m\u2570\u2500\u001b[0m\u001b[48;5;18m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[48;5;18m Generated: 2026-05-22 14:59 UTC \u001b[0m\u001b[48;5;18m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[48;5;18m\u2500\u256f\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 System Overview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSystem Overview\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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   \u221e            \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\u221e \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 (\u00b5m)   Primary  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  1   0.4800                     \n",
                            "  2   0.5500            \u2713        \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 (\u00b5m)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mPrimary\u001b[0m\u001b[1;35m \u001b[0m \n", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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\u2713 \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",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \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": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 First-Order Properties \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Surface Data \u2014 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSurface Data \u2014 Geometry\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                          \n",
                            "  S#   Type       Radius (mm)   Thickness (mm)   Conic    Stop   Comment  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  0    Plane      \u221e             \u221e                \u2014                        \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   \u2713               \n",
                            "  5    standard   79.6836       2.9521           0.0000                   \n",
                            "  6    standard   -18.3953      42.2078          0.0000                   \n",
                            "  7    standard   \u221e             0.0000           \u2014                        \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 0 Plane \u221e \u221e \u2014 \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 \u2713 \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\u221e \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\u2014 \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 import (\n", " FirstOrderSection,\n", " SurfaceGeometryTableSection,\n", " SystemOverviewSection,\n", ")\n", "\n", "# Minimal prescription: overview + first-order only\n", "p_minimal = Prescription(\n", " lens,\n", " sections=[SystemOverviewSection(), FirstOrderSection(), SurfaceGeometryTableSection()],\n", ")\n", "p_minimal.view()" ] }, { "cell_type": "markdown", "id": "a1000015", "metadata": {}, "source": [ "## 7. Custom prescription: user-defined lens\n", "\n", "Build a cemented doublet from scratch and read off key properties from the prescription." ] }, { "cell_type": "code", "execution_count": 8, "id": "a1000016", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n",
                            "\u2502 Optical Prescription \u2014 Achromatic Doublet f/4                                                                   \u2502\n",
                            "\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Generated: 2026-05-22 14:59 UTC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n",
                            "
\n" ], "text/plain": [ "\u001b[48;5;18m\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\u001b[0m\n", "\u001b[48;5;18m\u2502\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[1;37;48;5;18mOptical Prescription \u2014 Achromatic Doublet f/4\u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m \u001b[0m\u001b[48;5;18m\u2502\u001b[0m\n", "\u001b[48;5;18m\u2570\u2500\u001b[0m\u001b[48;5;18m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[48;5;18m Generated: 2026-05-22 14:59 UTC \u001b[0m\u001b[48;5;18m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\u001b[48;5;18m\u2500\u256f\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 System Overview \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSystem Overview\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                            \n",
                            "  Name              Achromatic Doublet f/4  \n",
                            "  Surfaces          3                       \n",
                            "  Stop Surface      1.0000                  \n",
                            "  Aperture Type     EPDAperture             \n",
                            "  Aperture Value    25.0000                 \n",
                            "  Object Distance   \u221e                       \n",
                            "  Image Distance    88.9120                 \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[37mAchromatic Doublet f/4\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[37m3 \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[37m1.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[37m25.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\u221e \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[37m88.9120 \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 (\u00b5m)   Primary  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  1   0.4861                     \n",
                            "  2   0.5876            \u2713        \n",
                            "  3   0.6563                     \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 (\u00b5m)\u001b[0m\u001b[1;35m \u001b[0m \u001b[1;35m \u001b[0m\u001b[1;35mPrimary\u001b[0m\u001b[1;35m \u001b[0m \n", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 1 0.4861 \n", " \u001b[2m \u001b[0m\u001b[2m2\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.5876 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2713 \u001b[0m\u001b[2m \u001b[0m \n", " 3 0.6563 \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",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  1   AngleField   0.0000   0.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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 1 AngleField 0.0000 0.0000 1.0000 \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 First-Order Properties \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mFirst-Order Properties\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                           \n",
                            "  Effective Focal Length (EFL)   92.8832   \n",
                            "  Front Focal Length (FFL)       -92.8832  \n",
                            "  Back Focal Length (BFL)        0.0000    \n",
                            "  Front Principal Plane (P1)     1.6107    \n",
                            "  Back Principal Plane (P2)      -92.8832  \n",
                            "  Front Nodal Plane (N1)         1.6107    \n",
                            "  Back Nodal Plane (N2)          -92.8832  \n",
                            "  Image-Space F/#                3.7153    \n",
                            "  Entrance Pupil Diameter        25.0000   \n",
                            "  Entrance Pupil Location        0.0000    \n",
                            "  Exit Pupil Diameter            25.4412   \n",
                            "  Exit Pupil Location            -94.5223  \n",
                            "  Transverse Magnification       -0.0000   \n",
                            "  Lagrange Invariant             -0.0000   \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[37m92.8832 \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-92.8832\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.0000 \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[37m1.6107 \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-92.8832\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[37m1.6107 \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-92.8832\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[37m3.7153 \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[37m25.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[37m0.0000 \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[37m25.4412 \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-94.5223\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-0.0000 \u001b[0m\u001b[37m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Surface Data \u2014 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSurface Data \u2014 Geometry\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                          \n",
                            "  S#   Type       Radius (mm)   Thickness (mm)   Conic    Stop   Comment  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  0    Plane      \u221e             \u221e                \u2014                        \n",
                            "  1    standard   61.5000       6.0000           0.0000   \u2713               \n",
                            "  2    standard   -44.6000      2.5000           0.0000                   \n",
                            "  3    standard   -129.0000     88.9120          0.0000                   \n",
                            "  4    standard   \u221e             0.0000           \u2014                        \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 0 Plane \u221e \u221e \u2014 \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[2m61.5000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m6.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\u2713 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m \u001b[0m\u001b[2m \u001b[0m \n", " 2 standard -44.6000 2.5000 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-129.0000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m88.9120 \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 \u221e 0.0000 \u2014 \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Surface Data \u2014 Materials \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSurface Data \u2014 Materials\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
                                                                   \n",
                            "  S#   Material   nd       Vd        Semi-Diameter (mm)   Coating  \n",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  0    Air        1.0000   \u2014         \u2014                    \u2014        \n",
                            "  1    N-BK7      1.5168   64.1673   \u2014                    \u2014        \n",
                            "  2    N-F2       1.6200   36.4309   \u2014                    \u2014        \n",
                            "  3    Air        1.0000   \u2014         \u2014                    \u2014        \n",
                            "  4    Air        1.0000   \u2014         \u2014                    \u2014        \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 0 Air 1.0000 \u2014 \u2014 \u2014 \n", " \u001b[2m \u001b[0m\u001b[2m1 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2mN-BK7 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m1.5168\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m64.1673\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \n", " 2 N-F2 1.6200 36.4309 \u2014 \u2014 \n", " \u001b[2m \u001b[0m\u001b[2m3 \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\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m\u2014 \u001b[0m\u001b[2m \u001b[0m \n", " 4 Air 1.0000 \u2014 \u2014 \u2014 \n", " \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Seidel Aberration Coefficients \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
                            "
\n" ], "text/plain": [ "\u001b[92m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u001b[0m\u001b[1mSeidel Aberration Coefficients\u001b[0m\u001b[92m \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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",
                            " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n",
                            "  1       -0.023577   0.000000     0.000000       -0.000000    0.000000    -0.026992   -0.000000  \n",
                            "  2       0.052430    0.000000     0.000000       0.000000     0.000000    0.067059    -0.000000  \n",
                            "  3       -0.065064   -0.000000    0.000000       -0.000000    0.000000    -0.057747   0.000000   \n",
                            "  Total   -0.036210   0.000000     0.000000       0.000000     0.000000    -0.017679   0.000000   \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", " \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n", " 1 -0.023577 0.000000 0.000000 -0.000000 0.000000 -0.026992 -0.000000 \n", " \u001b[2m \u001b[0m\u001b[2m2 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.052430 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.067059 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.000000\u001b[0m\u001b[2m \u001b[0m \n", " 3 -0.065064 -0.000000 0.000000 -0.000000 0.000000 -0.057747 0.000000 \n", " \u001b[2m \u001b[0m\u001b[2mTotal\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.036210\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m-0.017679\u001b[0m\u001b[2m \u001b[0m \u001b[2m \u001b[0m\u001b[2m0.000000 \u001b[0m\u001b[2m \u001b[0m \n", " \n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from optiland.optic import Optic\n", "\n", "doublet = Optic(name=\"Achromatic Doublet f/4\")\n", "doublet.surfaces.add(index=0, radius=float(\"inf\"), thickness=float(\"inf\"))\n", "doublet.surfaces.add(index=1, radius=61.5, thickness=6.0, material=\"N-BK7\", is_stop=True)\n", "doublet.surfaces.add(index=2, radius=-44.6, thickness=2.5, material=\"N-F2\")\n", "doublet.surfaces.add(index=3, radius=-129.0, thickness=0.0)\n", "doublet.surfaces.add(index=4) # image plane\n", "doublet.set_aperture(aperture_type=\"EPD\", value=25.0)\n", "doublet.fields.set_type(\"angle\")\n", "doublet.fields.add(y=0.0)\n", "doublet.wavelengths.add(value=0.4861) # F-line\n", "doublet.wavelengths.add(value=0.5876, is_primary=True) # d-line\n", "doublet.wavelengths.add(value=0.6563) # C-line\n", "doublet.updater.image_solve()\n", "\n", "Prescription(doublet).view()" ] }, { "cell_type": "code", "execution_count": 9, "id": "a1000017", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Section: First-Order Properties\n", " Effective Focal Length (EFL) : 92.8832\n", " Front Focal Length (FFL) : -92.8832\n", " Back Focal Length (BFL) : 0.0000\n", " Front Principal Plane (P1) : 1.6107\n", " Back Principal Plane (P2) : -92.8832\n", " Front Nodal Plane (N1) : 1.6107\n", " Back Nodal Plane (N2) : -92.8832\n", " Image-Space F/# : 3.7153\n", " Entrance Pupil Diameter : 25.0000\n", " Entrance Pupil Location : 0.0000\n", " Exit Pupil Diameter : 25.4412\n", " Exit Pupil Location : -94.5223\n", " Transverse Magnification : -0.0000\n", " Lagrange Invariant : -0.0000\n" ] } ], "source": [ "# Read off first-order properties programmatically\n", "doc = Prescription(doublet).build()\n", "fo_section = doc.sections[1] # FirstOrderSection\n", "\n", "print(f\"Section: {fo_section.title}\")\n", "for block in fo_section.blocks:\n", " if hasattr(block, \"rows\"):\n", " for label, value in block.rows:\n", " print(f\" {label:30s}: {value}\")" ] }, { "cell_type": "markdown", "id": "a1000018", "metadata": {}, "source": [ "## Conclusion\n", "\n", "In this tutorial you learned how to:\n", "\n", "- Generate a prescription with `Prescription(lens).view()` for Rich console output\n", "- Inspect the `Document` model programmatically via `Prescription.build()`\n", "- Save reports to plain text (`.txt`) and PDF (`.pdf`, requires `reportlab`)\n", "- Customise which sections appear using the `sections=` constructor argument\n", "- Generate a prescription for a custom doublet and extract first-order properties\n", "\n", "Prescriptions are useful for documenting a design checkpoint, comparing two design iterations,\n", "or producing a handoff report for fabrication." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 2 }