Skip to content

Commit

Permalink
Merge pull request microsoft#1929 from lakhotiaharshit/fix_keithley_o…
Browse files Browse the repository at this point in the history
…verload

Fix: Keysight_34465A overload value 9.9e37 to be np.inf instead
  • Loading branch information
astafan8 authored Mar 5, 2020
2 parents 9c9e2cf + 2629f73 commit 67a7c0c
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 8 deletions.
37 changes: 37 additions & 0 deletions qcodes/instrument/sims/Keysight_34465A.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ devices:
r: "Keysight, 34465A, 1000, A.02.16-02.40-02.16-00.51-03-01"
- q: "DISPLay:TEXT:CLEar"
r: null_response
- q: "SAMPle:TIMer? MIN"
r: 0.1
properties:
voltage:
default: 10
Expand All @@ -32,6 +34,41 @@ devices:
r: "{}"
setter:
q: "SAMPle:COUNt {}"
trigger_count:
default: 1
getter:
q: "TRIGger:COUNt?"
r: "{}"
setter:
q: "TRIGger:COUNt {}"
pretrigger_count:
default: 1
getter:
q: "SAMPle:COUNt:PRETrigger?"
r: "{}"
setter:
q: "SAMPle:COUNt:PRETrigger {}"
sample_source:
default: "TIM"
getter:
q: "SAMPle:SOURce?"
r: "{}"
setter:
q: "SAMPle:SOURce {}"
trigger_source:
default: "BUS"
getter:
q: "TRIGger:SOURce?"
r: "{}"
setter:
q: "TRIGger:SOURce {}"
sample_timer:
default: 1.0
getter:
q: "SAMPle:TIMer?"
r: "{}"
setter:
q: "SAMPle:TIMer {}"
dc_autorange:
default: 0
getter:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -807,7 +807,8 @@ def _options(self) -> Tuple[str, ...]:

def _get_parameter(self, sense_function: str = "DC Voltage") -> float:
"""
Measure the parameter given by sense_function
Measure the parameter given by sense_function. In case of overload i.e.
when instrument throws +/-9.9e37, it is converted to +/-inf.
Args:
sense_function: The parameter to measure. Valid values are those
Expand All @@ -820,6 +821,11 @@ def _get_parameter(self, sense_function: str = "DC Voltage") -> float:
with self.sample.count.set_to(1):
response = self.ask('READ?')

if float(response) >= 9.9e37:
return np.inf
elif float(response) <= -9.9e37:
return -np.inf

return float(response)

def fetch(self) -> np.ndarray:
Expand Down Expand Up @@ -906,12 +912,16 @@ def _raw_vals_to_array(raw_vals: str) -> np.ndarray:
"""
Helper function that converts comma-delimited string of floating-point
values to a numpy 1D array of them. Most data retrieval command of these
instruments return data in this format.
instruments return data in this format.In case of overload i.e.
when instrument throws +/-9.9e37, it is converted to +/-inf.
Args:
raw_vals: comma-delimited string of floating-point values
Returns:
numpy 1D array of data
"""
return np.fromstring(raw_vals, dtype=float, sep=",")
result_array = np.fromstring(raw_vals, dtype=float, sep=",")
result_array[result_array >= 9.9e37] = np.inf
result_array[result_array <= -9.9e37] = -np.inf
return result_array
59 changes: 54 additions & 5 deletions qcodes/tests/drivers/test_keysight_34465a.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import pytest

import numpy as np

import qcodes.instrument.sims as sims
from qcodes.instrument_drivers.Keysight.Keysight_34465A_submodules import \
Keysight_34465A
Expand All @@ -11,15 +13,38 @@ def driver():
keysight_sim = Keysight_34465A('keysight_34465A_sim',
address='GPIB::1::INSTR',
visalib=visalib)

try:
yield keysight_sim
finally:
Keysight_34465A.close_all()


@pytest.fixture(scope='function')
def driver_with_read_and_fetch_mocked(val_volt):
keysight_sim = Keysight_34465A('keysight_34465A_sim',
address='GPIB::1::INSTR',
visalib=visalib)

def get_ask_with_read_mock(original_ask, read_value):
def ask_with_read_mock(cmd: str) -> str:
if cmd in ("READ?", "FETCH?"):
return read_value
else:
return original_ask(cmd)
return ask_with_read_mock

keysight_sim.ask = get_ask_with_read_mock(keysight_sim.ask, val_volt)
try:
yield keysight_sim
finally:
keysight_sim.close()
Keysight_34465A.close_all()


def test_init(driver):
idn = driver.IDN()
assert idn['vendor'] == 'Keysight'
assert idn['model'] == '34465A'


def test_has_dig_option(driver):
Expand All @@ -37,9 +62,34 @@ def test_NPLC(driver):
driver.NPLC.set(10.0)


def test_get_voltage(driver):
voltage = driver.volt.get()
assert voltage == 10.0
@pytest.mark.parametrize("val_volt", ['100.0'])
def test_get_voltage(driver_with_read_and_fetch_mocked):
voltage = driver_with_read_and_fetch_mocked.volt.get()
assert voltage == 100.0


@pytest.mark.parametrize("val_volt", ['9.9e37'])
def test_get_voltage_plus_inf(driver_with_read_and_fetch_mocked):
voltage = driver_with_read_and_fetch_mocked.volt.get()
assert voltage == np.inf


@pytest.mark.parametrize("val_volt", ['-9.9e37'])
def test_get_voltage_minus_inf(driver_with_read_and_fetch_mocked):
voltage = driver_with_read_and_fetch_mocked.volt.get()
assert voltage == -np.inf


@pytest.mark.xfail(run=False, reason="If the test is run, it will pass "
"but all tests after this one will "
"fail. The problem is coming from "
"timetrace().")
@pytest.mark.parametrize("val_volt", ['10, 9.9e37, -9.9e37'])
def test_get_timetrace(driver_with_read_and_fetch_mocked):
driver_with_read_and_fetch_mocked.timetrace_npts(3)
assert driver_with_read_and_fetch_mocked.timetrace_npts() == 3
voltage = driver_with_read_and_fetch_mocked.timetrace()
assert (voltage == np.array([10.0, np.inf, -np.inf])).all()


def test_set_get_autorange(driver):
Expand Down Expand Up @@ -79,4 +129,3 @@ def test_display_text(driver):
driver.display.text(original_text)
restored_text = driver.display.text()
assert restored_text == original_text

0 comments on commit 67a7c0c

Please sign in to comment.