Add functions for 2D detector data merging
This commit is contained in:
parent
ac6f67cc53
commit
e8ce57b56b
@ -68,7 +68,10 @@ def _parameters_match(scan1, scan2):
|
|||||||
if max(r1_start - r2_end, r2_start - r1_end) > max_range_gap:
|
if max(r1_start - r2_end, r2_start - r1_end) > max_range_gap:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
elif np.max(np.abs(scan1[param] - scan2[param])) > PARAM_PRECISIONS[param]:
|
elif (
|
||||||
|
np.max(np.abs(np.median(scan1[param]) - np.median(scan2[param])))
|
||||||
|
> PARAM_PRECISIONS[param]
|
||||||
|
):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
@ -85,7 +88,10 @@ def merge_datasets(dataset_into, dataset_from):
|
|||||||
for scan_into in dataset_into:
|
for scan_into in dataset_into:
|
||||||
for ind, scan_from in enumerate(dataset_from):
|
for ind, scan_from in enumerate(dataset_from):
|
||||||
if _parameters_match(scan_into, scan_from) and not merged[ind]:
|
if _parameters_match(scan_into, scan_from) and not merged[ind]:
|
||||||
merge_scans(scan_into, scan_from)
|
if scan_into["counts"].ndim == 3:
|
||||||
|
merge_h5_scans(scan_into, scan_from)
|
||||||
|
else: # scan_into["counts"].ndim == 1
|
||||||
|
merge_scans(scan_into, scan_from)
|
||||||
merged[ind] = True
|
merged[ind] = True
|
||||||
|
|
||||||
for scan_from in dataset_from:
|
for scan_from in dataset_from:
|
||||||
@ -147,6 +153,63 @@ def merge_scans(scan_into, scan_from):
|
|||||||
print(f'Merging scans: {scan_into["idx"]} ({fname1}) <-- {scan_from["idx"]} ({fname2})')
|
print(f'Merging scans: {scan_into["idx"]} ({fname1}) <-- {scan_from["idx"]} ({fname2})')
|
||||||
|
|
||||||
|
|
||||||
|
def merge_h5_scans(scan_into, scan_from):
|
||||||
|
if "init_scan" not in scan_into:
|
||||||
|
scan_into["init_scan"] = scan_into.copy()
|
||||||
|
|
||||||
|
if "merged_scans" not in scan_into:
|
||||||
|
scan_into["merged_scans"] = []
|
||||||
|
|
||||||
|
for scan in scan_into["merged_scans"]:
|
||||||
|
if scan_from is scan:
|
||||||
|
print("Already merged scan")
|
||||||
|
return
|
||||||
|
|
||||||
|
scan_into["merged_scans"].append(scan_from)
|
||||||
|
|
||||||
|
scan_motor = scan_into["scan_motor"] # the same as scan_from["scan_motor"]
|
||||||
|
|
||||||
|
pos_all = scan_into["init_scan"][scan_motor]
|
||||||
|
val_all = scan_into["init_scan"]["counts"]
|
||||||
|
err_all = scan_into["init_scan"]["counts_err"] ** 2
|
||||||
|
for scan in scan_into["merged_scans"]:
|
||||||
|
pos_all = np.append(pos_all, scan[scan_motor])
|
||||||
|
val_all = np.concatenate((val_all, scan["counts"]))
|
||||||
|
err_all = np.concatenate((err_all, scan["counts_err"] ** 2))
|
||||||
|
|
||||||
|
sort_index = np.argsort(pos_all)
|
||||||
|
pos_all = pos_all[sort_index]
|
||||||
|
val_all = val_all[sort_index]
|
||||||
|
err_all = err_all[sort_index]
|
||||||
|
|
||||||
|
pos_tmp = pos_all[:1]
|
||||||
|
val_tmp = val_all[:1]
|
||||||
|
err_tmp = err_all[:1]
|
||||||
|
num_tmp = np.array([1])
|
||||||
|
for pos, val, err in zip(pos_all[1:], val_all[1:], err_all[1:]):
|
||||||
|
if pos - pos_tmp[-1] < MOTOR_POS_PRECISION:
|
||||||
|
# the repeated motor position
|
||||||
|
val_tmp[-1] += val
|
||||||
|
err_tmp[-1] += err
|
||||||
|
num_tmp[-1] += 1
|
||||||
|
else:
|
||||||
|
# a new motor position
|
||||||
|
pos_tmp = np.append(pos_tmp, pos)
|
||||||
|
val_tmp = np.concatenate((val_tmp, val[None, :]))
|
||||||
|
err_tmp = np.concatenate((err_tmp, err[None, :]))
|
||||||
|
num_tmp = np.append(num_tmp, 1)
|
||||||
|
|
||||||
|
scan_into[scan_motor] = pos_tmp
|
||||||
|
scan_into["counts"] = val_tmp / num_tmp[:, None, None]
|
||||||
|
scan_into["counts_err"] = np.sqrt(err_tmp) / num_tmp[:, None, None]
|
||||||
|
|
||||||
|
scan_from["export"] = False
|
||||||
|
|
||||||
|
fname1 = os.path.basename(scan_into["original_filename"])
|
||||||
|
fname2 = os.path.basename(scan_from["original_filename"])
|
||||||
|
print(f'Merging scans: {scan_into["idx"]} ({fname1}) <-- {scan_from["idx"]} ({fname2})')
|
||||||
|
|
||||||
|
|
||||||
def restore_scan(scan):
|
def restore_scan(scan):
|
||||||
if "merged_scans" in scan:
|
if "merged_scans" in scan:
|
||||||
for merged_scan in scan["merged_scans"]:
|
for merged_scan in scan["merged_scans"]:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user