@@ -325,7 +325,7 @@ def _merge_data(
325
325
shape : tuple [int , ...] | None ,
326
326
single_tree_write_status : int | None ,
327
327
meas_parameter : str ,
328
- ) -> tuple [dict [str , npt .NDArray ], int | None ]:
328
+ ) -> tuple [dict [str , npt .NDArray ], int ]:
329
329
subtree_merged_data = {}
330
330
subtree_parameters = existing_data .keys ()
331
331
@@ -335,20 +335,19 @@ def _merge_data(
335
335
"The following keys were unexpected: "
336
336
f"{ set (new_data .keys () - existing_data .keys ())} "
337
337
)
338
-
339
- new_write_status : int | None
340
- single_param_merged_data , new_write_status = _merge_data_single_param (
338
+ single_param_merged_data , data_written = _merge_data_single_param (
341
339
existing_data .get (meas_parameter ),
342
340
new_data .get (meas_parameter ),
343
341
shape ,
344
342
single_tree_write_status ,
345
343
)
344
+ new_write_status = data_written if data_written is not None else 0
346
345
if single_param_merged_data is not None :
347
346
subtree_merged_data [meas_parameter ] = single_param_merged_data
348
347
349
348
for subtree_param in subtree_parameters :
350
349
if subtree_param != meas_parameter :
351
- single_param_merged_data , new_write_status = _merge_data_single_param (
350
+ single_param_merged_data , data_written = _merge_data_single_param (
352
351
existing_data .get (subtree_param ),
353
352
new_data .get (subtree_param ),
354
353
shape ,
@@ -357,6 +356,9 @@ def _merge_data(
357
356
if single_param_merged_data is not None :
358
357
subtree_merged_data [subtree_param ] = single_param_merged_data
359
358
359
+ if data_written is not None and data_written > new_write_status :
360
+ new_write_status = data_written
361
+
360
362
return subtree_merged_data , new_write_status
361
363
362
364
@@ -373,22 +375,34 @@ def _merge_data_single_param(
373
375
(merged_data , new_write_status ) = _insert_into_data_dict (
374
376
existing_values , new_values , single_tree_write_status , shape = shape
375
377
)
376
- elif new_values is not None :
378
+ elif new_values is not None or shape is not None :
377
379
(merged_data , new_write_status ) = _create_new_data_dict (new_values , shape )
378
380
elif existing_values is not None :
379
381
merged_data = existing_values
380
382
new_write_status = single_tree_write_status
383
+ elif shape is None and new_values is None :
384
+ merged_data = existing_values
385
+ new_write_status = single_tree_write_status
381
386
else :
382
387
merged_data = None
383
388
new_write_status = None
384
389
return merged_data , new_write_status
385
390
386
391
387
392
def _create_new_data_dict (
388
- new_values : npt .NDArray , shape : tuple [int , ...] | None
389
- ) -> tuple [npt .NDArray , int ]:
390
- if shape is None :
393
+ new_values : npt .NDArray | None , shape : tuple [int , ...] | None
394
+ ) -> tuple [npt .NDArray , int | None ]:
395
+ if shape is None and new_values is None :
396
+ raise RuntimeError ("Cannot create new data dict without new values" )
397
+ elif shape is None :
398
+ assert new_values is not None
391
399
return new_values , new_values .size
400
+ elif new_values is None :
401
+ # we don't know the datatype so use float which can hold NaN
402
+ # since that is the most common?
403
+ data = np .zeros (shape )
404
+ data [:] = np .nan
405
+ return data , None
392
406
elif new_values .size > 0 :
393
407
n_values = new_values .size
394
408
data = np .zeros (shape , dtype = new_values .dtype )
0 commit comments