Consolidate angle names between data formats

This commit is contained in:
usov_i 2021-02-05 11:40:26 +01:00
parent 7e6df95c49
commit 239949b7c0
7 changed files with 87 additions and 96 deletions

View File

@ -110,7 +110,7 @@ def create():
temperature_spinner.value = None temperature_spinner.value = None
gamma, nu = calculate_pol(det_data, index) gamma, nu = calculate_pol(det_data, index)
omega = np.ones((IMAGE_H, IMAGE_W)) * det_data["rot_angle"][index] omega = np.ones((IMAGE_H, IMAGE_W)) * det_data["omega"][index]
image_source.data.update(gamma=[gamma], nu=[nu], omega=[omega]) image_source.data.update(gamma=[gamma], nu=[nu], omega=[omega])
def update_overview_plot(): def update_overview_plot():
@ -611,25 +611,25 @@ def calculate_hkl(det_data, index):
wave = det_data["wave"] wave = det_data["wave"]
ddist = det_data["ddist"] ddist = det_data["ddist"]
gammad = det_data["pol_angle"][index] gammad = det_data["gamma"][index]
om = det_data["rot_angle"][index] om = det_data["omega"][index]
nud = det_data["tlt_angle"] nud = det_data["nu"]
ub = det_data["UB"] ub = det_data["UB"]
geometry = det_data["zebra_mode"] geometry = det_data["zebra_mode"]
if geometry == "bisecting": if geometry == "bisecting":
ch = det_data["chi_angle"][index] chi = det_data["chi"][index]
ph = det_data["phi_angle"][index] phi = det_data["phi"][index]
elif geometry == "normal beam": elif geometry == "normal beam":
ch = 0 chi = 0
ph = 0 phi = 0
else: else:
raise ValueError(f"Unknown geometry type '{geometry}'") raise ValueError(f"Unknown geometry type '{geometry}'")
for xi in np.arange(IMAGE_W): for xi in np.arange(IMAGE_W):
for yi in np.arange(IMAGE_H): for yi in np.arange(IMAGE_H):
h[yi, xi], k[yi, xi], l[yi, xi] = pyzebra.ang2hkl( h[yi, xi], k[yi, xi], l[yi, xi] = pyzebra.ang2hkl(
wave, ddist, gammad, om, ch, ph, nud, ub, xi, yi wave, ddist, gammad, om, chi, phi, nud, ub, xi, yi
) )
return h, k, l return h, k, l
@ -640,8 +640,8 @@ def calculate_pol(det_data, index):
nu = np.empty(shape=(IMAGE_H, IMAGE_W)) nu = np.empty(shape=(IMAGE_H, IMAGE_W))
ddist = det_data["ddist"] ddist = det_data["ddist"]
gammad = det_data["pol_angle"][index] gammad = det_data["gamma"][index]
nud = det_data["tlt_angle"] nud = det_data["nu"]
for xi in np.arange(IMAGE_W): for xi in np.arange(IMAGE_W):
for yi in np.arange(IMAGE_H): for yi in np.arange(IMAGE_H):

View File

@ -183,11 +183,11 @@ def prepare_event_file(export_filename, roi_dict, path_prefix=""):
wave = dat["wave"] wave = dat["wave"]
ddist = dat["ddist"] ddist = dat["ddist"]
pol_angle = dat["pol_angle"][0] gamma = dat["gamma"][0]
rot_angle = dat["rot_angle"][0] omega = dat["omega"][0]
tlt_angle = dat["tlt_angle"][0] nu = dat["nu"][0]
chi_angle = dat["chi_angle"][0] chi = dat["chi"][0]
phi_angle = dat["phi_angle"][0] phi = dat["phi"][0]
var_angle = dat["variable"] var_angle = dat["variable"]
var_angle_name = dat["variable_name"] var_angle_name = dat["variable_name"]
@ -210,16 +210,16 @@ def prepare_event_file(export_filename, roi_dict, path_prefix=""):
var_step = var_C - var_F var_step = var_C - var_F
var_p = var_F + var_step * frStep var_p = var_F + var_step * frStep
if var_angle_name == "pol_angle": if var_angle_name == "gamma":
pol_angle = var_p gamma = var_p
elif var_angle_name == "rot_angle": elif var_angle_name == "omega":
rot_angle = var_p omega = var_p
elif var_angle_name == "tlt_angle": elif var_angle_name == "nu":
tlt_angle = var_p nu = var_p
elif var_angle_name == "chi_angle": elif var_angle_name == "chi":
chi_angle = var_p chi = var_p
elif var_angle_name == "phi_angle": elif var_angle_name == "phi":
phi_angle = var_p phi = var_p
intensity = coeff[1] * abs(coeff[2] * var_step) * math.sqrt(2) * math.sqrt(np.pi) intensity = coeff[1] * abs(coeff[2] * var_step) * math.sqrt(2) * math.sqrt(np.pi)
@ -231,8 +231,8 @@ def prepare_event_file(export_filename, roi_dict, path_prefix=""):
coeff, _ = curve_fit(gauss, range(len(projY)), projY, p0=p0, maxfev=maxfev) coeff, _ = curve_fit(gauss, range(len(projY)), projY, p0=p0, maxfev=maxfev)
y_pos = y0 + coeff[1] y_pos = y0 + coeff[1]
ga, nu = pyzebra.det2pol(ddist, pol_angle, tlt_angle, x_pos, y_pos) ga, nu = pyzebra.det2pol(ddist, gamma, nu, x_pos, y_pos)
diff_vector = pyzebra.z1frmd(wave, ga, rot_angle, chi_angle, phi_angle, nu) diff_vector = pyzebra.z1frmd(wave, ga, omega, chi, phi, nu)
d_spacing = float(pyzebra.dandth(wave, diff_vector)[0]) d_spacing = float(pyzebra.dandth(wave, diff_vector)[0])
dv1, dv2, dv3 = diff_vector.flatten() * 1e10 dv1, dv2, dv3 = diff_vector.flatten() * 1e10

View File

@ -66,18 +66,8 @@ CCL_FIRST_LINE = (
) )
CCL_ANGLES = { CCL_ANGLES = {
"bi": ( "bi": (("twotheta", float), ("omega", float), ("chi", float), ("phi", float)),
("twotheta_angle", float), "nb": (("gamma", float), ("omega", float), ("nu", float), ("unkwn_angle", float)),
("omega_angle", float),
("chi_angle", float),
("phi_angle", float),
),
"nb": (
("gamma_angle", float),
("omega_angle", float),
("nu_angle", float),
("unkwn_angle", float),
),
} }
CCL_SECOND_LINE = ( CCL_SECOND_LINE = (
@ -122,6 +112,8 @@ def parse_1D(fileobj, data_type):
variable = variable.strip() variable = variable.strip()
value = value.strip() value = value.strip()
if variable in META_VARS_FLOAT: if variable in META_VARS_FLOAT:
if variable == "2-theta": # fix that angle name not to be an expression
variable = "twotheta"
metadata[variable] = float(value) metadata[variable] = float(value)
elif variable in META_VARS_STR: elif variable in META_VARS_STR:
metadata[variable] = value metadata[variable] = value
@ -151,8 +143,8 @@ def parse_1D(fileobj, data_type):
s[param_name] = param_type(param) s[param_name] = param_type(param)
s["om"] = np.linspace( s["om"] = np.linspace(
s["omega_angle"] - (s["n_points"] / 2) * s["angle_step"], s["omega"] - (s["n_points"] / 2) * s["angle_step"],
s["omega_angle"] + (s["n_points"] / 2) * s["angle_step"], s["omega"] + (s["n_points"] / 2) * s["angle_step"],
s["n_points"], s["n_points"],
) )
@ -194,13 +186,13 @@ def parse_1D(fileobj, data_type):
except KeyError: except KeyError:
print("Mag_field not present in dat file") print("Mag_field not present in dat file")
s["omega_angle"] = metadata["omega"] s["omega"] = metadata["omega"]
s["n_points"] = len(s["om"]) s["n_points"] = len(s["om"])
s["monitor"] = s["Monitor1"][0] s["monitor"] = s["Monitor1"][0]
s["twotheta_angle"] = metadata["2-theta"] s["twotheta"] = metadata["twotheta"]
s["chi_angle"] = metadata["chi"] s["chi"] = metadata["chi"]
s["phi_angle"] = metadata["phi"] s["phi"] = metadata["phi"]
s["nu_angle"] = metadata["nu"] s["nu"] = metadata["nu"]
s["idx"] = 1 s["idx"] = 1
scan.append(dict(s)) scan.append(dict(s))
@ -249,12 +241,12 @@ def export_1D(data, path, area_method=AREA_METHODS[0], lorentz=False, hkl_precis
# apply lorentz correction to area # apply lorentz correction to area
if lorentz: if lorentz:
if zebra_mode == "bi": if zebra_mode == "bi":
twotheta_angle = np.deg2rad(scan["twotheta_angle"]) twotheta = np.deg2rad(scan["twotheta"])
corr_factor = np.sin(twotheta_angle) corr_factor = np.sin(twotheta)
else: # zebra_mode == "nb": else: # zebra_mode == "nb":
gamma_angle = np.deg2rad(scan["gamma_angle"]) gamma = np.deg2rad(scan["gamma"])
nu_angle = np.deg2rad(scan["nu_angle"]) nu = np.deg2rad(scan["nu"])
corr_factor = np.sin(gamma_angle) * np.cos(nu_angle) corr_factor = np.sin(gamma) * np.cos(nu)
area_n = np.abs(area_n * corr_factor) area_n = np.abs(area_n * corr_factor)
area_s = np.abs(area_s * corr_factor) area_s = np.abs(area_s * corr_factor)

View File

@ -41,7 +41,7 @@ def read_detector_data(filepath):
filepath (str): File path of an h5 file. filepath (str): File path of an h5 file.
Returns: Returns:
ndarray: A 3D array of data, rot_angle, pol_angle, tilt_angle. ndarray: A 3D array of data, omega, gamma, nu.
""" """
with h5py.File(filepath, "r") as h5f: with h5py.File(filepath, "r") as h5f:
data = h5f["/entry1/area_detector2/data"][:] data = h5f["/entry1/area_detector2/data"][:]
@ -63,19 +63,19 @@ def read_detector_data(filepath):
# om, sometimes ph # om, sometimes ph
if det_data["zebra_mode"] == "nb": if det_data["zebra_mode"] == "nb":
det_data["rot_angle"] = h5f["/entry1/area_detector2/rotation_angle"][:] det_data["omega"] = h5f["/entry1/area_detector2/rotation_angle"][:]
else: # bi else: # bi
det_data["rot_angle"] = h5f["/entry1/sample/rotation_angle"][:] det_data["omega"] = h5f["/entry1/sample/rotation_angle"][:]
det_data["pol_angle"] = h5f["/entry1/ZEBRA/area_detector2/polar_angle"][:] # gammad det_data["gamma"] = h5f["/entry1/ZEBRA/area_detector2/polar_angle"][:] # gammad
det_data["tlt_angle"] = h5f["/entry1/ZEBRA/area_detector2/tilt_angle"][:] # nud det_data["nu"] = h5f["/entry1/ZEBRA/area_detector2/tilt_angle"][:] # nud
det_data["ddist"] = h5f["/entry1/ZEBRA/area_detector2/distance"][:] det_data["ddist"] = h5f["/entry1/ZEBRA/area_detector2/distance"][:]
det_data["wave"] = h5f["/entry1/ZEBRA/monochromator/wavelength"][:] det_data["wave"] = h5f["/entry1/ZEBRA/monochromator/wavelength"][:]
det_data["chi_angle"] = h5f["/entry1/sample/chi"][:] # ch det_data["chi"] = h5f["/entry1/sample/chi"][:] # ch
det_data["phi_angle"] = h5f["/entry1/sample/phi"][:] # ph det_data["phi"] = h5f["/entry1/sample/phi"][:] # ph
det_data["UB"] = h5f["/entry1/sample/UB"][:].reshape(3, 3) det_data["UB"] = h5f["/entry1/sample/UB"][:].reshape(3, 3)
for var in ("rot_angle", "pol_angle", "tlt_angle", "chi_angle", "phi_angle"): for var in ("omega", "gamma", "nu", "chi", "phi"):
if abs(det_data[var][0] - det_data[var][-1]) > 0.1: if abs(det_data[var][0] - det_data[var][-1]) > 0.1:
det_data["variable"] = det_data[var] det_data["variable"] = det_data[var]
det_data["variable_name"] = var det_data["variable_name"] = var

View File

@ -35,7 +35,6 @@ def merge(scan1, scan2):
note: dict1 and dict2 can be same dict note: dict1 and dict2 can be same dict
:return dict1 with merged scan""" :return dict1 with merged scan"""
# load om and Counts # load om and Counts
x1, x2 = scan1["om"], scan2["om"] x1, x2 = scan1["om"], scan2["om"]
# print(scan1["om"]) # print(scan1["om"])
@ -134,7 +133,6 @@ def check_temp_mag(scan1, scan2):
except KeyError: except KeyError:
print("temperature missing") print("temperature missing")
if all(truth_list): if all(truth_list):
return True return True
else: else:
@ -147,17 +145,17 @@ def merge_dups(dictionary):
return return
if dictionary["meta"]["zebra_mode"] == "bi": if dictionary["meta"]["zebra_mode"] == "bi":
angles = ["twotheta_angle", "omega_angle", "chi_angle", "phi_angle"] angles = ["twotheta", "omega", "chi", "phi"]
elif dictionary["meta"]["zebra_mode"] == "nb": elif dictionary["meta"]["zebra_mode"] == "nb":
angles = ["gamma_angle", "omega_angle", "nu_angle"] angles = ["gamma", "omega", "nu"]
precision = { precision = {
"twotheta_angle": 0.1, "twotheta": 0.1,
"chi_angle": 0.1, "chi": 0.1,
"nu_angle": 0.1, "nu": 0.1,
"phi_angle": 0.05, "phi": 0.05,
"omega_angle": 5, "omega": 5,
"gamma_angle": 0.05, "gamma": 0.05,
} }
for i in range(len(dictionary["scan"])): for i in range(len(dictionary["scan"])):
@ -166,8 +164,9 @@ def merge_dups(dictionary):
continue continue
else: else:
# print(i, j) # print(i, j)
if check_angles(dictionary["scan"][i], dictionary["scan"][j], angles, precision) \ if check_angles(
and check_temp_mag(dictionary["scan"][i], dictionary["scan"][j]): dictionary["scan"][i], dictionary["scan"][j], angles, precision
) and check_temp_mag(dictionary["scan"][i], dictionary["scan"][j]):
merge(dictionary["scan"][i], dictionary["scan"][j]) merge(dictionary["scan"][i], dictionary["scan"][j])
print("merged %d with %d within the dictionary" % (i, j)) print("merged %d with %d within the dictionary" % (i, j))
@ -240,22 +239,21 @@ def unified_merge(dict1, dict2):
# decide angles # decide angles
if dict1["meta"]["zebra_mode"] == "bi": if dict1["meta"]["zebra_mode"] == "bi":
angles = ["twotheta_angle", "omega_angle", "chi_angle", "phi_angle"] angles = ["twotheta", "omega", "chi", "phi"]
elif dict1["meta"]["zebra_mode"] == "nb": elif dict1["meta"]["zebra_mode"] == "nb":
angles = ["gamma_angle", "omega_angle", "nu_angle"] angles = ["gamma", "omega", "nu"]
# precision of angles to check # precision of angles to check
precision = { precision = {
"twotheta_angle": 0.1, "twotheta": 0.1,
"chi_angle": 0.1, "chi": 0.1,
"nu_angle": 0.1, "nu": 0.1,
"phi_angle": 0.05, "phi": 0.05,
"omega_angle": 5, "omega": 5,
"gamma_angle": 0.1, "gamma": 0.1,
} }
if (dict1["meta"]["data_type"] == "ccl") and (dict2["meta"]["data_type"] == "ccl"): if (dict1["meta"]["data_type"] == "ccl") and (dict2["meta"]["data_type"] == "ccl"):
precision["omega_angle"] = 0.05 precision["omega"] = 0.05
process(dict1, dict2, angles, precision) process(dict1, dict2, angles, precision)

View File

@ -11,6 +11,7 @@ import collections
from .ccl_io import load_1D from .ccl_io import load_1D
def create_tuples(x, y, y_err): def create_tuples(x, y, y_err):
"""creates tuples for sorting and merginng of the data """creates tuples for sorting and merginng of the data
Counts need to be normalized to monitor before""" Counts need to be normalized to monitor before"""
@ -344,9 +345,9 @@ def scan_dict(dict, precision=0.5):
""" """
if dict["meta"]["zebra_mode"] == "bi": if dict["meta"]["zebra_mode"] == "bi":
angles = ["twotheta_angle", "omega_angle", "chi_angle", "phi_angle"] angles = ["twotheta", "omega", "chi", "phi"]
elif dict["meta"]["zebra_mode"] == "nb": elif dict["meta"]["zebra_mode"] == "nb":
angles = ["gamma_angle", "omega_angle", "nu_angle"] angles = ["gamma", "omega", "nu"]
else: else:
print("Unknown zebra mode") print("Unknown zebra mode")
return return
@ -421,11 +422,11 @@ def variables(dictionary):
"n_points", "n_points",
"monitor", "monitor",
"Time", "Time",
"omega_angle", "omega",
"twotheta_angle", "twotheta",
"chi_angle", "chi",
"phi_angle", "phi",
"nu_angle", "nu",
] ]
inall_red = [i for i in inall if i not in wrong] inall_red = [i for i in inall if i not in wrong]

View File

@ -407,24 +407,24 @@ def box_int(file, box):
dat = pyzebra.read_detector_data(file) dat = pyzebra.read_detector_data(file)
sttC = dat["pol_angle"][0] sttC = dat["gamma"][0]
om = dat["rot_angle"] om = dat["omega"]
nuC = dat["tlt_angle"][0] nuC = dat["nu"][0]
ddist = dat["ddist"] ddist = dat["ddist"]
# defining indices # defining indices
x0, xN, y0, yN, fr0, frN = box x0, xN, y0, yN, fr0, frN = box
# omega fit # omega fit
om = dat["rot_angle"][fr0:frN] om = dat["omega"][fr0:frN]
cnts = np.sum(dat["data"][fr0:frN, y0:yN, x0:xN], axis=(1, 2)) cnts = np.sum(dat["data"][fr0:frN, y0:yN, x0:xN], axis=(1, 2))
p0 = [1.0, 0.0, 1.0] p0 = [1.0, 0.0, 1.0]
coeff, var_matrix = curve_fit(gauss, range(len(cnts)), cnts, p0=p0) coeff, var_matrix = curve_fit(gauss, range(len(cnts)), cnts, p0=p0)
frC = fr0 + coeff[1] frC = fr0 + coeff[1]
omF = dat["rot_angle"][math.floor(frC)] omF = dat["omega"][math.floor(frC)]
omC = dat["rot_angle"][math.ceil(frC)] omC = dat["omega"][math.ceil(frC)]
frStep = frC - math.floor(frC) frStep = frC - math.floor(frC)
omStep = omC - omF omStep = omC - omF
omP = omF + omStep * frStep omP = omF + omStep * frStep