Source code for pylablib.aux_libs.devices.Ophir

from ...core.devio import backend,units  #@UnresolvedImport
from ...core.utils import py3
import collections

_depends_local=["...core.devio.backend"]

[docs]class OphirDevice(backend.IBackendWrapper): """ Generic Ophir device. Args: conn: serial connection parameters (usually port or a tuple containing port and baudrate) """ def __init__(self, conn): conn=backend.SerialDeviceBackend.combine_conn(conn,("COM1",9600)) instr=backend.SerialDeviceBackend(conn,term_read="\r\n",term_write="\r\n") backend.IBackendWrapper.__init__(self,instr) def _parse_response(self, comm, resp): resp=resp.strip() if resp.startswith(b"?"): raise RuntimeError("Command {} returned error: {}".format(comm,resp[1:].strip())) if resp.startswith(b"*"): return py3.as_str(resp[1:].strip()) raise RuntimeError("Command {} returned unrecognized response: {}".format(comm,resp))
[docs] def query(self, comm): """Send a query to the device and parse the reply""" comm=comm.strip() with self.instr.single_op(): self.instr.flush_read() self.instr.write(comm) resp=self.instr.readline() return self._parse_response(comm,resp)
[docs]class VegaPowerMeter(OphirDevice): """ Ophir Vega power meter. Args: conn: serial connection parameters (usually port or a tuple containing port and baudrate) """ def __init__(self, conn): OphirDevice.__init__(self,conn) self._add_status_node("power",self.get_power) self._add_settings_node("wavelength",self.get_wavelength,self.set_wavelength) self._add_status_node("wavelength_info",self.get_wavelength_info) self._add_status_node("range_info",self.get_range_info) self._add_settings_node("range_idx",self.get_range_idx,self.set_range_idx) self._add_settings_node("filter_in",self.is_filter_in,self.set_filter)
[docs] def get_power(self): """Get the current power readings""" power=self.query("$SP") if power.lower()=="over": return "over" return float(power)
WavelengthInfo=collections.namedtuple("WavelengthInfo",["mode","rng","curr_idx","presets","curr_wavelength"])
[docs] def get_wavelength_info(self): """ Get wavelength setting info. Return tuple ``(mode, rng, curr_idx, presets, curr_wavelength)``, where `mode` is the measurement mode (``"CONTINUOUS"`` or ``"HOLD"``), `rng` is full wavelength range (in m), `curr_idx` is the current wavelength preset index, `presets` is the list of all preset wavelengths (in m), and `curr_wavelength` is the current measurement wavelength (in m). """ info=[i.strip() for i in self.query("$AW").split() if i.strip()] mode=info[0] rng=(float(info[1])*1E-9,float(info[2])*1E-9) curr_idx=int(info[3]) presets=[float(w)*1E-9 for w in info[4:] if w.upper()!="NONE"] return self.WavelengthInfo(mode,rng,curr_idx-1,presets,presets[curr_idx-1])
[docs] def get_wavelength(self): """Get current calibration wavelength""" return self.get_wavelength_info().curr_wavelength
[docs] def set_wavelength(self, wavelength): """Set current calibration wavelength""" self.query("$WL{:d}".format(int(wavelength*1E9))) return self.get_wavelength()
RangeInfo=collections.namedtuple("RangeInfo",["curr_idx","ranges","curr_range"])
[docs] def get_range_info(self): """ Get power range info. Return tuple ``(curr_idx, ranges, curr_range)``, where `curr_idx` is the current power range index, `ranges` is the list of ranges (in W) for all indices and `curr_range` is the current range (in W). """ info=[i.strip() for i in self.query("$AR").split() if i.strip()] curr_idx=int(info[0]) ranges=[units.convert_power_units(*units.split_units(r),result_unit="W") for r in info[3:]] if curr_idx<0: curr_range=info[3+curr_idx] else: curr_range=ranges[curr_idx] return self.RangeInfo(curr_idx,ranges,curr_range)
[docs] def get_range(self): """Get current power range (maximal power in W)""" return self.get_range_info().curr_range
[docs] def get_range_idx(self): """ Get current power range index Index goes from 0 (highest) to maximal (lowest); auto-ranging is -1. """ return self.get_range_info().curr_idx
[docs] def set_range_idx(self, rng_idx): """ Set current range index. `rng_idx` is the range index from 0 (highest) to maximal (lowest); auto-ranging is -1. """ self.query("$WN{:d}".format(rng_idx)) return self.get_range_idx()
[docs] def is_filter_in(self): """Check if the filter is set to be on at the power meter""" return int(self.query("$FQ").split()[0].strip())==2
[docs] def set_filter(self, filter_in=True): """Change the filter setting at the power meter (on or off)""" self.query("$FQ{:d}".format(2 if filter_in else 1)) return self.is_filter_in()