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