{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "_KV4I7OQLqyd" }, "source": [ "# Lens Picture\n", "\n", "This notebook demonstrates the simulation and optimization of an optical system using the `diffinytrace` package. \n", "It was run in **Google Colab** to take advantage of GPU acceleration and Google Drive integration for saving results.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "eWw2dmv4vWgk", "outputId": "b678234d-69ae-431e-adfd-4609e0ab7059" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing ./diffinytrace.zip\n", " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Requirement already satisfied: colour-science==0.4.7 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (0.4.7)\n", "Requirement already satisfied: matplotlib==3.10.8 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (3.10.8)\n", "Requirement already satisfied: numpy==2.3.5 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (2.3.5)\n", "Requirement already satisfied: pandas==3.0.1 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (3.0.1)\n", "Requirement already satisfied: Pillow==12.0.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (12.0.0)\n", "Requirement already satisfied: plotly==6.6.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (6.6.0)\n", "Requirement already satisfied: pvlib==0.15.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (0.15.0)\n", "Requirement already satisfied: scikit_learn==1.8.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (1.8.0)\n", "Requirement already satisfied: scipy==1.17.1 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (1.17.1)\n", "Requirement already satisfied: tqdm==4.67.3 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (4.67.3)\n", "Requirement already satisfied: nbformat==5.1.3 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (5.1.3)\n", "Requirement already satisfied: ipykernel==7.2.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (7.2.0)\n", "Requirement already satisfied: cadquery==2.7.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (2.7.0)\n", "Requirement already satisfied: torchmetrics==1.9.0 in /usr/local/lib/python3.12/dist-packages (from diffinytrace==2.1) (1.9.0)\n", "Requirement already satisfied: cadquery-ocp<7.9,>=7.8.1 in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (7.8.1.1.post1)\n", "Requirement already satisfied: ezdxf>=1.3.0 in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (1.4.3)\n", "Requirement already satisfied: multimethod<2.0,>=1.11 in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (1.12)\n", "Requirement already satisfied: nlopt<3.0,>=2.9.0 in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (2.10.0)\n", "Requirement already satisfied: runtype in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (0.5.3)\n", "Requirement already satisfied: casadi in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (3.7.2)\n", "Requirement already satisfied: path in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (17.1.1)\n", "Requirement already satisfied: trame in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (3.12.0)\n", "Requirement already satisfied: trame-vtk in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (2.11.7)\n", "Requirement already satisfied: trame-components in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (2.5.0)\n", "Requirement already satisfied: trame-vuetify in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (3.2.1)\n", "Requirement already satisfied: pyparsing>=3.0.0 in /usr/local/lib/python3.12/dist-packages (from cadquery==2.7.0->diffinytrace==2.1) (3.3.2)\n", "Requirement already satisfied: comm>=0.1.1 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (0.2.3)\n", "Requirement already satisfied: debugpy>=1.6.5 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (1.8.15)\n", "Requirement already satisfied: ipython>=7.23.1 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (7.34.0)\n", "Requirement already satisfied: jupyter-client>=8.8.0 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (8.8.0)\n", "Requirement already satisfied: jupyter-core!=6.0.*,>=5.1 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (5.9.1)\n", "Requirement already satisfied: matplotlib-inline>=0.1 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (0.2.1)\n", "Requirement already satisfied: nest-asyncio>=1.4 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (1.6.0)\n", "Requirement already satisfied: packaging>=22 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (26.0)\n", "Requirement already satisfied: psutil>=5.7 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (5.9.5)\n", "Requirement already satisfied: pyzmq>=25 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (26.2.1)\n", "Requirement already satisfied: tornado>=6.4.1 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (6.5.1)\n", "Requirement already satisfied: traitlets>=5.4.0 in /usr/local/lib/python3.12/dist-packages (from ipykernel==7.2.0->diffinytrace==2.1) (5.7.1)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib==3.10.8->diffinytrace==2.1) (1.3.3)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib==3.10.8->diffinytrace==2.1) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib==3.10.8->diffinytrace==2.1) (4.62.1)\n", "Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib==3.10.8->diffinytrace==2.1) (1.5.0)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.12/dist-packages (from matplotlib==3.10.8->diffinytrace==2.1) (2.9.0.post0)\n", "Requirement already satisfied: ipython-genutils in /usr/local/lib/python3.12/dist-packages (from nbformat==5.1.3->diffinytrace==2.1) (0.2.0)\n", "Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /usr/local/lib/python3.12/dist-packages (from nbformat==5.1.3->diffinytrace==2.1) (4.26.0)\n", "Requirement already satisfied: narwhals>=1.15.1 in /usr/local/lib/python3.12/dist-packages (from plotly==6.6.0->diffinytrace==2.1) (2.19.0)\n", "Requirement already satisfied: pytz in /usr/local/lib/python3.12/dist-packages (from pvlib==0.15.0->diffinytrace==2.1) (2025.2)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (from pvlib==0.15.0->diffinytrace==2.1) (2.32.4)\n", "Requirement already satisfied: h5py in /usr/local/lib/python3.12/dist-packages (from pvlib==0.15.0->diffinytrace==2.1) (3.16.0)\n", "Requirement already satisfied: joblib>=1.3.0 in /usr/local/lib/python3.12/dist-packages (from scikit_learn==1.8.0->diffinytrace==2.1) (1.5.3)\n", "Requirement already satisfied: threadpoolctl>=3.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit_learn==1.8.0->diffinytrace==2.1) (3.6.0)\n", "Requirement already satisfied: torch>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from torchmetrics==1.9.0->diffinytrace==2.1) (2.10.0+cu128)\n", "Requirement already satisfied: lightning-utilities>=0.15.3 in /usr/local/lib/python3.12/dist-packages (from torchmetrics==1.9.0->diffinytrace==2.1) (0.15.3)\n", "Requirement already satisfied: vtk==9.3.1 in /usr/local/lib/python3.12/dist-packages (from cadquery-ocp<7.9,>=7.8.1->cadquery==2.7.0->diffinytrace==2.1) (9.3.1)\n", "Requirement already satisfied: typing_extensions>=4.6.0 in /usr/local/lib/python3.12/dist-packages (from ezdxf>=1.3.0->cadquery==2.7.0->diffinytrace==2.1) (4.15.0)\n", "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (75.2.0)\n", "Requirement already satisfied: jedi>=0.16 in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (0.19.2)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (4.4.2)\n", "Requirement already satisfied: pickleshare in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (0.7.5)\n", "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (3.0.52)\n", "Requirement already satisfied: pygments in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (2.20.0)\n", "Requirement already satisfied: backcall in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (0.2.0)\n", "Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.12/dist-packages (from ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (4.9.0)\n", "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.12/dist-packages (from jsonschema!=2.5.0,>=2.4->nbformat==5.1.3->diffinytrace==2.1) (26.1.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.12/dist-packages (from jsonschema!=2.5.0,>=2.4->nbformat==5.1.3->diffinytrace==2.1) (2025.9.1)\n", "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.12/dist-packages (from jsonschema!=2.5.0,>=2.4->nbformat==5.1.3->diffinytrace==2.1) (0.37.0)\n", "Requirement already satisfied: rpds-py>=0.25.0 in /usr/local/lib/python3.12/dist-packages (from jsonschema!=2.5.0,>=2.4->nbformat==5.1.3->diffinytrace==2.1) (0.30.0)\n", "Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.12/dist-packages (from jupyter-core!=6.0.*,>=5.1->ipykernel==7.2.0->diffinytrace==2.1) (4.9.6)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.7->matplotlib==3.10.8->diffinytrace==2.1) (1.17.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (3.25.2)\n", "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (1.14.0)\n", "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (3.6.1)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (3.1.6)\n", "Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (2025.3.0)\n", "Requirement already satisfied: cuda-bindings==12.9.4 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.9.4)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.8.93)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.8.90)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.8.90)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (9.10.2.21)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.8.4.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (11.3.3.83)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.9.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (10.3.9.90)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (11.7.3.90)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.5.8.93)\n", "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (0.7.1)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (2.27.5)\n", "Requirement already satisfied: nvidia-nvshmem-cu12==3.4.5 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (3.4.5)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.8.90)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (12.8.93)\n", "Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (1.13.1.3)\n", "Requirement already satisfied: triton==3.6.0 in /usr/local/lib/python3.12/dist-packages (from torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (3.6.0)\n", "Requirement already satisfied: cuda-pathfinder~=1.1 in /usr/local/lib/python3.12/dist-packages (from cuda-bindings==12.9.4->torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (1.5.2)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests->pvlib==0.15.0->diffinytrace==2.1) (3.4.7)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests->pvlib==0.15.0->diffinytrace==2.1) (3.11)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests->pvlib==0.15.0->diffinytrace==2.1) (2.5.0)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests->pvlib==0.15.0->diffinytrace==2.1) (2026.2.25)\n", "Requirement already satisfied: trame-server<4,>=3.4 in /usr/local/lib/python3.12/dist-packages (from trame->cadquery==2.7.0->diffinytrace==2.1) (3.10.0)\n", "Requirement already satisfied: trame-client<4,>=3.10.1 in /usr/local/lib/python3.12/dist-packages (from trame->cadquery==2.7.0->diffinytrace==2.1) (3.11.4)\n", "Requirement already satisfied: trame-common<2,>=1 in /usr/local/lib/python3.12/dist-packages (from trame->cadquery==2.7.0->diffinytrace==2.1) (1.1.3)\n", "Requirement already satisfied: wslink>=2.3.3 in /usr/local/lib/python3.12/dist-packages (from trame->cadquery==2.7.0->diffinytrace==2.1) (2.5.6)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.12/dist-packages (from trame->cadquery==2.7.0->diffinytrace==2.1) (6.0.3)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.12/dist-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (0.8.6)\n", "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.12/dist-packages (from pexpect>4.3->ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (0.7.0)\n", "Requirement already satisfied: wcwidth in /usr/local/lib/python3.12/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=7.23.1->ipykernel==7.2.0->diffinytrace==2.1) (0.6.0)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (1.3.0)\n", "Requirement already satisfied: more-itertools in /usr/local/lib/python3.12/dist-packages (from trame-server<4,>=3.4->trame->cadquery==2.7.0->diffinytrace==2.1) (10.8.0)\n", "Requirement already satisfied: aiohttp<4 in /usr/local/lib/python3.12/dist-packages (from wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (3.13.5)\n", "Requirement already satisfied: msgpack<2,>=1 in /usr/local/lib/python3.12/dist-packages (from wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (1.1.2)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=2.0.0->torchmetrics==1.9.0->diffinytrace==2.1) (3.0.3)\n", "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp<4->wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (2.6.1)\n", "Requirement already satisfied: aiosignal>=1.4.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp<4->wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (1.4.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.12/dist-packages (from aiohttp<4->wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (1.8.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.12/dist-packages (from aiohttp<4->wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (6.7.1)\n", "Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp<4->wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (0.4.1)\n", "Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp<4->wslink>=2.3.3->trame->cadquery==2.7.0->diffinytrace==2.1) (1.23.0)\n", "Building wheels for collected packages: diffinytrace\n", " Building wheel for diffinytrace (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for diffinytrace: filename=diffinytrace-2.1-py3-none-any.whl size=88812 sha256=5666754bd81285164d374136a957cc67b7b9e85c51b4c1397a29a71648d504e1\n", " Stored in directory: /tmp/pip-ephem-wheel-cache-kw4re0m9/wheels/db/ea/21/35eb070bb05c3b3e3b9b47ff193267b4ac5b0871240da78a7c\n", "Successfully built diffinytrace\n", "Installing collected packages: diffinytrace\n", " Attempting uninstall: diffinytrace\n", " Found existing installation: diffinytrace 2.1\n", " Uninstalling diffinytrace-2.1:\n", " Successfully uninstalled diffinytrace-2.1\n", "Successfully installed diffinytrace-2.1\n" ] } ], "source": [ "%pip install diffinytrace.zip" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "B70R9DmGvyfL", "outputId": "5afac7f3-7c3d-40e2-d6f9-39bf205f27b3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mounted at /content/gdrive\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/gdrive')\n", "from os import listdir\n", "from os.path import isfile, join\n", "path = \"gdrive/MyDrive/results_final\"\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 439 }, "id": "THJWLOas9XYG", "outputId": "237c193a-8c49-47d9-8500-cb03ac93b489" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "num of conv points should probably be at least 336.0\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAHWCAYAAABkNgFvAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAnl9JREFUeJzs3Xd4U2X/x/F3kqZ7UbqgFMreo+w9lCFLZO89VEBQnPiouNfP9aiIssrespQhiCxZLaPs3TJLS6F0rzQ5vz+O9hGhpUDbk7Tf13X1MkmT9JPbUD6c3Oe+dYqiKAghhBBCCGGD9FoHEEIIIYQQ4lFJmRVCCCGEEDZLyqwQQgghhLBZUmaFEEIIIYTNkjIrhBBCCCFslpRZIYQQQghhs6TMCiGEEEIImyVlVgghhBBC2Cwps0IIIYQQwmZJmRVCCFFoLl26hE6nY968eVpHEUIUEVJmhRBWS6fT5elrx44dhZpry5YtjB49mlq1amEwGAgKCrrv/Xbs2HFXTgcHB/z8/Gjbti0ff/wxsbGxD/VzExMT+eijj2jYsCEeHh44ODhQrlw5+vfvz4YNG/LhlQkhhO3RKYqiaB1CCCHuZ9GiRXddX7BgAVu3bmXhwoV33d6hQwf8/PwKLdeIESNYvnw59evX58qVKxgMBi5dunTP/Xbs2EG7du2YNGkSjRo1wmw2Exsby969e/nll1/w8PBgxYoVPPHEEw/8mRcuXKBTp05cvnyZnj170qpVK1xdXbl69SobN24kNDSUBQsWMHTo0AJ4xflHURQyMjIwGo0YDAat4wghigAps0IImzFx4kSmT5+O1r+2oqKi8PHxwWg00q1bN06cOJFrmV25ciV9+vS563tHjx6lY8eOZGZmcurUKUqVKpXjz8vKyiI4OJjIyEh+++03WrRocc99tmzZgtlspnPnzo/9+oQQwpbINAMhhM3q1asX9evXv+u27t27o9PpWL9+ffZtBw4cQKfTsWnTpuzbIiIi6Nu3L15eXjg7O9O0adM8f1RfunRpjEbjY2WvW7cu33zzDfHx8Xz//fe53nflypWcOHGCt99++75FFqBjx453Fdm4uDheeeUVateujaurK+7u7nTu3JmjR4/e9bh58+ah0+nuKeN/T5H45xSO8+fP07t3b/z9/XF0dKRMmTIMGDCAhISE7Pts3bqVli1b4unpiaurK1WrVuXNN9/M/v795sweO3aMESNGUKFCBRwdHfH392fUqFHcvn37rkzvvvsuOp2OCxcuMGLECDw9PfHw8GDkyJGkpqbedd8H5RBCFB12WgcQQohH1apVK9atW0diYiLu7u4oisKePXvQ6/Xs3r2bp59+GoDdu3ej1+uzi2BMTAzNmzcnNTWVSZMmUbJkSebPn8/TTz/NqlWr6NmzZ6Hk79OnD6NHj2bLli189NFHOd7vl19+AWDIkCF5fu6IiAjWrl1L3759KV++PDExMfz000+0adOGU6dOUbp06YfKmpmZSadOncjIyOCFF17A39+f69ev8+uvvxIfH4+HhwcnT56kW7du1KlTh/fffx8HBwcuXLjAnj17cn3urVu3EhERwciRI/H39+fkyZPMnDmTkydPsn//fnQ63V3379evH+XLl+eTTz7h8OHDzJ49G19fXz777DOAR84hhLBNUmaFEDarVatWWCwW9uzZQ+fOnTlx4gR37tyhb9++7N69O/t+u3fvpm7duri7uwPw6aefEhMTw+7du2nZsiUAY8eOpU6dOkyZMoUePXqg1xf8B1dGo5EqVapw8eLFXO935swZPD09CQgIuOv2lJQU0tLSsq/b29tnv8batWtz7ty5u17H0KFDqVatGnPmzOHtt99+qKynTp0iMjLynikT77zzTvblrVu3kpmZyaZNm/D29s7zc48fP56XX375rtuaNm3KwIED+fPPP2nVqtVd3wsODmbOnDnZ12/fvs2cOXOyy+yj5hBC2CaZZiCEsFnBwcG4urqya9cuQC2tZcqUYdiwYRw+fJjU1FQURbmnEG3cuJHGjRtnF1kAV1dXxo0bx6VLlzh16lShvQZXV1eSkpJyvU9iYiKurq733P6f//wHHx+f7K9BgwZlf8/BwSG7yJrNZm7fvp39cfvhw4cfOqeHhwcAv/322z0f6f/N09MTgHXr1mGxWPL83E5OTtmX09PTuXXrFk2bNgW4b9bnnnvuruutWrXi9u3bJCYmPlYOIYRtkjIrhLBZBoOBZs2aZR+F3b17N61ataJly5aYzWb279/PqVOniIuLu6vMXr58mapVq97zfNWrV8/+fmFJTk7Gzc0t1/u4ubmRnJx8z+3jx49n69atbN269Z7VHCwWC19//TWVK1fGwcEBb29vfHx8OHbs2F1zXPOqfPnyTJkyhdmzZ+Pt7U2n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LL7++mtatmzJjRs3OHPmDKBuvdqpUyeaNWvG7t27sbOz48MPP+Spp57i2LFj2UdJt2/fTqlSpdi+fTvnzp1j4MCBNGrUiGeffZbVq1dTt25dxo0bx9ixY7N/7sWLF3nqqaf48MMPmTt3LrGxsUycOJGJEycSEhKSfb8vvviCd955h2nTpuX5cSNGjCAqKort27djNBqZNGkSN2/ezPX/VVJSEsOHD+e7775DURS+/PJLunTpwvnz53FzcyMsLAxfX19CQkJ46qmnMBjuv8zmvn378PT0pGHDhtm3tW/fHr1ez4EDB+jRo0euOQqLlNni7ORa2DAFUm+DnSN0+AAaj5W5sUIIYQMuXLiAoij3FDtvb2/S09MBmDBhAp999hkAL774YvZ9goKC+PDDD3nuuefyXGYTExNJSEigW7duVKxYEYDq1atnf//KlSu8+uqrVKtWDYDKlSvn+Fx169albt262dc/+OAD1qxZw/r165k4cWL27V26dGH8+PEAvP7663z99dds3779vmU2KSmJ//73v3z//fcMHz4cgIoVK9KypbqU5PLly7FYLMyePTu7gIeEhODp6cmOHTvo2LEjACVKlOD777/HYDBQpUoVOnbsyB9//MGzzz6Ll5cXBoMBNzc3/P39s3/2J598wuDBg7PHuHLlynz77be0adOGGTNm4OjoCMATTzzByy+/nP24MWPG5Pq4K1eusGnTJkJDQ2nUqBEAc+bMuWvc7+eJJ5646/rMmTPx9PRk586ddOvWDR8fHwA8PT3veh3/Fh0dja+v71232dnZ4eXlRXR0dK4ZCpOU2eIoNQ42vgInflav+9WG3rPAN/c/HEIIUVw4GQ2cer+TZj/7cYSGhmKxWBg8eDAZGRnZt//+++988sknnDlzhsTERLKyskhPTyc1NRV3d/cHPq+XlxcjRoygU6dOdOjQgfbt29OvXz9KlVJ3gZwyZQpjxoxh4cKFtG/fnr59+2aX3n9LTk7m3XffZcOGDdy4cYOsrCzS0tK4cuXKXferU6dO9mWdToe/v3+ORyVPnz5NRkYGTz755H2/f/ToUS5cuICbm9tdt6enp3Px4sXs6zVr1rzrSKWfn98DT147evQox44du2sKgKIoWCwWIiMjs8vnP49w5uVx586dw87OjgYNGmR/v1q1ag9cGSImJoa33nqLHTt2cPPmTcxmM6mp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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import diffinytrace as dit\n", "import torch\n", "import numpy as np\n", "torch.set_default_dtype(torch.float64)\n", "import random\n", "\n", "SEED = 0\n", "np.random.seed(SEED)\n", "torch.manual_seed(SEED)\n", "random.seed(SEED)\n", "\n", "\n", "from sunlight_picture import create_lens\n", "import os\n", "import pickle\n", "import gc\n", "\n", "def save_data(data, filename):\n", " with open(filename, 'wb') as file:\n", " pickle.dump(data, file)\n", " print(f\"Data saved to {filename}\")\n", "\n", "def load_data(filename):\n", " with open(filename, 'rb') as file:\n", " data = pickle.load(file)\n", " print(f\"Data loaded from {filename}\")\n", " return data\n", "\n", "def create_folder(folder_path):\n", " try:\n", " os.makedirs(folder_path, exist_ok=True)\n", " return f\"Folder created successfully at: {folder_path}\" if not os.path.exists(folder_path) else f\"Folder already exists at: {folder_path}\"\n", " except Exception as e:\n", " return f\"An error occurred: {e}\"\n", "\n", "device = \"cuda:0\"\n", "image_file_name = \"img1.jpg\"\n", "results_folder_main = path+\"/lens_picture/\"\n", "create_folder(results_folder_main)\n", "sigma_final = 0.3\n", "#theta_max_rad=5.\n", "\n", "sigmas = None\n", "ns_start = [4,4]\n", "orders = [3,3]\n", "num_refinements = 6\n", "#num_refinements = 4\n", "lens_thickness:float=5.\n", "\n", "theta_max_rad = 20/1000.\n", "detector_distance:float=60.\n", "\n", "lens_distance:float=5.0\n", "\n", "aperture_radius_source = 21.\n", "image_padding = 0.2\n", "grid_size = 256\n", "num_rays = 2**21\n", "#[1601,1601]\n", "from diffinytrace import utils\n", "#from diffinytrace.nonimaging import smoothing\n", "aperture_radius_detector = aperture_radius_source*(1+image_padding)\n", "\n", "print(\"num of conv points should probably be at least \", 2.0*aperture_radius_detector*2.0/sigma_final)\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Parameters\n", "dx = (aperture_radius_detector*2.0)/grid_size\n", "x = np.linspace(-dx*2, dx*2, 500) # x-axis range\n", "\n", "# Gaussian 1 centered at 0\n", "gaussian1 = (1 / (sigma_final * np.sqrt(2 * np.pi))) * np.exp(-x**2 / (2 * sigma_final**2))\n", "\n", "# Gaussian 2 centered at dx\n", "gaussian2 = (1 / (sigma_final * np.sqrt(2 * np.pi))) * np.exp(-(x - dx)**2 / (2 * sigma_final**2))\n", "\n", "# Plot\n", "plt.figure(figsize=(8, 5))\n", "plt.plot(x, gaussian1, label='Gaussian centered at 0')\n", "plt.plot(x, gaussian2, label=r'Gaussian centered at $\\Delta x$')\n", "plt.title(\"Two 1D Gaussians\")\n", "plt.xlabel(\"x [mmm]\")\n", "plt.ylabel(\"y [1]\")\n", "plt.legend()\n", "plt.grid()\n", "plt.show()\n", "\n", "gc.collect()\n", "irr_func = utils.irradiance_importer.create_irradiance_from_image_square(image_file_name,image_padding,0.,aperture_radius_detector)\n", "\n", "#quantity2D.plot(final_smoother.desired_smooth_irradiance.cpu().detach().numpy(),\"Smoothed Desired Irr.\",aperture_radius_detector,cmap=\"gray\")\n", "#plt.imshow(final_smoother.desired_smooth_irradiance.cpu().detach().numpy()[::-1])\n", "#%%\n", "def make_run(subfolder_main,use_desired_irradiance_smoothing,T_margin):\n", " create_folder(subfolder_main)\n", " subfolder = subfolder_main\n", "\n", " #create_folder(subfolder)\n", " kwargs = dict(image_file_name=image_file_name,\n", " lens_material=dit.materials[\"PMMA\"],\n", " air_material=dit.materials[\"AIR\"],\n", " device=device,\n", " sigma=sigma_final,\n", " use_desired_irradiance_smoothing=use_desired_irradiance_smoothing,\n", " num_rays=num_rays,\n", " num_refinements=num_refinements,\n", " grid_size=grid_size,\n", " theta_max_rad=theta_max_rad,\n", " T_margin=T_margin,\n", " lens_thickness=lens_thickness,\n", " detector_distance=detector_distance,\n", " lens_distance=lens_distance,\n", " )\n", "\n", " results = create_lens(**kwargs)\n", " save_data(results, subfolder+\"/results_dict.pkl\")\n", " del results\n", " gc.collect()\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6aohmd7ypfGx", "outputId": "1184f8a7-57b2-4a0e-f23d-7f51bb446ea8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Only sobol_pow2,sobol or monte_carlo sampling supported for VisibleSunlightSimpleMonochromatic\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.12/dist-packages/torch/functional.py:505: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at /pytorch/aten/src/ATen/native/TensorShape.cpp:4381.)\n", " return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]\n" ] } ], "source": [ "from diffinytrace import (\n", " source, transforms, Bspline, Plane, Lens, Detector, SequentialOpticalSystem,\n", " utils, plotting, target_grid, render, minimize, set_unused_bspline_coeff_to_nearest,\n", " export, gaussian_smoother\n", ")\n", "import matplotlib.pyplot as plt\n", "import diffinytrace as dit\n", "import torch\n", "from typing import List\n", "\n", "\n", "\n", "aperture_radius_source:float=21.\n", "aperture_radius_lens:float=25.\n", "image_padding:float=0.2\n", "\n", "\n", "lens_material=dit.materials[\"PMMA\"]\n", "air_material=dit.materials[\"AIR\"]\n", "light_transform = transforms.Offset(torch.tensor([0.0,0.0,0.0]))\n", "light_transform.pos.requires_grad = False\n", "\n", "light_source = None\n", "\n", "light_source = source.VisibleSunlightSimpleMonochromatic(light_transform,aperture_radius_source,wl=0.5,total_power=1.0,theta_max_rad=theta_max_rad)\n", "lens_transform = transforms.Distance(lens_distance,parent_transform=light_transform)\n", "\n", "aperture_radius_detector = aperture_radius_source*(1+image_padding)\n", "\n", "bspline_surface1 = Bspline(aperture_radius_lens,orders,ns_start)\n", "\n", "surface1 = Plane()\n", "lens1 = Lens(lens_transform,lens_thickness,surface1,bspline_surface1,lens_material,aperture_radius_lens,is_square=True)\n", "lens_transform.distance.requires_grad = False\n", "lens1.lens_thickness.requires_grad = False\n", "detector_transform = transforms.Distance(detector_distance,parent_transform=lens1)#25.0+0.5\n", "detector_transform.distance.requires_grad = False\n", "plane_surface = Plane()\n", "detector = Detector(detector_transform,plane_surface,aperture_radius_detector)\n", "system = SequentialOpticalSystem({\"source\":light_source,\"lens\":lens1,\"detector\":detector},air_material)\n", "sequence = [\"source\",\"lens\",\"detector\"]\n", "\n", "\n", "x,weights = light_source.sample([1,5,5,5],\"simpson\")\n", "\n", "#x,weights = light_source.sample(2000)\n", "\n", "O,D,wave_len,_,RayPaths = system(x,sequence)\n", "\n", "system.to(\"cpu\")\n", "offset_arrows = -(aperture_radius_lens+1)\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "OBCDnfabDx40", "outputId": "2b63e7a9-25e8-4caf-f748-c449a66a5f81" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "in create lens\n", "after system init\n", "after system to device\n", "pre smoother init\n", "after smoother init\n", "after eval_func init\n", "BEGIN: opti after refine: coeff shape: torch.Size([4, 4])\n", "last_merit tensor(0.0071, device='cuda:0', grad_fn=) 0.00705260743574\n", "last_error (tensor(0.0082), tensor(0.0002), tensor(0.7922)) 0.008244025422616102\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([6, 6])\n", "last_merit tensor(0.0064, device='cuda:0', grad_fn=) 0.00641845394323\n", "last_error (tensor(0.0077), tensor(0.0002), tensor(0.8056)) 0.00765247376305787\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([10, 10])\n", "last_merit tensor(0.0046, device='cuda:0', grad_fn=) 0.00464712997668\n", "last_error (tensor(0.0062), tensor(0.0001), tensor(0.8206)) 0.006184337578308565\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([18, 18])\n", "last_merit tensor(0.0031, device='cuda:0', grad_fn=) 0.0031097300493\n", "last_error (tensor(0.0050), tensor(9.9376e-05), tensor(0.8425)) 0.005003939945132245\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([34, 34])\n", "last_merit tensor(0.0020, device='cuda:0', grad_fn=) 0.00198103558025\n", "last_error (tensor(0.0044), tensor(8.7174e-05), tensor(0.8618)) 0.004392787688376916\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([66, 66])\n", "last_merit tensor(0.0012, device='cuda:0', grad_fn=) 0.00122569508378\n", "last_error (tensor(0.0041), tensor(8.1533e-05), tensor(0.8743)) 0.004112682494093111\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([130, 130])\n", "last_merit tensor(0.0010, device='cuda:0', grad_fn=) 0.00100309784371\n", "last_error (tensor(0.0040), tensor(8.0040e-05), tensor(0.8829)) 0.0040419741300820634\n", "END\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [12:15<00:00, 1.36it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Data saved to gdrive/MyDrive/results_final/lens_picture//results_desired_irr_smoothing/results_dict.pkl\n", "in create lens\n", "after system init\n", "after system to device\n", "pre smoother init\n", "after smoother init\n", "after eval_func init\n", "BEGIN: opti after refine: coeff shape: torch.Size([4, 4])\n", "last_merit tensor(0.0087, device='cuda:0', grad_fn=) 0.00869124639883\n", "last_error (tensor(0.0087), tensor(0.0002), tensor(0.7489)) 0.008648570836628374\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([6, 6])\n", "last_merit tensor(0.0078, device='cuda:0', grad_fn=) 0.00784546959036\n", "last_error (tensor(0.0078), tensor(0.0002), tensor(0.7961)) 0.007776924767509648\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([10, 10])\n", "last_merit tensor(0.0063, device='cuda:0', grad_fn=) 0.00628575566533\n", "last_error (tensor(0.0063), tensor(0.0001), tensor(0.8058)) 0.006265553724726324\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([18, 18])\n", "last_merit tensor(0.0051, device='cuda:0', grad_fn=) 0.00513838046929\n", "last_error (tensor(0.0051), tensor(0.0001), tensor(0.8308)) 0.005098846773479705\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([34, 34])\n", "last_merit tensor(0.0043, device='cuda:0', grad_fn=) 0.00431877371606\n", "last_error (tensor(0.0045), tensor(8.8706e-05), tensor(0.8521)) 0.004471681287180115\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([66, 66])\n", "last_merit tensor(0.0039, device='cuda:0', grad_fn=) 0.00385829548256\n", "last_error (tensor(0.0042), tensor(8.4029e-05), tensor(0.8596)) 0.004237167682689041\n", "END\n", "BEGIN: opti after refine: coeff shape: torch.Size([130, 130])\n", "last_merit tensor(0.0037, device='cuda:0', grad_fn=) 0.00368949622911\n", "last_error (tensor(0.0043), tensor(8.4396e-05), tensor(0.8656)) 0.0042489995618780925\n", "END\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 1000/1000 [12:15<00:00, 1.36it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Data saved to gdrive/MyDrive/results_final/lens_picture//results_classical/results_dict.pkl\n" ] } ], "source": [ "\n", "def run_all_methods():\n", "\n", " gc.collect()\n", "\n", " subfolder_main = results_folder_main+\"/results_desired_irr_smoothing\"\n", " make_run(subfolder_main,use_desired_irradiance_smoothing = True,T_margin=None)\n", "\n", " gc.collect()\n", " subfolder_main = results_folder_main+\"/results_classical\"\n", " make_run(subfolder_main,use_desired_irradiance_smoothing = False,T_margin=None)\n", "\n", "\n", " gc.collect()\n", "\n", "\n", "run_all_methods()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 464 }, "id": "U2nTgZJf-JY2", "outputId": "3a9296de-1f26-4f4c-de96-ffbc54b43b07" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING: ray_paths will project the ray position onto the y-z plane!\n" ] }, { "data": { "image/png": "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MNhRSnz33XcAgGbNmsWtb968eZX7N2rUKG45GAzGtXmrKUVR8Pbbb6Nr164YN24c2rRpg9NOOw3Lly8HAOzbtw9SSrRo0SLucQ0bNkQoFEJZWdlRHzPxufbu3QvTNNG6detqH7Nnzx6UlZUhEAjEfV133XXQdd39+RGRv5mmiQsuuAArVqzA3XffjaVLl2LNmjU499xzq3wNTHy9+e677yq9zgKVX2v37NmDxx57rNJrzr///W9s3bo1ud8UZRTb2FFKtGrVCgCwe/fuuICza9eulB+7U6dOeOmllxCNRvH+++9j/PjxGDFiBLZv345GjRpBUZRK5di/fz/C4TCaNGkCACgoKABgdQDx2rt3b6XjOQ2OHY0aNYIQAjt27Ki2jE2aNEGzZs2waNGiKrdXF4CJyF+++uorlJaWYt68eXE1GuXl5VXun/h606pVK3zyySeV9tu1axcaNGjgLjdp0gTnn38+xo4dW2lf736U+3jHjlKie/fuKCgowGuvvRa3ft68ebV6vmAwiHA4fFSPCQQCGDhwIO644w4cOHAAO3bsQFFRkduRw+tf//oXAKB///4AgOOOOw6A1YvMsWHDhhpd2RYWFqJv376YNWtWtVWqQ4cOxe7duxEMBnHaaadV+goGg0f1vRJRbnICnPdvfsuWLVi5cmWNHt+nTx98+umn2Lx5s7vum2++wbp16+L2Gzp0KNavX49evXpVer3p3Lmzu18gEKhVbQllD96xoxozDKPKXqM/+9nPKq1r2rQpbrzxRtx3330oKChAz5498dJLL7ltRoQ4umuKrl27Qtd1/PWvf0W/fv1QXFwc92Lk+PTTT/H73/8el112GU444QTs378fDzzwANq1a+f2EJs4cSIuvPBCjB49GqNHj8amTZswfvx4/OpXv0KPHj0AAKeffjratGmD2267DQ888AAOHDiABx98EE2bNq1ReR988EGcddZZGDp0KMaOHYvGjRvj448/xjHHHINrr70WZ599NkaMGIFzzjkHt99+O04++WQcOnQIn3/+Ob766ivMmDHjqH4+RJSbunTpguOOOw533HEHDMPAwYMHMWHCBBx77LE1evw111yD++67D7/4xS8wadIkANZrXMuWLeNeZydNmoQ+ffpg+PDhuP7669GiRQt8//33WLZsGQYMGIBRo0YBsF5rX3vtNQwYMACFhYXo3Lkz7+jlmkz33qDcMGHCBAmgyq/nnnuuUq9YKaUMh8Pypptuko0aNZLFxcWypKREPv744xKA3Ldvn5Sycm9ax29/+1t5/PHHu8vRaFSOHTtWtmjRQiqKEtfby2vnzp1y9OjRskOHDjIUCsnmzZvLX/3qV/LLL7+M2+/ll1+WJ598sgwGg7Jly5by1ltvjestJqWUH330kezTp4+sV6+e7NGjh3z33Xer7BV70kknVVmWlStXysGDB8v69evLBg0ayDPOOEO+++67cT+fSZMmyY4dO8pgMCibNWsmBw8eLGfNmlXt74GIch8Sep5++OGHsk+fPrKgoEB27NhRzpw5s9JrS3U99aWUcv369bJ///4yGAzK9u3by7///e9y0KBB8sILL4zb78svv5SXXnqpbNq0qQyFQrJdu3ZyzJgxcv369e4+//73v+Wpp54q69WrJwHIpUuXJv8HQCmlSCllZiIl5aOrrroKK1asiKs2ICKi5CkrK0OHDh1w2223YcKECZkuDqUZq2IpZZYtW4aVK1eid+/eME0Tr7/+Op5//nlMmTIl00UjIvKNyZMno0WLFmjXrh2+++47PPLIIzAMA9dee22mi0YZwGBHKVNUVITXX38dkydPRnl5Odq3b48pU6bg1ltvzXTRiIh8QwiBe++9F9u3b4emaTj99NOxZMkStGnTJtNFowxgVSwRERGRT3C4EyIiIiKfYLCjtNqxYweef/55fmQWERFRCjDYUcpJKfH+++9j1KhROP7443HTTTfhhx9+yHSxiIiIfIfBjlImHA5j1qxZ6NOnD84880x89NFHePTRR7FlyxZ+ZBYRURKZpomRI0di48aNmS4KZRiDHSXd9u3bcdddd6Ft27YoKSlBs2bNsHDhQmzatAm33HILiouLM11EIiLfWb58eZWfDkT5hcOdUFJIKbFq1SpMnToVr7zyCgoKCnD11VfjpptuqvKjv4iIKHmEEOjbty/ef/99d104HEYoFMpgqSgTeMeO6qSiogIzZ850q1vXrl2LRx99FNu3b8e0adMY6oiI0qRfv35YtWoVTNPEO++8g2bNmrGjWh5isKNa8Va3Xn311WjWrBkWLVrE6lYiojTauXMnxowZg507d6Jfv37Yt28fNmzYgAULFuCYY46BqqqZLiKlGatiqcZY3UpElF1CoRDeeecd/PKXv8T8+fMhhMDKlSux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hNTaB1TnM71N3foscKmyKjbTPvzwQ6xatQrff/89AKBly5bo27cvfvazn6XkeCkLdgcOHMB1112HBQsWoLi4GDfccAMmTJgAVbU+/WH37t1o37590j/8loiIKFeksoo/oofxeOmkpD8v1cyuXbvwq1/9CitXrkTbtm3djxTbuXMnbrvtNpx55pl45ZVX0Lx586QeN2WtPO+66y6sW7cOzz33HO677z7MmjULI0eORCQS+4xU99MRiIiIiHxk7NixMAwDGzZswDfffIMPPvgAH3zwAb755hts2LABpmli3LhxST9uyu7YzZs3DzNnzsSgQYMAABdeeCHOP/98jBgxAvPnzwcQP5I+ERERkV+89dZbWL58OTp37lxpW+fOnTF16lQ3IyVTyu7Y7d69G8cff7y7fMwxx+Ddd9/Fjz/+iPPOOw+HDx9O1aGJiIiIMioUCuHAgQPVbv/xxx8RCoWSftyUBbu2bdtiw4YNcesaNGiAt99+G+Xl5bjoootSdWgiIiKijLrssstQUlKCV199NS7gHThwAK+++iquueYajBo1KunHTVlV7LBhw/CPf/wD5513Xtz6oqIivPXWWzj77LNTdWgiIiKijJoyZQpM08Tll18OXdcRDFrDSkciEWiahv/3//4fHnnkkaQfN2XBbtKkSdixY0eV2xo0aIB33nkHH3/8caoOT0RERJQxoVAITzzxBCZPnoy1a9fGDXfSu3dvFBcXp+S4KQt2jRs3RuPGjSutl1JCURQ0aNAAAwcOTNXhiYiIiDKuuLgYgwcPTtvx0v7JE6FQCOvWrUPXrl3TfWgiIiKijDh06BD+9a9/4auvvkKrVq0watQoNG3aNOnHSVmw+93vflflesMw8OCDD7rfzJQpU1JVBCIiIqKM6NatG1asWIEmTZpg69atGDBgAPbt24dOnTrh66+/xj333IPVq1ejffv2ST1uyoLdY489hlNOOQWNGjWKWy+lxIYNG1BYWMhx7IiIiMiXNm7cCF3XAQB33nknjj32WKxbtw4NGzbEwYMHcdFFF+F//ud/MHv27KQeN2XB7v7778dTTz2FRx99FGeddZa7PhAI4Nlnn0W3bt1SdWgiIiKirLFq1So8+eSTaNiwIQBrhJBJkybh8ssvT/qxUjaO3R133IEXX3wRN954I/7whz8gGo2m6lBEREREWcepmayoqECrVq3ith177LHYvXt30o+ZsmAHAH369MHatWuxe/dunHbaaVi/fj2rX4mIiCgvDBkyBKeeeioOHDiATZs2xW3bsmVLbnWecBQVFWHmzJl44YUXMHToUBiGkepDEhEREWXUhAkT4paLiorilhcsWIABAwYk/bhpG+7k8ssvR//+/bF27dq4z5AlIiIi8pvEYJfo4YcfTslx0zqO3XHHHYfjjjsunYckIiIiyhspbWNHREREROnDYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkEwx2RERERD7BYEdERETkE1qmC0BERJQL9KgOPWwgGrGnUR16xIAe1hGNGoiGdRhRHXrEhB41YEQNd2roBvSoaa3TDZi6CT1qwjQMGLoJQzdhGvZUN2GaJkxDwjSs9abpzEtIKSFNCdM0IU0JacJaZ6+X0lqGBDA2CBRHM/2jozRisCMiopRKdSByQlEyA5GEHYxyjQIoigIFsOrklAyXh9KOwY6IKEsdMRDZoai6QBSNWiGIgaiGFECBAkUBIBQIRYEiFCskKQoUAShCgRDCnlrbhSognKkqINTYvKrFpta8Ci0goAZUe529rKlQAyq0gDUNBFVoQRVqUIMWUBEIqNBCGrSgikBAQ6BAgxbSEAxqEFr1LaoiehgLSp9K38+QsgKDHRH5TtYHItPexkCU1kCkhVQECgI/GYiIchmDHRG5qgtE0XDUXq46EOkRHbrdNqjWgciQ7rp8CkRQ7OBTl0AkBIRWfSASmrDCTzWBSAuoCITyMxA556Jz/rrt3EznPJXWeW14z10JwzAhTROGISEN53ES0jmvpQlT95zT3vNd2o8xpb0t/tw3DdNeJ2NTz2Pi1pnOYyQgY4+R0npOjAgARWxjl08Y7IiSIGWBKGq9oTAQeWRZINKCAlooUH0gClpTLWC93Jq6HSLM2gcJU7fnjxAk3HCQECT0qIlo2EhKkJAJ66x5JCzH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i1EjDHZpVlgvAADYvms/tu/an9EyEBGRv514sAWiwsDwThdnuiiUJgx2adakuADXjTgJG7fszcjxuxzfGE2KCzJybCIiSq8TD7UEAIxqNirDJaF0UWQ2fy4GERER1YqUElEjAgAIqEEoipLhElE6MNgRERER+QR7xRIRERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIMdERERkU8w2BERERH5BIOdx9atW7Fv3746P88XX3wBwzCO6jFSSmzcuBGRSKROxw6Hw9i0adNRP07XdWzYsKFOxyYiovT74osvoOt6potBWYLBDsCmTZswevRotGvXDtOmTavTc5WVleGUU05Bt27d8Pzzz/9kwJNSYunSpRg0aBC6du2KFStW1On4S5cuRZcuXXDWWWdh2bJlP7m/ruuYNWsWunbtip49e+LAgQN1Oj4REaXP/v370bNnT3Tt2hWzZs1iwKP8DnZOoOvWrRvee+89TJs2DbfffnudnrNJkyZYvXo1Onfu7D53VQHPG+jOOussHDx4EPPnz8fgwYPrdPzhw4dj3rx52Lt3r/vcVQU8b6ArKSlB9+7dsXr1ahQXF9fp+ERElD4NGzbEBx98gO7du6OkpIQBj6BIKWWmC5Fue/bswfDhw1FaWoqioiIMGDAAp556KjRNS+pxduzYgffeew9ffvklmjZtirvvvhtjx47F8uXLMWbMGGzZsgWtWrXCoEGD0KlTJyiKkrRjSymxadMmvPfee/j+++/Rvn17PP/88+jbty+mTp2KSZMmoaysDF26dMHAgQPRqlWrpB2biIjS77vvvsOyZcuwceNGNGnSBBMmTMAtt9yS6WJRmuVlsFu2bBkGDx4MKSWKiopQVFQEVVWTfhwpJSoqKrB//34YhoFBgwZh6dKlGD9+PB544AEoioLi4mIUFhYmNdR5j3/o0CHs378fADBx4kRMmDAB/fv3x8qVK6GqKho2bIiCgoKUHJ+IiNIn8T3nzDPPrHPzHspBMk/t3r1b3nHHHbKwsFAWFRXJO++8U+7evTspz22appw3b57s1auXBCAHDRokly5dGrfPhg0b5JVXXimFEPK4446T//d//ycrKiqScvzy8nI5bdo02bp1aymEkFdddZXctGlTXPkWL14sBwwYIAHI3r17ywULFkjTNJNyfCIiSh/TNOWCBQtk7969JQA5YMAAuXjxYr6m56m8DXYOb8ArLCyUr7zySp2e7+DBg7JPnz7VBrpEiQFv48aNdTr++vXrqw10iRIDXt++feXhw4frdHwiIkqfw4cPy759+zLQkSuvO08AwDHHHIMHHngA33zzDW6//XY0bNiwTs+nqir69++PpUuXup0jjqRLly745z//ic8//xyXX345AoFAnY4fDAZxxRVXYMOGDZg1axY6depU7b6KoridKxYvXoy+ffumpEqaiIhSQ1VV9O3bF4sXL8ayZctw1llnsWlNnsvLNnZEREREfpT3d+yIiIiI/ILBjoiIiMgnGOyIiIiIfILBjoiIiMgnGOyIiIiIfILBjoiIiMgnGOyIiIiIfCLvgl0uDNuXC2UkIiKi7JM3wc4JS+FwOMMlqV4ulJGIiIiyV94EO0VRsHDhQowYMQJXXHEFpkyZkukiVZILZSRKpe3bt2P06NFo2rQp6tWrhx49euCjjz5yt0sp8Ze//AWtWrVCvXr1MHToUPznP//JYImJiLJL3gS7VatWYdSoUejcuTPKy8vx5JNP4pprrsl0seLkQhmJUmXv3r0488wzEQgE8MYbb+CLL77Ao48+isaNG7v7PPTQQ5g6dSqefPJJfPDBBygsLMTw4cNRUVGRwZITEWUR6WOmabrzCxculA8++KCUUsqysjL53HPPydatW8sxY8ZkqnhSytwoI1E6/OlPf5L9+/evdrtpmrJly5by4Ycfdtft27dPhkIhOWfOnGofN3DgQHnTTTfJ3/72t7JRo0ayefPm8qmnnpIHDx6UV199tSwqKpInnHCCXLRokfuYpUuXSgDyzTfflD179pQFBQVy8ODBcufOnXLRokWyS5cuskGDBnLUqFHy0KFDyfkBEBElgW/v2EkpoSgK1qxZg4ULF+LFF1/EwYMHAQCNGzfGRRddhIceegjvvvsurr32WpaRKMPmz5+P0047DZdccgmaN2+OXr164emnn3a3b968Gd9//z2GDh3qrmvYsCFOP/10rFq16ojPPXPmTBxzzDH48MMPcfPNN+PGG2/EJZdcgn79+uHjjz/GsGHDcNVVV+Hw4cNxj5s4cSIef/xxvP/++9i6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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "dit.plotting.system2D.plot(system,RayPaths,500,show = False)\n", "\"\"\"dit.plotting.system2D.annotated_arrow([0,offset_arrows],[lens_distance,offset_arrows],(-30,-12),f\"${int(lens_distance)}$[mm]\",\"<->\")\n", "dit.plotting.system2D.annotated_arrow([lens_distance,offset_arrows],[lens_distance+lens_thickness,offset_arrows],(-12,-12),f\"${int(lens_thickness)}$[mm]\",\"<->\")\n", "dit.plotting.system2D.annotated_arrow([lens_distance+lens_thickness,offset_arrows],[lens_distance+lens_thickness+detector_distance,offset_arrows],(0,-12),f\"${int(detector_distance)}$[mm]\",\"<->\")\n", "\n", "dit.plotting.system2D.annotated_arrow([-1,-aperture_radius_source],[-1,aperture_radius_source],(-12,-12),f\"${int(aperture_radius_source*2)}$[mm]\",\"<->\",rotation=90)\n", "dit.plotting.system2D.annotated_arrow([lens_distance+lens_thickness+detector_distance+1,-aperture_radius_detector],[lens_distance+lens_thickness+detector_distance+1,aperture_radius_detector],(3,-12),f\"${int(aperture_radius_detector*2)}$[mm]\",\"<->\",rotation=90)\n", "\n", "dit.plotting.system2D.annotate_position([0,aperture_radius_source],(-20,20),\"Light source\")\n", "dit.plotting.system2D.annotate_position([lens_distance+lens_thickness,aperture_radius_lens],(15,10),\"Lens\")\n", "dit.plotting.system2D.annotate_position([lens_distance+lens_thickness+detector_distance,aperture_radius_detector],(-50,10),\"Target\")\n", "\"\"\"\n", "ax = plt.gca()\n", "z_source = 0.0\n", "z_lens_start = 5.0\n", "z_lens_end = 10.0\n", "z_target = 70.0\n", "\n", "source_half_height = 21.0 # 42 mm total\n", "lens_half_height = 25.0 # 50 mm total (covers full aperture)\n", "target_half_height = 25.0 # 50 mm total\n", "\n", "# Target (green vertical line)\n", "ax.plot([z_target, z_target], [-target_half_height, target_half_height],\n", " color='limegreen', linewidth=2.0, solid_capstyle='butt')\n", "\n", "# --- Annotations ---\n", "\n", "# \"Light source\" label with arrow\n", "ax.annotate('Light source', xy=(z_source + 0.3, source_half_height - 1),\n", " xytext=(12, 27), fontsize=11,\n", " arrowprops=dict(arrowstyle='->', color='black', lw=1.0),\n", " ha='left', va='bottom')\n", "\n", "# \"Target\" label with arrow\n", "ax.annotate('Target', xy=(z_target - 0.3, target_half_height - 1),\n", " xytext=(65, 27), fontsize=11,\n", " arrowprops=dict(arrowstyle='->', color='black', lw=1.0),\n", " ha='left', va='bottom')\n", "\n", "# --- Dimension arrows ---\n", "from matplotlib.patches import FancyArrowPatch\n", "\n", "def dim_arrow(ax, x0, y0, x1, y1):\n", " \"\"\"Draw a double-headed dimension arrow with tips exactly at endpoints.\"\"\"\n", " arrow = FancyArrowPatch(\n", " (x0, y0), (x1, y1),\n", " arrowstyle='<->', mutation_scale=10,\n", " color='black', lw=1.0, shrinkA=0, shrinkB=0, clip_on=False)\n", " ax.add_patch(arrow)\n", "\n", "# Vertical dimension: 42 mm on left side (close to source)\n", "dim_x_left = -3.0\n", "dim_arrow(ax, dim_x_left, -source_half_height, dim_x_left, source_half_height)\n", "ax.text(dim_x_left - 2.0, 0, '42 mm', fontsize=10, ha='center', va='center',\n", " rotation=90)\n", "\n", "# Vertical dimension: 50 mm on right side (close to target)\n", "dim_x_right = 83.0\n", "dim_arrow(ax, dim_x_right, -target_half_height, dim_x_right, target_half_height)\n", "ax.text(dim_x_right + 3.0, 0, '50 mm', fontsize=10, ha='center', va='center',\n", " rotation=90)\n", "\n", "# Horizontal dimensions at bottom\n", "dim_y = -29.0\n", "\n", "# 5 mm: z=0 to z=5\n", "dim_arrow(ax, z_source, dim_y, z_lens_start, dim_y)\n", "ax.text((z_source + z_lens_start) / 2 - 4.0, dim_y - 1.5, '5 mm', fontsize=10,\n", " ha='center', va='top', rotation=45)\n", "\n", "# 5 mm: z=5 to z=10\n", "dim_arrow(ax, z_lens_start, dim_y, z_lens_end, dim_y)\n", "ax.text((z_lens_start + z_lens_end) / 2 - 2.5, dim_y - 1.5, '5 mm', fontsize=10,\n", " ha='center', va='top', rotation=45)\n", "\n", "# 70 mm: z=10 to z=80\n", "dim_arrow(ax, z_lens_end, dim_y, z_target, dim_y)\n", "ax.text((z_lens_end + z_target) / 2, dim_y - 2.0, '60 mm', fontsize=10,\n", " ha='center', va='top')\n", "\n", "# --- Remove frame, axis labels, tick labels ---\n", "ax.set_axis_off()\n", "\n", "# Set limits to give appropriate padding\n", "ax.set_xlim(-8, 88)\n", "ax.set_ylim(-34, 32)\n", "ax.set_aspect('equal')\n", "\n", "plt.tight_layout()\n", "\n", "plt.savefig(path+\"/layout3.png\", dpi=400, bbox_inches='tight')\n", "\n", "#import os\n", "#os.kill(os.getpid(), 9)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ABe0TcQzRXwQ" }, "outputs": [], "source": [] } ], "metadata": { "accelerator": "GPU", "colab": { "gpuType": "G4", "provenance": [] }, "kernelspec": { "display_name": "working", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.12.0" } }, "nbformat": 4, "nbformat_minor": 0 }