Add code for 1D detector #69

Merged
usov_i merged 118 commits from det1d into master 2020-10-22 12:07:50 +02:00
16 changed files with 1218 additions and 818 deletions
Showing only changes of commit 7afd41ea8b - Show all commits

View File

@ -106,6 +106,21 @@ def create_tuples(x, y, y_err):
t.append(tup) t.append(tup)
return t return t
def normalize(dict, key, monitor):
"""Normalizes the measurement to monitor, checks if sigma exists, otherwise creates it
:arg dict : dictionary to from which to tkae the scan
:arg key : which scan to normalize from dict1
:arg monitor : final monitor
:return counts - normalized counts
:return sigma - normalized sigma"""
counts = np.array(dict["Measurements"][key]["Counts"])
sigma = np.sqrt(counts) if "sigma" not in dict["Measurements"][key] else dict["Measurements"][key]['sigma']
monitor_ratio = monitor/dict["Measurements"][key]["monitor"]
scaled_counts = counts*monitor_ratio
scaled_sigma = np.array(sigma)*monitor_ratio
return scaled_counts, scaled_sigma
def merge(dict1, dict2, keys, auto=True, monitor=100000): def merge(dict1, dict2, keys, auto=True, monitor=100000):
"""merges the two tuples and sorts them, if om value is same, Counts value is average """merges the two tuples and sorts them, if om value is same, Counts value is average
@ -123,25 +138,8 @@ def merge(dict1, dict2, keys, auto=True, monitor=100000):
# load om and Counts # load om and Counts
x1, x2 = dict1["Measurements"][keys[0]]["om"], dict2["Measurements"][keys[1]]["om"] x1, x2 = dict1["Measurements"][keys[0]]["om"], dict2["Measurements"][keys[1]]["om"]
y1, y2 = np.array(dict1["Measurements"][keys[0]]["Counts"]), np.array( cor_y1, y_err1 = normalize(dict1, keys[0], monitor=monitor)
dict2["Measurements"][keys[1]]["Counts"] cor_y2, y_err2 = normalize(dict2, keys[1], monitor=monitor)
)
# normalize y to monitors
cor_y1 = (y1 / dict1["Measurements"][keys[0]]["monitor"]) * monitor
cor_y2 = (y2 / dict2["Measurements"][keys[0]]["monitor"]) * monitor
# check if sigma errors for y exist, otherwise create them as sqrt(y)
y_err1 = (
np.sqrt(cor_y1)
if "sigma" not in dict1["Measurements"][keys[0]]
else np.array(dict1["Measurements"][keys[0]]["sigma"])
* np.sqrt(monitor / dict1["Measurements"][keys[0]]["monitor"])
)
y_err2 = (
np.sqrt(cor_y2)
if "sigma" not in dict2["Measurements"][keys[1]]
else np.array(dict2["Measurements"][keys[1]]["sigma"])
* np.sqrt(monitor / dict2["Measurements"][keys[1]]["monitor"])
)
# creates touples (om, Counts, sigma) for sorting and further processing # creates touples (om, Counts, sigma) for sorting and further processing
tuple_list = create_tuples(x1, cor_y1, y_err1) + create_tuples(x2, cor_y2, y_err2) tuple_list = create_tuples(x1, cor_y1, y_err1) + create_tuples(x2, cor_y2, y_err2)
# Sort the list on om and add 0 0 0 tuple to the last postion # Sort the list on om and add 0 0 0 tuple to the last postion
@ -174,6 +172,7 @@ def merge(dict1, dict2, keys, auto=True, monitor=100000):
dict1["Measurements"][keys[0]]["om"] = om dict1["Measurements"][keys[0]]["om"] = om
dict1["Measurements"][keys[0]]["Counts"] = Counts dict1["Measurements"][keys[0]]["Counts"] = Counts
dict1["Measurements"][keys[0]]["sigma"] = sigma dict1["Measurements"][keys[0]]["sigma"] = sigma
dict1["Measurements"][keys[0]]["monitor"] = monitor
return dict1 return dict1
@ -193,28 +192,14 @@ def substract_measurement(dict1, dict2, keys, auto=True, monitor=100000):
if dict1["Measurements"][keys[0]]["monitor"] == dict2["Measurements"][keys[1]]["monitor"]: if dict1["Measurements"][keys[0]]["monitor"] == dict2["Measurements"][keys[1]]["monitor"]:
monitor = dict1["Measurements"][keys[0]]["monitor"] monitor = dict1["Measurements"][keys[0]]["monitor"]
monitor_ratio_prim = monitor / dict1["Measurements"][str(keys[0])]["monitor"] cor_y1, y_err1 = normalize(dict1, keys[0], monitor=monitor)
monitor_ratio_sec = monitor / dict2["Measurements"][str(keys[1])]["monitor"] cor_y2, y_err2 = normalize(dict2, keys[1], monitor=monitor)
y1 = np.array(dict1["Measurements"][str(keys[0])]["Counts"]) * monitor_ratio_prim
y2 = np.array(dict2["Measurements"][str(keys[1])]["Counts"]) * monitor_ratio_sec dict1_count_err = create_uncertanities(cor_y1, y_err1)
y_err1 = ( dict2_count_err = create_uncertanities(cor_y2, y_err2)
np.sqrt(y1)
if "sigma" not in dict1["Measurements"][keys[0]]
else dict1["Measurements"][keys[0]]["sigma"]
* np.sqrt(monitor / dict1["Measurements"][keys[0]]["monitor"])
)
y_err2 = (
np.sqrt(y2)
if "sigma" not in dict2["Measurements"][keys[1]]
else dict2["Measurements"][keys[1]]["sigma"]
* np.sqrt(monitor / dict2["Measurements"][keys[1]]["monitor"])
)
dict1_count_err = create_uncertanities(y1, y_err1)
dict2_count_err = create_uncertanities(y2, y_err2)
if np.average(y1) > np.average(y2):
res = np.subtract(dict1_count_err, dict2_count_err) res = np.subtract(dict1_count_err, dict2_count_err)
else:
res = np.subtract(dict2_count_err, dict1_count_err)
res_nom = [] res_nom = []
res_err = [] res_err = []
for k in range(len(res)): for k in range(len(res)):
@ -222,7 +207,8 @@ def substract_measurement(dict1, dict2, keys, auto=True, monitor=100000):
res_err = np.append(res_err, res[k].s) res_err = np.append(res_err, res[k].s)
dict1["Measurements"][str(keys[0])]["Counts"] = res_nom dict1["Measurements"][str(keys[0])]["Counts"] = res_nom
dict1["Measurements"][str(keys[0])]["sigma"] = res_err dict1["Measurements"][str(keys[0])]["sigma"] = res_err
dict1["Measurements"][str(keys[0])]["monitor"] = monitor
return dict1
def compare_dict(dict1, dict2): def compare_dict(dict1, dict2):
"""takes two ccl dictionaries and compare different values for each key """takes two ccl dictionaries and compare different values for each key