Skip to content

Commit e3b0178

Browse files
committed
replace global final rebin checkbox with a button that enables final rebin for all runs
1 parent 0f6511e commit e3b0178

File tree

9 files changed

+278
-116
lines changed

9 files changed

+278
-116
lines changed

src/quicknxs/interfaces/configuration.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ class Configuration(object):
3535
sample_size = 10
3636
use_constant_q = False
3737
wl_bandwidth = 3.2
38-
# Final Q rebin global options
39-
do_final_rebin_global = False
38+
# Final Q rebin global option
4039
final_rebin_step_global = -0.02
4140
# Normalize to unity when stitching
4241
normalize_to_unity = True
@@ -75,7 +74,6 @@ def setup_default_values(cls):
7574
cls.sample_size = 10
7675
cls.use_constant_q = False
7776
cls.wl_bandwidth = 3.2
78-
cls.do_final_rebin_global = False
7977
cls.final_rebin_step_global = -0.02
8078
cls.normalize_to_unity = True
8179
cls.total_reflectivity_q_cutoff = 0.01

src/quicknxs/interfaces/data_handling/data_set.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -801,15 +801,6 @@ def _as_ints(a):
801801

802802
direct_beam_low_res_roi = get_direct_beam_low_res_roi(conf, direct_beam.configuration)
803803

804-
final_rebin = False
805-
q_step = 0.0
806-
if conf.do_final_rebin_global:
807-
final_rebin = True
808-
q_step = conf.final_rebin_step_global
809-
else:
810-
final_rebin = conf.do_final_rebin_run
811-
q_step = conf.final_rebin_step_run
812-
813804
# The reduced data workspace may be a group or a single
814805
# workspace depending on the InputWorkspace parameter
815806
ws = api.MagnetismReflectometryReduction(
@@ -827,9 +818,9 @@ def _as_ints(a):
827818
CutLowResNormAxis=True,
828819
LowResNormAxisPixelRange=direct_beam_low_res_roi,
829820
CutTimeAxis=True,
830-
FinalRebin=final_rebin,
821+
FinalRebin=conf.do_final_rebin_run,
831822
QMin=0.001,
832-
QStep=q_step,
823+
QStep=conf.final_rebin_step_run,
833824
RoundUpPixel=False,
834825
AngleOffset=angle_offset,
835826
UseWLTimeAxis=False,
@@ -840,7 +831,7 @@ def _as_ints(a):
840831
ConstantQBinning=conf.use_constant_q,
841832
ConstQTrim=0.1,
842833
CropFirstAndLastPoints=False,
843-
CleanupBadData=final_rebin,
834+
CleanupBadData=conf.do_final_rebin_run,
844835
AcceptNullReflectivity=True, # return empty reflectivity curves (all intensities are zero)
845836
ErrorWeightedBackground=False,
846837
SampleLength=conf.sample_size,

src/quicknxs/interfaces/event_handlers/configuration_handler.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from dataclasses import dataclass
22

3-
from PyQt5.QtCore import Qt
4-
from PyQt5.QtWidgets import QAction, QCheckBox, QDoubleSpinBox, QSpinBox, QWidget
3+
from qtpy import QtCore
4+
from qtpy.QtWidgets import QAction, QCheckBox, QDoubleSpinBox, QSpinBox, QWidget
55

66
from quicknxs.interfaces.configuration import Configuration
77

@@ -41,7 +41,7 @@ def config_setter_factory(self, qwidget: QWidget, config_name: str):
4141
def config_setter():
4242
if isinstance(qwidget, QCheckBox):
4343
value = qwidget.checkState()
44-
bool_value = value == Qt.CheckState.Checked
44+
bool_value = value == QtCore.Qt.Checked
4545
setattr(Configuration, config_name, bool_value)
4646
elif isinstance(qwidget, QAction):
4747
value = qwidget.isChecked()
@@ -81,8 +81,7 @@ class ConfigWidget:
8181
recalc_reflectivity: bool = False
8282

8383
config_widgets = [
84-
ConfigWidget("final_rebin_checkbox_global", "do_final_rebin", recalc_reflectivity=True),
85-
ConfigWidget("q_rebin_spinbox_global", "final_rebin_step", recalc_reflectivity=True),
84+
ConfigWidget("q_rebin_spinbox_global", "final_rebin_step_global"),
8685
ConfigWidget("normalize_to_unity_checkbox", "normalize_to_unity"),
8786
ConfigWidget("normalization_q_cutoff_spinbox", "total_reflectivity_q_cutoff"),
8887
ConfigWidget("global_fit_checkbox", "global_stitching"),

src/quicknxs/interfaces/event_handlers/main_handler.py

Lines changed: 29 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -859,12 +859,9 @@ def update_reduction_table(self, table_widget: QtWidgets.QTableWidget, idx: int,
859859
direct_beam = d.configuration.direct_beam
860860
table_widget.setItem(idx, 12, QtWidgets.QTableWidgetItem(str(direct_beam)))
861861
if d.configuration.do_final_rebin_run:
862-
item = QtWidgets.QTableWidgetItem(str(d.configuration.final_rebin_step_run))
862+
item = QtWidgets.QTableWidgetItem(f"{d.configuration.final_rebin_step_run:.3f}")
863863
else:
864864
item = QtWidgets.QTableWidgetItem("")
865-
if d.configuration.do_final_rebin_global:
866-
item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable)
867-
item.setBackground(QColors.light_grey)
868865
table_widget.setItem(idx, 13, item)
869866

870867
self.main_window.auto_change_active = False
@@ -1350,15 +1347,6 @@ def check_region_values_changed(self):
13501347
valid_change or not configuration.direct_angle_offset_overwrite == self.ui.dangle0Overwrite.value()
13511348
)
13521349

1353-
# Final rebin
1354-
valid_change = (
1355-
valid_change or not configuration.do_final_rebin_global == self.ui.final_rebin_checkbox_global.isChecked()
1356-
)
1357-
1358-
valid_change = (
1359-
valid_change or not configuration.final_rebin_step_global == self.ui.q_rebin_spinbox_global.value()
1360-
)
1361-
13621350
valid_change = (
13631351
valid_change or not configuration.do_final_rebin_run == self.ui.final_rebin_checkbox_run.isChecked()
13641352
)
@@ -1429,7 +1417,6 @@ def get_configuration(self) -> Configuration:
14291417
configuration.direct_pixel_overwrite = self.ui.directPixelOverwrite.value()
14301418
configuration.direct_angle_offset_overwrite = self.ui.dangle0Overwrite.value()
14311419
Configuration.sample_size = self.ui.sample_size_spinbox.value()
1432-
Configuration.do_final_rebin_global = self.ui.final_rebin_checkbox_global.isChecked()
14331420
Configuration.final_rebin_step_global = self.ui.q_rebin_spinbox_global.value()
14341421

14351422
Configuration.apply_deadtime = self.ui.deadtime_entry.applyCheckBox.isChecked()
@@ -1537,7 +1524,6 @@ def populate_from_configuration(self, configuration=None):
15371524
self.ui.directPixelOverwrite.setValue(configuration.direct_pixel_overwrite)
15381525
self.ui.dangle0Overwrite.setValue(configuration.direct_angle_offset_overwrite)
15391526
self.ui.sample_size_spinbox.setValue(configuration.sample_size)
1540-
self.ui.final_rebin_checkbox_global.setChecked(configuration.do_final_rebin_global)
15411527
self.ui.q_rebin_spinbox_global.setValue(configuration.final_rebin_step_global)
15421528

15431529
self.ui.deadtime_entry.applyCheckBox.setChecked(configuration.apply_deadtime)
@@ -1770,40 +1756,34 @@ def show_results(self):
17701756
self.main_window.update_gisans_viewer.connect(dialog.update_gisans)
17711757
dialog.show()
17721758

1773-
def toggle_final_rebin_global(self, state: int):
1774-
"""Toggle global rebin checkbox.
1759+
def propagate_final_rebin_to_run_config(self):
1760+
"""Enable final rebin with the given Q-step for all runs in the active data tab.
17751761
1776-
Ensure mutual exclusivity with the per-run rebin checkbox.
1762+
Note: This function updates the UI and internal configuration state while blocking all signals.
1763+
The caller is responsible for triggering recalculation and replotting.
17771764
"""
1778-
if state == QtCore.Qt.Checked:
1779-
self.ui.final_rebin_checkbox_run.blockSignals(True)
1780-
self.ui.final_rebin_checkbox_run.setChecked(False)
1781-
self.ui.final_rebin_checkbox_run.blockSignals(False)
1782-
1783-
# col_index = self.ui.reductionTable.get_column_index("Q-Steps")
1784-
col_index = 13
1785-
self.ui.reductionTable.blockSignals(True)
1786-
for row in range(self.ui.reductionTable.rowCount()):
1787-
item = self.ui.reductionTable.item(row, col_index)
1788-
if item is None:
1789-
item = QtWidgets.QTableWidgetItem("")
1790-
if item:
1791-
if state == QtCore.Qt.Checked:
1792-
_item = QtWidgets.QTableWidgetItem(item.text())
1793-
_item.setFlags(item.flags() & ~QtCore.Qt.ItemIsEditable)
1794-
_item.setBackground(QColors.light_grey)
1795-
self.ui.reductionTable.setItem(row, col_index, _item)
1796-
else:
1797-
_item = QtWidgets.QTableWidgetItem(item.text())
1798-
_item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
1799-
_item.setBackground(QColors.white)
1800-
self.ui.reductionTable.setItem(row, col_index, _item)
1801-
self.ui.reductionTable.blockSignals(False)
1802-
1803-
def toggle_final_rebin_run(self, state: int):
1804-
"""Toggle per-run rebin checkbox.
1765+
q_step = self.ui.q_rebin_spinbox_global.value()
18051766

1806-
Ensure mutual exclusivity with the global rebin checkbox.
1807-
"""
1808-
if state == QtCore.Qt.Checked:
1809-
self.ui.final_rebin_checkbox_global.setChecked(False)
1767+
# loop over runs in the active data tab to update internal state and UI state
1768+
reduct_list = self._data_manager.reduction_list
1769+
for idx, nexus_data in enumerate(reduct_list):
1770+
active_cross_section_name: str = self._data_manager.active_cross_section.name
1771+
active_cross_section = nexus_data.cross_sections[active_cross_section_name]
1772+
# get the current configuration state
1773+
conf = active_cross_section.configuration
1774+
# update the run final rebin configuration state
1775+
conf.do_final_rebin_run = True
1776+
conf.final_rebin_step_run = q_step
1777+
nexus_data.update_configuration(conf)
1778+
# update the UI reduction table to reflect the configuration state (signals are blocked)
1779+
self.update_reduction_table(self.reduction_table, idx, active_cross_section)
1780+
1781+
# update the run final rebin spinbox value
1782+
self.ui.q_rebin_spinbox_run.blockSignals(True)
1783+
self.ui.q_rebin_spinbox_run.setValue(q_step)
1784+
self.ui.q_rebin_spinbox_run.blockSignals(False)
1785+
1786+
# update the run final rebin checkbox
1787+
self.ui.final_rebin_checkbox_run.blockSignals(True)
1788+
self.ui.final_rebin_checkbox_run.setChecked(True)
1789+
self.ui.final_rebin_checkbox_run.blockSignals(False)

src/quicknxs/interfaces/main_window.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -576,15 +576,12 @@ def reload_all_files(self):
576576
"""Reload all previously loaded files upon change in loading configuration."""
577577
self.file_handler.reload_all_files()
578578

579-
def toggleFinalRebinRun(self, state):
580-
"""Signal handling."""
581-
self.file_handler.toggle_final_rebin_run(state)
582-
self.changeRegionValues()
583-
584-
def toggleFinalRebinGlobal(self, state):
585-
"""Signal handling."""
586-
self.file_handler.toggle_final_rebin_global(state)
587-
self.file_handler.get_configuration()
579+
def propagate_final_rebin_to_runs(self):
580+
"""Enable final rebin for all runs with Q-step from the UI input `q_rebin_spinbox_global`."""
581+
# update the internal configuration state
582+
self.file_handler.propagate_final_rebin_to_run_config()
583+
# recalculate and replot reflectivity
584+
self.global_reflectivity_config_changed()
588585

589586
# Un-used UI signals
590587
def change_gisans_colorscale(self):

src/quicknxs/ui/ui_main_window.ui

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -425,16 +425,21 @@
425425
<number>1</number>
426426
</property>
427427
<item row="0" column="1">
428-
<widget class="QCheckBox" name="final_rebin_checkbox_global">
428+
<widget class="QPushButton" name="propagate_final_rebin_button">
429429
<property name="toolTip">
430-
<string>Check for apply a final Q rebinning globally. This will be used instead of any per-run Q-Step values.</string>
430+
<string>Enable final rebin with the given Q-step for all runs.</string>
431431
</property>
432432
<property name="text">
433-
<string>Final rebin</string>
433+
<string>Enable final rebin</string>
434434
</property>
435435
<property name="checked">
436436
<bool>true</bool>
437437
</property>
438+
<property name="font">
439+
<font>
440+
<pointsize>10</pointsize>
441+
</font>
442+
</property>
438443
</widget>
439444
</item>
440445
<item row="0" column="2">
@@ -6531,6 +6536,22 @@
65316536
</hint>
65326537
</hints>
65336538
</connection>
6539+
<connection>
6540+
<sender>q_rebin_spinbox_run</sender>
6541+
<signal>editingFinished()</signal>
6542+
<receiver>MainWindow</receiver>
6543+
<slot>changeRegionValues()</slot>
6544+
<hints>
6545+
<hint type="sourcelabel">
6546+
<x>342</x>
6547+
<y>747</y>
6548+
</hint>
6549+
<hint type="destinationlabel">
6550+
<x>543</x>
6551+
<y>416</y>
6552+
</hint>
6553+
</hints>
6554+
</connection>
65346555
<connection>
65356556
<sender>normalizeXTof</sender>
65366557
<signal>stateChanged(int)</signal>
@@ -6643,6 +6664,22 @@
66436664
</hint>
66446665
</hints>
66456666
</connection>
6667+
<connection>
6668+
<sender>propagate_final_rebin_button</sender>
6669+
<signal>pressed()</signal>
6670+
<receiver>MainWindow</receiver>
6671+
<slot>propagate_final_rebin_to_runs()</slot>
6672+
<hints>
6673+
<hint type="sourcelabel">
6674+
<x>114</x>
6675+
<y>518</y>
6676+
</hint>
6677+
<hint type="destinationlabel">
6678+
<x>3</x>
6679+
<y>453</y>
6680+
</hint>
6681+
</hints>
6682+
</connection>
66466683
<connection>
66476684
<sender>reload_file_button</sender>
66486685
<signal>pressed()</signal>
@@ -7395,27 +7432,11 @@
73957432
</hint>
73967433
</hints>
73977434
</connection>
7398-
<connection>
7399-
<sender>final_rebin_checkbox_global</sender>
7400-
<signal>stateChanged(int)</signal>
7401-
<receiver>MainWindow</receiver>
7402-
<slot>toggleFinalRebinGlobal()</slot>
7403-
<hints>
7404-
<hint type="sourcelabel">
7405-
<x>59</x>
7406-
<y>579</y>
7407-
</hint>
7408-
<hint type="destinationlabel">
7409-
<x>-1</x>
7410-
<y>536</y>
7411-
</hint>
7412-
</hints>
7413-
</connection>
74147435
<connection>
74157436
<sender>final_rebin_checkbox_run</sender>
74167437
<signal>stateChanged(int)</signal>
74177438
<receiver>MainWindow</receiver>
7418-
<slot>toggleFinalRebinRun()</slot>
7439+
<slot>changeRegionValues()</slot>
74197440
<hints>
74207441
<hint type="sourcelabel">
74217442
<x>110</x>
@@ -7481,8 +7502,6 @@
74817502
<slot>stripOverlap()</slot>
74827503
<slot>toggle_smoothing()</slot>
74837504
<slot>toggleColorbars()</slot>
7484-
<slot>toggleFinalRebinGlobal()</slot>
7485-
<slot>toggleFinalRebinRun()</slot>
74867505
<slot>update_offspec_qz_bin_width()</slot>
74877506
</slots>
74887507
</ui>

0 commit comments

Comments
 (0)