pylablib.devices.M2 package

Submodules

pylablib.devices.M2.base module

exception pylablib.devices.M2.base.M2Error[source]

Bases: DeviceError

Generic M2 error

add_note()

Exception.add_note(note) – add a note to the exception

args
with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

exception pylablib.devices.M2.base.M2ParseError(*args, code=None)[source]

Bases: M2Error

M2 parse error

add_note()

Exception.add_note(note) – add a note to the exception

args
with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

exception pylablib.devices.M2.base.M2CommunicationError(exc)[source]

Bases: M2Error, DeviceBackendError

M2 network communication error

add_note()

Exception.add_note(note) – add a note to the exception

args
with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

class pylablib.devices.M2.base.ICEBlocDevice(addr, port, timeout=5.0, start_link=True)[source]

Bases: IDevice

Generic M2 Ice Bloc device.

Parameters:
  • addr (str) – IP address of the Ice Bloc device.

  • port (int) – port of the Ice Bloc device.

  • timeout (float) – default timeout of synchronous operations.

  • start_link (bool) – if True, initialize device link on creation.

Error

alias of M2Error

ReraiseError

alias of M2CommunicationError

BackendError

alias of OSError

open()[source]

Open the connection

close()[source]

Close the connection

is_opened()[source]

Check if the device is connected

set_timeout(timeout)[source]

Set timeout for connecting or sending/receiving

flush()[source]

Flush read buffer

noreply(exhaust_when_done=False)[source]

Context manager within which the code switches to the no-reply mode, where it does not wait for a reply to certain commands (usually element setting commands). This allows for faster command issuing, but ignores possible errors returned by the commands. If exhaust_when_done==True, receive all sent replies upon exiting the context; otherwise, receive them the next time a communication with the device is done.

query(op, params, reply_op='auto', report=False, allow_noreply=False)[source]

Send a query using the standard device interface.

reply_op is the name of the reply operation (by default, its the operation name plus "_reply"). If report==True, request completion report (does not apply to all operation). If allow_noreply==True, allow skipping the reply, which allows for faster consecutive command issuing; this only works if the no-reply mode is also activated using noreply(). Return tuple (command, args) with the reply command name and the corresponding arguments (in no-reply mode return (None, None)).

update_reports(timeout=0.0, ignore_replies=None, max_replies=None)[source]

Check for fresh operation reports.

By default, only receive reports and raise an error on replies; if ignore_replies is supplies, it is a list of replies which do not raise an error. If max_replies is supplied, it is the maximal number of replies to read before stopping (by default, no limit, i.e., wait a read leads to a timeout).

get_last_report(op)[source]

Get the latest report for the given operation

check_report(op)[source]

Check and return the latest report for the given operation

wait_for_report(op, error_msg=None, timeout=None)[source]

Wait for a report for the given operation

error_msg specifies the exception message if the report results in an error.

Initialize device link (called automatically on creation)

apply_settings(settings)

Apply the settings.

settings is the dict {name: value} of the device available settings. Non-applicable settings are ignored.

get_device_variable(key)

Get the value of a settings, status, or full info parameter

get_full_info(include=0)

Get dict {name: value} containing full device information (including status and settings).

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

get_full_status(include=0)

Get dict {name: value} containing the device status (including settings).

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

get_settings(include=0)

Get dict {name: value} containing all the device settings.

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

set_device_variable(key, value)

Set the value of a settings parameter

pylablib.devices.M2.emm module

class pylablib.devices.M2.emm.EMM(addr, port, timeout=5.0, start_link=True)[source]

Bases: ICEBlocDevice

M2 EMM Ice Bloc device.

Parameters:
  • addr (str) – IP address of the Ice Bloc device.

  • port (int) – port of the Ice Bloc device.

  • timeout (float) – default timeout of synchronous operations.

  • start_link (bool) – if True, initialize device link on creation.

get_laser_status()[source]

Get the device system status

fine_tune_wavelength(wavelength, beam='visible', sync=True, timeout=None)[source]

Fine-tune the wavelength.

If sync==True, wait until the operation is complete (might take from several seconds up to several minutes).

check_fine_tuning_report()[source]

Check wavelength fine-tuning report

Return "success" or "fail" if the operation is complete, or None if it is still in progress.

wait_for_fine_tuning(timeout=None)[source]

Wait until wavelength fine-tuning is complete

is_fine_tuning()[source]

check if fine tuning is in progress

get_fine_tuning_status()[source]

Get fine-tuning status.

Return either "idle" (no tuning or locking) or "active" (tuning in progress).

get_fine_wavelength()[source]

Get fine-tuned wavelength

stop_fine_tuning()[source]

Stop fine wavelength tuning

setup_terascan(scan_type, scan_range, rate, trunc_rate=True)[source]

Setup terascan.

Parameters:
  • scan_type (str) – scan type. Can be "medium" (BRF+etalon, rate from 100 GHz/s to 1 GHz/s), "fine" (all elements, rate from 20 GHz/s to 1 MHz/s), "ir_medium" or "ir_fine" (same as "medium" or "fine", but defined for the IR laser)

  • scan_range (tuple) – tuple (start, stop) with the scan range (in Hz).

  • rate (float) – scan rate (in Hz/s).

  • trunc_rate (bool) – if True, truncate the scan rate to the nearest available rate (otherwise, incorrect rate would raise an error).

start_terascan(scan_type, sync=False, sync_done=False)[source]

Start terascan.

Scan parameters are set up separately using setup_terascan(). Scan type can be "medium" (BRF+etalon, rate from 100 GHz/s to 1 GHz/s), "fine" (all elements, rate from 20 GHz/s to 1 MHz/s), "ir_medium" or "ir_fine" (same as "medium" or "fine", but defined for the IR laser) If sync==True, wait until the scan is set up (not until the whole scan is complete). If sync_done==True, wait until the whole scan is complete (not recommended, as it can take hours).

enable_terascan_updates(enable=True, update_period=0.01, update_delay=0)[source]

Enable sending periodic terascan updates.

If enabled, laser will send updates in the beginning and in the end of every terascan segment. If update_period!=0, it will also send updates every update_period percents of the segment (this option is not currently supported by M2 firmware).

check_terascan_update()[source]

Check the latest terascan update.

Return None if none are available, or a dictionary {"wavelength":current_wavelength, "activity":op}, where op is "scanning" (scanning in progress), "stitching" (stitching in progress), or "repeat" (segment is repeated).

wait_for_terascan_update()[source]

Wait until a new terascan update is available

check_terascan_start_report()[source]

Check report on terascan start.

Return "success" or "fail" if the operation is complete, or None if it is still in progress.

stop_terascan(scan_type, sync=False)[source]

Stop terascan of the given type.

If sync==True, wait until the operation is complete.

get_terascan_status(scan_type)[source]

Get status of a terascan of a given type (or all statuses if scan_type=="all").

Return a dictionary with 3 items:

"current": current laser frequency (or None if no scan is in progress) "range": tuple with the fill scan range (or None if no frequency is available) "status": can be "stopped" (scan is not in progress), "scanning" (scan is in progress), or "stitching" (scan is in progress, but currently stitching)

stop_all_operation(repeated=True, attempt=0)[source]

Stop all laser operations (tuning and scanning).

If repeated==True, repeat trying to stop the operations until succeeded (more reliable, but takes more time). If attempt>0, it can supply the number of already tried attempts to stop (with repeated=False); the more attempts failed, the more drastic measures will be taken to stop (e.g., initialize short terascan) Return True if the operation is success and False otherwise.

BackendError

alias of OSError

Error

alias of M2Error

ReraiseError

alias of M2CommunicationError

apply_settings(settings)

Apply the settings.

settings is the dict {name: value} of the device available settings. Non-applicable settings are ignored.

check_report(op)

Check and return the latest report for the given operation

close()

Close the connection

flush()

Flush read buffer

get_device_variable(key)

Get the value of a settings, status, or full info parameter

get_full_info(include=0)

Get dict {name: value} containing full device information (including status and settings).

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

get_full_status(include=0)

Get dict {name: value} containing the device status (including settings).

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

get_last_report(op)

Get the latest report for the given operation

get_settings(include=0)

Get dict {name: value} containing all the device settings.

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

is_opened()

Check if the device is connected

noreply(exhaust_when_done=False)

Context manager within which the code switches to the no-reply mode, where it does not wait for a reply to certain commands (usually element setting commands). This allows for faster command issuing, but ignores possible errors returned by the commands. If exhaust_when_done==True, receive all sent replies upon exiting the context; otherwise, receive them the next time a communication with the device is done.

open()

Open the connection

query(op, params, reply_op='auto', report=False, allow_noreply=False)

Send a query using the standard device interface.

reply_op is the name of the reply operation (by default, its the operation name plus "_reply"). If report==True, request completion report (does not apply to all operation). If allow_noreply==True, allow skipping the reply, which allows for faster consecutive command issuing; this only works if the no-reply mode is also activated using noreply(). Return tuple (command, args) with the reply command name and the corresponding arguments (in no-reply mode return (None, None)).

set_device_variable(key, value)

Set the value of a settings parameter

set_timeout(timeout)

Set timeout for connecting or sending/receiving

Initialize device link (called automatically on creation)

update_reports(timeout=0.0, ignore_replies=None, max_replies=None)

Check for fresh operation reports.

By default, only receive reports and raise an error on replies; if ignore_replies is supplies, it is a list of replies which do not raise an error. If max_replies is supplied, it is the maximal number of replies to read before stopping (by default, no limit, i.e., wait a read leads to a timeout).

wait_for_report(op, error_msg=None, timeout=None)

Wait for a report for the given operation

error_msg specifies the exception message if the report results in an error.

pylablib.devices.M2.solstis module

class pylablib.devices.M2.solstis.Solstis(addr, port, timeout=5.0, start_link=True, use_websocket='auto', use_cavity=True)[source]

Bases: ICEBlocDevice

M2 Solstis Ice Bloc device.

Parameters:
  • addr (str) – IP address of the Ice Bloc device.

  • port (int) – port of the Ice Bloc device.

  • timeout (float) – default timeout of synchronous operations.

  • start_link (bool) – if True, initialize device link on creation.

  • use_websocket (bool) – if True, use websocket interface (same as used by the web interface) for additional functionality (wavemeter connection, etalon value, improved operation stopping); "auto" enables it if websocket package is installed, and disables otherwise

  • use_cavity – if False and any reference cavity methods are used, either ignore them, or use closest available methods instead

connect_wavemeter(sync=True)[source]

Connect to the wavemeter (if sync==True, wait until the connection is established)

disconnect_wavemeter(sync=True)[source]

Disconnect from the wavemeter (if sync==True, wait until the connection is broken)

is_wavemeter_connected()[source]

Check if the wavemeter is connected

get_system_status()[source]

Get the device system status

get_full_web_status()[source]

Get full websocket status.

Return a large dictionary containing all the information available in the web interface.

get_full_fine_tuning_status()[source]

Get full fine-tuning status (see M2 Solstis JSON protocol manual for "poll_wave_m" command)

lock_wavemeter(lock=True, sync=True, error_on_fail=True)[source]

Lock or unlock the laser to the wavemeter (if sync==True, wait until the operation is complete)

is_wavemeter_lock_on()[source]

Check if the laser is locked to the wavemeter

fine_tune_wavelength(wavelength, sync=True, timeout=None)[source]

Fine-tune the wavelength.

Only works if the wavemeter is connected. If sync==True, wait until the operation is complete (might take from several seconds up to several minutes).

check_fine_tuning_report()[source]

Check wavelength fine-tuning report

Return "success" or "fail" if the operation is complete, or None if it is still in progress.

wait_for_fine_tuning(timeout=None)[source]

Wait until wavelength fine-tuning is complete

get_fine_tuning_status()[source]

Get fine-tuning status.

Return either "idle" (no tuning or locking), "nolink" (no wavemeter link), "tuning" (tuning in progress), or "locked" (tuned and locked to the wavemeter).

get_fine_wavelength()[source]

Get fine-tuned wavelength.

Only works if the wavemeter is connected.

stop_fine_tuning()[source]

Stop fine wavelength tuning

coarse_tune_wavelength(wavelength, sync=True)[source]

Coarse-tune the wavelength.

Only works if the wavemeter is disconnected. If sync==True, wait until the operation is complete.

get_full_coarse_tuning_status()[source]

Get full coarse-tuning status (see M2 M2 Solstis JSON protocol manual for "poll_move_wave_t" command)

get_coarse_tuning_status()[source]

Get coarse-tuning status.

Return either "done" (tuning is done), "tuning" (tuning in progress), or "fail" (tuning failed).

get_coarse_wavelength()[source]

Get course-tuned wavelength.

Only works if the wavemeter is disconnected.

stop_coarse_tuning()[source]

Stop coarse wavelength tuning

tune_etalon(value, sync=True)[source]

Tune the etalon to value percent.

Only works if the wavemeter is disconnected. If sync==True, wait until the operation is complete.

lock_etalon(sync=True)[source]

Lock the etalon.

If sync==True, wait until the operation is complete.

unlock_etalon(sync=True)[source]

Unlock the etalon .

If sync==True, wait until the operation is complete. Automatically unlock the reference cavity first (otherwise the operation fails).

get_etalon_lock_status()[source]

Get etalon lock status.

Return either "off" (lock is off), "on" (lock is on), "debug" (lock in debug condition), "error" (lock had an error), "search" (lock is searching), or "low" (lock is off due to low output).

tune_laser_resonator(value, fine=False, sync=True)[source]

Tune the laser cavity to value percent.

If fine==True, adjust fine tuning; otherwise, adjust coarse tuning. Only works if the wavemeter is disconnected. If sync==True, wait until the operation is complete.

tune_reference_cavity(value, fine=False, sync=True)[source]

Tune the reference cavity to value percent.

If fine==True, adjust fine tuning; otherwise, adjust coarse tuning. Only works if the wavemeter is disconnected. If sync==True, wait until the operation is complete. If reference cavity is disabled by setting use_cavity=False on creation, do nothing.

lock_reference_cavity(sync=True)[source]

Lock the laser to the reference cavity.

Automatically lock etalon first (otherwise the operation fails). If sync==True, wait until the operation is complete. If reference cavity is disabled by setting use_cavity=False on creation, do nothing.

unlock_reference_cavity(sync=True)[source]

Unlock the laser from the reference cavity.

If sync==True, wait until the operation is complete. If reference cavity is disabled by setting use_cavity=False on creation, do nothing.

get_reference_cavity_lock_status()[source]

Get the reference cavity lock status.

Return either "off" (lock is off), "on" (lock is on), "debug" (lock in debug condition), "error" (lock had an error), "search" (lock is searching), "low" (lock is off due to low output), or "disabled" (reference cavity is disabled by setting use_cavity=False on creation).

setup_terascan(scan_type, scan_range, rate, trunc_rate=True)[source]

Setup terascan.

Parameters:
  • scan_type (str) – scan type. Can be "medium" (BRF+etalon, rate from 100 GHz/s to 1 GHz/s), "fine" (all elements, rate from 20 GHz/s to 1 MHz/s), or "line" (all elements, rate from 20 GHz/s to 50 kHz/s).

  • scan_range (tuple) – tuple (start, stop) with the scan range (in Hz).

  • rate (float) – scan rate (in Hz/s).

  • trunc_rate (bool) – if True, truncate the scan rate to the nearest available rate (otherwise, incorrect rate would raise an error).

If reference cavity is disabled by setting use_cavity=False on creation and scan_type is "line", use "fine" instead.

start_terascan(scan_type, sync=False, sync_done=False)[source]

Start terascan.

Scan parameters are set up separately using setup_terascan(). Scan type can be "medium" (BRF+etalon, rate from 100 GHz/s to 1 GHz/s), "fine" (all elements, rate from 20 GHz/s to 1 MHz/s), or "line" (all elements, rate from 20 GHz/s to 50 kHz/s). If reference cavity is disabled by setting use_cavity=False on creation and scan_type is "line", use "fine" instead. If sync==True, wait until the scan is set up (not until the whole scan is complete). If sync_done==True, wait until the whole scan is complete (not recommended, as it can take hours).

enable_terascan_updates(enable=True, update_period=0)[source]

Enable sending periodic terascan updates.

If enabled, laser will send updates in the beginning and in the end of every terascan segment. If update_period!=0, it will also send updates every update_period percents of the segment (this option is not currently supported by M2 firmware).

check_terascan_update()[source]

Check the latest terascan update.

Return None if none are available, or a dictionary {"wavelength":current_wavelength, "activity":op}, where op is "scanning" (scanning in progress), "stitching" (stitching in progress), "finished" (scan is finished), or "repeat" (segment is repeated).

wait_for_terascan_update()[source]

Wait until a new terascan update is available

check_terascan_start_report()[source]

Check report on terascan start.

Return "success" or "fail" if the operation is complete, or None if it is still in progress.

stop_terascan(scan_type, sync=False)[source]

Stop terascan of the given type.

If reference cavity is disabled by setting use_cavity=False on creation and scan_type is "line", use "fine" instead. If sync==True, wait until the operation is complete.

get_terascan_status(scan_type, web_status=True)[source]

Get status of a terascan of a given type.

Return a dictionary with 4 items:

"current": current laser frequency (or None if no scan is in progress) "range": tuple with the fill scan range (or None if no frequency is available) "status": can be "stopped" (scan is not in progress), "scanning" (scan is in progress), or "stitching" (scan is in progress, but currently stitching) "web": whether scan is running in web interface (some failure modes still report "scanning" through the usual interface); only available if the laser web connection is on and if web_status==True.

If reference cavity is disabled by setting use_cavity=False on creation and scan_type is "line", use "fine" instead.

start_fast_scan(scan_type, width, period, sync=False, setup_locks=True)[source]

Setup and start fast scan.

Parameters:
  • scan_type (str) – scan type. Can be "cavity_continuous", "cavity_single", "cavity_triangular", "etalon_continuous", "etalon_single", "resonator_continuous", "resonator_single", "resonator_ramp", "resonator_triangular", "ecd_continuous", "ecd_ramp", or "fringe_test" (see M2 Solstis JSON protocol manual for details)

  • width (float) – scan width (in Hz).

  • period (float) – scan time/period (in s).

  • sync (bool) – if True, wait until the scan is set up (not until the whole scan is complete).

  • setup_locks (bool) – if True, automatically setup etalon and reference cavity locks in the appropriate states for etalon, cavity, or resonator scans.

If reference cavity is disabled by setting use_cavity=False on creation, use resonator scans instead of cavity scans.

check_fast_scan_start_report()[source]

Check fast scan start report.

Return "success" or "fail" if the operation is complete, or None if it is still in progress.

stop_fast_scan(scan_type, return_to_start=True, sync=False)[source]

Stop fast scan of the given type.

If reference cavity is disabled by setting use_cavity=False on creation, use resonator scans instead of cavity scans. If return_to_start==True, return to the center frequency after stopping; otherwise, stay at the current instantaneous frequency. If sync==True, wait until the operation is complete.

get_fast_scan_status(scan_type)[source]

Get status of a fast scan of a given type.

Return dictionary with 2 items:

"status": can be "stopped" (scan is not in progress), "scanning" (scan is in progress). "value": current tuner value (in percent); does not necessary correspond to the scan progress.

If reference cavity is disabled by setting use_cavity=False on creation, use resonator scans instead of cavity scans.

stop_scan_web(scan_type)[source]

Stop scan of the current type (terascan or fine scan) using web interface.

More reliable than native programming interface, but requires activated web interface. If reference cavity is disabled by setting use_cavity=False on creation, use resonator scans instead of cavity scans.

stop_all_operation(repeated=True, attempt=0)[source]

Stop all laser operations (tuning and scanning).

More reliable than native programming interface, but requires activated web interface. If repeated==True, repeat trying to stop the operations until succeeded (more reliable, but takes more time). If attempt>0, it can supply the number of already tried attempts to stop (with repeated=False); the more attempts failed, the more drastic measures will be taken to stop (e.g., initialize short terascan or a fast scan, cycle wavemeter connection, etc.) Return True if the operation is success and False otherwise.

BackendError

alias of OSError

Error

alias of M2Error

ReraiseError

alias of M2CommunicationError

apply_settings(settings)

Apply the settings.

settings is the dict {name: value} of the device available settings. Non-applicable settings are ignored.

check_report(op)

Check and return the latest report for the given operation

close()

Close the connection

flush()

Flush read buffer

get_device_variable(key)

Get the value of a settings, status, or full info parameter

get_full_info(include=0)

Get dict {name: value} containing full device information (including status and settings).

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

get_full_status(include=0)

Get dict {name: value} containing the device status (including settings).

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

get_last_report(op)

Get the latest report for the given operation

get_settings(include=0)

Get dict {name: value} containing all the device settings.

include specifies either a list of variables (only these variables are returned), a priority threshold (only values with the priority equal or higher are returned), or "all" (all available variables). Since the lowest priority is -10, setting include=-10 queries all available variables, which is equivalent to include="all".

is_opened()

Check if the device is connected

noreply(exhaust_when_done=False)

Context manager within which the code switches to the no-reply mode, where it does not wait for a reply to certain commands (usually element setting commands). This allows for faster command issuing, but ignores possible errors returned by the commands. If exhaust_when_done==True, receive all sent replies upon exiting the context; otherwise, receive them the next time a communication with the device is done.

open()

Open the connection

query(op, params, reply_op='auto', report=False, allow_noreply=False)

Send a query using the standard device interface.

reply_op is the name of the reply operation (by default, its the operation name plus "_reply"). If report==True, request completion report (does not apply to all operation). If allow_noreply==True, allow skipping the reply, which allows for faster consecutive command issuing; this only works if the no-reply mode is also activated using noreply(). Return tuple (command, args) with the reply command name and the corresponding arguments (in no-reply mode return (None, None)).

set_device_variable(key, value)

Set the value of a settings parameter

set_timeout(timeout)

Set timeout for connecting or sending/receiving

Initialize device link (called automatically on creation)

update_reports(timeout=0.0, ignore_replies=None, max_replies=None)

Check for fresh operation reports.

By default, only receive reports and raise an error on replies; if ignore_replies is supplies, it is a list of replies which do not raise an error. If max_replies is supplied, it is the maximal number of replies to read before stopping (by default, no limit, i.e., wait a read leads to a timeout).

wait_for_report(op, error_msg=None, timeout=None)

Wait for a report for the given operation

error_msg specifies the exception message if the report results in an error.

Module contents