Skip to content

Commit 8393744

Browse files
authored
Merge pull request #1773 from bnmajor/physics-pkg-and-filters
Separate physics package and detector filters
2 parents a1bef0a + d363b6d commit 8393744

11 files changed

+267
-108
lines changed

hexrdgui/absorption_correction_options_dialog.py

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
import h5py
2-
31
from hexrdgui.hexrd_config import HexrdConfig
42
from hexrdgui.ui_loader import UiLoader
53

6-
from hexrd.material import _angstroms, _kev, Material
7-
84

95
class AbsorptionCorrectionOptionsDialog:
106

@@ -49,6 +45,12 @@ def load_additional_materials(self):
4945
# FIXME: Update to use defaults once they've been added to HEXRD
5046
return
5147

48+
@property
49+
def any_detector_filters_applied(self):
50+
det_names = HexrdConfig().detector_names
51+
all_filters = [HexrdConfig().detector_filter(det) for det in det_names]
52+
return any(filter.thickness > 0 for filter in all_filters)
53+
5254
def update_gui(self):
5355
# Filter info is set per detector
5456
self.ui.detectors.addItems(HexrdConfig().detector_names)
@@ -65,31 +67,41 @@ def update_gui(self):
6567
w.insertSeparator(2 + len(custom_mats))
6668

6769
# Set default values
68-
filter = HexrdConfig().detector_filter(self.ui.detectors.currentText())
69-
coating = HexrdConfig().detector_coating(
70-
self.ui.detectors.currentText())
71-
phosphor = HexrdConfig().detector_phosphor(self.ui.detectors.currentText())
70+
det = self.ui.detectors.currentText()
71+
if (filter := HexrdConfig().detector_filter(det)) is None:
72+
HexrdConfig().update_detector_filter(det)
73+
filter = HexrdConfig().detector_filter(det)
74+
if (coating := HexrdConfig().detector_coating(det)) is None:
75+
HexrdConfig().update_detector_coating(det)
76+
coating = HexrdConfig().detector_coating(det)
77+
if (phosphor := HexrdConfig().detector_phosphor(det)) is None:
78+
HexrdConfig().update_detector_phosphor(det)
79+
phosphor = HexrdConfig().detector_phosphor(det)
80+
7281
# FILTER
7382
if filter.material not in self.mat_options:
7483
self.ui.filter_material_input.setText(filter.material)
7584
else:
7685
self.ui.filter_material.setCurrentText(filter.material)
7786
self.ui.filter_density.setValue(filter.density)
7887
self.ui.filter_thickness.setValue(filter.thickness)
88+
self.ui.apply_filters.setChecked(self.any_detector_filters_applied)
7989
# COATING
8090
if coating.material not in self.mat_options:
8191
self.ui.coating_material_input.setText(coating.material)
8292
else:
8393
self.ui.coating_material.setCurrentText(coating.material)
8494
self.ui.coating_density.setValue(coating.density)
8595
self.ui.coating_thickness.setValue(coating.thickness)
96+
self.ui.apply_coating.setChecked(coating.thickness > 0)
8697
# PHOSPHOR
8798
if phosphor.material not in self.mat_options:
8899
self.ui.phosphor_material_input.setText(phosphor.material)
89100
else:
90101
self.ui.phosphor_material.setCurrentText(phosphor.material)
91102
self.ui.phosphor_density.setValue(phosphor.density)
92103
self.ui.phosphor_thickness.setValue(phosphor.thickness)
104+
self.ui.apply_phosphor.setChecked(phosphor.thickness > 0)
93105
self.ui.phosphor_readout_length.setValue(phosphor.readout_length)
94106
self.ui.phosphor_pre_U0.setValue(phosphor.pre_U0)
95107

@@ -103,6 +115,9 @@ def setup_connections(self):
103115
self.ui.button_box.accepted.connect(self.accept_changes)
104116
self.ui.button_box.accepted.connect(self.ui.accept)
105117
self.ui.button_box.rejected.connect(self.ui.reject)
118+
self.ui.apply_filters.toggled.connect(self.toggle_apply_filters)
119+
self.ui.apply_coating.toggled.connect(self.toggle_apply_coating)
120+
self.ui.apply_phosphor.toggled.connect(self.toggle_apply_phosphor)
106121

107122
def exec(self):
108123
return self.ui.exec()
@@ -127,8 +142,9 @@ def material_changed(self, index, category):
127142
else:
128143
self.density_inputs[category].setValue(0.0)
129144

130-
def filter_info_changed(self):
131-
det_name = self.ui.detectors.currentText()
145+
def filter_info_changed(self, new_value=None, det_name=None):
146+
if det_name is None:
147+
det_name = self.ui.detectors.currentText()
132148
self.filters.setdefault(det_name, {})
133149
self.filters[det_name]['density'] = self.ui.filter_density.value()
134150
self.filters[det_name]['thickness'] = self.ui.filter_thickness.value()
@@ -173,3 +189,35 @@ def accept_changes(self):
173189
density=self.ui.phosphor_density.value(),
174190
thickness=self.ui.phosphor_thickness.value()
175191
)
192+
193+
def toggle_apply_filters(self, checked):
194+
if not checked:
195+
self.ui.filter_thickness.setValue(0.0)
196+
for det in HexrdConfig().detector_names:
197+
self.filter_info_changed(det_name=det)
198+
self.ui.detectors.setEnabled(checked)
199+
self.ui.filter_material.setEnabled(checked)
200+
index = self.ui.filter_material.currentIndex()
201+
self.ui.filter_material_input.setEnabled(checked and index == 0)
202+
self.ui.filter_density.setEnabled(checked)
203+
self.ui.filter_thickness.setEnabled(checked)
204+
205+
def toggle_apply_coating(self, checked):
206+
if not checked:
207+
self.ui.coating_thickness.setValue(0.0)
208+
self.ui.coating_material.setEnabled(checked)
209+
index = self.ui.coating_material.currentIndex()
210+
self.ui.coating_material_input.setEnabled(checked and index == 0)
211+
self.ui.coating_density.setEnabled(checked)
212+
self.ui.coating_thickness.setEnabled(checked)
213+
214+
def toggle_apply_phosphor(self, checked):
215+
if not checked:
216+
self.ui.phosphor_thickness.setValue(0.0)
217+
self.ui.phosphor_material.setEnabled(checked)
218+
index = self.ui.phosphor_material.currentIndex()
219+
self.ui.phosphor_material_input.setEnabled(checked and index == 0)
220+
self.ui.phosphor_density.setEnabled(checked)
221+
self.ui.phosphor_thickness.setEnabled(checked)
222+
self.ui.phosphor_readout_length.setEnabled(checked)
223+
self.ui.phosphor_pre_U0.setEnabled(checked)

hexrdgui/create_hedm_instrument.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ def create_hedm_instrument():
2020

2121
# Make sure that the physics package is included for instruments
2222
# that expect it
23-
if HexrdConfig().physics_package is not None:
23+
if HexrdConfig().has_physics_package:
2424
iconfig['physics_package'] = HexrdConfig().physics_package
25-
for det in HexrdConfig().detector_names:
26-
iconfig['detectors'][det]['filter'] = (
27-
HexrdConfig().detector_filter(det))
28-
iconfig['detectors'][det]['coating'] = (
29-
HexrdConfig().detector_coating(det))
30-
iconfig['detectors'][det]['phosphor'] = (
31-
HexrdConfig().detector_phosphor(det))
25+
if HexrdConfig().apply_absorption_correction:
26+
for det in HexrdConfig().detector_names:
27+
iconfig['detectors'][det]['filter'] = (
28+
HexrdConfig().detector_filter(det))
29+
iconfig['detectors'][det]['coating'] = (
30+
HexrdConfig().detector_coating(det))
31+
iconfig['detectors'][det]['phosphor'] = (
32+
HexrdConfig().detector_phosphor(det))
3233

3334
kwargs = {
3435
'instrument_config': iconfig,

hexrdgui/hexrd_config.py

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import hexrd.imageseries.save
1515
from hexrd.config.loader import NumPyIncludeLoader
1616
from hexrd.instrument import HEDMInstrument
17-
from hexrd.instrument.constants import PHYSICS_PACKAGE_DEFAULTS
17+
from hexrd.instrument.constants import PHYSICS_PACKAGE_DEFAULTS, PINHOLE_DEFAULTS
1818
from hexrd.instrument.physics_package import HEDPhysicsPackage
1919
from hexrd.material import load_materials_hdf5, save_materials_hdf5, Material
2020
from hexrd.rotations import RotMatEuler
@@ -27,7 +27,6 @@
2727
from hexrdgui import utils
2828
from hexrdgui.masking.constants import MaskType
2929
from hexrdgui.singletons import QSingleton
30-
from hexrdgui.utils.guess_instrument_type import guess_instrument_type
3130

3231
import hexrdgui.resources.calibration
3332
import hexrdgui.resources.indexing
@@ -596,7 +595,7 @@ def set_overlays():
596595
def set_physics_and_coatings():
597596
pp = state.get('physics_package_dictified', None)
598597
self.physics_package_dictified = pp if pp is not None else {}
599-
dc = state.get('detector_coatings_dictified')
598+
dc = state.get('detector_coatings_dictified', None)
600599
self.detector_coatings_dictified = dc if dc is not None else {}
601600

602601
if 'detector_coatings_dictified' in state:
@@ -702,7 +701,7 @@ def overlays_dictified(self, v):
702701
continue
703702

704703
if overlay_dict.get('tth_distortion_type') is not None:
705-
if self.physics_package is None:
704+
if not self.has_physics_package:
706705
# We need to create a default physics package
707706
# This is for backward compatibility
708707
self.create_default_physics_package()
@@ -2434,7 +2433,7 @@ def custom_polar_tth_distortion_object_serialized(self):
24342433
def custom_polar_tth_distortion_object_serialized(self, v):
24352434
obj = None
24362435
if v is not None:
2437-
if self.physics_package is None:
2436+
if not self.has_physics_package:
24382437
# This requires a physics package to deserialize
24392438
self.create_default_physics_package()
24402439

@@ -3045,37 +3044,53 @@ def apply_absorption_correction(self, v):
30453044

30463045
@property
30473046
def physics_package_dictified(self):
3048-
if self.physics_package is None:
3047+
if not self.has_physics_package:
30493048
return None
3049+
30503050
return self.physics_package.serialize()
30513051

30523052
@physics_package_dictified.setter
3053-
def physics_package_dictified(self, v):
3054-
instr_type = guess_instrument_type(self.detector_names)
3055-
self.update_physics_package(instr_type, **v)
3053+
def physics_package_dictified(self, kwargs):
3054+
if not kwargs:
3055+
self.physics_package = None
3056+
return
3057+
3058+
# Set defaults if missing
3059+
kwargs = {
3060+
**PHYSICS_PACKAGE_DEFAULTS.HED,
3061+
**kwargs,
3062+
}
3063+
self.physics_package = HEDPhysicsPackage(**kwargs)
3064+
3065+
def update_physics_package(self, **kwargs):
3066+
self.physics_package_dictified = {
3067+
**self.physics_package_dictified,
3068+
**kwargs,
3069+
}
30563070

30573071
@property
30583072
def physics_package(self):
30593073
return self._physics_package
30603074

3061-
def update_physics_package(self, instr_type=None, **kwargs):
3062-
if instr_type not in ('TARDIS', 'PXRDIP'):
3063-
self._physics_package = None
3064-
elif self.physics_package is None:
3065-
all_kwargs = PHYSICS_PACKAGE_DEFAULTS.HED
3066-
all_kwargs.update(**kwargs)
3067-
self._physics_package = HEDPhysicsPackage(**all_kwargs)
3068-
else:
3069-
self._physics_package.deserialize(**kwargs)
3070-
self.physics_package_modified.emit()
3075+
@physics_package.setter
3076+
def physics_package(self, value):
3077+
if value != self._physics_package:
3078+
self._physics_package = value
3079+
self.physics_package_modified.emit()
3080+
3081+
@property
3082+
def has_physics_package(self) -> bool:
3083+
return self.physics_package is not None
30713084

30723085
def create_default_physics_package(self):
3073-
self._physics_package = HEDPhysicsPackage(
3074-
**PHYSICS_PACKAGE_DEFAULTS.HED)
3075-
self.physics_package_modified.emit()
3086+
# Our default will be an HED Physics package with a pinhole
3087+
self.physics_package_dictified = {
3088+
**PHYSICS_PACKAGE_DEFAULTS.HED,
3089+
**PINHOLE_DEFAULTS.TARDIS,
3090+
}
30763091

30773092
def absorption_length(self):
3078-
if self._physics_package is None:
3093+
if not self.has_physics_package:
30793094
raise ValueError(
30803095
f'Cannot calculate absorption length without physics package')
30813096
return self.physics_package.pinhole_absorption_length(
@@ -3129,6 +3144,8 @@ def detector_filter(self, det_name):
31293144
return self._detector_coatings[det_name].get('filter', None)
31303145

31313146
def update_detector_filter(self, det_name, **kwargs):
3147+
if det_name not in self.detector_names:
3148+
return None
31323149
self._set_detector_coatings('filter')
31333150
filter = self._detector_coatings[det_name]['filter']
31343151
filter.deserialize(**kwargs)
@@ -3138,6 +3155,8 @@ def detector_coating(self, det_name):
31383155
return self._detector_coatings[det_name].get('coating', None)
31393156

31403157
def update_detector_coating(self, det_name, **kwargs):
3158+
if det_name not in self.detector_names:
3159+
return None
31413160
self._set_detector_coatings('coating')
31423161
coating = self._detector_coatings[det_name]['coating']
31433162
coating.deserialize(**kwargs)
@@ -3147,6 +3166,8 @@ def detector_phosphor(self, det_name):
31473166
return self._detector_coatings[det_name].get('phosphor', None)
31483167

31493168
def update_detector_phosphor(self, det_name, **kwargs):
3169+
if det_name not in self.detector_names:
3170+
return None
31503171
self._set_detector_coatings('phosphor')
31513172
phosphor = self._detector_coatings[det_name]['phosphor']
31523173
phosphor.deserialize(**kwargs)

hexrdgui/llnl_import_tool_dialog.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class LLNLImportToolDialog(QObject):
3636

3737
cancel_workflow = Signal()
3838

39-
def __init__(self, cmap=None, physics_package_manager=None, parent=None):
39+
def __init__(self, cmap=None, parent=None):
4040
super().__init__(parent)
4141

4242
loader = UiLoader()
@@ -59,7 +59,6 @@ def __init__(self, cmap=None, physics_package_manager=None, parent=None):
5959
self.import_in_progress = False
6060
self.loaded_images = []
6161
self.canvas = parent.image_tab_widget.active_canvas
62-
self.physics_package_manager = physics_package_manager
6362

6463
# Disable these by default.
6564
# If we disable these in Qt Designer, there are some weird bugs
@@ -620,7 +619,6 @@ def completed(self):
620619
self.ui.instrument.setDisabled(False)
621620
HexrdConfig().enable_canvas_toolbar.emit(True)
622621
self.cmap.block_updates(False)
623-
self.physics_package_manager.show()
624622

625623
def show(self):
626624
self.ui.show()

0 commit comments

Comments
 (0)