Skip to main content

Python module for 3D Monte Carlo Simulation of Light Propagation

Project description

PyTissueOptics

A hardware-accelerated Python module to simulate light transport in arbitrarily complex 3D media with ease.

Tests codecov CodeFactor License

This python package is a fast and flexible implementation of Monte Carlo modeling for light transport in diffuse media. The package is easy to set up and use, and its mesh-based approach makes it a polyvalent tool to simulate light transport in arbitrarily complex scenes. The package offers both a native Python implementation and a hardware-accelerated version using OpenCL which supports most GPUs and CPUs.

Designed with research and education in mind, the code aims to be clear, modular, and easy to extend for a wide range of applications.

Notable features

  • Supports arbitrarily complex mesh-based 3D environments.
  • Normal smoothing for accurate modeling of curved surfaces like lenses.
  • Per-photon data points of deposited energy, fluence rate and intersection events.
  • Hardware accelerated with OpenCL using PyOpenCL.
  • Photon traces & detectors.
  • Import external 3D models (.OBJ).
  • Many 3D visualization options built with Mayavi.
  • Low memory mode with auto-binning to 2D views.
  • Reusable graphics framework to kickstart other raytracing projects like SensorSim.

Installation

Requires Python 3.9+ installed.

Currently, the pip version is outdated. We recommend installing the development version.

  1. Clone the repository.
  2. Create a virtual environment inside the repository with python -m venv venv.
  3. Activate the virtual environment.
    • On MacOS/Linux: source venv/bin/activate.
    • On Windows: venv\Scripts\activate.bat.
  4. Upgrade pip with pip install --upgrade pip.
  5. Install the package requirements with python -m pip install -e .[dev].

Getting started

A command-line interface is available to quicky run a simulation from our pool of examples:

python -m pytissueoptics --help

You can kick start your first simulation using one of our pre-defined scene under the samples module.

from pytissueoptics import *

# Define (scene, source, logger)
N = 500_000
scene = samples.PhantomTissue()
source = DivergentSource(
   position=Vector(0, 0, -0.1), direction=Vector(0, 0, 1), N=N, diameter=0.2, divergence=0.78
)
logger = EnergyLogger(scene)

# Run
source.propagate(scene, logger=logger)

# Stats & Visualizations
viewer = Viewer(scene, source, logger)
viewer.reportStats()

viewer.show2D(View2DProjectionX())
viewer.show2D(View2DProjectionX(solidLabel="middleLayer"))
viewer.show2D(View2DSurfaceZ(solidLabel="middleLayer", surfaceLabel="interface0"))
viewer.show1D(Direction.Z_POS)
viewer.show3D()

Expected output

Report of solid 'backLayer'
  Absorbance: 67.78% (10.53% of total power)
    Transmittance at 'backLayer_back': 22.4%
    Transmittance at 'interface0': 4.9%
    ...

stack_visuals

Scene definition

Here is the explicit definition of the above scene sample. We recommend you look at other examples to get familiar with the API.

materials = [
   ScatteringMaterial(mu_s=2, mu_a=1, g=0.8, n=1.4),
   ScatteringMaterial(mu_s=3, mu_a=1, g=0.8, n=1.7),
   ScatteringMaterial(mu_s=2, mu_a=1, g=0.8, n=1.4),
]
w = 3
frontLayer = Cuboid(a=w, b=w, c=0.75, material=materials[0], label="frontLayer")
middleLayer = Cuboid(a=w, b=w, c=0.5, material=materials[1], label="middleLayer")
backLayer = Cuboid(a=w, b=w, c=0.75, material=materials[2], label="backLayer")
layerStack = backLayer.stack(middleLayer, "front").stack(frontLayer, "front")
scene = ScatteringScene([layerStack])

Hardware acceleration

Depending on your platform and GPU, you might already have OpenCL drivers installed, which should work out of the box. Run a PyTissueOptics simulation first to see your current status.

Follow the instructions on screen to get setup properly. It will offer to run a benchmark test to determine the ideal number of work units for your hardware. For more help getting OpenCL to work, refer to PyOpenCL's documentation on the matter. Note that you can disable hardware acceleration at any time with disableOpenCL() or by setting the environment variable PTO_DISABLE_OPENCL=1.

Examples

All examples can be run using the CLI tool:

python -m pytissueoptics --list
python -m pytissueoptics --examples 1,2,3
  1. Scene sample
  2. Infinite medium
  3. Optical lens & saving progress
  4. Custom layer stack
  5. Sphere in cube
  6. Sampling volume simulation

Other scene and benchmark examples are available under /examples, including:


Known limitations

  1. It uses Henyey-Greenstein approximation for scattering direction because it is sufficient most of the time.
  2. Reflections are specular, which does not account for the roughness of materials. A Bling-Phong reflection model could be added in a future release.

Acknowledgment

This package was first inspired by the standard, tested, and loved MCML from Wang, Jacques and Zheng , itself based on Prahl and completely documented, explained, dissected by Jacques and Prahl. The original idea of using Monte Carlo for tissue optics calculations was first proposed by Wilson and Adam in 1983. This would not be possible without the work of these pioneers.

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

pytissueoptics-2.0.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

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

pytissueoptics-2.0.0-py3-none-any.whl (436.5 kB view details)

Uploaded Python 3

File details

Details for the file pytissueoptics-2.0.0.tar.gz.

File metadata

  • Download URL: pytissueoptics-2.0.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for pytissueoptics-2.0.0.tar.gz
Algorithm Hash digest
SHA256 fac69847e86f64ea46289edff247d7eaffce6c1fee280168d872687f7d2201e5
MD5 05c5e3a1f34c922ec24ee8c02831cca8
BLAKE2b-256 c4731517b8bb3c753b17f64a256539bf4b38f37f9c8bd4ba08fd2c0f12410522

See more details on using hashes here.

File details

Details for the file pytissueoptics-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: pytissueoptics-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 436.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for pytissueoptics-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c978cad10f3cd41f964b2fb357a48547386864b0f34c3ad839e67dbd3f492fd0
MD5 bc965408dc47a2ec98bbe5cfc012af99
BLAKE2b-256 f16926f62178a0b9f93b2701ad8a1d87a423776164fa657ee1c7a97af50e44a7

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