From 2495217008a486d19e8dd50ed739be3fe9d8bfab Mon Sep 17 00:00:00 2001 From: edgar Date: Mon, 22 Jul 2024 13:13:49 +0200 Subject: [PATCH 1/2] feature on pyFAI-calib2, save .json file --- .../gui/model/ExperimentSettingsModel.py | 5 ++ src/pyFAI/gui/tasks/IntegrationTask.py | 85 +++++++++++++++++++ src/pyFAI/resources/gui/calibration-result.ui | 10 +++ 3 files changed, 100 insertions(+) diff --git a/src/pyFAI/gui/model/ExperimentSettingsModel.py b/src/pyFAI/gui/model/ExperimentSettingsModel.py index a9705b30e..be780a86f 100644 --- a/src/pyFAI/gui/model/ExperimentSettingsModel.py +++ b/src/pyFAI/gui/model/ExperimentSettingsModel.py @@ -62,6 +62,7 @@ def __init__(self, parent=None): self.__calibrantModel = CalibrantModel() self.__detectorModel = DetectorModel() self.__poniFile = FilenameModel() + self.__jsonFile = FilenameModel() self.__image.changed.connect(self.wasChanged) self.__image.filenameChanged.connect(self.wasChanged) @@ -72,6 +73,7 @@ def __init__(self, parent=None): self.__calibrantModel.changed.connect(self.wasChanged) self.__detectorModel.changed.connect(self.wasChanged) self.__poniFile.changed.connect(self.wasChanged) + self.__jsonFile.changed.connect(self.wasChanged) self.__dark.changed.connect(self.wasChanged) self.__dark.filenameChanged.connect(self.wasChanged) @@ -165,6 +167,9 @@ def polarizationFactor(self): def poniFile(self): return self.__poniFile + + def jsonFile(self): + return self.__jsonFile def dark(self): return self.__dark diff --git a/src/pyFAI/gui/tasks/IntegrationTask.py b/src/pyFAI/gui/tasks/IntegrationTask.py index f84728ec3..a2b827777 100644 --- a/src/pyFAI/gui/tasks/IntegrationTask.py +++ b/src/pyFAI/gui/tasks/IntegrationTask.py @@ -58,7 +58,9 @@ from pyFAI import method_registry from ..dialog import MessageBox from pyFAI.io import ponifile +from pyFAI.worker import Worker import pyFAI.geometry +import json _logger = logging.getLogger(__name__) @@ -952,6 +954,7 @@ def _initGui(self): self._customMethodButton.clicked.connect(self.__customIntegrationMethod) self._savePoniButton.clicked.connect(self.__saveAsPoni) + self._saveJsonButton.clicked.connect(self.__saveJsonFile) super()._initGui() @@ -1135,6 +1138,88 @@ def __saveAsPoni(self): except Exception as e: MessageBox.exception(self, "Error while saving poni file", e, _logger) + def __saveJsonFile(self): + dialog = createSaveDialog(self, "Save as JSON file", json=True) + # Disable the warning as the data is append to the file + dialog.setOption(qt.QFileDialog.DontConfirmOverwrite, True) + model = self.model() + jsonFile = model.experimentSettingsModel().jsonFile() + previousJsonFile = jsonFile.value() + if previousJsonFile is not None: + dialog.selectFile(previousJsonFile) + + result = dialog.exec_() + if not result: + return + filename = dialog.selectedFiles()[0] + nameFilter = dialog.selectedNameFilter() + isJsonFilter = ".json" in nameFilter + if isJsonFilter and not filename.endswith(".json"): + filename = filename + ".json" + with jsonFile.lockContext(): + jsonFile.setValue(filename) + + geometry = self._geometryTabs.geometryModel() + experimentSettingsModel = model.experimentSettingsModel() + detector = experimentSettingsModel.detector() + + ai = AzimuthalIntegrator( + dist=geometry.distance().value(), + poni1=geometry.poni1().value(), + poni2=geometry.poni2().value(), + rot1=geometry.rotation1().value(), + rot2=geometry.rotation2().value(), + rot3=geometry.rotation3().value(), + detector=detector, + wavelength=geometry.wavelength().value(), + ) + + nbpt_rad = self.model().integrationSettingsModel().nPointsRadial().value() + nbpt_azim = self.model().integrationSettingsModel().nPointsAzimuthal().value() + unit = self.model().integrationSettingsModel().radialUnit().value() + method = method_registry.Method(0, self.__method.split, self.__method.algo, self.__method.impl, None) + if nbpt_azim == 1: + method = method.fixed(dim=1) + else: + method = method.fixed(dim=2) + worker = Worker(azimuthalIntegrator=ai, + shapeOut=(nbpt_azim, nbpt_rad), + unit=unit, + method=method, + ) + config_dictionary = worker.get_config() + config_dictionary["application"] = "pyFAI-calib2" + config_dictionary["do_polarization"] = True + config_dictionary["polarization_factor"] = self.model().experimentSettingsModel().polarizationFactor().value() + mask_filename = model.experimentSettingsModel().mask().filename() + flat_filename = model.experimentSettingsModel().flat().filename() + dark_filename = model.experimentSettingsModel().dark().filename() + if mask_filename: + config_dictionary["do_mask"] = True + config_dictionary["mask_file"] = mask_filename + else: + config_dictionary["do_mask"] = False + if flat_filename: + config_dictionary["do_flat"] = True + config_dictionary["flat_field"] = flat_filename + else: + config_dictionary["do_flat"] = False + if dark_filename: + config_dictionary["do_dark"] = True + config_dictionary["dark_current"] = dark_filename + else: + config_dictionary["do_dark"] = False + + try: + with open(filename, "wt") as fd: + fd.write(json.dumps(config_dictionary, indent=2)) + + with jsonFile.lockContext(): + jsonFile.setValue(filename) + jsonFile.setSynchronized(True) + except Exception as e: + MessageBox.exception(self, "Error while saving json file", e, _logger) + def __updateDisplayedGeometry(self): "Called after the fit" experimentSettingsModel = self.model().experimentSettingsModel() diff --git a/src/pyFAI/resources/gui/calibration-result.ui b/src/pyFAI/resources/gui/calibration-result.ui index c48ac9339..ccdf27244 100644 --- a/src/pyFAI/resources/gui/calibration-result.ui +++ b/src/pyFAI/resources/gui/calibration-result.ui @@ -181,6 +181,16 @@ + + + + A .json file with PONI and integration parameters. + + + Save integration JSON file + + + From 46552e1d8d92e3b29fb6932e0cad7be9ab203637 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:17:28 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/pyFAI/gui/model/ExperimentSettingsModel.py | 2 +- src/pyFAI/gui/tasks/IntegrationTask.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pyFAI/gui/model/ExperimentSettingsModel.py b/src/pyFAI/gui/model/ExperimentSettingsModel.py index be780a86f..a8e2b63aa 100644 --- a/src/pyFAI/gui/model/ExperimentSettingsModel.py +++ b/src/pyFAI/gui/model/ExperimentSettingsModel.py @@ -167,7 +167,7 @@ def polarizationFactor(self): def poniFile(self): return self.__poniFile - + def jsonFile(self): return self.__jsonFile diff --git a/src/pyFAI/gui/tasks/IntegrationTask.py b/src/pyFAI/gui/tasks/IntegrationTask.py index a2b827777..094b6c355 100644 --- a/src/pyFAI/gui/tasks/IntegrationTask.py +++ b/src/pyFAI/gui/tasks/IntegrationTask.py @@ -1162,7 +1162,7 @@ def __saveJsonFile(self): geometry = self._geometryTabs.geometryModel() experimentSettingsModel = model.experimentSettingsModel() detector = experimentSettingsModel.detector() - + ai = AzimuthalIntegrator( dist=geometry.distance().value(), poni1=geometry.poni1().value(), @@ -1173,7 +1173,7 @@ def __saveJsonFile(self): detector=detector, wavelength=geometry.wavelength().value(), ) - + nbpt_rad = self.model().integrationSettingsModel().nPointsRadial().value() nbpt_azim = self.model().integrationSettingsModel().nPointsAzimuthal().value() unit = self.model().integrationSettingsModel().radialUnit().value() @@ -1213,7 +1213,7 @@ def __saveJsonFile(self): try: with open(filename, "wt") as fd: fd.write(json.dumps(config_dictionary, indent=2)) - + with jsonFile.lockContext(): jsonFile.setValue(filename) jsonFile.setSynchronized(True)