Skip to content

Changes to doNd and plot_id #166

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

Open
wants to merge 25 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9acdcd5
Update doNd
ThorvaldLarsen Dec 28, 2018
5bf021d
Modify plot_by_id
ThorvaldLarsen Dec 28, 2018
ebaf219
Remove unused asingment
ThorvaldLarsen Dec 28, 2018
d6f07b5
Modify colobar label for subtraction
ThorvaldLarsen Dec 28, 2018
b8dd89b
Revert colorbar labeling
ThorvaldLarsen Dec 28, 2018
7ed6340
Add new refreshtime
ThorvaldLarsen Jan 2, 2019
a983292
Use only one isinstance call for 'or'
ThorvaldLarsen Jan 2, 2019
8242a8c
Fix filname for png save
ThorvaldLarsen Jan 2, 2019
a33b839
Add tight_layout call before png/pdf save
ThorvaldLarsen Jan 2, 2019
2e31369
Change add_result call to avoid null values in database
ThorvaldLarsen Jan 3, 2019
588c9d8
Merge pull request #26 from qdev-dk/master
ThorvaldLarsen Jan 4, 2019
32f2123
Add transforms and remove plot_by_id copy
ThorvaldLarsen Jan 4, 2019
e1052f1
Add progressbar from Estrabans doNd
ThorvaldLarsen Jan 4, 2019
8c591ed
Add initial call for progressbar
ThorvaldLarsen Jan 10, 2019
0765a2a
Add importerror for progressbar
ThorvaldLarsen Jan 10, 2019
44fb5f9
Better error message
ThorvaldLarsen Jan 10, 2019
594b417
Typo
ThorvaldLarsen Jan 10, 2019
73c0595
Add linecuts and example notebook
ThorvaldLarsen Jan 23, 2019
c4db1dc
Fix typo
ThorvaldLarsen Jan 23, 2019
e7f090b
Fix dicimals and units and move file
ThorvaldLarsen Jan 23, 2019
c83652e
Merge pull request #27 from qdev-dk/master
ThorvaldLarsen Jan 25, 2019
b1e0252
Cleanup the code a little bit and make progressbar optional
jenshnielsen Mar 19, 2019
5a7aaef
use tqdm instead of progressbar2
jenshnielsen Apr 12, 2019
b99d5c4
refresh notebook
jenshnielsen Apr 12, 2019
9df2e33
remove unused variables
jenshnielsen Apr 12, 2019
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
336 changes: 307 additions & 29 deletions examples/dataset/Example of doND wrappers.ipynb

Large diffs are not rendered by default.

201 changes: 201 additions & 0 deletions examples/dataset/Plot_id extensions.ipynb

Large diffs are not rendered by default.

134 changes: 59 additions & 75 deletions qdev_wrappers/dataset/doNd.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from typing import Callable, Sequence, Union, Tuple, List, Optional
import os
import time

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from tqdm import tqdm

from qcodes.dataset.measurements import Measurement
from qcodes.instrument.base import _BaseParameter
from qcodes.dataset.plotting import plot_by_id
from qcodes import config
from qcodes.instrument.parameter import _BaseParameter, ArrayParameter, MultiParameter
from qdev_wrappers.dataset.plotting_tools import save_image

AxesTuple = Tuple[matplotlib.axes.Axes, matplotlib.colorbar.Colorbar]
AxesTupleList = Tuple[List[matplotlib.axes.Axes],
Expand All @@ -23,7 +22,7 @@ def do0d(*param_meas: Union[_BaseParameter, Callable[[], None]],
do_plot: bool = True) -> AxesTupleListWithRunId:
"""
Perform a measurement of a single parameter. This is probably most
useful for an ArrayParamter that already returns an array of data points
useful for an ArrayParameter that already returns an array of data points

Args:
*param_meas: Parameter(s) to measure at each step or functions that
Expand All @@ -40,21 +39,28 @@ def do0d(*param_meas: Union[_BaseParameter, Callable[[], None]],
output = []

for parameter in param_meas:
meas.register_parameter(parameter)
output.append([parameter, None])

if isinstance(parameter, (ArrayParameter, MultiParameter)):
paramtype = 'array'
elif isinstance(parameter, _BaseParameter):
paramtype = 'numeric'
if isinstance(parameter, _BaseParameter):
meas.register_parameter(parameter, paramtype=paramtype)
output.append([parameter, None])

with meas.run() as datasaver:

for i, parameter in enumerate(param_meas):
i = 0
for parameter in param_meas:
if isinstance(parameter, _BaseParameter):
output[i][1] = parameter.get()
i += 1
elif callable(parameter):
parameter()
datasaver.add_result(*output)
dataid = datasaver.run_id

if do_plot is True:
ax, cbs = _save_image(datasaver)
ax, cbs = save_image(dataid)
else:
ax = None,
cbs = None
Expand Down Expand Up @@ -95,48 +101,59 @@ def do1d(param_set: _BaseParameter, start: number, stop: number,
The run_id of the DataSet created
"""
meas = Measurement()
refresh_time = 1 # 1 second refresh time for liveplotting and progressbar
meas.write_period = refresh_time
meas.register_parameter(
param_set) # register the first independent parameter
output = []
param_set.post_delay = delay
interrupted = False

points_taken = 0
time.sleep(0.1)

for action in enter_actions:
# this omits the posibility of passing
# argument to enter and exit actions.
# Do we want that?
meas.add_before_run(action, ())
for action in exit_actions:
meas.add_after_run(action, ())

# do1D enforces a simple relationship between measured parameters
# and set parameters. For anything more complicated this should be
# reimplemented from scratch


output = []
for parameter in param_meas:
if isinstance(parameter, (ArrayParameter, MultiParameter)):
paramtype = 'array'
elif isinstance(parameter, _BaseParameter):
paramtype = 'numeric'
if isinstance(parameter, _BaseParameter):
meas.register_parameter(parameter, setpoints=(param_set,))
meas.register_parameter(parameter, setpoints=(param_set,),
paramtype=paramtype)
output.append([parameter, None])

try:
with meas.run() as datasaver:

for set_point in np.linspace(start, stop, num_points):
for set_point in tqdm(np.linspace(start, stop, num_points)):
param_set.set(set_point)
output = []
i = 0
for parameter in param_meas:
if isinstance(parameter, _BaseParameter):
output.append((parameter, parameter.get()))
output[i][1] = parameter.get()
i += 1
elif callable(parameter):
parameter()
datasaver.add_result((param_set, set_point),
*output)

points_taken += 1
except KeyboardInterrupt:
interrupted = True

dataid = datasaver.run_id # convenient to have for plotting

if do_plot is True:
ax, cbs = _save_image(datasaver)
ax, cbs = save_image(dataid)
else:
ax = None,
cbs = None
Expand Down Expand Up @@ -191,42 +208,52 @@ def do2d(param_set1: _BaseParameter, start1: number, stop1: number,
"""

meas = Measurement()
refresh_time = 1 # 1 second refresh time for liveplotting and progressbar
meas.write_period = refresh_time
meas.register_parameter(param_set1)
param_set1.post_delay = delay1
meas.register_parameter(param_set2)
param_set1.post_delay = delay2
interrupted = False

points_taken = 0
time.sleep(0.1)

for action in enter_actions:
# this omits the possibility of passing
# argument to enter and exit actions.
# Do we want that?
meas.add_before_run(action, ())

for action in exit_actions:
meas.add_after_run(action, ())

output = []
for parameter in param_meas:
if isinstance(parameter, (ArrayParameter, MultiParameter)):
paramtype = 'array'
elif isinstance(parameter, _BaseParameter):
paramtype = 'numeric'
if isinstance(parameter, _BaseParameter):
meas.register_parameter(parameter,
setpoints=(param_set1, param_set2))
setpoints=(param_set1, param_set2),
paramtype=paramtype)
output.append([parameter, None])

try:
with meas.run() as datasaver:

for set_point1 in np.linspace(start1, stop1, num_points1):
for set_point1 in tqdm(np.linspace(start1, stop1, num_points1)):
param_set1.set(set_point1)
for action in before_inner_actions:
action()
for set_point2 in np.linspace(start2, stop2, num_points2):
param_set2.set(set_point2)
output = []
i = 0
for parameter in param_meas:
if isinstance(parameter, _BaseParameter):
output.append((parameter, parameter.get()))
output[i][1] = parameter.get()
i += 1
elif callable(parameter):
parameter()
datasaver.add_result((param_set1, set_point1),
(param_set2, set_point2),
*output)
(param_set2, set_point2),
*output)
for action in after_inner_actions:
action()
except KeyboardInterrupt:
Expand All @@ -235,54 +262,11 @@ def do2d(param_set1: _BaseParameter, start1: number, stop1: number,
dataid = datasaver.run_id

if do_plot is True:
ax, cbs = _save_image(datasaver)
ax, cbs = save_image(dataid)
else:
ax = None,
cbs = None
if interrupted:
raise KeyboardInterrupt

return dataid, ax, cbs


def _save_image(datasaver) -> AxesTupleList:
"""
Save the plots created by datasaver as pdf and png

Args:
datasaver: a measurement datasaver that contains a dataset to be saved
as plot.

"""
plt.ioff()
dataid = datasaver.run_id
start = time.time()
axes, cbs = plot_by_id(dataid)
stop = time.time()
print(f"plot by id took {stop-start}")

mainfolder = config.user.mainfolder
experiment_name = datasaver._dataset.exp_name
sample_name = datasaver._dataset.sample_name

storage_dir = os.path.join(mainfolder, experiment_name, sample_name)
os.makedirs(storage_dir, exist_ok=True)

png_dir = os.path.join(storage_dir, 'png')
pdf_dif = os.path.join(storage_dir, 'pdf')

os.makedirs(png_dir, exist_ok=True)
os.makedirs(pdf_dif, exist_ok=True)

save_pdf = True
save_png = True

for i, ax in enumerate(axes):
if save_pdf:
full_path = os.path.join(pdf_dif, f'{dataid}_{i}.pdf')
ax.figure.savefig(full_path, dpi=500)
if save_png:
full_path = os.path.join(png_dir, f'{dataid}_{i}.png')
ax.figure.savefig(full_path, dpi=500)
plt.ion()
return axes, cbs
Loading