Santec TSL-570 Tunable Semiconductor Laser

This notebook demonstrates the QCoDeS driver for the Santec TSL-570 tunable laser.

Key points

  • Uses SCPI command mode via the driver

  • Wavelength/frequency are in SI units (m, Hz)

  • Power setpoint is in mW

  • Uses a VISA resource address (for example TCPIP socket)

Update the resource string before running.

1. Import and Connect

[ ]:
import time

from qcodes_contrib_drivers.drivers.Santec.Santec_TSL import SantecTSL

# Example VISA resource for LAN socket
resource = "TCPIP0::192.168.50.29::5000::SOCKET"
laser = SantecTSL("laser", resource)
print(f"Connected to: {laser.get_idn()}")

2. System Information

[ ]:
print("=== System Information ===")
print(f"Firmware version:  {laser.system_version()}")
print(f"Product code:      {laser.system_code()}")
print(f"Command set:       {laser.command_set()}")
print(f"Interlock status:  {laser.system_lock()}")
print(f"System alert:      {laser.system_alert()}")
print(f"Error queue:       {laser.system_error()}")

3. Basic Wavelength and Power Control

[ ]:
print("=== Current Settings ===")
print(f"Wavelength: {laser.wavelength() * 1e9:.4f} nm ({laser.wavelength():.10e} m)")
print(f"Frequency:  {laser.frequency() / 1e12:.6f} THz ({laser.frequency():.10e} Hz)")
print(f"Power:      {laser.power():.4f} mW")
print(f"Output:     {laser.output()}")
print(f"Shutter:    {laser.shutter()}")

target_wavelength_nm = 1550.0
laser.wavelength(target_wavelength_nm * 1e-9)
print(f"\nWavelength set to: {laser.wavelength() * 1e9:.4f} nm")

target_frequency_thz = 193.5
laser.frequency(target_frequency_thz * 1e12)
print(f"Frequency set to: {laser.frequency() / 1e12:.4f} THz")
print(f"Corresponding wavelength: {laser.wavelength() * 1e9:.4f} nm")

laser.power_unit("mW")
laser.power(1.0)
print(f"Power set to: {laser.power():.4f} mW")

4. Fine Wavelength Control

[ ]:
laser.wavelength_fine(25.0)
print(f"Fine tuning offset: {laser.wavelength_fine()}")

laser.wavelength_offset(0.01e-9)
print(f"Wavelength offset: {laser.wavelength_offset() * 1e9:.3f} nm")

laser.disable_fine_tuning()
print("Fine-tuning disabled")

5. Wavelength and Frequency Sweep Configuration

[ ]:
start_nm = 1530.0
stop_nm = 1570.0
laser.sweep_start_wavelength(start_nm * 1e-9)
laser.sweep_stop_wavelength(stop_nm * 1e-9)

start_thz = 187.3
stop_thz = 196.1
laser.sweep_start_frequency(start_thz * 1e12)
laser.sweep_stop_frequency(stop_thz * 1e12)

laser.sweep_mode(1)
laser.sweep_speed(10)
laser.sweep_step_wavelength(0.1e-9)
laser.sweep_dwell(0.1)
laser.sweep_cycles(1)
laser.sweep_delay(0.5)

print("=== Sweep Parameters ===")
print(f"Wavelength start: {laser.sweep_start_wavelength() * 1e9:.2f} nm")
print(f"Wavelength stop:  {laser.sweep_stop_wavelength() * 1e9:.2f} nm")
print(f"Frequency start:  {laser.sweep_start_frequency() / 1e12:.2f} THz")
print(f"Frequency stop:   {laser.sweep_stop_frequency() / 1e12:.2f} THz")
print(f"Mode:             {laser.sweep_mode()} (0=step 1-way, 1=cont 1-way, 2=step 2-way, 3=cont 2-way)")
print(f"Speed:            {laser.sweep_speed()} nm/s")
print(f"Step (wavelength): {laser.sweep_step_wavelength() * 1e9:.3f} nm")
print(f"Step (frequency):  {laser.sweep_step_frequency() / 1e9:.3f} GHz")
print(f"Dwell:            {laser.sweep_dwell()} s")
print(f"Cycles:           {laser.sweep_cycles()}")
print(f"Delay:            {laser.sweep_delay()} s")

6. Trigger Configuration

[ ]:
laser.trigger_input_external(True)
laser.trigger_input_polarity("RISE")  # RISE or FALL
laser.trigger_input_standby(False)

laser.trigger_output_timing("STEP")  # NONE, STOP, START, STEP
laser.trigger_output_polarity("RISE")  # RISE or FALL
laser.trigger_output_step(1e-12)
laser.trigger_output_setting("WAVELENGTH")  # WAVELENGTH or TIME

print("=== Trigger Input ===")
print(f"External: {laser.trigger_input_external()}")
print(f"Polarity: {laser.trigger_input_polarity()}")
print(f"Standby:  {laser.trigger_input_standby()}")

print("\n=== Trigger Output ===")
print(f"Timing:   {laser.trigger_output_timing()}")
print(f"Polarity: {laser.trigger_output_polarity()}")
print(f"Step:     {laser.trigger_output_step() * 1e12:.3f} pm")
print(f"Mode:     {laser.trigger_output_setting()}")

7. Execute and Monitor Sweep

[ ]:
print(f"Sweep state before start: {laser.sweep_state()}")
laser.sweep_single()

print("=== Monitoring Sweep ===")
for idx in range(10):
    state = laser.sweep_state()
    wl_nm = laser.wavelength() * 1e9
    count = laser.sweep_count()
    print(f"[{idx + 1}] State: {state:16s} lambda = {wl_nm:8.3f} nm  Count: {count}")
    if state == "STOPPED":
        break
    time.sleep(0.2)

laser.sweep_stop()
print(f"Final state: {laser.sweep_state()}")

8. Snapshot and Logged Data

[ ]:
# Avoid update=True because sweep_range_minimum_wavelength / sweep_range_maximum_wavelength can time out on some firmware
snapshot = laser.snapshot(update=False)

print("=== Snapshot (selected parameters) ===")
params = snapshot["parameters"]
for name in ["wavelength", "frequency", "power", "output", "sweep_mode", "sweep_state"]:
    if name in params:
        print(f"{name:20s}: {params[name].get('value', 'N/A')}")

print("\nLogged points:", laser.readout_points())
# Data readouts return numpy arrays
# wavelength_log = laser.readout_data()
# power_log = laser.readout_power_data()

9. Cleanup and Shutdown

[ ]:
print("Shutting down laser output...")
laser.sweep_stop()
laser.shutter(False)
laser.output(False)
print(f"Sweep:   {laser.sweep_state()}")
print(f"Output:  {laser.output()}")
print(f"Shutter: {laser.shutter()}")

laser.close()
print("Connection closed.")