Skip to content

Commit

Permalink
Merge pull request #1093 from psavery/load-crystal-parameters-from-gr…
Browse files Browse the repository at this point in the history
…ains

Add ability to load crystal parameters from grains
  • Loading branch information
joelvbernier authored Nov 12, 2021
2 parents 0068708 + 7203903 commit 6102f90
Show file tree
Hide file tree
Showing 11 changed files with 451 additions and 21 deletions.
14 changes: 14 additions & 0 deletions hexrd/ui/calibration_crystal_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

from hexrd.ui.constants import DEFAULT_CRYSTAL_REFINEMENTS
from hexrd.ui.hexrd_config import HexrdConfig
from hexrd.ui.select_grains_dialog import SelectGrainsDialog
from hexrd.ui.select_items_widget import SelectItemsWidget
from hexrd.ui.ui_loader import UiLoader
from hexrd.ui.utils import convert_angle_convention
Expand Down Expand Up @@ -61,6 +62,8 @@ def setup_connections(self):
self.refinements_selector.selection_changed.connect(
self.refinements_edited)

self.ui.load.clicked.connect(self.load)

@property
def params(self):
return self._params
Expand Down Expand Up @@ -262,3 +265,14 @@ def update_tab_gui(self):
o_values = [x.value() for x in self.orientation_widgets]
p_values = [x.value() for x in self.position_widgets]
self.slider_widget.update_gui(o_values, p_values)

def load(self):
dialog = SelectGrainsDialog(self.ui)
if not dialog.exec_():
return

self.load_from_grain(dialog.selected_grain)

def load_from_grain(self, grain):
self.params = grain[3:15]
self.params_modified.emit()
2 changes: 2 additions & 0 deletions hexrd/ui/hexrd_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ def __init__(self):
self.logging_stderr_handler = None
self.loading_state = False
self.last_loaded_state_file = None
self.find_orientations_grains_table = None
self.fit_grains_grains_table = None

self.setup_logging()

Expand Down
1 change: 0 additions & 1 deletion hexrd/ui/indexing/fit_grains_options_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ def __init__(self, grains_table, parent=None):
view = self.ui.grains_table_view
view.data_model = self.data_model
view.material = self.material
view.grains_table = grains_table

ok_button = self.ui.button_box.button(QDialogButtonBox.Ok)
ok_button.setText('Fit Grains')
Expand Down
1 change: 0 additions & 1 deletion hexrd/ui/indexing/fit_grains_results_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,6 @@ def setup_tableview(self):
# Update the variables on the table view
view.data_model = self.data_model
view.material = self.material
view.grains_table = self.data

def show(self):
self.ui.show()
Expand Down
55 changes: 44 additions & 11 deletions hexrd/ui/indexing/grains_table_view.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np

from PySide2.QtCore import QSortFilterProxyModel, Qt
from PySide2.QtCore import QSortFilterProxyModel, Qt, Signal
from PySide2.QtGui import QCursor
from PySide2.QtWidgets import QMenu, QTableView

Expand All @@ -19,11 +19,14 @@


class GrainsTableView(QTableView):

selection_changed = Signal()

def __init__(self, parent=None):
super().__init__(parent)

self.material = None
self.grains_table = None
self.pull_spots_allowed = True
self._data_model = None
self._tolerances = []
self.selected_tol_id = -1
Expand Down Expand Up @@ -58,32 +61,51 @@ def add_actions(d):

return super().contextMenuEvent(event)

@property
def grains_table(self):
if not self.source_model:
return None

return self.source_model.full_grains_table

@property
def proxy_model(self):
return self.model()

@property
def results_model(self):
def source_model(self):
if not self.proxy_model:
return None
return self.proxy_model.sourceModel()

@property
def selected_rows(self):
if not self.selectionModel():
return []
return self.selectionModel().selectedRows()

@property
def selected_grain_ids(self):
rows = self.selectionModel().selectedRows()
# Map these rows through the proxy in case of sorting
rows = [self.proxy_model.mapToSource(x) for x in rows]
return [int(self.results_model.data(x)) for x in rows]
rows = [self.proxy_model.mapToSource(x) for x in self.selected_rows]
return [int(self.source_model.data(x)) for x in rows]

@property
def selected_grains(self):
grain_ids = self.selected_grain_ids
if not grain_ids or self.grains_table is None:
return None

return self.grains_table[grain_ids]

@property
def can_run_pull_spots(self):
return all((
self.selected_grain_ids,
self.material is not None,
self.grains_table is not None,
))
return (
self.pull_spots_allowed and
self.selected_grain_ids and
self.material is not None and
self.grains_table is not None
)

@property
def tolerances(self):
Expand Down Expand Up @@ -214,8 +236,16 @@ def data_model(self):
@data_model.setter
def data_model(self, v):
self._data_model = v
if v is None:
self.setModel(None)
return

self.setup_proxy()

# A new selection model is created each time a new data model is set.
self.selectionModel().selectionChanged.connect(
self.on_selection_changed)

def setup_proxy(self):

# Subclass QSortFilterProxyModel to restrict sorting by column
Expand All @@ -237,6 +267,9 @@ def sort(self, column, order):
self.sortByColumn(0, Qt.AscendingOrder)
self.horizontalHeader().setSortIndicatorShown(False)

def on_selection_changed(self):
return self.selection_changed.emit()

def on_sort_indicator_changed(self, index, order):
"""Shows sort indicator for sortable columns, hides for all others."""
horizontal_header = self.horizontalHeader()
Expand Down
15 changes: 12 additions & 3 deletions hexrd/ui/indexing/run.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import copy

import numpy as np

from PySide2.QtCore import QObject, QThreadPool, Qt, Signal
Expand Down Expand Up @@ -299,6 +301,8 @@ def generate_grains_table(self):
print(msg)

self.grains_table = generate_grains_table(self.qbar)
HexrdConfig().find_orientations_grains_table = copy.deepcopy(
self.grains_table)

def start_fit_grains_runner(self):
# We will automatically start fit grains after the indexing
Expand Down Expand Up @@ -396,7 +400,10 @@ def run_fit_grains(self):
'write_spots_files': write_spots,
}
self.fit_grains_results = fit_grains(**kwargs)
self.result_grains_table = create_grains_table(self.fit_grains_results)
print('Fit Grains Complete')
HexrdConfig().fit_grains_grains_table = copy.deepcopy(
self.result_grains_table)

# If we wrote out the spots, let's write out the grains.out file too
if write_spots:
Expand All @@ -412,24 +419,26 @@ def view_fit_grains_results(self):
print(result)

kwargs = {
'fit_grains_results': self.fit_grains_results,
'grains_table': self.result_grains_table,
'parent': self.parent,
}
dialog = create_fit_grains_results_dialog(**kwargs)
self.fit_grains_results_dialog = dialog
dialog.show_later()


def create_fit_grains_results_dialog(fit_grains_results, parent=None):
# Build grains table
def create_grains_table(fit_grains_results):
num_grains = len(fit_grains_results)
shape = (num_grains, 21)
grains_table = np.empty(shape)
gw = instrument.GrainDataWriter(array=grains_table)
for result in fit_grains_results:
gw.dump_grain(*result)
gw.close()
return grains_table


def create_fit_grains_results_dialog(grains_table, parent=None):
# Use the material to compute stress from strain
indexing_config = HexrdConfig().indexing_config
name = indexing_config.get('_selected_material')
Expand Down
9 changes: 8 additions & 1 deletion hexrd/ui/resources/ui/calibration_crystal_editor.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>767</width>
<height>385</height>
<height>398</height>
</rect>
</property>
<property name="sizePolicy">
Expand Down Expand Up @@ -525,6 +525,13 @@
</widget>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="load">
<property name="text">
<string>Load Crystal Parameters</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
Expand Down
4 changes: 2 additions & 2 deletions hexrd/ui/resources/ui/laue_overlay_editor.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>550</width>
<height>565</height>
<height>610</height>
</rect>
</property>
<property name="sizePolicy">
Expand All @@ -19,7 +19,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>565</height>
<height>610</height>
</size>
</property>
<property name="windowTitle">
Expand Down
4 changes: 2 additions & 2 deletions hexrd/ui/resources/ui/rotation_series_overlay_editor.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
<x>0</x>
<y>0</y>
<width>550</width>
<height>680</height>
<height>710</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>680</height>
<height>710</height>
</size>
</property>
<property name="windowTitle">
Expand Down
Loading

0 comments on commit 6102f90

Please sign in to comment.