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
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])
def update_overview_plot():
@ -611,25 +611,25 @@ def calculate_hkl(det_data, index):
wave = det_data["wave"]
ddist = det_data["ddist"]
gammad = det_data["pol_angle"][index]
om = det_data["rot_angle"][index]
nud = det_data["tlt_angle"]
gammad = det_data["gamma"][index]
om = det_data["omega"][index]
nud = det_data["nu"]
ub = det_data["UB"]
geometry = det_data["zebra_mode"]
if geometry == "bisecting":
ch = det_data["chi_angle"][index]
ph = det_data["phi_angle"][index]
chi = det_data["chi"][index]
phi = det_data["phi"][index]
elif geometry == "normal beam":
ch = 0
ph = 0
chi = 0
phi = 0
else:
raise ValueError(f"Unknown geometry type '{geometry}'")
for xi in np.arange(IMAGE_W):
for yi in np.arange(IMAGE_H):
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
@ -640,8 +640,8 @@ def calculate_pol(det_data, index):
nu = np.empty(shape=(IMAGE_H, IMAGE_W))
ddist = det_data["ddist"]
gammad = det_data["pol_angle"][index]
nud = det_data["tlt_angle"]
gammad = det_data["gamma"][index]
nud = det_data["nu"]
for xi in np.arange(IMAGE_W):
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"]
ddist = dat["ddist"]
pol_angle = dat["pol_angle"][0]
rot_angle = dat["rot_angle"][0]
tlt_angle = dat["tlt_angle"][0]
chi_angle = dat["chi_angle"][0]
phi_angle = dat["phi_angle"][0]
gamma = dat["gamma"][0]
omega = dat["omega"][0]
nu = dat["nu"][0]
chi = dat["chi"][0]
phi = dat["phi"][0]
var_angle = dat["variable"]
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_p = var_F + var_step * frStep
if var_angle_name == "pol_angle":
pol_angle = var_p
elif var_angle_name == "rot_angle":
rot_angle = var_p
elif var_angle_name == "tlt_angle":
tlt_angle = var_p
elif var_angle_name == "chi_angle":
chi_angle = var_p
elif var_angle_name == "phi_angle":
phi_angle = var_p
if var_angle_name == "gamma":
gamma = var_p
elif var_angle_name == "omega":
omega = var_p
elif var_angle_name == "nu":
nu = var_p
elif var_angle_name == "chi":
chi = var_p
elif var_angle_name == "phi":
phi = var_p
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)
y_pos = y0 + coeff[1]
ga, nu = pyzebra.det2pol(ddist, pol_angle, tlt_angle, x_pos, y_pos)
diff_vector = pyzebra.z1frmd(wave, ga, rot_angle, chi_angle, phi_angle, nu)
ga, nu = pyzebra.det2pol(ddist, gamma, nu, x_pos, y_pos)
diff_vector = pyzebra.z1frmd(wave, ga, omega, chi, phi, nu)
d_spacing = float(pyzebra.dandth(wave, diff_vector)[0])
dv1, dv2, dv3 = diff_vector.flatten() * 1e10

View File

@ -66,18 +66,8 @@ CCL_FIRST_LINE = (
)
CCL_ANGLES = {
"bi": (
("twotheta_angle", float),
("omega_angle", float),
("chi_angle", float),
("phi_angle", float),
),
"nb": (
("gamma_angle", float),
("omega_angle", float),
("nu_angle", float),
("unkwn_angle", float),
),
"bi": (("twotheta", float), ("omega", float), ("chi", float), ("phi", float)),
"nb": (("gamma", float), ("omega", float), ("nu", float), ("unkwn_angle", float)),
}
CCL_SECOND_LINE = (
@ -122,6 +112,8 @@ def parse_1D(fileobj, data_type):
variable = variable.strip()
value = value.strip()
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)
elif variable in META_VARS_STR:
metadata[variable] = value
@ -151,8 +143,8 @@ def parse_1D(fileobj, data_type):
s[param_name] = param_type(param)
s["om"] = np.linspace(
s["omega_angle"] - (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["omega"] + (s["n_points"] / 2) * s["angle_step"],
s["n_points"],
)
@ -194,13 +186,13 @@ def parse_1D(fileobj, data_type):
except KeyError:
print("Mag_field not present in dat file")
s["omega_angle"] = metadata["omega"]
s["omega"] = metadata["omega"]
s["n_points"] = len(s["om"])
s["monitor"] = s["Monitor1"][0]
s["twotheta_angle"] = metadata["2-theta"]
s["chi_angle"] = metadata["chi"]
s["phi_angle"] = metadata["phi"]
s["nu_angle"] = metadata["nu"]
s["twotheta"] = metadata["twotheta"]
s["chi"] = metadata["chi"]
s["phi"] = metadata["phi"]
s["nu"] = metadata["nu"]
s["idx"] = 1
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
if lorentz:
if zebra_mode == "bi":
twotheta_angle = np.deg2rad(scan["twotheta_angle"])
corr_factor = np.sin(twotheta_angle)
twotheta = np.deg2rad(scan["twotheta"])
corr_factor = np.sin(twotheta)
else: # zebra_mode == "nb":
gamma_angle = np.deg2rad(scan["gamma_angle"])
nu_angle = np.deg2rad(scan["nu_angle"])
corr_factor = np.sin(gamma_angle) * np.cos(nu_angle)
gamma = np.deg2rad(scan["gamma"])
nu = np.deg2rad(scan["nu"])
corr_factor = np.sin(gamma) * np.cos(nu)
area_n = np.abs(area_n * 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.
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:
data = h5f["/entry1/area_detector2/data"][:]
@ -63,19 +63,19 @@ def read_detector_data(filepath):
# om, sometimes ph
if det_data["zebra_mode"] == "nb":
det_data["rot_angle"] = h5f["/entry1/area_detector2/rotation_angle"][:]
else: # bi
det_data["rot_angle"] = h5f["/entry1/sample/rotation_angle"][:]
det_data["omega"] = h5f["/entry1/area_detector2/rotation_angle"][:]
else: # bi
det_data["omega"] = h5f["/entry1/sample/rotation_angle"][:]
det_data["pol_angle"] = h5f["/entry1/ZEBRA/area_detector2/polar_angle"][:] # gammad
det_data["tlt_angle"] = h5f["/entry1/ZEBRA/area_detector2/tilt_angle"][:] # nud
det_data["gamma"] = h5f["/entry1/ZEBRA/area_detector2/polar_angle"][:] # gammad
det_data["nu"] = h5f["/entry1/ZEBRA/area_detector2/tilt_angle"][:] # nud
det_data["ddist"] = h5f["/entry1/ZEBRA/area_detector2/distance"][:]
det_data["wave"] = h5f["/entry1/ZEBRA/monochromator/wavelength"][:]
det_data["chi_angle"] = h5f["/entry1/sample/chi"][:] # ch
det_data["phi_angle"] = h5f["/entry1/sample/phi"][:] # ph
det_data["chi"] = h5f["/entry1/sample/chi"][:] # ch
det_data["phi"] = h5f["/entry1/sample/phi"][:] # ph
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:
det_data["variable"] = det_data[var]
det_data["variable_name"] = var

View File

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

View File

@ -11,6 +11,7 @@ import collections
from .ccl_io import load_1D
def create_tuples(x, y, y_err):
"""creates tuples for sorting and merginng of the data
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":
angles = ["twotheta_angle", "omega_angle", "chi_angle", "phi_angle"]
angles = ["twotheta", "omega", "chi", "phi"]
elif dict["meta"]["zebra_mode"] == "nb":
angles = ["gamma_angle", "omega_angle", "nu_angle"]
angles = ["gamma", "omega", "nu"]
else:
print("Unknown zebra mode")
return
@ -421,11 +422,11 @@ def variables(dictionary):
"n_points",
"monitor",
"Time",
"omega_angle",
"twotheta_angle",
"chi_angle",
"phi_angle",
"nu_angle",
"omega",
"twotheta",
"chi",
"phi",
"nu",
]
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)
sttC = dat["pol_angle"][0]
om = dat["rot_angle"]
nuC = dat["tlt_angle"][0]
sttC = dat["gamma"][0]
om = dat["omega"]
nuC = dat["nu"][0]
ddist = dat["ddist"]
# defining indices
x0, xN, y0, yN, fr0, frN = box
# 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))
p0 = [1.0, 0.0, 1.0]
coeff, var_matrix = curve_fit(gauss, range(len(cnts)), cnts, p0=p0)
frC = fr0 + coeff[1]
omF = dat["rot_angle"][math.floor(frC)]
omC = dat["rot_angle"][math.ceil(frC)]
omF = dat["omega"][math.floor(frC)]
omC = dat["omega"][math.ceil(frC)]
frStep = frC - math.floor(frC)
omStep = omC - omF
omP = omF + omStep * frStep