Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DaylightSolutions MIRCat driver - different QCL chips #263

Merged
merged 7 commits into from
Oct 23, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 49 additions & 36 deletions qcodes_contrib_drivers/drivers/DaylightSolutions/MIRcat.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ class DRSDaylightSolutions_MIRcat(Instrument):
status: beta-version

Args:
name (str): name for the instrument
dll_path (Optional[str], optional): path to the MIRcatSDK driver dll
library file. Defaults to None.
name: name for the instrument
dll_path: path to the MIRcatSDK driver dll library file. Defaults to None.
wavelength: sequence of 2-tuple for the wavelength boundaries of all chips.
"""
dll_path = 'C:\\MIRcat_laser\\libs\\x64\\MIRcatSDK.dll'

Expand Down Expand Up @@ -93,6 +93,7 @@ def __init__(self,
dll_path: Optional[str] = None,
**kwargs: Any) -> None:
super().__init__(name, **kwargs)


if sys.platform != 'win32':
self._dll: Any = None
Expand All @@ -111,6 +112,14 @@ def __init__(self,
self._is_keyswitch_set = ctypes.c_bool(False)
self._execute('MIRcatSDK_IsKeySwitchStatusSet',
[ctypes.byref(self._is_keyswitch_set)])
self._limits_chip1 = self.get_limits(1)
self._limits_chip2 = self.get_limits(2)
self._limits_chip3 = self.get_limits(3)
self._limits_chip4 = self.get_limits(4)
self._range_chip1: tuple[float, float] = self.get_ranges(1)
self._range_chip2: tuple[float, float] = self.get_ranges(2)
self._range_chip3: tuple[float, float] = self.get_ranges(3)
self._range_chip4: tuple[float, float] = self.get_ranges(4)

self.status = Parameter(
'status',
Expand All @@ -126,7 +135,7 @@ def __init__(self,
label='QCL wavelength',
get_cmd=self._get_wavelength,
set_cmd=self._set_wavelength,
vals=vals.Numbers(3e-6, 13e-6),
vals=vals.Numbers(self._range_chip1[0], self._range_chip4[1]),
unit='m',
instrument=self
)
Expand All @@ -136,8 +145,8 @@ def __init__(self,
label='QCL wavenumber',
get_cmd=self._get_wavenumber,
set_cmd=self._set_wavenumber,
vals=vals.Numbers(0, 1600),
unit='cm' + u'\u207b\u00b9',
vals=vals.Numbers(1/self._range_chip4[1]/100, 1/self._range_chip1[0]/100),
unit='cm' + '\u207b\u00b9',
instrument=self
)

Expand All @@ -155,7 +164,7 @@ def __init__(self,
label='Temperature of chip 1',
get_cmd=partial(self._get_temperature, chip=1),
vals=vals.Numbers(),
unit=u'\u00b0'+'C',
unit='\u00b0'+'C',
instrument=self
)

Expand All @@ -164,7 +173,7 @@ def __init__(self,
label='Temperature of chip 2',
get_cmd=partial(self._get_temperature, chip=2),
vals=vals.Numbers(),
unit=u'\u00b0'+'C',
unit='\u00b0'+'C',
instrument=self
)

Expand All @@ -173,7 +182,7 @@ def __init__(self,
label='Temperature of chip 3',
get_cmd=partial(self._get_temperature, chip=3),
vals=vals.Numbers(),
unit=u'\u00b0'+'C',
unit='\u00b0'+'C',
instrument=self
)

Expand All @@ -182,7 +191,7 @@ def __init__(self,
label='Temperature of chip 4',
get_cmd=partial(self._get_temperature, chip=4),
vals=vals.Numbers(),
unit=u'\u00b0'+'C',
unit='\u00b0'+'C',
instrument=self
)

Expand All @@ -191,7 +200,7 @@ def __init__(self,
label='Pulse rate for chip 1',
get_cmd=partial(self._get_pulse_rate, chip=1),
set_cmd=partial(self._set_pulse_rate, chip=1),
vals=vals.Numbers(100, 1e6),
vals=vals.Numbers(max_value=self._limits_chip1[0]),
unit='Hz',
instrument=self
)
Expand All @@ -201,7 +210,7 @@ def __init__(self,
label='Pulse rate for chip 2',
get_cmd=partial(self._get_pulse_rate, chip=2),
set_cmd=partial(self._set_pulse_rate, chip=2),
vals=vals.Numbers(100, 1e6),
vals=vals.Numbers(max_value=self._limits_chip2[0]),
unit='Hz',
instrument=self
)
Expand All @@ -211,7 +220,7 @@ def __init__(self,
label='Pulse rate for chip 3',
get_cmd=partial(self._get_pulse_rate, chip=3),
set_cmd=partial(self._set_pulse_rate, chip=3),
vals=vals.Numbers(100, 1e6),
vals=vals.Numbers(max_value=self._limits_chip3[0]),
unit='Hz',
instrument=self
)
Expand All @@ -221,7 +230,7 @@ def __init__(self,
label='Pulse rate for chip 4',
get_cmd=partial(self._get_pulse_rate, chip=4),
set_cmd=partial(self._set_pulse_rate, chip=4),
vals=vals.Numbers(100, 1e6),
vals=vals.Numbers(max_value=self._limits_chip4[0]),
unit='Hz',
instrument=self
)
Expand All @@ -231,7 +240,7 @@ def __init__(self,
label='Pulse width for chip 1',
get_cmd=partial(self._get_pulse_width, chip=1),
set_cmd=partial(self._set_pulse_width, chip=1),
vals=vals.Numbers(40e-9, 500e-9),
vals=vals.Numbers(max_value=self._limits_chip1[1]),
unit='s',
instrument=self
)
Expand All @@ -241,7 +250,7 @@ def __init__(self,
label='Pulse width for chip 2',
get_cmd=partial(self._get_pulse_width, chip=2),
set_cmd=partial(self._set_pulse_width, chip=2),
vals=vals.Numbers(40e-9, 500e-9),
vals=vals.Numbers(max_value=self._limits_chip2[1]),
unit='s',
instrument=self
)
Expand All @@ -251,7 +260,7 @@ def __init__(self,
label='Pulse width for chip 3',
get_cmd=partial(self._get_pulse_width, chip=3),
set_cmd=partial(self._set_pulse_width, chip=3),
vals=vals.Numbers(40e-9, 500e-9),
vals=vals.Numbers(max_value=self._limits_chip3[1]),
unit='s',
instrument=self
)
Expand All @@ -261,7 +270,7 @@ def __init__(self,
label='Pulse width for chip 4',
get_cmd=partial(self._get_pulse_width, chip=4),
set_cmd=partial(self._set_pulse_width, chip=4),
vals=vals.Numbers(40e-9, 500e-9),
vals=vals.Numbers(max_value=self._limits_chip4[1]),
unit='s',
instrument=self
)
Expand All @@ -271,7 +280,7 @@ def __init__(self,
label='Pulse current for chip 1',
get_cmd=partial(self._get_pulse_current, chip=1),
set_cmd=partial(self._set_pulse_current, chip=1),
vals=vals.Numbers(),
vals=vals.Numbers(max_value=self._limits_chip1[3]),
unit='A',
instrument=self
)
Expand All @@ -281,7 +290,7 @@ def __init__(self,
label='Pulse current for chip 2',
get_cmd=partial(self._get_pulse_current, chip=2),
set_cmd=partial(self._set_pulse_current, chip=2),
vals=vals.Numbers(),
vals=vals.Numbers(max_value=self._limits_chip2[3]),
unit='A',
instrument=self
)
Expand All @@ -290,7 +299,7 @@ def __init__(self,
label='Pulse current for chip 3',
get_cmd=partial(self._get_pulse_current, chip=3),
set_cmd=partial(self._set_pulse_current, chip=3),
vals=vals.Numbers(),
vals=vals.Numbers(max_value=self._limits_chip3[3]),
unit='A',
instrument=self
)
Expand All @@ -299,7 +308,7 @@ def __init__(self,
label='Pulse current for chip 4',
get_cmd=partial(self._get_pulse_current, chip=4),
set_cmd=partial(self._set_pulse_current, chip=4),
vals=vals.Numbers(),
vals=vals.Numbers(max_value=self._limits_chip4[3]),
unit='A',
instrument=self
)
Expand Down Expand Up @@ -344,7 +353,7 @@ def set_pulse_parameters(self,
ctypes.c_float(pulse_width*1e9),
ctypes.c_float(current*1e3)])

def get_limits(self, chip: int = 0) -> tuple:
def get_limits(self, chip: int = 0) -> tuple[float, ...]:
"""Get the limits for a given QCL chip.

Args:
Expand Down Expand Up @@ -429,7 +438,7 @@ def disarm(self) -> None:
self._execute('MIRcatSDK_IsLaserArmed', [ctypes.byref(is_armed)])
time.sleep(1)

def get_ranges(self, chip: int = 0) -> tuple:
def get_ranges(self, chip: int = 0) -> tuple[float, float]:
"""Get the acceptable range for a given QCL chip.

Args:
Expand All @@ -456,7 +465,7 @@ def get_ranges(self, chip: int = 0) -> tuple:
[chip, ctypes.byref(pf_min_range),
ctypes.byref(pf_max_range),
ctypes.byref(pb_units)])
return (pf_min_range.value*1e6, pf_max_range.value*1e6)
return (pf_min_range.value*1e-6, pf_max_range.value*1e-6)

def check_tune(self) -> float:
"""Check the QCL tune.
Expand Down Expand Up @@ -753,32 +762,36 @@ def _set_pulse_current(self, pulse_current: float, chip: int = 0) -> None:
def _set_wavelength(self, wavelength: float, chip: int = 0) -> None:
wavelength = wavelength*1e6
if chip == 0:
if wavelength <= 8.2:
if wavelength <= self._range_chip1[1]:
chip = 1
elif 8.2 < wavelength <= 10.3:
elif self._range_chip2[0] < wavelength <= self._range_chip2[1]:
chip = 2
elif 10.3 < wavelength <= 12.7:
elif self._range_chip3[0] < wavelength <= self._range_chip3[1]:
chip = 3
else:
elif self._range_chip4[0] < wavelength:
chip = 4
else:
raise ValueError('selected wavelength is not supported')

self.log.info(f'Set wavelength to {wavelength} on QCL chip {chip}.')
self._execute('MIRcatSDK_TuneToWW',
[ctypes.c_float(wavelength),
ctypes.c_ubyte(1),
ctypes.c_uint8(chip)])
self._get_wavenumber()

def _set_wavenumber(self, wavenumber: float, chip: int = 0) -> None:
if chip == 0:
if wavenumber >= 1219:
chip = 1
elif 971 <= wavenumber < 1219:
chip = 2
elif 788 <= wavenumber < 971:
if wavenumber >= 1/self._range_chip4[1]/100:
chip = 4
elif 1/self._range_chip3[0]/100 > wavenumber >= 1/self._range_chip3[1]/100:
chip = 3
elif 1/self._range_chip2[0]/100 > wavenumber >= 1/self._range_chip2[1]/100:
chip = 2
elif 1/self._range_chip1[0]/100 > wavenumber:
chip = 1
else:
chip = 4
raise ValueError(f'selected wavenumber {wavenumber} is not supported')

self.log.info(f'Set wavenumber to {wavenumber} on QCL chip {chip}.')
self._execute('MIRcatSDK_TuneToWW',
Expand Down