Skip to main content

Raytrace module

Project description

Chromatic Confocal Sensor Ray Tracer

Specialized ray tracing engine designed for simulating and optimizing chromatic confocal sensors. This repository provides a powerful toolset for researchers and engineers working on precise optical measurement systems, enabling the accurate modeling of light interactions within chromatic confocal setups.

Installation

The library can be simply installed by:

pip install confocal-raytracer

Defining the setup

The optical setup is defined inside a JSON-like file. If, for example, an achromatic doublet is defined each face of both lenses should be defined as follows:

doublet = {
    "AC500-150-A-ML_1": {
        "Front Face": dict(
            curvature=96.85, konic=0, z_0=0, aperture_radius=50 / 2
        ),
        "Back Face": dict(
            curvature=-73.74,
            konic=0,
            z_0=9.5,
            aperture_radius=50 / 2,
        ),
        "Material": "BAK4",
        "Calibration": False,
    },
    "AC500-150-A-ML_2": {
        "Front Face": dict(
            curvature=-73.74, konic=0, z_0=9.5, aperture_radius=50 / 2
        ),
        "Back Face": dict(
            curvature=-241.63,
            konic=0,
            z_0=13.5,
            aperture_radius=50 / 2,
        ),
        "Material": "SF10",
        "Calibration": False,
    },
    "AC500-150-A-ML_1_R": {
        "Front Face": dict(
            curvature=241.63,
            konic=0,
            z_0=0,
            aperture_radius=50 / 2,
        ),
        "Back Face": dict(
            curvature=73.74, konic=0, z_0=4, aperture_radius=50 / 2
        ),
        "Material": "BAK4",
        "Calibration": False,
    },
    "AC500-150-A-ML_2_R": {
        "Front Face": dict(
            curvature=73.74,
            konic=0,
            z_0=4,
            aperture_radius=50 / 2,
        ),
        "Back Face": dict(
            curvature=-96.85, konic=0, z_0=13.5, aperture_radius=50 / 2
        ),
        "Material": "SF10",
        "Calibration": False,
    },
    "Sensor": {
        "Front Face": dict(
            curvature=float("inf"),
            konic=0,
            z_0=170,
            aperture_radius=100,
        ),
        "Back Face": dict(
            curvature=float("inf"),
            konic=0,
            z_0=170,
            aperture_radius=100,
        ),
        "Material": "SF2",
        "Calibration": False,
    },
}

Lens materials

The materials available with their refractive indexes should be specified in a Pandas Data Frame. The custom spectrum intensity can also be specified in the same Data Frame as follows:

wl_nm intensity n_BK7 n_SF2 n_SF5 n_BAF10 n_SF10 n_BAK4 n_SF57
500.5 0.0851431638 1.5213856439764 1.6587264318676913 1.6847781738090497 1.67825 1.74315 1.57468 1.86746
500.7 0.08645302802 1.5213723632237195 1.6586929033319964 1.6847437966326086 1.6782202524647911 1.7430968741556505 1.574659846238762 1.8673847333525386
500.8 0.08502408117 1.5213657288620468 1.658676166909398 1.684726608044388 1.6782055071330022 1.7430704823647605 1.5746498284981434 1.8673473595993073
501.0 0.08721513301 1.5213524721680336 1.6586427497546976 1.6846922308679468 1.6781762683497092 1.7430180354906653 1.5746299095672376 1.86727312240276
501.1 0.08640539646 1.5213458498356942 1.658626069022597 1.684675042279726 1.6781617729016662 1.7429919781855066 1.5746200076850838 1.867236255427011

Example usage


from confocal_raytracer.simulation.raytrace import RayTrace
from confocal_raytracer.simulation.setup import chromatic_confocal
from confocal_raytracer.simulation._utils import plotter
from confocal_raytracer.load_data import n_data
import numpy as np
import matplotlib.pyplot as plt
import time
import warnings



# Ignore warning in axins legend location.
warnings.filterwarnings("ignore")

# Set refractive index of the spatial filter
n_data["n_absorb"] = np.inf

# Decimate the refractive index data to make
# the plot faster
n_data = n_data[::5]

# Get example optical data
optical_data = chromatic_confocal

# Set the pinhole size before sensor
PINHOLE_SIZE = 25 / 1000  # milimeters

# Number of rays from light source
N_RAYS = 3
# Set the extension of the light source
LIGHT_SOURCE_RADIUS = 0 / 1000  # milimeters
# Set the desviation angle with respecto to the 
# optical axis of the N_RAYS
THETA = 6.0  # Degrees
# If LIGHT_SOURCE_RADIUS != 0 it is possible to set
# more rays for each height with the same desviation angle
N_RAYS_HEIGHT = 1
# Light source position
Z0 = -33.4  # Light source position same as
# back focal length of the achormatic doublet

fig, ax = plt.subplots()

# RayTrace object
raytrace = RayTrace(
    optical_data=optical_data,
    n_data=n_data,
    light_source_radius=LIGHT_SOURCE_RADIUS,
    n_rays=N_RAYS,
    theta=THETA,
    z0=Z0,
    n_rays_height=N_RAYS_HEIGHT,
)

t0 = time.perf_counter()
# After intersecting the full system, 
# frays will have the shape (len(n_data), N_RAYS_HEIGHT, N_RAYS)
# where each one of the rays will be a Ray object with all the
# parameters included in it such as: angle of incidence and path followed by the ray
frays = raytrace.intersect_full_system()
print("Elapsed time (s): ", time.perf_counter() - t0)

# Plot setup
fig, ax = plotter(optical_data=optical_data, final_rays=frays, fig=fig, ax=ax)
plt.plot(
    [
        optical_data["Sensor"]["Front Face"]["z_0"],
        optical_data["Sensor"]["Front Face"]["z_0"],
    ],
    [-PINHOLE_SIZE / 2, PINHOLE_SIZE / 2],
    c="r",
)
ax.set(xlabel="z-position (mm)", ylabel="y-position (mm)")
axins = ax.inset_axes([0.25, 0.1, 0.35, 0.35])
plotter(optical_data=optical_data, final_rays=frays, fig=fig, ax=axins)
axins.plot(
    [
        optical_data["Sensor"]["Front Face"]["z_0"],
        optical_data["Sensor"]["Front Face"]["z_0"],
    ],
    [-PINHOLE_SIZE / 2, PINHOLE_SIZE / 2],
    c="r",
    lw=3,
    label="PINHOLE",
)
x1, x2, y1, y2 = (
    optical_data["Sensor"]["Front Face"]["z_0"] - 0.1,
    optical_data["Sensor"]["Front Face"]["z_0"] + 0.1,
    -0.1,
    0.1,
)
axins.legend()
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
plt.gca().indicate_inset_zoom(axins, edgecolor="black")
plt.tight_layout()
plt.show()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

confocal_raytracer-0.1.34.tar.gz (300.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

confocal_raytracer-0.1.34-py3-none-any.whl (293.2 kB view details)

Uploaded Python 3

File details

Details for the file confocal_raytracer-0.1.34.tar.gz.

File metadata

  • Download URL: confocal_raytracer-0.1.34.tar.gz
  • Upload date:
  • Size: 300.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.9.13 Windows/10

File hashes

Hashes for confocal_raytracer-0.1.34.tar.gz
Algorithm Hash digest
SHA256 01e33583f2417b3d5ca2592ab9e451520a6110dd354ae15315a5aaf090ecceba
MD5 430192c0c77ee34a281b0778970d943c
BLAKE2b-256 13f154a6e17ccfbef39f607c490213c6f080b86f6be30777b444ff13e1d9b885

See more details on using hashes here.

File details

Details for the file confocal_raytracer-0.1.34-py3-none-any.whl.

File metadata

File hashes

Hashes for confocal_raytracer-0.1.34-py3-none-any.whl
Algorithm Hash digest
SHA256 92edc9689b94cde9e595a4cd9dd33cb12b2ceedc54fb1a555a0001137e536232
MD5 f147058c5fad3f411638c7488deccf15
BLAKE2b-256 bb868c1ef126ce73746e3f48025b4812a1df8ee1137bee4b1edea63394aec366

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page