Skip to content

Commit a19d1e2

Browse files
author
stephlazar
authored
Merge pull request QudevETH#20 from QudevETH/hotfix/repr_saving
Fix string recognition of ro channel map because of representation sa…
2 parents a14ebb7 + 407e974 commit a19d1e2

File tree

5 files changed

+212
-6792
lines changed

5 files changed

+212
-6792
lines changed

pycqed/analysis/analysis_toolbox.py

Lines changed: 65 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,9 @@ def get_start_stop_time(timestamp):
246246
'''
247247
from pycqed.analysis import measurement_analysis as MA
248248
ma = MA.MeasurementAnalysis(timestamp=timestamp)
249-
timestring_start = a_tools.get_instrument_setting(
249+
timestring_start = get_instrument_setting(
250250
ma, 'MC', 'measurement_begintime')
251-
timestring_stop = a_tools.get_instrument_setting(
251+
timestring_stop = get_instrument_setting(
252252
ma, 'MC', 'measurement_endtime')
253253
date_start, time_start = timestring_start.split(' ')
254254
date_stop, time_stop = timestring_stop.split(' ')
@@ -291,9 +291,11 @@ def get_data_from_timestamp_legacy(timestamps, param_names, TwoD=False, max_file
291291
'This data file attribute does not exist or hasn''t been coded for extraction.')
292292

293293
else:
294-
if param.split('.')[0] in ma.data_file.get('Instrument settings', {}):
295-
data[param].append(ma.data_file['Instrument settings'][
296-
param.split('.')[0]].attrs[param.split('.')[1]])
294+
if param.split('.')[0] in ma.data_file.get(
295+
'Instrument settings', {}):
296+
data[param].append(eval(
297+
ma.data_file['Instrument settings'][
298+
param.split('.')[0]].attrs[param.split('.')[1]]))
297299
elif param.split('.')[0] in ma.data_file.get('Analysis', {}):
298300
temp = ma.data_file['Analysis']
299301
for ii in range(len(param.split('.'))-1):
@@ -303,7 +305,10 @@ def get_data_from_timestamp_legacy(timestamps, param_names, TwoD=False, max_file
303305
temp = ma.data_file
304306
for ii in range(len(param.split('.'))-1):
305307
temp = temp[param.split('.')[ii]]
306-
data[param].append(temp[param.split('.')[-1]])
308+
try:
309+
data[param].append(eval(temp[param.split('.')[-1]]))
310+
except KeyError:
311+
data[param].append(temp[param.split('.')[-1]])
307312
else:
308313
warnings.warn(
309314
'This data file attribute does not exist or '
@@ -317,7 +322,8 @@ def get_param_value_from_file(file_path, instr_name, param_name, h5mode='r+'):
317322
instr_settings = data_file['Instrument settings']
318323
if instr_name in list(instr_settings.keys()):
319324
if param_name in list(instr_settings[instr_name].attrs):
320-
param_val = float(instr_settings[instr_name].attrs[param_name])
325+
param_val = eval(instr_settings[instr_name].attrs[
326+
param_name])
321327
else:
322328
raise KeyError('"{}" does not exist for instrument "{}"'.format(
323329
param_name, instr_name))
@@ -344,10 +350,11 @@ def get_qb_channel_map_from_hdf(qb_names, file_path, value_names, h5mode='r+'):
344350
ro_type = 'w'
345351

346352
for qbn in qb_names:
347-
qbchs = [str(instr_settings[qbn].attrs['acq_I_channel'])]
348-
ro_acq_weight_type = instr_settings[qbn].attrs['acq_weights_type']
353+
qbchs = [str(eval(instr_settings[qbn].attrs['acq_I_channel']))]
354+
# eval because strings are saved as representations
355+
ro_acq_weight_type = eval(instr_settings[qbn].attrs['acq_weights_type'])
349356
if ro_acq_weight_type in ['SSB', 'DSB', 'optimal_qutrit']:
350-
qbchs += [str(instr_settings[qbn].attrs['acq_Q_channel'])]
357+
qbchs += [str(eval(instr_settings[qbn].attrs['acq_Q_channel']))]
351358
channel_map[qbn] = [ch for ch in value_names for nr in qbchs
352359
if ro_type+nr in ch]
353360

@@ -362,9 +369,8 @@ def get_qb_thresholds_from_file(qb_names, file_path, h5mode='r+'):
362369
instr_settings = data_file['Instrument settings']
363370
thresholds = {}
364371
for qbn in qb_names:
365-
ro_channel = int(
366-
instr_settings[qbn].attrs['RO_acq_weight_function_I'])
367-
thresholds[qbn] = 1.5*float(
372+
ro_channel = eval(instr_settings[qbn].attrs['RO_acq_weight_function_I'])
373+
thresholds[qbn] = 1.5*eval(
368374
instr_settings['UHFQC'].attrs['quex_thres_{}_level'.format(
369375
ro_channel)])
370376
return thresholds
@@ -392,9 +398,10 @@ def get_data_from_ma_v1(ma, param_names):
392398
'This data file attribute does not exist or hasn''t been coded for extraction.')
393399

394400
else:
395-
if param.split('.')[0] in ma.data_file.get('Instrument settings', {}):
396-
data[param] = ma.data_file['Instrument settings'][
397-
param.split('.')[0]].attrs[param.split('.')[1]]
401+
if param.split('.')[0] in ma.data_file.get(
402+
'Instrument settings', {}):
403+
data[param] = eval(ma.data_file['Instrument settings'][
404+
param.split('.')[0]].attrs[param.split('.')[1]])
398405
elif param.split('.')[0] in ma.data_file.get('Analysis', {}):
399406
temp = ma.data_file['Analysis']
400407
for ii in range(len(param.split('.'))-1):
@@ -404,10 +411,14 @@ def get_data_from_ma_v1(ma, param_names):
404411
temp = ma.data_file
405412
for ii in range(len(param.split('.'))-1):
406413
temp = temp[param.split('.')[ii]]
407-
data[param] = temp[param.split('.')[-1]]
414+
try:
415+
data[param] = eval(temp[param.split('.')[-1]])
416+
except KeyError:
417+
data[param] = temp[param.split('.')[-1]]
408418
else:
409419
warnings.warn(
410-
'This data file attribute does not exist or hasn''t been coded for extraction.')
420+
'This data file attribute does not exist or '
421+
'hasn"t been coded for extraction.')
411422
return data
412423

413424

@@ -444,17 +455,19 @@ def get_data_from_ma_v2(ma, param_names, numeric_params=None):
444455
# tmp_var is a temporary fix!
445456
# should be removed at some point
446457
try:
447-
tmp_var = ma.data_file['Instrument settings'][
448-
'MC'].attrs['detector_function_name']
458+
tmp_var = eval(ma.data_file['Instrument settings'][
459+
'MC'].attrs['detector_function_name'])
449460
except:
450461
tmp_var = None
451462
if tmp_var == 'TimeDomainDetector':
452463
temp2 = ma.data_file['Instrument settings']['TD_Meas']
453464
exec(
454-
('cal_zero = %s' % (temp2.attrs['cal_zero_points'])), locals())
465+
('cal_zero = %s' % (eval(temp2.attrs['cal_zero_points']))),
466+
locals())
455467
exec(
456-
('cal_one = %s' % (temp2.attrs['cal_one_points'])), locals())
457-
dofs = int(temp2.attrs['NoSegments']) - \
468+
('cal_one = %s' % (eval(temp2.attrs['cal_one_points']))),
469+
locals())
470+
dofs = eval(temp2.attrs['NoSegments']) - \
458471
len(cal_zero) - len(cal_one)
459472
else:
460473
dofs = len(ma.sweep_points)
@@ -480,29 +493,34 @@ def get_data_from_ma_v2(ma, param_names, numeric_params=None):
480493
data[param] = np.double(ma.data_file['Analysis'][param])
481494
else:
482495
warnings.warn(
483-
'The data file attribute %s does not exist or hasn''t been coded for extraction.' % (param))
484-
# print 'boo9', data['amp']
485-
496+
'The data file attribute %s does not exist or '
497+
'hasn"t been coded for extraction.' % (param))
486498
else:
487-
if param.split('.')[0] in list(ma.data_file.get('Instrument settings', {}).keys()):
488-
data[param] = ma.data_file['Instrument settings'][
489-
param.split('.')[0]].attrs[param.split('.')[1]]
499+
if param.split('.')[0] in list(ma.data_file.get(
500+
'Instrument settings', {}).keys()):
501+
data[param] = eval(ma.data_file['Instrument settings'][
502+
param.split('.')[0]].attrs[param.split('.')[1]])
490503
else:
491504
extract_param = True
492-
if param.split('.')[0] in list(ma.data_file.get('Analysis', {}).keys()):
505+
if param.split('.')[0] in list(ma.data_file.get(
506+
'Analysis', {}).keys()):
493507
temp = ma.data_file['Analysis']
494508
elif param.split('.')[0] in list(ma.data_file.keys()):
495509
temp = ma.data_file
496510
else:
497511
extract_param = False
498512
warnings.warn(
499-
'The data file attribute %s does not exist or hasn''t been coded for extraction.' % (param))
513+
'The data file attribute %s does not exist or '
514+
'hasn"t been coded for extraction.' % (param))
500515
if extract_param:
501516
for ii in range(len(param.split('.'))-1):
502517
temp = temp[param.split('.')[ii]]
503518
param_end = param.split('.')[-1]
504519
if param_end in list(temp.attrs.keys()):
505-
data[param] = temp.attrs[param_end]
520+
try:
521+
data[param] = eval(temp.attrs[param_end])
522+
except TypeError:
523+
data[param] = temp.attrs[param_end]
506524
elif param_end in list(temp.keys()):
507525
data[param] = temp[param_end].value
508526
if numeric_params is not None:
@@ -690,14 +708,16 @@ def get_all_msmt_filepaths(folder, suffix='hdf5', pattern=''):
690708
def get_instrument_setting(analysis_object, instrument_name, parameter):
691709
instrument_settings = analysis_object.data_file['Instrument settings']
692710
instrument = instrument_settings[instrument_name]
693-
attr = instrument.attrs[parameter]
711+
attr = eval(instrument.attrs[parameter])
694712
return attr
695713

696714

697715
def compare_instrument_settings_timestamp(timestamp_a, timestamp_b):
698716
'''
699-
Takes two analysis objects as input and prints the differences between the instrument settings.
700-
Currently it only compares settings existing in object_a, this function can be improved to not care about the order of arguments.
717+
Takes two analysis objects as input and prints the differences between
718+
the instrument settings. Currently it only compares settings existing in
719+
object_a, this function can be improved to not care about the order of
720+
arguments.
701721
'''
702722

703723
h5mode = 'r+'
@@ -724,13 +744,13 @@ def compare_instrument_settings_timestamp(timestamp_a, timestamp_b):
724744
print('Instrument "%s" does have parameter "%s"' % (
725745
ins_key, par_key))
726746

727-
if ins_a.attrs[par_key] == ins_b.attrs[par_key]:
747+
if eval(ins_a.attrs[par_key]) == eval(ins_b.attrs[par_key]):
728748
pass
729749
else:
730750
print(' "%s" has a different value '
731751
' "%s" for %s, "%s" for %s' % (
732-
par_key, ins_a.attrs[par_key], timestamp_a,
733-
ins_b.attrs[par_key], timestamp_b))
752+
par_key, eval(ins_a.attrs[par_key]), timestamp_a,
753+
eval(ins_b.attrs[par_key]), timestamp_b))
734754
diffs_found = True
735755

736756
if not diffs_found:
@@ -742,8 +762,10 @@ def compare_instrument_settings_timestamp(timestamp_a, timestamp_b):
742762

743763
def compare_instrument_settings(analysis_object_a, analysis_object_b):
744764
'''
745-
Takes two analysis objects as input and prints the differences between the instrument settings.
746-
Currently it only compares settings existing in object_a, this function can be improved to not care about the order of arguments.
765+
Takes two analysis objects as input and prints the differences between the
766+
instrument settings. Currently it only compares settings existing in
767+
object_a, this function can be improved to not care about the order
768+
of arguments.
747769
'''
748770
sets_a = analysis_object_a.data_file['Instrument settings']
749771
sets_b = analysis_object_b.data_file['Instrument settings']
@@ -764,13 +786,13 @@ def compare_instrument_settings(analysis_object_a, analysis_object_b):
764786
print('Instrument "%s" does have parameter "%s"' % (
765787
ins_key, par_key))
766788

767-
if ins_a.attrs[par_key] == ins_b.attrs[par_key]:
789+
if eval(ins_a.attrs[par_key]) == eval(ins_b.attrs[par_key]):
768790
pass
769791
else:
770792
print(' "%s" has a different value '
771793
' "%s" for a, "%s" for b' % (
772-
par_key, ins_a.attrs[par_key],
773-
ins_b.attrs[par_key]))
794+
par_key, eval(ins_a.attrs[par_key]),
795+
eval(ins_b.attrs[par_key])))
774796
diffs_found = True
775797

776798
if not diffs_found:

0 commit comments

Comments
 (0)