Skip to main content

Python interface to RefractiveIndex database

Tests

The original database
https://github.com/polyanskiy/refractiveindex.info-database

Installation

pip install refractiveindex

Usage

import numpy as np
from refractiveindex import RefractiveIndexMaterial

# Tabulated nk material
SiO = RefractiveIndexMaterial(shelf='main', book='SiO', page='Hass')

SiO.get_refractive_index(600)
# 1.96553846

SiO.get_extinction_coefficient(600)
# 0.001

SiO.get_epsilon(600)
# (3.8633404437869827+0.003931076923076923j)

# Formula-based material
bk7 = RefractiveIndexMaterial(shelf='specs', book='SCHOTT-optical', page='N-BK7')
bk7.get_refractive_index(589.3)
# 1.5168...

# Array input
wavelengths = np.array([400, 500, 600, 700])
SiO.get_refractive_index(wavelengths)
# array([2.15092857, 1.999, 1.96553846, 1.942])

Units

All methods accept an optional unit= parameter. Default is nm. The following calls are all equivalent:

bk7.get_refractive_index(589.3)                 # nm (default)
bk7.get_refractive_index(5893, unit='A')         # Angstrom
bk7.get_refractive_index(5.893e-7, unit='m')     # meters
bk7.get_refractive_index(0.5893, unit='um')      # µm
bk7.get_refractive_index(16978, unit='cm-1')     # wavenumbers
bk7.get_refractive_index(508.8, unit='THz')      # terahertz
bk7.get_refractive_index(2.108, unit='eV')       # electron volts

The same parameter works for get_extinction_coefficient, get_epsilon, and get_wl_range.

Unit String Conversion from µm
meters 'm' $\lambda{[\text{m}]} = \lambda{[\mu\text{m}]} \cdot 10^{-6}$
nanometers 'nm' $\lambda{[\text{nm}]} = \lambda{[\mu\text{m}]} \cdot 10^{3}$
Angstroms 'A' $\lambda{[\text{Å}]} = \lambda{[\mu\text{m}]} \cdot 10^{4}$
wavenumbers 'cm-1' $\tilde{\nu}{[\text{cm}^{-1}]} = 10^4 / \lambda{[\mu\text{m}]}$
terahertz 'THz' $\nu{[\text{THz}]} = \frac{c[\text{m}/\text{s}] \cdot 10^{-6}}{\lambda{[\mu\text{m}]}}$
electron volts 'eV' $E [\text{eV}] = \frac{h[\text{J}\cdot \text{s}]\cdot c[\text{m}/\text{s}] \cdot 10^{6}}{e[\text{C}] \cdot \lambda [\mu \text{m}]}$

Here $c$ is the speed of light, $h$ is the Plank constant, $e$ is the elementary charge.

Valid wavelength range

Every material exposes the wavelength range over which its data are defined:

# Returns (min, max) in the requested unit
bk7.get_wl_range()            # e.g. (300.0, 2500.0)   nm
bk7.get_wl_range(unit='um')   # e.g. (0.3, 2.5)        µm
bk7.get_wl_range(unit='cm-1') # e.g. (4000.0, 33333.3) cm⁻¹

Result is always returned as (min, max).

Out-of-range behavior

No exception is raised for out-of-range wavelengths, but the returned value is not reliable:

Data type Out-of-range result
Tabulated (n, k, nk) nan
Formula (1–9) Silent extrapolation — may be unphysical, or nan with a RuntimeWarning if the formula evaluates a square root of a negative number

Always check get_wl_range() before querying if you are not certain the wavelength is within the measured range:

lo, hi = mat.get_wl_range()
if lo <= wavelength <= hi:
    n = mat.get_refractive_index(wavelength)
else:
    raise ValueError(f"wavelength {wavelength} nm is outside the valid range [{lo}, {hi}] nm")

Notes:

  • Here the time dependence is assumed to be $\mathrm{e}^{-\mathrm{i} \omega t}$, so $\mathrm{Im}(\varepsilon) > 0$ is responsible for the losses. For the opposite convention, use exp_type:
    SiO.get_epsilon(600, exp_type="exp(+iwt)")  # (n - ik)^2
    # (3.8633404437869827-0.003931076923076923j)
    
    The default is exp_type="exp(-iwt)". You can also write "exp(iwt)", j instead of i, and ω instead of w, for example "exp(-jωt)". Here j is the imaginary unit, so only the sign selects the convention. The old names "exp_minus_i_omega_t" and "exp_plus_i_omega_t" also work.
  • If there is a space in the name, write underscore instead, i.e. not page='Rodriguez-de Marcos' but page='Rodriguez-de_Marcos'.
  • All 9 dispersion formula types used by the refractiveindex.info database are supported: Sellmeier (1), Sellmeier-2 (2), Polynomial (3), RefractiveIndex.INFO (4), Cauchy (5), Gases (6), Herzberger (7), Retro (8), and Exotic (9).
  • The database is automatically downloaded on first use to ~/.refractiveindex.info-database.

How to get material page names

You can find the proper "page" name by hovering your cursor on the link in the Data section

How to get page name

Or you can look up folders in this repository
https://github.com/polyanskiy/refractiveindex.info-database

Similar projects

Possible problems

If the upstream database has changed its structure, upgrade the package

pip install --upgrade refractiveindex

and remove the database folder at ~/.refractiveindex.info-database.

TODO

  1. Include EODG data

Metadata

Release files for refractiveindex 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for refractiveindex 1.1.0
File Size Uploaded Provenance Actions
refractiveindex-1.1.0.tar.gz 9.3 kB With provenance Details for refractiveindex-1.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for refractiveindex 1.1.0
File Interpreter ABI Platform Actions
refractiveindex-1.1.0-py3-none-any.whl Python 3 none any Details for refractiveindex-1.1.0-py3-none-any.whl

Total release size: 19.7 kB

Release files / refractiveindex-1.1.0.tar.gz

Download URL refractiveindex-1.1.0.tar.gz
Size 9.3 kB
Tags Source
SHA-256 checksum
How to use checksums
eace3e0e453abe4fd11e99c1fe9ad1221004244853f27c6f0a7a2bf365d5890b
BLAKE2b-256 checksum
How to use checksums
48e3c793a2090b1e590832aacd205e483dfed78a01ef7596aeee4e30dd656aab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Release files / refractiveindex-1.1.0-py3-none-any.whl

Download URL refractiveindex-1.1.0-py3-none-any.whl
Size 10.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
88e5aa6058ddac3d4db846a1188bef29a1393b658e9a7f27c21f658371b2dcf5
BLAKE2b-256 checksum
How to use checksums
b3284ff64667f858541976b9fc85716a3a008ddf202f2821359a89828aab07c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

Security for refractiveindex 1.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for refractiveindex-1.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 26, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page