Source code for prsctrl.scripts.light_power
from devctrl.devices import Laser, LedController
import numpy as np
from time import sleep
import matplotlib.pyplot as plt
import logging
log = logging.getLogger(__name__)
try:
from pylablib.devices.Thorlabs.misc import PM160
except ImportError:
pass
# 0.709 is the aperture area of the Thorlabs detector
[docs]
def measure_light_intensity(light_source: Laser|LedController, wavelength_nm, max_laser_power_mW=155, max_led_current_A=0.7, n_steps=10, scale_factor=1/0.709):
if isinstance(light_source, Laser):
xargs = np.linspace(max_laser_power_mW/n_steps, max_laser_power_mW, n_steps)
setter_f = lambda x: light_source.set_power_mW(x)
light_source.set_mode("CP")
light_source.set_power_mW(0)
light_source.on()
header = "Laser Power [mW]"
unit = "mW"
elif isinstance(light_source, LedController):
xargs = np.linspace(max_led_current_A / n_steps, max_led_current_A, n_steps)
setter_f = lambda x: light_source.set_current_A(x)
light_source.set_mode("CC")
light_source.set_current_A(0)
light_source.on()
header = "LED Current [A]"
unit = "A"
else:
raise RuntimeError(f"Light source must be a Laser or LedController.")
powers = np.empty((xargs.shape[0], 2))
power_meter = PM160("USB0::0x1313::0x8072::1915211::INSTR")
power_meter.set_wavelength(wavelength_nm)
power_meter.enable_autorange(True)
for i, x in enumerate(xargs):
log.info(f"Step {i+1:02}/{n_steps:02}: {x} {unit}")
setter_f(x)
sleep(1.0)
power = power_meter.get_power() * 1e3
print(f"power: {power} mW, scaled power = {power*scale_factor} mW/cm^2")
powers[i,0] = x
powers[i,1] = power * scale_factor
log.info(f"Done, setting light source to {0} {unit}")
setter_f(0)
return powers
[docs]
def plot_light_intensity(powers, xunit=None, subplot_kw=None):
fig, ax = plt.subplots(**(subplot_kw or dict(figsize=(5.2, 4.8))))
ax.scatter(powers[:,0], powers[:,1])
if xunit:
ax.set_xlabel(xunit)
ax.set_ylabel("Sample Power [mW/cm$^2$]")
return fig, ax