@@ -325,7 +325,7 @@ def _merge_data(
325325 shape : tuple [int , ...] | None ,
326326 single_tree_write_status : int | None ,
327327 meas_parameter : str ,
328- ) -> tuple [dict [str , npt .NDArray ], int | None ]:
328+ ) -> tuple [dict [str , npt .NDArray ], int ]:
329329 subtree_merged_data = {}
330330 subtree_parameters = existing_data .keys ()
331331
@@ -335,20 +335,19 @@ def _merge_data(
335335 "The following keys were unexpected: "
336336 f"{ set (new_data .keys () - existing_data .keys ())} "
337337 )
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 (
341339 existing_data .get (meas_parameter ),
342340 new_data .get (meas_parameter ),
343341 shape ,
344342 single_tree_write_status ,
345343 )
344+ new_write_status = data_written if data_written is not None else 0
346345 if single_param_merged_data is not None :
347346 subtree_merged_data [meas_parameter ] = single_param_merged_data
348347
349348 for subtree_param in subtree_parameters :
350349 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 (
352351 existing_data .get (subtree_param ),
353352 new_data .get (subtree_param ),
354353 shape ,
@@ -357,6 +356,9 @@ def _merge_data(
357356 if single_param_merged_data is not None :
358357 subtree_merged_data [subtree_param ] = single_param_merged_data
359358
359+ if data_written is not None and data_written > new_write_status :
360+ new_write_status = data_written
361+
360362 return subtree_merged_data , new_write_status
361363
362364
@@ -373,22 +375,33 @@ def _merge_data_single_param(
373375 (merged_data , new_write_status ) = _insert_into_data_dict (
374376 existing_values , new_values , single_tree_write_status , shape = shape
375377 )
376- elif new_values is not None :
377- ( merged_data , new_write_status ) = _create_new_data_dict ( new_values , shape )
378- elif existing_values is not None :
378+ elif (
379+ existing_values is not None and existing_values . size != 0 and new_values is None
380+ ) :
379381 merged_data = existing_values
380382 new_write_status = single_tree_write_status
383+ elif shape is not None :
384+ (merged_data , new_write_status ) = _create_new_data_dict (new_values , shape )
381385 else :
382386 merged_data = None
383387 new_write_status = None
384388 return merged_data , new_write_status
385389
386390
387391def _create_new_data_dict (
388- new_values : npt .NDArray , shape : tuple [int , ...] | None
389- ) -> tuple [npt .NDArray , int ]:
390- if shape is None :
392+ new_values : npt .NDArray | None , shape : tuple [int , ...] | None
393+ ) -> tuple [npt .NDArray , int | None ]:
394+ if shape is None and new_values is None :
395+ raise RuntimeError ("Cannot create new data dict without new values" )
396+ elif shape is None :
397+ assert new_values is not None
391398 return new_values , new_values .size
399+ elif new_values is None :
400+ # we don't know the datatype so use float which can hold NaN
401+ # since that is the most common?
402+ data = np .zeros (shape )
403+ data [:] = np .nan
404+ return data , None
392405 elif new_values .size > 0 :
393406 n_values = new_values .size
394407 data = np .zeros (shape , dtype = new_values .dtype )
0 commit comments