Skip to content

Commit 3123682

Browse files
authored
Merge pull request #1914 from HEXRD/physics-package-sample-tilt
Specify sample tilt in physics package dialog
2 parents 23a3df4 + 8d1168f commit 3123682

File tree

7 files changed

+280
-47
lines changed

7 files changed

+280
-47
lines changed

hexrdgui/const_chi_overlay_editor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def setup_connections(self):
6161

6262
HexrdConfig().euler_angle_convention_changed.connect(
6363
self.euler_angle_convention_changed)
64+
HexrdConfig().sample_tilt_modified.connect(self.update_gui)
6465

6566
self.ui.add_chi_value_row.clicked.connect(
6667
self.add_chi_value)

hexrdgui/hexrd_config.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from hexrd.instrument.constants import PHYSICS_PACKAGE_DEFAULTS, PINHOLE_DEFAULTS
1919
from hexrd.instrument.physics_package import HEDPhysicsPackage
2020
from hexrd.material import load_materials_hdf5, save_materials_hdf5, Material
21-
from hexrd.rotations import RotMatEuler
21+
from hexrd.rotations import angleAxisOfRotMat, RotMatEuler, rotMatOfExpMap
2222
from hexrd.utils.decorators import memoize
2323
from hexrd.utils.yaml import NumpyToNativeDumper
2424
from hexrd.valunits import valWUnit
@@ -713,6 +713,12 @@ def overlays_dictified(self, v):
713713
# Skip over ones that do not have a matching material
714714
continue
715715

716+
if overlay_dict.get('sample_rmat') is not None:
717+
# Legacy way of setting sample rmat was on Laue overlays.
718+
# Now we have a global setting for it. Apply this to the
719+
# global setting.
720+
self.sample_rmat = overlay_dict.pop('sample_rmat')
721+
716722
if overlay_dict.get('tth_distortion_type') is not None:
717723
if not self.has_physics_package:
718724
# We need to create a default physics package
@@ -2175,6 +2181,15 @@ def sample_tilt(self, v):
21752181
self._sample_tilt = v
21762182
self.sample_tilt_modified.emit()
21772183

2184+
@property
2185+
def sample_rmat(self) -> np.ndarray:
2186+
return rotMatOfExpMap(self.sample_tilt)
2187+
2188+
@sample_rmat.setter
2189+
def sample_rmat(self, v: np.ndarray):
2190+
phi, n = angleAxisOfRotMat(v)
2191+
self.sample_tilt = phi * n.flatten()
2192+
21782193
def _polar_pixel_size_tth(self):
21792194
return self.config['image']['polar']['pixel_size_tth']
21802195

hexrdgui/laue_overlay_editor.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def setup_connections(self):
4747
self.euler_angle_convention_changed)
4848
HexrdConfig().instrument_config_loaded.connect(
4949
self.update_visibility_states)
50+
HexrdConfig().sample_tilt_modified.connect(self.update_gui)
5051

5152
def setup_combo_boxes(self):
5253
width_shapes = [x.value.capitalize() for x in LaueRangeShape]
@@ -77,7 +78,6 @@ def update_gui(self):
7778
overlay = self.overlay
7879
self.ui.min_energy.setValue(overlay.min_energy)
7980
self.ui.max_energy.setValue(overlay.max_energy)
80-
self.sample_rmat = overlay.sample_rmat
8181
self.crystal_params = overlay.crystal_params
8282
self.refinements = overlay.refinements
8383
self.width_shape = overlay.width_shape
@@ -90,6 +90,8 @@ def update_gui(self):
9090
self.ui.tth_width.setValue(np.degrees(overlay.tth_width))
9191
self.ui.eta_width.setValue(np.degrees(overlay.eta_width))
9292

93+
self.sample_rmat = HexrdConfig().sample_rmat
94+
9395
self.update_enable_states()
9496
self.update_orientation_suffixes()
9597

@@ -151,12 +153,13 @@ def update_config(self):
151153
overlay.tth_width = self.tth_width
152154
overlay.eta_width = self.eta_width
153155
overlay.width_shape = self.width_shape
154-
overlay.sample_rmat = self.sample_rmat
155156
overlay.refinements = self.refinements
156157
overlay.label_type = self.label_type
157158
overlay.label_offsets = self.label_offsets
158159
overlay.xray_source = self.xray_source
159160

161+
HexrdConfig().sample_rmat = self.sample_rmat
162+
160163
self.overlay.update_needed = True
161164
HexrdConfig().overlay_config_changed.emit()
162165

hexrdgui/overlays/laue_overlay.py

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from numba import njit
55
import numpy as np
66

7-
from hexrd import constants
87
from hexrd.instrument import switch_xray_source
98
from hexrd.transforms import xfcapi
109
from hexrd.utils.hkl import hkl_to_str
@@ -27,7 +26,7 @@ class LaueOverlay(Overlay):
2726
data_key = 'spots'
2827
ranges_key = 'ranges'
2928

30-
def __init__(self, material_name, crystal_params=None, sample_rmat=None,
29+
def __init__(self, material_name, crystal_params=None,
3130
min_energy=5, max_energy=35, tth_width=None, eta_width=None,
3231
width_shape=None, label_type=None, label_offsets=None,
3332
**overlay_kwargs):
@@ -36,17 +35,13 @@ def __init__(self, material_name, crystal_params=None, sample_rmat=None,
3635
if crystal_params is None:
3736
crystal_params = default_crystal_params()
3837

39-
if sample_rmat is None:
40-
sample_rmat = constants.identity_3x3.copy()
41-
4238
if width_shape is None:
4339
width_shape = LaueRangeShape.ellipse
4440

4541
if label_offsets is None:
4642
label_offsets = [1, 1]
4743

4844
self.crystal_params = crystal_params
49-
self.sample_rmat = sample_rmat
5045
self._min_energy = min_energy
5146
self._max_energy = max_energy
5247
self.tth_width = tth_width
@@ -61,7 +56,6 @@ def child_attributes_to_save(self):
6156
# arguments to the __init__ method.
6257
return [
6358
'crystal_params',
64-
'sample_rmat',
6559
'min_energy',
6660
'max_energy',
6761
'tth_width',
@@ -128,15 +122,6 @@ def max_energy(self, x):
128122
assert x > self.min_energy
129123
self._max_energy = x
130124

131-
@property
132-
def sample_rmat(self):
133-
return self._sample_rmat
134-
135-
@sample_rmat.setter
136-
def sample_rmat(self, x):
137-
assert isinstance(x, np.ndarray), 'input must be a (3, 3) array'
138-
self._sample_rmat = x
139-
140125
@property
141126
def widths_enabled(self):
142127
widths = ['tth_width', 'eta_width']
@@ -234,7 +219,7 @@ def generate_overlay(self):
234219
self.plane_data_no_exclusions,
235220
minEnergy=self.min_energy,
236221
maxEnergy=self.max_energy,
237-
rmat_s=self.sample_rmat,
222+
rmat_s=HexrdConfig().sample_rmat,
238223
grain_params=[self.crystal_params, ])
239224

240225
for det_key, psim in sim_data.items():
@@ -264,7 +249,7 @@ def generate_overlay(self):
264249
# !!! apply offset corrections to angles
265250
# convert to angles in LAB ref
266251
angles_corr, _ = xfcapi.detectorXYToGvec(
267-
xy_data, panel.rmat, self.sample_rmat,
252+
xy_data, panel.rmat, HexrdConfig().sample_rmat,
268253
panel.tvec, instr.tvec, constants.zeros_3,
269254
beamVec=instr.beam_vector,
270255
etaVec=instr.eta_vector

hexrdgui/physics_package_manager_dialog.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,18 @@
1111
from hexrdgui import resource_loader
1212
from hexrdgui.hexrd_config import HexrdConfig
1313
from hexrdgui.ui_loader import UiLoader
14+
from hexrdgui.utils import (
15+
block_signals,
16+
euler_angles_to_exp_map,
17+
exp_map_to_euler_angles,
18+
)
1419
from hexrdgui.utils.guess_instrument_type import guess_instrument_type
1520

1621
import hexrd.resources as hexrd_resources
1722
from hexrd.material import _angstroms, _kev, Material
23+
from hexrd.instrument import calc_beam_vec
1824
from hexrd.instrument.constants import FILTER_DEFAULTS, PINHOLE_DEFAULTS
25+
from hexrd.rotations import rotMatOfExpMap
1926

2027

2128
class PhysicsPackageManagerDialog:
@@ -41,6 +48,8 @@ def show(self, delete_if_canceled=False):
4148
self.delete_if_canceled = delete_if_canceled
4249
self.setup_form()
4350
self.draw_diagram()
51+
self.reset_sample_tilt()
52+
self.update_tilt_suffixes()
4453
self.ui.show()
4554

4655
@property
@@ -96,6 +105,14 @@ def setup_connections(self):
96105
HexrdConfig().detectors_changed.connect(
97106
self.initialize_detector_coatings)
98107

108+
HexrdConfig().euler_angle_convention_changed.connect(
109+
self.on_euler_angle_convention_changed)
110+
HexrdConfig().sample_tilt_modified.connect(
111+
self.reset_sample_tilt)
112+
113+
for w in self.sample_tilt_widgets:
114+
w.valueChanged.connect(self.update_sample_normal)
115+
99116
self.ui.accepted.connect(self.on_accepted)
100117
self.ui.rejected.connect(self.on_rejected)
101118

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

109126
self.delete_if_canceled = False
110127

128+
def on_euler_angle_convention_changed(self):
129+
self.update_tilt_suffixes()
130+
self.reset_sample_tilt()
131+
132+
@property
133+
def sample_tilt_widgets(self):
134+
return [getattr(self.ui, f'sample_tilt_{i}') for i in range(3)]
135+
136+
@property
137+
def sample_normal_widgets(self):
138+
return [getattr(self.ui, f'sample_normal_{i}') for i in range(3)]
139+
140+
@property
141+
def sample_rmat(self):
142+
angles = [w.value() for w in self.sample_tilt_widgets]
143+
return rotMatOfExpMap(euler_angles_to_exp_map(angles))
144+
145+
def update_tilt_suffixes(self):
146+
suffix = '' if HexrdConfig().euler_angle_convention is None else '°'
147+
for w in self.sample_tilt_widgets:
148+
w.setSuffix(suffix)
149+
150+
def reset_sample_tilt(self):
151+
angles = exp_map_to_euler_angles(HexrdConfig().sample_tilt)
152+
with block_signals(*self.sample_tilt_widgets):
153+
for w, v in zip(self.sample_tilt_widgets, angles):
154+
w.setValue(v)
155+
156+
self.update_sample_normal()
157+
158+
def save_sample_tilt(self):
159+
angles = [w.value() for w in self.sample_tilt_widgets]
160+
HexrdConfig().sample_tilt = euler_angles_to_exp_map(angles)
161+
162+
def update_sample_normal(self):
163+
d = HexrdConfig().active_beam['vector']
164+
bvec = calc_beam_vec(d['azimuth'], d['polar_angle'])
165+
sample_normal = np.dot(self.sample_rmat, [0., 0., np.sign(bvec[2])])
166+
for w, v in zip(self.sample_normal_widgets, sample_normal):
167+
w.setValue(v)
168+
111169
def initialize_detector_coatings(self):
112170
# Reset detector coatings to make sure they're in sync w/ current dets
113171
HexrdConfig().detector_coatings_dictified = {}
@@ -295,6 +353,8 @@ def accept_changes(self):
295353

296354
HexrdConfig().update_physics_package(**kwargs)
297355

356+
self.save_sample_tilt()
357+
298358
if HexrdConfig().apply_absorption_correction:
299359
# Make sure changes are reflected
300360
HexrdConfig().deep_rerender_needed.emit()

hexrdgui/resources/ui/laue_overlay_editor.ui

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@
170170
<property name="alignment">
171171
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
172172
</property>
173+
<property name="keyboardTracking">
174+
<bool>false</bool>
175+
</property>
173176
<property name="decimals">
174177
<number>8</number>
175178
</property>
@@ -186,6 +189,9 @@
186189
<property name="alignment">
187190
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
188191
</property>
192+
<property name="keyboardTracking">
193+
<bool>false</bool>
194+
</property>
189195
<property name="decimals">
190196
<number>8</number>
191197
</property>
@@ -202,6 +208,9 @@
202208
<property name="alignment">
203209
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
204210
</property>
211+
<property name="keyboardTracking">
212+
<bool>false</bool>
213+
</property>
205214
<property name="decimals">
206215
<number>8</number>
207216
</property>

0 commit comments

Comments
 (0)