4. Getting Starting with the Codebase

This section will help you explore the Optiland codebase and run your first simulation.

4.1. Exploring the Codebase

Optiland is designed with modularity in mind. Here are the key components you’ll want to explore first:

  • optic: Defines the core Optic class for building optical systems.

  • rays: Defines ray objects and and ray generators for simulating light propagation.

  • surfaces: The building blocks for defining optical elements like lenses and mirrors.

  • optimization: Tools for optimizing optical systems based on user-defined objectives and variables.

We recommend starting with the optic module, as it provides the primary interface for defining optical systems. You may also explore the analysis module to see how simulations are generally performed.

The code is thoroughly documented, so use the inline comments and function/class docstrings to understand how each module works.

4.2. Running Your First Simulation

Here’s a simple example to get you started. This script simulates a basic singlet lens, visualizes the system, and traces some rays.

import numpy as np
from optiland import optic

# Initialize an optic system
system = optic.Optic()

# add surfaces to the system
system.surfaces.add(index=0, thickness=np.inf)
system.surfaces.add(index=1, thickness=7, radius=20.0, is_stop=True, material='N-SF11')
system.surfaces.add(index=2, thickness=23.0)
system.surfaces.add(index=3)

# add aperture
system.set_aperture(aperture_type='EPD', value=20)

# add field
system.fields.set_type(field_type='angle')
system.fields.add(y=0)

# add wavelength
system.wavelengths.add(value=0.587, is_primary=True)

# draw the system in 2D
system.draw(num_rays=5)

# trace some rays (~32x32 rays total)
rays = system.trace(Hx=0, Hy=0, wavelength=0.587, num_rays=32, distribution='uniform')

# print the first 10 ray y intersection points on the image plane
print(rays.y[:10])

This script demonstrates three important aspects of Optiland:

  1. Defining an optical system: The Optic object is the starting point for all simulations. Aperture, field, and wavelength are set using the set_aperture, set_field_type, add_field and add_wavelength methods.

  2. Visualization: Calling the draw method generates a 2D plot of the system.

  3. Tracing rays: Calling the trace method generates rays and traces them through the system. This returns the rays at the image plane.

Save this script as example_simulation.py and run it using:

python example_simulation.py

Alternatively, you can run the script in an interactive Python environment like Jupyter Notebook.

You should see a 2D plot of rays passing through the lens. Experiment with different parameters (e.g., radius of curvature, conic) to observe how the system behaves.

4.3. Next Steps

Once you’ve run the example simulation, explore the following areas:

  • Modify optical systems: Add more lenses or mirrors to build complex systems.

  • Use the analysis tools: Evaluate system performance with tools like spot diagrams or wavefront analysis.

  • Experiment with optimization: Learn how to optimize lens thickness, curvature, and other parameters for specific design goals.

For more examples, see the Introduction or learn Optiland step-by-step with the Learning Guide.