Skip to main content

ISO 11146 Calculation of Laser Beam Center, Diameter, and M²

Project description

by Scott Prahl

pypi github conda zenodo

License testing docs Downloads

Simple and fast calculation of beam sizes from a single monochrome image based on the ISO 11146 method of variances. Some effort has been made to make the algorithm less sensitive to background offset and noise.

This module also supports M² calculations based on a series of images collected at various distances from the focused beam.

Extensive documentation can be found at <https://laserbeamsize.readthedocs.io>

Installation

Use pip:

pip install --user laserbeamsize

or conda:

conda install -c conda-forge laserbeamsize

or use immediately by clicking the Google Colaboratory button below

Colab

Determining the beam size in an image

Finding the center and dimensions of a good beam image:

import imageio.v3 as iio
import laserbeamsize as lbs

file = "https://github.com/scottprahl/laserbeamsize/raw/master/docs/t-hene.pgm"
image = iio.imread(file)

x, y, dx, dy, phi = lbs.beam_size(image)
print("The center of the beam ellipse is at (%.0f, %.0f)" % (x, y))
print("The ellipse diameter (closest to horizontal) is %.0f pixels" % dx)
print("The ellipse diameter (closest to   vertical) is %.0f pixels" % dy)
print("The ellipse is rotated %.0f° ccw from the horizontal" % (phi * 180/3.1416))

to produce:

The center of the beam ellipse is at (651, 492)
The ellipse diameter (closest to horizontal) is 369 pixels
The ellipse diameter (closest to   vertical) is 347 pixels
The ellipse is rotated -12° ccw from the horizontal

A visual report can be done with one function call:

lbs.plot_image_analysis(beam)
plt.show()

produces something like

HeNe report

or:

lbs.plot_image_analysis(beam, r"Original Image $\lambda$=4µm beam", pixel_size = 12, units='µm')
plt.show()

produces something like

astigmatic report

Non-gaussian beams work too:

# 12-bit pixel image stored as high-order bits in 16-bit values
tem02 = imageio.imread("TEM02_100mm.pgm") >> 4
lbs.plot_image_analysis(tem02, title = r"TEM$_{02}$ at z=100mm", pixel_size=3.75)
plt.show()

produces

TEM02

Determining M²

Determining M² for a laser beam is also straightforward. Just collect beam diameters from five beam locations within one Rayleigh distance of the focus and from five locations more than two Rayleigh distances:

lambda1=308e-9 # meters
z1_all=np.array([-200,-180,-160,-140,-120,-100,-80,-60,-40,-20,0,20,40,60,80,99,120,140,160,180,200])*1e-3
d1_all=2*np.array([416,384,366,311,279,245,216,176,151,120,101,93,102,120,147,177,217,256,291,316,348])*1e-6
lbs.M2_radius_plot(z1_all, d1_all, lambda1, strict=True)
plt.show()

produces

fit for M2

Here is an analysis of a set of images that do not meet the ISO 11146 requirements for determining M² (because the image locations are not taken in right locations relative to the focus). These beam images are from a HeNe laser with slightly misaligned mirrors to primarily lase in a TEM₀₁ transverse mode. The laser resonator had a fixed rotation of 38.7° from the plane of the optical table.:

lambda0 = 632.8e-9 # meters
z10 = np.array([247,251,259,266,281,292])*1e-3 # meters
filenames = ["sb_%.0fmm_10.pgm" % (number*1e3) for number in z10]

# the 12-bit pixel images are stored in high-order bits in 16-bit values
tem10 = [imageio.imread(name)>>4 for name in filenames]

# remove top to eliminate artifact
for i in range(len(z10)):
    tem10[i] = tem10[i][200:,:]

# find beam rotated by 38.7° in all images
fixed_rotation = np.radians(38.7)
options = {'pixel_size': 3.75, 'units': "µm", 'crop': [1400,1400], 'z':z10, 'phi':fixed_rotation}
dy, dx= lbs.beam_size_montage(tem10, **options)  # dy and dx in microns
plt.show()

produces

montage of laser images

Here is one way to plot the fit using the above diameters:

lbs.M2_diameter_plot(z10, dx*1e-6, lambda0, dy=dy*1e-6)
plt.show()

In the graph on the below right, the dashed line shows the expected divergence of a pure gaussian beam. Since real beams should diverge faster than this (not slower) there is some problem with the measurements (too few!). On the other hand, the M² value the semi-major axis 2.6±0.7 is consistent with the expected value of 3 for the TEM₁₀ mode.

fit

License

laserbeamsize is licensed under the terms of the MIT license.

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

laserbeamsize-2.0.5.tar.gz (41.9 kB view details)

Uploaded Source

Built Distribution

laserbeamsize-2.0.5-py3-none-any.whl (34.8 kB view details)

Uploaded Python 3

File details

Details for the file laserbeamsize-2.0.5.tar.gz.

File metadata

  • Download URL: laserbeamsize-2.0.5.tar.gz
  • Upload date:
  • Size: 41.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for laserbeamsize-2.0.5.tar.gz
Algorithm Hash digest
SHA256 71a01d08255b7f893b83dabe5dbddde425f0ca5738d5f8109375e79b4a6ff1a0
MD5 11625c86a2ed312af76d56756de119cb
BLAKE2b-256 6a1fffea494420ed2c65977b306a4947b592ed1d73571d0907cb500645495e81

See more details on using hashes here.

File details

Details for the file laserbeamsize-2.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for laserbeamsize-2.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 8974e3da561496a3cf15ed1b6453d8eacd0b09bb215d6a6ff20e0d8924b90a04
MD5 7623cdb1f7074617d940e4e0a77deec6
BLAKE2b-256 26157c86d160fc8e4b1bc5fc9e188a1947845ce74c149d054f01a381cc38cdf3

See more details on using hashes here.

Supported by

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