Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions hexrdgui/const_chi_overlay_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ def setup_connections(self):

HexrdConfig().euler_angle_convention_changed.connect(
self.euler_angle_convention_changed)
HexrdConfig().sample_tilt_modified.connect(self.update_gui)

self.ui.add_chi_value_row.clicked.connect(
self.add_chi_value)
Expand Down
17 changes: 16 additions & 1 deletion hexrdgui/hexrd_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from hexrd.instrument.constants import PHYSICS_PACKAGE_DEFAULTS, PINHOLE_DEFAULTS
from hexrd.instrument.physics_package import HEDPhysicsPackage
from hexrd.material import load_materials_hdf5, save_materials_hdf5, Material
from hexrd.rotations import RotMatEuler
from hexrd.rotations import angleAxisOfRotMat, RotMatEuler, rotMatOfExpMap
from hexrd.utils.decorators import memoize
from hexrd.utils.yaml import NumpyToNativeDumper
from hexrd.valunits import valWUnit
Expand Down Expand Up @@ -713,6 +713,12 @@ def overlays_dictified(self, v):
# Skip over ones that do not have a matching material
continue

if overlay_dict.get('sample_rmat') is not None:
# Legacy way of setting sample rmat was on Laue overlays.
# Now we have a global setting for it. Apply this to the
# global setting.
self.sample_rmat = overlay_dict.pop('sample_rmat')

if overlay_dict.get('tth_distortion_type') is not None:
if not self.has_physics_package:
# We need to create a default physics package
Expand Down Expand Up @@ -2175,6 +2181,15 @@ def sample_tilt(self, v):
self._sample_tilt = v
self.sample_tilt_modified.emit()

@property
def sample_rmat(self) -> np.ndarray:
return rotMatOfExpMap(self.sample_tilt)

@sample_rmat.setter
def sample_rmat(self, v: np.ndarray):
phi, n = angleAxisOfRotMat(v)
self.sample_tilt = phi * n.flatten()

def _polar_pixel_size_tth(self):
return self.config['image']['polar']['pixel_size_tth']

Expand Down
7 changes: 5 additions & 2 deletions hexrdgui/laue_overlay_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def setup_connections(self):
self.euler_angle_convention_changed)
HexrdConfig().instrument_config_loaded.connect(
self.update_visibility_states)
HexrdConfig().sample_tilt_modified.connect(self.update_gui)

def setup_combo_boxes(self):
width_shapes = [x.value.capitalize() for x in LaueRangeShape]
Expand Down Expand Up @@ -77,7 +78,6 @@ def update_gui(self):
overlay = self.overlay
self.ui.min_energy.setValue(overlay.min_energy)
self.ui.max_energy.setValue(overlay.max_energy)
self.sample_rmat = overlay.sample_rmat
self.crystal_params = overlay.crystal_params
self.refinements = overlay.refinements
self.width_shape = overlay.width_shape
Expand All @@ -90,6 +90,8 @@ def update_gui(self):
self.ui.tth_width.setValue(np.degrees(overlay.tth_width))
self.ui.eta_width.setValue(np.degrees(overlay.eta_width))

self.sample_rmat = HexrdConfig().sample_rmat

self.update_enable_states()
self.update_orientation_suffixes()

Expand Down Expand Up @@ -151,12 +153,13 @@ def update_config(self):
overlay.tth_width = self.tth_width
overlay.eta_width = self.eta_width
overlay.width_shape = self.width_shape
overlay.sample_rmat = self.sample_rmat
overlay.refinements = self.refinements
overlay.label_type = self.label_type
overlay.label_offsets = self.label_offsets
overlay.xray_source = self.xray_source

HexrdConfig().sample_rmat = self.sample_rmat

self.overlay.update_needed = True
HexrdConfig().overlay_config_changed.emit()

Expand Down
21 changes: 3 additions & 18 deletions hexrdgui/overlays/laue_overlay.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from numba import njit
import numpy as np

from hexrd import constants
from hexrd.instrument import switch_xray_source
from hexrd.transforms import xfcapi
from hexrd.utils.hkl import hkl_to_str
Expand All @@ -27,7 +26,7 @@ class LaueOverlay(Overlay):
data_key = 'spots'
ranges_key = 'ranges'

def __init__(self, material_name, crystal_params=None, sample_rmat=None,
def __init__(self, material_name, crystal_params=None,
min_energy=5, max_energy=35, tth_width=None, eta_width=None,
width_shape=None, label_type=None, label_offsets=None,
**overlay_kwargs):
Expand All @@ -36,17 +35,13 @@ def __init__(self, material_name, crystal_params=None, sample_rmat=None,
if crystal_params is None:
crystal_params = default_crystal_params()

if sample_rmat is None:
sample_rmat = constants.identity_3x3.copy()

if width_shape is None:
width_shape = LaueRangeShape.ellipse

if label_offsets is None:
label_offsets = [1, 1]

self.crystal_params = crystal_params
self.sample_rmat = sample_rmat
self._min_energy = min_energy
self._max_energy = max_energy
self.tth_width = tth_width
Expand All @@ -61,7 +56,6 @@ def child_attributes_to_save(self):
# arguments to the __init__ method.
return [
'crystal_params',
'sample_rmat',
'min_energy',
'max_energy',
'tth_width',
Expand Down Expand Up @@ -128,15 +122,6 @@ def max_energy(self, x):
assert x > self.min_energy
self._max_energy = x

@property
def sample_rmat(self):
return self._sample_rmat

@sample_rmat.setter
def sample_rmat(self, x):
assert isinstance(x, np.ndarray), 'input must be a (3, 3) array'
self._sample_rmat = x

@property
def widths_enabled(self):
widths = ['tth_width', 'eta_width']
Expand Down Expand Up @@ -234,7 +219,7 @@ def generate_overlay(self):
self.plane_data_no_exclusions,
minEnergy=self.min_energy,
maxEnergy=self.max_energy,
rmat_s=self.sample_rmat,
rmat_s=HexrdConfig().sample_rmat,
grain_params=[self.crystal_params, ])

for det_key, psim in sim_data.items():
Expand Down Expand Up @@ -264,7 +249,7 @@ def generate_overlay(self):
# !!! apply offset corrections to angles
# convert to angles in LAB ref
angles_corr, _ = xfcapi.detectorXYToGvec(
xy_data, panel.rmat, self.sample_rmat,
xy_data, panel.rmat, HexrdConfig().sample_rmat,
panel.tvec, instr.tvec, constants.zeros_3,
beamVec=instr.beam_vector,
etaVec=instr.eta_vector
Expand Down
60 changes: 60 additions & 0 deletions hexrdgui/physics_package_manager_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,18 @@
from hexrdgui import resource_loader
from hexrdgui.hexrd_config import HexrdConfig
from hexrdgui.ui_loader import UiLoader
from hexrdgui.utils import (
block_signals,
euler_angles_to_exp_map,
exp_map_to_euler_angles,
)
from hexrdgui.utils.guess_instrument_type import guess_instrument_type

import hexrd.resources as hexrd_resources
from hexrd.material import _angstroms, _kev, Material
from hexrd.instrument import calc_beam_vec
from hexrd.instrument.constants import FILTER_DEFAULTS, PINHOLE_DEFAULTS
from hexrd.rotations import rotMatOfExpMap


class PhysicsPackageManagerDialog:
Expand All @@ -41,6 +48,8 @@ def show(self, delete_if_canceled=False):
self.delete_if_canceled = delete_if_canceled
self.setup_form()
self.draw_diagram()
self.reset_sample_tilt()
self.update_tilt_suffixes()
self.ui.show()

@property
Expand Down Expand Up @@ -96,6 +105,14 @@ def setup_connections(self):
HexrdConfig().detectors_changed.connect(
self.initialize_detector_coatings)

HexrdConfig().euler_angle_convention_changed.connect(
self.on_euler_angle_convention_changed)
HexrdConfig().sample_tilt_modified.connect(
self.reset_sample_tilt)

for w in self.sample_tilt_widgets:
w.valueChanged.connect(self.update_sample_normal)

self.ui.accepted.connect(self.on_accepted)
self.ui.rejected.connect(self.on_rejected)

Expand All @@ -108,6 +125,47 @@ def on_rejected(self):

self.delete_if_canceled = False

def on_euler_angle_convention_changed(self):
self.update_tilt_suffixes()
self.reset_sample_tilt()

@property
def sample_tilt_widgets(self):
return [getattr(self.ui, f'sample_tilt_{i}') for i in range(3)]

@property
def sample_normal_widgets(self):
return [getattr(self.ui, f'sample_normal_{i}') for i in range(3)]

@property
def sample_rmat(self):
angles = [w.value() for w in self.sample_tilt_widgets]
return rotMatOfExpMap(euler_angles_to_exp_map(angles))

def update_tilt_suffixes(self):
suffix = '' if HexrdConfig().euler_angle_convention is None else '°'
for w in self.sample_tilt_widgets:
w.setSuffix(suffix)

def reset_sample_tilt(self):
angles = exp_map_to_euler_angles(HexrdConfig().sample_tilt)
with block_signals(*self.sample_tilt_widgets):
for w, v in zip(self.sample_tilt_widgets, angles):
w.setValue(v)

self.update_sample_normal()

def save_sample_tilt(self):
angles = [w.value() for w in self.sample_tilt_widgets]
HexrdConfig().sample_tilt = euler_angles_to_exp_map(angles)

def update_sample_normal(self):
d = HexrdConfig().active_beam['vector']
bvec = calc_beam_vec(d['azimuth'], d['polar_angle'])
sample_normal = np.dot(self.sample_rmat, [0., 0., np.sign(bvec[2])])
for w, v in zip(self.sample_normal_widgets, sample_normal):
w.setValue(v)

def initialize_detector_coatings(self):
# Reset detector coatings to make sure they're in sync w/ current dets
HexrdConfig().detector_coatings_dictified = {}
Expand Down Expand Up @@ -295,6 +353,8 @@ def accept_changes(self):

HexrdConfig().update_physics_package(**kwargs)

self.save_sample_tilt()

if HexrdConfig().apply_absorption_correction:
# Make sure changes are reflected
HexrdConfig().deep_rerender_needed.emit()
Expand Down
9 changes: 9 additions & 0 deletions hexrdgui/resources/ui/laue_overlay_editor.ui
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="decimals">
<number>8</number>
</property>
Expand All @@ -186,6 +189,9 @@
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="decimals">
<number>8</number>
</property>
Expand All @@ -202,6 +208,9 @@
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="keyboardTracking">
<bool>false</bool>
</property>
<property name="decimals">
<number>8</number>
</property>
Expand Down
Loading
Loading