From ef67cdb12d002a725fb7615ee5fd3e7f0535723f Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Mon, 21 Oct 2024 15:22:43 +0200 Subject: [PATCH 01/13] experiment tab button working --- .../Gui/ApplicationWindow.qml | 12 +- .../Gui/Globals/References.qml | 8 +- .../Experiment/MainContent/ExperimentView.qml | 8 + .../Experiment/Sidebar/basic/SideBarBasic.qml | 178 ++++++++++++++++++ .../Gui/Pages/Sample/Layout.qml | 17 +- .../Gui/Pages/Sample/Sidebar/Basic/Layout.qml | 3 - 6 files changed, 205 insertions(+), 21 deletions(-) create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index f72a4755..dc546250 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -41,6 +41,7 @@ EaComponents.ApplicationWindow { if (Globals.References.applicationWindow.appBarCentralTabs.analysisButton !== null) { Globals.References.applicationWindow.appBarCentralTabs.analysisButton.enabled = false } + if (Globals.References.applicationWindow.appBarCentralTabs.summaryButton !== null) { Globals.References.applicationWindow.appBarCentralTabs.summaryButton.enabled = false } @@ -100,17 +101,18 @@ EaComponents.ApplicationWindow { } }, // Sample page -/* + // Experiment tab EaElements.AppBarTabButton { id: experimentTabButton - enabled: false //ExGlobals.Variables.samplePageEnabled + enabled: false fontIcon: "microscope" text: qsTr("Experiment") ToolTip.text: qsTr("Experimental settings and data page") - Component.onCompleted:Globals.References.applicationWindow.appBarCentralTabs.experimentTabButton = experimentTabButton + Component.onCompleted:Globals.References.applicationWindow.appBarCentralTabs.experimentButton = experimentTabButton }, +/* // Analysis tab EaElements.AppBarTabButton { id: analysisTabButton @@ -120,7 +122,7 @@ EaComponents.ApplicationWindow { fontIcon: "calculator" text: qsTr("Analysis") ToolTip.text: qsTr("Simulation and fitting page") - Component.onCompleted: Globals.References.applicationWindow.appBarCentralTabs.analysisTabButton = analysisTabButton + Component.onCompleted: Globals.References.applicationWindow.appBarCentralTabs.analysisButton = analysisTabButton }, */ // Summary page @@ -146,7 +148,7 @@ EaComponents.ApplicationWindow { Loader { source: 'Pages/Home/Layout.qml' }, Loader { source: 'Pages/Project/Layout.qml' }, Loader { source: 'Pages/Sample/Layout.qml' }, -// Loader { source: 'Pages/Experiment/Layout.qml' }, + Loader { source: 'Pages/Experiment/Layout.qml' }, // Loader { source: 'Pages/Analysis/Layout.qml' }, Loader { source: 'Pages/Report/Layout.qml' } ] diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml index 12175bdb..8c9ed472 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml @@ -42,8 +42,8 @@ QtObject { } } - // Populated in plotting/... - readonly property var plotting: { - 'graph1d': null, - } +// // Populated in plotting/... +// readonly property var plotting: { +// 'graph1d': null, +// } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml new file mode 100644 index 00000000..86de1e2c --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -0,0 +1,8 @@ +import QtQuick 2.13 + +import Gui.Logic 1.0 as ExLogic +import Gui.Globals 1.0 as ExGlobals + +Loader { + source: ExLogic.Paths.component('ExperimentDataChart.qml') +} diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml new file mode 100644 index 00000000..63df7353 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml @@ -0,0 +1,178 @@ +import QtQuick 2.14 +import QtQuick.Controls 2.14 +import QtQuick.Dialogs 1.3 as Dialogs1 + +import easyApp.Gui.Globals 1.0 as EaGlobals +import easyApp.Gui.Style 1.0 as EaStyle +import easyApp.Gui.Elements 1.0 as EaElements +import easyApp.Gui.Components 1.0 as EaComponents +import easyApp.Gui.Logic 1.0 as EaLogic + +import Gui.Globals 1.0 as ExGlobals +import Gui.Components 1.0 as ExComponents + +EaComponents.SideBarColumn { + + EaElements.GroupBox { + title: qsTr("Experimental data") + collapsible: false + enabled: ExGlobals.Constants.proxy.fitter.isFitFinished + + ExComponents.ExperimentDataExplorer {} + + Row { + spacing: EaStyle.Sizes.fontPixelSize + + EaElements.SideBarButton { + enabled: true + + fontIcon: "upload" + text: qsTr("Import data from local drive") + + onClicked: loadExperimentDataFileDialog.open() + } + + EaElements.SideBarButton { + enabled: !ExGlobals.Constants.proxy.data.experimentLoaded && + !ExGlobals.Constants.proxy.data.experimentSkipped + + fontIcon: "arrow-circle-right" + text: qsTr("Continue without experiment data") + + onClicked: ExGlobals.Constants.proxy.data.experimentSkipped = true + + Component.onCompleted: ExGlobals.Variables.continueWithoutExperimentDataButton = this + } + } + + Component.onCompleted: ExGlobals.Variables.experimentalDataGroup = this + } + + // EaElements.GroupBox { + // title: qsTr("Instrument and experiment type") + // enabled: ExGlobals.Constants.proxy.data.experimentLoaded || + // ExGlobals.Constants.proxy.data.experimentSkipped + + // Column { + + // Row { + // spacing: EaStyle.Sizes.fontPixelSize + + // Column { + // spacing: EaStyle.Sizes.fontPixelSize * -0.5 + + // EaElements.Label { + // enabled: false + // text: qsTr("Facility") + // } + + // EaElements.ComboBox { + // width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + // model: ["Unknown"] + // } + // } + + // Column { + // spacing: EaStyle.Sizes.fontPixelSize * -0.5 + + // EaElements.Label { + // enabled: false + // text: qsTr("Instrument") + // } + + // EaElements.ComboBox { + // width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + // model: ["Unknown"] + // } + // } + + // Column { + // spacing: EaStyle.Sizes.fontPixelSize * -0.5 + + // EaElements.Label { + // enabled: false + // text: qsTr("Configuration") + // } + + // EaElements.ComboBox { + // width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + // model: ["Unknown"] + // } + // } + // } + // } + // } + + EaElements.GroupBox { + title: qsTr(ExGlobals.Constants.proxy.data.currentDataName + " instrumental parameters") + visible: ExGlobals.Constants.proxy.data.experimentLoaded + collapsed: false + Row { + spacing: EaStyle.Sizes.fontPixelSize + + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + text: qsTr("Scaling:") + } + EaElements.Parameter { + id: xMin + enabled: true + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + units: "" + text: ExGlobals.Constants.proxy.data.currentScaling.toFixed(3) + onEditingFinished: ExGlobals.Constants.proxy.data.setScaling(text) + } + + // Max + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + text: qsTr("Background:") + } + EaElements.Parameter { + id: xMax + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + units: "" + text: ExGlobals.Constants.proxy.data.currentBackground.toExponential(2) + onEditingFinished: ExGlobals.Constants.proxy.data.setBackground(text) + } + + // Step + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + text: qsTr("Resolution:") + } + EaElements.Parameter { + id: xStep + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + units: "%" + text: ExGlobals.Constants.proxy.data.currentResolution.toFixed(2) + onEditingFinished: ExGlobals.Constants.proxy.data.setResolution(text) + } + } + } + + + EaElements.GroupBox { + title: qsTr("Simulation range") + visible: ExGlobals.Constants.proxy.data.experimentSkipped + + enabled: ExGlobals.Constants.proxy.data.experimentSkipped + + ExComponents.ExperimentSimulationSetup {} + } + + // Load experimental data file dialog + + Dialogs1.FileDialog{ + id: loadExperimentDataFileDialog + + nameFilters: [ qsTr("Data files") + " (*.dat *.txt *.ort)" ] + + onAccepted: ExGlobals.Constants.proxy.data.addExperimentDataFromOrt(fileUrl) + } + +} + diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml index 26573ec3..6535f645 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml @@ -44,21 +44,20 @@ EaComponents.ContentPage { // Loader { source: 'Sidebar/Advanced/Layout.qml' } ] - continueButton.visible: false - } +// continueButton.visible: false -/* - continueButton.text: Globals.BackendWrapper.projectCreated ? - qsTr('Continue') : - qsTr('Continue without project') + continueButton.text: qsTr('Continue') //Globals.BackendWrapper.projectCreated ? + //qsTr('Continue') : + // qsTr('Continue without project') continueButton.onClicked: { console.debug(`Clicking '${continueButton.text}' button ::: ${this}`) - Globals.References.applicationWindow.appBarCentralTabs.summaryButton.enabled = true - Globals.References.applicationWindow.appBarCentralTabs.summaryButton.toggle() +// Globals.References.applicationWindow.appBarCentralTabs.sampleButton.enabled = true + Globals.References.applicationWindow.appBarCentralTabs.experimentButton.enabled = true + Globals.References.applicationWindow.appBarCentralTabs.experimentButton.toggle() } } -*/ + Component.onCompleted: console.debug(`Sample page loaded ::: ${this}`) Component.onDestruction: console.debug(`Sample page destroyed ::: ${this}`) diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Basic/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Basic/Layout.qml index 91012725..cec36979 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Basic/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Sidebar/Basic/Layout.qml @@ -10,9 +10,6 @@ import "./Groups" as Groups EaComponents.SideBarColumn { - -// property string currentAssemblyType: 'Multi-layer' - Groups.MaterialEditor{ enabled: Globals.BackendWrapper.analysisIsFitFinished } From e5e2f30fad7c97a82627a0763c6d52d7d6065978 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Tue, 22 Oct 2024 12:32:18 +0200 Subject: [PATCH 02/13] seems to work with mockbackend --- .../Backends/Mock/Experiment.qml | 38 ++++ .../Backends/Mock/Plotting.qml | 4 + .../EasyReflectometryApp/Backends/Mock/qmldir | 1 + .../Backends/MockBackend.qml | 1 + .../Gui/ApplicationWindow.qml | 3 +- .../Gui/Globals/BackendWrapper.qml | 24 +++ .../Gui/Globals/References.qml | 13 +- .../Gui/Pages/Experiment/Layout.qml | 59 ++++++ .../Experiment/MainContent/ExperimentView.qml | 177 +++++++++++++++++- .../Sidebar/Basic/Groups/ExperimentalData.qml | 59 ++++++ .../Basic/Groups/InstrumentParameters.qml | 62 ++++++ .../Sidebar/Basic/Groups/SimulationRange.qml | 84 +++++++++ .../SideBarBasic.qml => Basic/Layout.qml} | 88 +++++---- .../Basic/Popups/OpenExperimentFile.qml | 26 +++ 14 files changed, 597 insertions(+), 42 deletions(-) create mode 100644 src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml rename src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/{basic/SideBarBasic.qml => Basic/Layout.qml} (65%) create mode 100644 src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Popups/OpenExperimentFile.qml diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml new file mode 100644 index 00000000..dcaa4789 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml @@ -0,0 +1,38 @@ +pragma Singleton + +import QtQuick + +QtObject { + property double scaling: 1. + property double background: 2. + property double resolution: 3. + + property double q_min: 4. + property double q_max: 5. + property double q_step: 6. + + // Setters + function setScaling(value) { + console.debug(`setScaling ${value}`) + } + function setBackground(value) { + console.debug(`setBackgroun ${value}`) + } + function setResolution(value) { + console.debug(`setResolution ${value}`) + } + + function setQMin(value) { + console.debug(`setQMin ${value}`) + } + function setQMax(value) { + console.debug(`setQMax ${value}`) + } + function setQStep(value) { + console.debug(`setQStep ${value}`) + } + + function load(path) { + console.debug(`Loading experiment from ${path}`) + } +} diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml index 3ccc5cad..f011eb41 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml @@ -12,6 +12,10 @@ QtObject { property double sldMaxX: 2. property double sldMinY: -20. property double sldMaxY: 20. + property double experimentMinX: -2. + property double experimentMaxX: 2. + property double experimentMinY: -20. + property double experimentMaxY: 20. function setQtChartsReflectometrySerieRef(value1, value2, value3) { console.debug(`setQtChartsReflectometrySerieRef ${value1}, ${value2}, ${value3}`) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir index 806c3927..b0b8eaa3 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/qmldir @@ -1,6 +1,7 @@ module MockLogic singleton Analysis Analysis.qml +singleton Experiment Experiment.qml singleton Home Home.qml singleton Project Project.qml singleton Report Report.qml diff --git a/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml b/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml index cc134069..0a19523b 100644 --- a/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml +++ b/src_qt6/EasyReflectometryApp/Backends/MockBackend.qml @@ -7,6 +7,7 @@ import Backends.Mock as Backend QtObject { property var analysis: Backend.Analysis + property var experiment: Backend.Experiment property var home: Backend.Home property var project: Backend.Project property var report: Backend.Report diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index dc546250..6f98036f 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -41,7 +41,6 @@ EaComponents.ApplicationWindow { if (Globals.References.applicationWindow.appBarCentralTabs.analysisButton !== null) { Globals.References.applicationWindow.appBarCentralTabs.analysisButton.enabled = false } - if (Globals.References.applicationWindow.appBarCentralTabs.summaryButton !== null) { Globals.References.applicationWindow.appBarCentralTabs.summaryButton.enabled = false } @@ -105,7 +104,7 @@ EaComponents.ApplicationWindow { // Experiment tab EaElements.AppBarTabButton { id: experimentTabButton - enabled: false + enabled: true fontIcon: "microscope" text: qsTr("Experiment") ToolTip.text: qsTr("Experimental settings and data page") diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 0cb0f471..3c5baa40 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -146,6 +146,25 @@ QtObject { function sampleSetCurrentLayerAPM(value) { activeBackend.sample.setCurrentLayerAPM(value) } function sampleSetCurrentLayerSolvation(value) { activeBackend.sample.setCurrentLayerSolvation(value) } + + ////////////////// + // Experiment page + ////////////////// + readonly property var experimentScaling: activeBackend.experiment.scaling + function experimentSetScaling(value) { activeBackend.experiment.setScaling(value) } + readonly property var experimentBackground: activeBackend.experiment.background + function experimentSetBackground(value) { activeBackend.experiment.setBackground(value) } + readonly property var experimentResolution: activeBackend.experiment.resolution + function experimentSetResolution(value) { activeBackend.experiment.setResolution(value) } + readonly property var experimentQMin: activeBackend.experiment.q_min + function experimentSetQMin(value) { activeBackend.experiment.setQMin(value) } + readonly property var experimentQMax: activeBackend.experiment.q_max + function experimentSetQMax(value) { activeBackend.experiment.setQMax(value) } + readonly property var experimentQStep: activeBackend.experiment.q_step + function experimentSetQStep(value) { activeBackend.experiment.setQStep(value) } + + function experimentLoad(value) { activeBackend.experiment.load(value) } + /////////////// // Analysis page /////////////// @@ -171,6 +190,11 @@ QtObject { readonly property var plottingSampleMinY: activeBackend.plotting.sampleMinY readonly property var plottingSampleMaxY: activeBackend.plotting.sampleMaxY + readonly property var plottingExperimentMinX: activeBackend.plotting.sampleMinX + readonly property var plottingExperimentMaxX: activeBackend.plotting.sampleMaxX + readonly property var plottingExperimentMinY: activeBackend.plotting.sampleMinY + readonly property var plottingExperimentMaxY: activeBackend.plotting.sampleMaxY + function plottingSetQtChartsReflectometrySerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsReflectometrySerieRef(value1, value2, value3) } function plottingSetQtChartsSldSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSldSerieRef(value1, value2, value3) } diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml index 8c9ed472..b9ba22eb 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/References.qml @@ -38,7 +38,18 @@ QtObject { 'sampleView': null, 'sldView': null, } - + }, + 'experiment':{ + 'mainContent': { + 'experimentView': null, + }, + 'sidebar': { + 'basic': { + 'popups': { + 'loadExperimentFileDialog': null, + } + } + } } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml new file mode 100644 index 00000000..0759dab1 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml @@ -0,0 +1,59 @@ + import QtQuick +import QtQuick.Controls + +import EasyApp.Gui.Style as EaStyle +import EasyApp.Gui.Globals as EaGlobals +import EasyApp.Gui.Elements as EaElements +import EasyApp.Gui.Components as EaComponents + +import Gui.Globals as Globals + + +EaComponents.ContentPage { + +// defaultInfo: Globals.BackendWrapper.projectCreated ? +// '' : +// qsTr('No project defined') + + mainView: EaComponents.MainContent { +/* tabs: [ + EaElements.TabButton { text: qsTr('Reflectivity') }, + EaElements.TabButton { text: qsTr('SLD') } + ]*/ + + items: [ + Loader { + source: `MainContent/ExperimentView.qml` + onStatusChanged: if (status === Loader.Ready) console.debug(`${source} loaded`) + } + ] + } + + sideBar: EaComponents.SideBar { + tabs: [ + EaElements.TabButton { text: qsTr('Basic controls') } +// EaElements.TabButton { text: qsTr('Advanced controls') } + ] + + items: [ + Loader { source: 'Sidebar/Basic/Layout.qml' } + // Loader { source: 'Sidebar/Advanced/Layout.qml' } + ] + +// continueButton.visible: false + + continueButton.text: qsTr('Continue') //Globals.BackendWrapper.projectCreated ? + //qsTr('Continue') : + // qsTr('Continue without project') + + continueButton.onClicked: { + console.debug(`Clicking '${continueButton.text}' button ::: ${this}`) + Globals.References.applicationWindow.appBarCentralTabs.analysisButton.enabled = true + Globals.References.applicationWindow.appBarCentralTabs.anslysisButton.toggle() + } + } + + Component.onCompleted: console.debug(`Experiment page loaded ::: ${this}`) + Component.onDestruction: console.debug(`Experiment page destroyed ::: ${this}`) + +} diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index 86de1e2c..cc63f3c9 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -1,8 +1,175 @@ -import QtQuick 2.13 +// SPDX-FileCopyrightText: 2023 EasyDiffraction contributors +// SPDX-License-Identifier: BSD-3-Clause +// © 2023 Contributors to the EasyDiffraction project -import Gui.Logic 1.0 as ExLogic -import Gui.Globals 1.0 as ExGlobals +import QtQuick +import QtQuick.Controls +import QtCharts -Loader { - source: ExLogic.Paths.component('ExperimentDataChart.qml') +import EasyApp.Gui.Style as EaStyle +import EasyApp.Gui.Globals as EaGlobals +import EasyApp.Gui.Elements as EaElements +import EasyApp.Gui.Charts as EaCharts + +import Gui.Globals as Globals + + +Rectangle { + id: container + + color: EaStyle.Colors.chartBackground + + EaCharts.QtCharts1dMeasVsCalc { + id: chartView + + anchors.topMargin: EaStyle.Sizes.toolButtonHeight - EaStyle.Sizes.fontPixelSize - 1 + + useOpenGL: EaGlobals.Vars.useOpenGL + + property double xRange: Globals.BackendWrapper.plottingExperimentMaxX - Globals.BackendWrapper.plottingExperimentMinX + axisX.title: "q (Å⁻¹)" + axisX.min: Globals.BackendWrapper.plottingExperimentMinX - xRange * 0.01 + axisX.max: Globals.BackendWrapper.plottingExperimentMaxX + xRange * 0.01 + axisX.minAfterReset: Globals.BackendWrapper.plottingExperimentMinX - xRange * 0.01 + axisX.maxAfterReset: Globals.BackendWrapper.plottingExperimentMaxX + xRange * 0.01 + + property double yRange: Globals.BackendWrapper.plottingExperimentMaxY - Globals.BackendWrapper.plottingExperimentMinY + axisY.title: "Log10 R(q)" + axisY.min: Globals.BackendWrapper.plottingExperimentMinY - yRange * 0.01 + axisY.max: Globals.BackendWrapper.plottingExperimentMaxY + yRange * 0.01 + axisY.minAfterReset: Globals.BackendWrapper.plottingExperimentMinY - yRange * 0.01 + axisY.maxAfterReset: Globals.BackendWrapper.plottingExperimentMaxY + yRange * 0.01 + + calcSerie.onHovered: (point, state) => showMainTooltip(chartView, point, state) + + // Tool buttons + Row { + id: toolButtons + + x: chartView.plotArea.x + chartView.plotArea.width - width + y: chartView.plotArea.y - height - EaStyle.Sizes.fontPixelSize + + spacing: 0.25 * EaStyle.Sizes.fontPixelSize + + EaElements.TabButton { + checked: Globals.Variables.showLegendOnExperimentPage + autoExclusive: false + height: EaStyle.Sizes.toolButtonHeight + width: EaStyle.Sizes.toolButtonHeight + borderColor: EaStyle.Colors.chartAxis + fontIcon: "align-left" + ToolTip.text: Globals.Variables.showLegendOnExperimentPage ? + qsTr("Hide legend") : + qsTr("Show legend") + onClicked: Globals.Variables.showLegendOnExperimentPage = checked + } + + EaElements.TabButton { + checked: chartView.allowHover + autoExclusive: false + height: EaStyle.Sizes.toolButtonHeight + width: EaStyle.Sizes.toolButtonHeight + borderColor: EaStyle.Colors.chartAxis + fontIcon: "comment-alt" + ToolTip.text: qsTr("Show coordinates tooltip on hover") + onClicked: chartView.allowHover = !chartView.allowHover + } + + Item { height: 1; width: 0.5 * EaStyle.Sizes.fontPixelSize } // spacer + + EaElements.TabButton { + checked: !chartView.allowZoom + autoExclusive: false + height: EaStyle.Sizes.toolButtonHeight + width: EaStyle.Sizes.toolButtonHeight + borderColor: EaStyle.Colors.chartAxis + fontIcon: "arrows-alt" + ToolTip.text: qsTr("Enable pan") + onClicked: chartView.allowZoom = !chartView.allowZoom + } + + EaElements.TabButton { + checked: chartView.allowZoom + autoExclusive: false + height: EaStyle.Sizes.toolButtonHeight + width: EaStyle.Sizes.toolButtonHeight + borderColor: EaStyle.Colors.chartAxis + fontIcon: "expand" + ToolTip.text: qsTr("Enable box zoom") + onClicked: chartView.allowZoom = !chartView.allowZoom + } + + EaElements.TabButton { + checkable: false + height: EaStyle.Sizes.toolButtonHeight + width: EaStyle.Sizes.toolButtonHeight + borderColor: EaStyle.Colors.chartAxis + fontIcon: "backspace" + ToolTip.text: qsTr("Reset axes") + onClicked: chartView.resetAxes() + } + + } + // Tool buttons + + // Legend + Rectangle { + visible: Globals.Variables.showLegendOnExperimentPage + + x: chartView.plotArea.x + chartView.plotArea.width - width - EaStyle.Sizes.fontPixelSize + y: chartView.plotArea.y + EaStyle.Sizes.fontPixelSize + width: childrenRect.width + height: childrenRect.height + + color: EaStyle.Colors.mainContentBackgroundHalfTransparent + border.color: EaStyle.Colors.chartGridLine + + Column { + leftPadding: EaStyle.Sizes.fontPixelSize + rightPadding: EaStyle.Sizes.fontPixelSize + topPadding: EaStyle.Sizes.fontPixelSize * 0.5 + bottomPadding: EaStyle.Sizes.fontPixelSize * 0.5 + + EaElements.Label { + text: '━ I (experiment)' + color: chartView.calcSerie.color + } + } + } + // Legend + + // ToolTips + EaElements.ToolTip { + id: dataToolTip + + arrowLength: 0 + textFormat: Text.RichText + } + // ToolTips + + // Data is set in python backend + + Component.onCompleted: { + Globals.References.pages.experiment.mainContent.experimentView = chartView + Globals.BackendWrapper.plottingSetQtChartsReflectometrySerieRef('experimentPage', + 'experimentSerie', + chartView.calcSerie) + } + + } + + // Logic + + function showMainTooltip(chart, point, state) { + if (!chartView.allowHover) { + return + } + const pos = chart.mapToPosition(Qt.point(point.x, point.y)) + dataToolTip.x = pos.x + dataToolTip.y = pos.y + dataToolTip.text = `

x: ${point.x.toFixed(3)}y: ${point.y.toFixed(3)}

` + dataToolTip.parent = chart + dataToolTip.visible = state + } } + diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml new file mode 100644 index 00000000..d01f346e --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml @@ -0,0 +1,59 @@ +import QtQuick 2.14 +import QtQuick.Controls 2.14 +import QtQuick.Dialogs as Dialogs1 + +// import easyApp.Gui.Globals as EaGlobals +import easyApp.Gui.Style as EaStyle +import easyApp.Gui.Elements as EaElements +//import easyApp.Gui.Components as EaComponents +// import easyApp.Gui.Logic as EaLogic + + + +import Gui.Globals as Globals + +EaElements.GroupBox { + title: qsTr("Experimental data") + collapsible: false + enabled: Globals.Constants.proxy.fitter.isFitFinished + + + +// ExComponents.ExperimentDataExplorer {} + + Row { + spacing: EaStyle.Sizes.fontPixelSize + + EaElements.SideBarButton { + enabled: true + + fontIcon: "upload" + text: qsTr("Import data from local drive") + + onClicked: { + console.debug(`Clicking '${text}' button ::: ${this}`) + Globals.References.pages.experiment.sidebar.basic.popups.loadExperimentFileDialog.open() + } + + Loader { + source: '../Popups/OpenExperimentFile.qml' + } + +// onClicked: loadExperimentDataFileDialog.open() + } + + EaElements.SideBarButton { +// enabled: !Globals.Constants.proxy.data.experimentLoaded && +// !Globals.Constants.proxy.data.experimentSkipped + + fontIcon: "arrow-circle-right" + text: qsTr("Continue without experiment data") + +// onClicked: Globals.Constants.proxy.data.experimentSkipped = true + + Component.onCompleted: Globals.Variables.continueWithoutExperimentDataButton = this + } + } + + Component.onCompleted: Globals.Variables.experimentalDataGroup = this +} diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml new file mode 100644 index 00000000..3388fe61 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml @@ -0,0 +1,62 @@ +import QtQuick 2.14 +import QtQuick.Controls 2.14 + +//import easyApp.Gui.Globals as EaGlobals +import easyApp.Gui.Style as EaStyle +import easyApp.Gui.Elements as EaElements +import easyApp.Gui.Components as EaComponents +//import easyApp.Gui.Logic as EaLogic + +import Gui.Globals as Globals + +EaElements.GroupBox { + title: qsTr("Instrumental parameters") +// title: qsTr(Globals.Constants.proxy.data.currentDataName + " instrumental parameters") +// visible: Globals.Constants.proxy.data.experimentLoaded + collapsed: true + Row { + spacing: EaStyle.Sizes.fontPixelSize + + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + text: qsTr("Scaling:") + } + EaElements.Parameter { + id: xMin + enabled: true + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + units: "" + text: Globals.BackendWrapper.experimentScaling.toFixed(3) + onEditingFinished: Globals.BackendWrapper.experimentSetScaling(text) + } + + // Max + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + text: qsTr("Background:") + } + EaElements.Parameter { + id: xMax + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + units: "" + text: Globals.BackendWrapper.experimentBackground.toFixed(2) + onEditingFinished: Globals.BackendWrapper.experimentSetBackground(text) + } + + // Step + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + text: qsTr("Resolution:") + } + EaElements.Parameter { + id: xStep + width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 + units: "%" + text: Globals.BackendWrapper.experimentResolution.toFixed(2) + onEditingFinished: Globals.BackendWrapper.experimentSetResolution(text) + } + } +} diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml new file mode 100644 index 00000000..01b2aa3d --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml @@ -0,0 +1,84 @@ +import QtQuick 2.13 +import QtQuick.Controls 2.13 + +import easyApp.Gui.Style as EaStyle +import easyApp.Gui.Elements as EaElements +import easyApp.Gui.Components as EaComponents +import easyApp.Gui.Logic as EaLogic + +import Gui.Globals as Globals + +EaElements.GroupBox { + title: qsTr("Simulation range") +// visible: Globals.Constants.proxy.data.experimentSkipped + +// enabled: Globals.Constants.proxy.data.experimentSkipped + + Row { + spacing: EaStyle.Sizes.fontPixelSize * 0.5 + + // Min + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: labelWidth() + text: qsTr("q-min:") + } + EaElements.Parameter { + id: xMin +// enabled: !ExGlobals.Constants.proxy.data.experimentLoaded + width: textFieldWidth() + units: "Å-1" + text: Globals.BackendWrapper.experimentQMin.toFixed(3) + onEditingFinished: Globals.BackendWrapper.experimentSetQMin(text) + } + + // Max + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: labelWidth() + text: qsTr("q-max:") + } + EaElements.Parameter { + id: xMax +// enabled: !ExGlobals.Constants.proxy.data.experimentLoaded + width: textFieldWidth() + units: "Å-1" + text: Globals.BackendWrapper.experimentQMax.toFixed(3) + onEditingFinished: Globals.BackendWrapper.experimentSetQMax(text) + } + + // Step + EaComponents.TableViewLabel{ + horizontalAlignment: Text.AlignRight + width: labelWidth() + text: qsTr("q-step:") + } + EaElements.Parameter { + id: xStep + // enabled: !ExGlobals.Constants.proxy.data.experimentLoaded + width: textFieldWidth() + units: "Å-1" + text: Globals.BackendWrapper.experimentQStep.toFixed(3) + onEditingFinished: Globals.BackendWrapper.experimentSetQStep(text) + } + } + // Logic + + function labelWidth() { + return (EaStyle.Sizes.sideBarContentWidth - spacing * 5 - textFieldWidth() * 3) / 3 + } + + function textFieldWidth() { + return EaStyle.Sizes.fontPixelSize * 7.0 + } +/* + function updateParameters() { + const json = { + "x_min": parseFloat(xMin.text), + "x_max": parseFloat(xMax.text), + "x_step": parseFloat(xStep.text) + } + ExGlobals.Constants.proxy.simulation.qRangeAsObj = JSON.stringify(json) + }*/ +} + diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml similarity index 65% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml index 63df7353..4c03f154 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/basic/SideBarBasic.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml @@ -1,24 +1,40 @@ import QtQuick 2.14 import QtQuick.Controls 2.14 -import QtQuick.Dialogs 1.3 as Dialogs1 +//import QtQuick.Dialogs as Dialogs1 + +//import easyApp.Gui.Globals as EaGlobals +//import easyApp.Gui.Style as EaStyle +//import easyApp.Gui.Elements as EaElements +import easyApp.Gui.Components as EaComponents +//import easyApp.Gui.Logic as EaLogic + +import Gui.Globals as Globals +import "./Groups" as Groups + +//import Gui.Components 1.0 as ExComponents -import easyApp.Gui.Globals 1.0 as EaGlobals -import easyApp.Gui.Style 1.0 as EaStyle -import easyApp.Gui.Elements 1.0 as EaElements -import easyApp.Gui.Components 1.0 as EaComponents -import easyApp.Gui.Logic 1.0 as EaLogic -import Gui.Globals 1.0 as ExGlobals -import Gui.Components 1.0 as ExComponents EaComponents.SideBarColumn { + Groups.ExperimentalData{ + enabled: Globals.BackendWrapper.analysisIsFitFinished + } + + Groups.InstrumentParameters{ + enabled: Globals.BackendWrapper.analysisIsFitFinished + } + + Groups.SimulationRange{ + enabled: Globals.BackendWrapper.analysisIsFitFinished + } +/* EaElements.GroupBox { title: qsTr("Experimental data") collapsible: false - enabled: ExGlobals.Constants.proxy.fitter.isFitFinished + enabled: Globals.Constants.proxy.fitter.isFitFinished - ExComponents.ExperimentDataExplorer {} +// ExComponents.ExperimentDataExplorer {} Row { spacing: EaStyle.Sizes.fontPixelSize @@ -33,25 +49,28 @@ EaComponents.SideBarColumn { } EaElements.SideBarButton { - enabled: !ExGlobals.Constants.proxy.data.experimentLoaded && - !ExGlobals.Constants.proxy.data.experimentSkipped + enabled: !Globals.Constants.proxy.data.experimentLoaded && + !Globals.Constants.proxy.data.experimentSkipped fontIcon: "arrow-circle-right" text: qsTr("Continue without experiment data") - onClicked: ExGlobals.Constants.proxy.data.experimentSkipped = true + onClicked: Globals.Constants.proxy.data.experimentSkipped = true - Component.onCompleted: ExGlobals.Variables.continueWithoutExperimentDataButton = this + Component.onCompleted: Globals.Variables.continueWithoutExperimentDataButton = this } } - Component.onCompleted: ExGlobals.Variables.experimentalDataGroup = this + Component.onCompleted: Globals.Variables.experimentalDataGroup = this } +*/ + + // EaElements.GroupBox { // title: qsTr("Instrument and experiment type") - // enabled: ExGlobals.Constants.proxy.data.experimentLoaded || - // ExGlobals.Constants.proxy.data.experimentSkipped + // enabled: Globals.Constants.proxy.data.experimentLoaded || + // Globals.Constants.proxy.data.experimentSkipped // Column { @@ -103,9 +122,10 @@ EaComponents.SideBarColumn { // } // } +/* EaElements.GroupBox { - title: qsTr(ExGlobals.Constants.proxy.data.currentDataName + " instrumental parameters") - visible: ExGlobals.Constants.proxy.data.experimentLoaded + title: qsTr(Globals.Constants.proxy.data.currentDataName + " instrumental parameters") + visible: Globals.Constants.proxy.data.experimentLoaded collapsed: false Row { spacing: EaStyle.Sizes.fontPixelSize @@ -120,8 +140,8 @@ EaComponents.SideBarColumn { enabled: true width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 units: "" - text: ExGlobals.Constants.proxy.data.currentScaling.toFixed(3) - onEditingFinished: ExGlobals.Constants.proxy.data.setScaling(text) + text: Globals.Constants.proxy.data.currentScaling.toFixed(3) + onEditingFinished: Globals.Constants.proxy.data.setScaling(text) } // Max @@ -134,8 +154,8 @@ EaComponents.SideBarColumn { id: xMax width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 units: "" - text: ExGlobals.Constants.proxy.data.currentBackground.toExponential(2) - onEditingFinished: ExGlobals.Constants.proxy.data.setBackground(text) + text: Globals.Constants.proxy.data.currentBackground.toExponential(2) + onEditingFinished: Globals.Constants.proxy.data.setBackground(text) } // Step @@ -148,31 +168,31 @@ EaComponents.SideBarColumn { id: xStep width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 units: "%" - text: ExGlobals.Constants.proxy.data.currentResolution.toFixed(2) - onEditingFinished: ExGlobals.Constants.proxy.data.setResolution(text) + text: Globals.Constants.proxy.data.currentResolution.toFixed(2) + onEditingFinished: Globals.Constants.proxy.data.setResolution(text) } } } - - +*/ +/* EaElements.GroupBox { title: qsTr("Simulation range") - visible: ExGlobals.Constants.proxy.data.experimentSkipped + visible: Globals.Constants.proxy.data.experimentSkipped - enabled: ExGlobals.Constants.proxy.data.experimentSkipped + enabled: Globals.Constants.proxy.data.experimentSkipped - ExComponents.ExperimentSimulationSetup {} +// ExComponents.ExperimentSimulationSetup {} } - +*/ // Load experimental data file dialog - +/* Dialogs1.FileDialog{ id: loadExperimentDataFileDialog nameFilters: [ qsTr("Data files") + " (*.dat *.txt *.ort)" ] - onAccepted: ExGlobals.Constants.proxy.data.addExperimentDataFromOrt(fileUrl) + onAccepted: Globals.Constants.proxy.data.addExperimentDataFromOrt(fileUrl) } - +*/ } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Popups/OpenExperimentFile.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Popups/OpenExperimentFile.qml new file mode 100644 index 00000000..3a8b62b9 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Popups/OpenExperimentFile.qml @@ -0,0 +1,26 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Dialogs + +import EasyApp.Gui.Globals as EaGlobals +import EasyApp.Gui.Components as EaComponents + +import Gui.Globals as Globals + + +FileDialog{ + + id: openExperimentFileDialog + + fileMode: FileDialog.OpenFile + nameFilters: [ 'Experiment files (*.dat *.txt *.ort)'] + + onAccepted: { +// Globals.References.applicationWindow.appBarCentralTabs.analysisButton.enabled = true + Globals.BackendWrapper.experimentLoad(selectedFile) + } + + Component.onCompleted: { + Globals.References.pages.experiment.sidebar.basic.popups.loadExperimentFileDialog = openExperimentFileDialog + } +} From dd05718e1f35b5b268a0edd945f76ed5fc941b81 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 23 Oct 2024 12:03:56 +0200 Subject: [PATCH 03/13] experiment using lib --- .../Backends/Mock/Experiment.qml | 6 +- .../Backends/Py/experiment.py | 84 +++++++++++++++++++ .../Backends/Py/logic/models.py | 26 ++++++ .../Backends/Py/logic/project.py | 24 ++++++ .../Backends/Py/plotting_1d.py | 4 + .../Backends/Py/py_backend.py | 13 ++- .../Gui/Globals/BackendWrapper.qml | 4 +- .../Sidebar/Basic/Groups/SimulationRange.qml | 4 +- src_qt6/pyproject.toml | 2 +- 9 files changed, 157 insertions(+), 10 deletions(-) create mode 100644 src_qt6/EasyReflectometryApp/Backends/Py/experiment.py diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml index dcaa4789..c6b2ae28 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml @@ -9,7 +9,7 @@ QtObject { property double q_min: 4. property double q_max: 5. - property double q_step: 6. + property int q_elements: 6 // Setters function setScaling(value) { @@ -28,8 +28,8 @@ QtObject { function setQMax(value) { console.debug(`setQMax ${value}`) } - function setQStep(value) { - console.debug(`setQStep ${value}`) + function setQElements(value) { + console.debug(`setQElements ${value}`) } function load(path) { diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py new file mode 100644 index 00000000..7715e5d3 --- /dev/null +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -0,0 +1,84 @@ +from PySide6.QtCore import QObject +from PySide6.QtCore import Signal +from PySide6.QtCore import Slot +from PySide6.QtCore import Property + +from easyreflectometry import Project as ProjectLib + +from .logic.models import Models as ModelsLogic +from .logic.project import Project as ProjectLogic + + +class Experiment(QObject): + modelChanged = Signal() + + def __init__(self, project_lib: ProjectLib, parent=None): + super().__init__(parent) + self._model_logic = ModelsLogic(project_lib) + self._project_logic = ProjectLogic(project_lib) + + + @Property(float, notify=modelChanged) + def scaling(self) -> float: + return self._model_logic.scaling_at_current_index + + @Property(float, notify=modelChanged) + def background(self) -> float: + return self._model_logic.background_at_current_index + + @Property(float, notify=modelChanged) + def resolution(self) -> float: + return self._model_logic.resolution_at_current_index + + @Property(float, notify=modelChanged) + def q_min(self) -> float: + return self._project_logic.q_min + + @Property(float, notify=modelChanged) + def q_max(self) -> float: + return self._project_logic.q_max + + @Property(int, notify=modelChanged) + def q_elements(self) -> float: + return self._project_logic.q_elements + + # Setters + @Slot(int) + def setModelIndex(self, value: int) -> None: + self._model_logic.index = value + + @Slot(float) + def setScaling(self, new_value: float) -> None: + self._model_logic.set_scaling_at_current_index(new_value) + self.modelChanged.emit() + + @Slot(float) + def setBackground(self, new_value: float) -> None: + self._model_logic.set_background_at_current_index(new_value) + self.modelChanged.emit() + + @Slot(float) + def setResolution(self, new_value: float) -> None: + self._model_logic.set_resolution_at_current_index(new_value) + self.modelChanged.emit() + + @Slot(float) + def setQMin(self, new_value: float) -> None: + self._project_logic.set_q(new_value) + self.modelChanged.emit() + + @Slot(float) + def setQMax(self, new_value: float) -> None: + self._project_logic.set_q_max(new_value) + self.modelChanged.emit() + + @Slot(int) + def setQElements(self, new_value: float) -> None: + self._project_logic.set_q_elements(new_value) + self.modelChanged.emit() + + # Actions + @Slot(str) + def load(self, value: str) -> None: + self._project_logic.load_experiment(value) + self.modelChanged.emit() \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py index cefe559d..1b40a343 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py @@ -2,6 +2,7 @@ from easyreflectometry import Project as ProjectLib from easyreflectometry.model import ModelCollection +from easyreflectometry.model.resolution_functions import PercentageFhwm class Models: @@ -22,6 +23,21 @@ def index(self, new_value: Union[int, str]) -> None: def name_at_current_index(self) -> str: return self._models[self._model_index].name + @property + def scaling_at_current_index(self) -> float: + return self._models[self._model_index].scale.value + + @property + def background_at_current_index(self) -> float: + return self._models[self._model_index].background.value + + @property + def resolution_at_current_index(self) -> float: + if isinstance(self._models[self._model_index].resolution_function, PercentageFhwm): + return self._models[self._model_index].resolution_function.constant + else: + return '-' + @property def models(self) -> list[dict[str, str]]: return _from_models_collection_to_list_of_dicts(self._models) @@ -33,6 +49,16 @@ def models_names(self) -> list[str]: def set_name_at_current_index(self, new_value: str) -> None: self._models[self._model_index].name = new_value + def set_scaling_at_current_index(self, new_value: str) -> None: + self._models[self._model_index].scale.value = new_value + + def set_background_at_current_index(self, new_value: str) -> None: + self._models[self._model_index].background.value = new_value + + def set_resolution_at_current_index(self, new_value: str) -> None: + if isinstance(self._models[self._model_index].resolution_function, PercentageFhwm): + self._models[self._model_index].resolution_function.constant = float(new_value) + def remove_at_index(self, value: str) -> None: self._models.pop(int(value)) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py index 8991275e..d03a346e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py @@ -43,6 +43,27 @@ def description(self, new_value: str) -> None: def creation_date(self) -> str: return self._project_lib._info['modified'] + @property + def q_min(self) -> float: + return self._project_lib.q_min + + def set_q_min(self, new_value: str) -> None: + self._project_lib.q_min = float(new_value) + + @property + def q_max(self) -> float: + return self._project_lib.q_max + + def set_q_max(self, new_value: str) -> None: + self._project_lib.q_max = float(new_value) + + @property + def q_elements(self) -> int: + return self._project_lib.q_elements + + def set_q_elements(self, new_value: str) -> None: + self._project_lib.q_elements = int(new_value) + def info(self) -> dict: info = copy(self._project_lib._info) info['location'] = self._project_lib.path @@ -58,5 +79,8 @@ def save(self) -> None: def load(self, path: str) -> None: self._project_lib.load_from_json(path) + def load_experiment(self, path: str) -> None: + self._project_lib.load_experiment_for_model_at_index(path) + def reset(self) -> None: self._project_lib.reset() diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py index 6c5cb4ca..51d28eb2 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py @@ -40,6 +40,10 @@ def __init__(self, project_lib: ProjectLib, parent=None): 'sampleSerie': None, 'sldSerie': None, }, + 'experimentPage': { + 'experimentSerie': None, + }, + # 'analysisPage': { # 'measSerie': None, # QtCharts.QXYSeries, # 'bkgSerie': None, # QtCharts.QXYSeries, diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index b684036d..341646d3 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -4,6 +4,7 @@ from EasyApp.Logic.Logging import LoggerLevelHandler from easyreflectometry import Project as ProjectLib from. analysis import Analysis +from .experiment import Experiment from .home import Home from .plotting_1d import Plotting1d from .project import Project @@ -23,6 +24,7 @@ def __init__(self, parent=None): self._home = Home() self._project = Project(self._project_lib) self._sample = Sample(self._project_lib) + self._experiment = Experiment(self._project_lib) self._analysis = Analysis(self._project_lib) self._report = Report(self._project_lib) self._status = Status(self._project_lib) @@ -35,11 +37,12 @@ def __init__(self, parent=None): # Must be last to ensure all backend parts are created self._connect_backend_parts() - ######### Enable dot access in QML code to the page specific backend parts + # Enable dot access in QML code to the page specific backend parts + # Pages @Property('QVariant', constant=True) def home(self) -> Home: return self._home - + @Property('QVariant', constant=True) def project(self) -> Project: return self._project @@ -48,6 +51,10 @@ def project(self) -> Project: def sample(self) -> Project: return self._sample + @Property('QVariant', constant=True) + def experiment(self) -> Home: + return self._experiment + @Property('QVariant', constant=True) def analysis(self) -> Analysis: return self._analysis @@ -56,6 +63,7 @@ def analysis(self) -> Analysis: def report(self) -> Report: return self._report + # Other elements @Property('QVariant', constant=True) def status(self) -> Status: return self._status @@ -91,6 +99,7 @@ def _relay_project_page_created(self): def _relay_sample_page_models_index(self, index: int): self._plotting.setModelIndex(index) + self._experiment.setModelIndex(index) def _relay_sample_page_sample_changed(self): self._plotting.sldChartRangesChanged.emit() diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 3c5baa40..4b0427d0 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -160,8 +160,8 @@ QtObject { function experimentSetQMin(value) { activeBackend.experiment.setQMin(value) } readonly property var experimentQMax: activeBackend.experiment.q_max function experimentSetQMax(value) { activeBackend.experiment.setQMax(value) } - readonly property var experimentQStep: activeBackend.experiment.q_step - function experimentSetQStep(value) { activeBackend.experiment.setQStep(value) } + readonly property var experimentQElements: activeBackend.experiment.q_elements + function experimentSetQElements(value) { activeBackend.experiment.setQElements(value) } function experimentLoad(value) { activeBackend.experiment.load(value) } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml index 01b2aa3d..13e408d6 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml @@ -58,8 +58,8 @@ EaElements.GroupBox { // enabled: !ExGlobals.Constants.proxy.data.experimentLoaded width: textFieldWidth() units: "Å-1" - text: Globals.BackendWrapper.experimentQStep.toFixed(3) - onEditingFinished: Globals.BackendWrapper.experimentSetQStep(text) + text: Globals.BackendWrapper.experimentQElements + onEditingFinished: Globals.BackendWrapper.experimentSetQElements(text) } } // Logic diff --git a/src_qt6/pyproject.toml b/src_qt6/pyproject.toml index 89772002..f6bcb5e5 100644 --- a/src_qt6/pyproject.toml +++ b/src_qt6/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ requires-python = '>=3.11' dependencies = [ 'EasyApp @ git+https://github.com/EasyScience/EasyApp.git@develop', - 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@develop', + 'easyreflectometry @ git+https://github.com/EasyScience/EasyReflectometryLib.git@197-add-experiment-data-to-project-in-order-for-this-to-be-exposed-to-the-app', 'PySide6==6.6', 'toml', ] From 54a1ae9b62b17ffd4f0bc49363bbd8d85c2f7d63 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 23 Oct 2024 12:17:02 +0200 Subject: [PATCH 04/13] qml path to python str --- src_qt6/EasyReflectometryApp/Backends/Py/experiment.py | 5 +++-- .../Experiment/Sidebar/Basic/Groups/SimulationRange.qml | 9 --------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index 7715e5d3..50146e8f 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -3,6 +3,7 @@ from PySide6.QtCore import Slot from PySide6.QtCore import Property +from EasyApp.Logic.Utils.Utils import generalizePath from easyreflectometry import Project as ProjectLib from .logic.models import Models as ModelsLogic @@ -79,6 +80,6 @@ def setQElements(self, new_value: float) -> None: # Actions @Slot(str) - def load(self, value: str) -> None: - self._project_logic.load_experiment(value) + def load(self, path: str) -> None: + self._project_logic.load_experiment(generalizePath(path)) self.modelChanged.emit() \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml index 13e408d6..c462f7a1 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml @@ -71,14 +71,5 @@ EaElements.GroupBox { function textFieldWidth() { return EaStyle.Sizes.fontPixelSize * 7.0 } -/* - function updateParameters() { - const json = { - "x_min": parseFloat(xMin.text), - "x_max": parseFloat(xMax.text), - "x_step": parseFloat(xStep.text) - } - ExGlobals.Constants.proxy.simulation.qRangeAsObj = JSON.stringify(json) - }*/ } From 05b96d1daaddec3be5fce1533e9d13bc743e7e5a Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 23 Oct 2024 14:14:58 +0200 Subject: [PATCH 05/13] able to load experimental data and plot --- .../Backends/Mock/Plotting.qml | 4 +- .../Backends/Py/experiment.py | 28 ++--- .../Backends/Py/plotting_1d.py | 103 ++++++++++++++---- .../Backends/Py/py_backend.py | 9 +- .../Gui/Globals/BackendWrapper.qml | 2 +- .../Experiment/MainContent/ExperimentView.qml | 26 ++++- 6 files changed, 127 insertions(+), 45 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml index f011eb41..0ffc8de4 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml @@ -25,5 +25,7 @@ QtObject { console.debug(`setQtChartsSldSerieRef ${value1}, ${value2}, ${value3}`) } - + function setQtChartsExperimentSerieRef(value1, value2, value3) { + console.debug(`setQtChartsSldSerieRef ${value1}, ${value2}, ${value3}`) + } } diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index 50146e8f..085ab36b 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -11,7 +11,7 @@ class Experiment(QObject): - modelChanged = Signal() + experimentChanged = Signal() def __init__(self, project_lib: ProjectLib, parent=None): super().__init__(parent) @@ -19,27 +19,27 @@ def __init__(self, project_lib: ProjectLib, parent=None): self._project_logic = ProjectLogic(project_lib) - @Property(float, notify=modelChanged) + @Property(float, notify=experimentChanged) def scaling(self) -> float: return self._model_logic.scaling_at_current_index - @Property(float, notify=modelChanged) + @Property(float, notify=experimentChanged) def background(self) -> float: return self._model_logic.background_at_current_index - @Property(float, notify=modelChanged) + @Property(float, notify=experimentChanged) def resolution(self) -> float: return self._model_logic.resolution_at_current_index - @Property(float, notify=modelChanged) + @Property(float, notify=experimentChanged) def q_min(self) -> float: return self._project_logic.q_min - @Property(float, notify=modelChanged) + @Property(float, notify=experimentChanged) def q_max(self) -> float: return self._project_logic.q_max - @Property(int, notify=modelChanged) + @Property(int, notify=experimentChanged) def q_elements(self) -> float: return self._project_logic.q_elements @@ -51,35 +51,35 @@ def setModelIndex(self, value: int) -> None: @Slot(float) def setScaling(self, new_value: float) -> None: self._model_logic.set_scaling_at_current_index(new_value) - self.modelChanged.emit() + self.experimentChanged.emit() @Slot(float) def setBackground(self, new_value: float) -> None: self._model_logic.set_background_at_current_index(new_value) - self.modelChanged.emit() + self.experimentChanged.emit() @Slot(float) def setResolution(self, new_value: float) -> None: self._model_logic.set_resolution_at_current_index(new_value) - self.modelChanged.emit() + self.experimentChanged.emit() @Slot(float) def setQMin(self, new_value: float) -> None: self._project_logic.set_q(new_value) - self.modelChanged.emit() + self.experimentChanged.emit() @Slot(float) def setQMax(self, new_value: float) -> None: self._project_logic.set_q_max(new_value) - self.modelChanged.emit() + self.experimentChanged.emit() @Slot(int) def setQElements(self, new_value: float) -> None: self._project_logic.set_q_elements(new_value) - self.modelChanged.emit() + self.experimentChanged.emit() # Actions @Slot(str) def load(self, path: str) -> None: self._project_logic.load_experiment(generalizePath(path)) - self.modelChanged.emit() \ No newline at end of file + self.experimentChanged.emit() \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py index 51d28eb2..41c828a9 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py @@ -21,6 +21,7 @@ class Plotting1d(QObject): # chartRangesChanged = Signal() sldChartRangesChanged = Signal() sampleChartRangesChanged = Signal() + experimentChartRangesChanged = Signal() def __init__(self, project_lib: ProjectLib, parent=None): super().__init__(parent) @@ -41,9 +42,10 @@ def __init__(self, project_lib: ProjectLib, parent=None): 'sldSerie': None, }, 'experimentPage': { - 'experimentSerie': None, + 'measuredSerie': None, + 'varianceUpperSerie': None, + 'varianceLowerSerie': None, }, - # 'analysisPage': { # 'measSerie': None, # QtCharts.QXYSeries, # 'bkgSerie': None, # QtCharts.QXYSeries, @@ -54,29 +56,42 @@ def __init__(self, project_lib: ProjectLib, parent=None): @property def sample_data(self) -> DataSet1D: try: - sample_data = self._project_lib.sample_data_for_model_at_index() + data = self._project_lib.sample_data_for_model_at_index() except IndexError: - sample_data = DataSet1D( + data = DataSet1D( name='Sample Data empty', x=np.empty(0), y=np.empty(0), ) - return sample_data + return data @property def sld_data(self) -> DataSet1D: try: - sld_data = self._project_lib.sld_data_for_model_at_index() + data = self._project_lib.sld_data_for_model_at_index() except IndexError: - sld_data = DataSet1D( - name='Sample Data empty', + data = DataSet1D( + name='SLD Data empty', x=np.empty(0), y=np.empty(0), ) - return sld_data + return data - # Frontend/Backend public properties + @property + def experiment_data(self) -> DataSet1D: + try: + data = self._project_lib.experimental_data_for_model_at_index() + except IndexError: + data = DataSet1D( + name='Experiment Data empty', + x=np.empty(0), + y=np.empty(0), + ey=np.empty(0), + ex=np.empty(0), + ) + return data + # Sample @Property(float, notify=sampleChartRangesChanged) def sampleMaxX(self): return self.sample_data.x.max() @@ -93,6 +108,7 @@ def sampleMaxY(self): def sampleMinY(self): return np.log10(self.sample_data.y.min()) + # SLD @Property(float, notify=sldChartRangesChanged) def sldMaxX(self): return self.sld_data.x.max() @@ -109,6 +125,23 @@ def sldMaxY(self): def sldMinY(self): return self.sld_data.y.min() + # Experiment + @Property(float, notify=experimentChartRangesChanged) + def experimentMaxX(self): + return self.experiment_data.x.max() + + @Property(float, notify=experimentChartRangesChanged) + def experimentMinX(self): + return self.experiment_data.x.min() + + @Property(float, notify=experimentChartRangesChanged) + def experimentMaxY(self): + return np.log10(self.experiment_data.y.max()) + + @Property(float, notify=experimentChartRangesChanged) + def experimentMinY(self): + return np.log10(self.experiment_data.y.min()) + @Property(str, notify=currentLib1dChanged) def currentLib1d(self): return self._currentLib1d @@ -145,23 +178,29 @@ def setModelIndex(self, value: int) -> None: def setQtChartsReflectometrySerieRef(self, page:str, serie:str, ref: QObject): self._chartRefs['QtCharts'][page][serie] = ref console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) - self.drawCalculatedOnSampleChart() - self.chartRefsChanged.emit() +# self.drawCalculatedOnSampleChart() +# self.chartRefsChanged.emit() @Slot(str, str, 'QVariant') def setQtChartsSldSerieRef(self, page:str, serie:str, ref: QObject): self._chartRefs['QtCharts'][page][serie] = ref console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) - self.drawCalculatedOnSldChart() - self.chartRefsChanged.emit() +# self.drawCalculatedOnSldChart() +# self.chartRefsChanged.emit() - # Backend public methods + @Slot(str, str, 'QVariant') + def setQtChartsExperimentSerieRef(self, page:str, serie:str, ref: QObject): + self._chartRefs['QtCharts'][page][serie] = ref + console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) +# self.drawMeasuredOnExperimentChart() +# self.chartRefsChanged.emit() def refreshSamplePage(self): self.drawCalculatedOnSampleChart() self.drawCalculatedOnSldChart() - # Sample + def refreshExperimentPage(self): + self.drawMeasuredOnExperimentChart() def drawCalculatedOnSampleChart(self): if PLOT_BACKEND == 'QtCharts': @@ -171,22 +210,40 @@ def drawCalculatedOnSldChart(self): if PLOT_BACKEND == 'QtCharts': self.qtchartsReplaceCalculatedOnSldChartAndRedraw() - # QtCharts: Sample + def drawMeasuredOnExperimentChart(self): + if PLOT_BACKEND == 'QtCharts': + self.qtchartsReplaceMeasuredOnExperimentChartAndRedraw() def qtchartsReplaceCalculatedOnSampleChartAndRedraw(self): - sampleSerie = self._chartRefs['QtCharts']['samplePage']['sampleSerie'] - sampleSerie.clear() + series = self._chartRefs['QtCharts']['samplePage']['sampleSerie'] + series.clear() nr_points = 0 for point in self.sample_data.data_points(): - sampleSerie.append(point[0], np.log10(point[1])) + series.append(point[0], np.log10(point[1])) nr_points = nr_points + 1 console.debug(IO.formatMsg('sub', 'Calc curve', f'{nr_points} points', 'on sample page', 'replaced')) def qtchartsReplaceCalculatedOnSldChartAndRedraw(self): - sldSerie = self._chartRefs['QtCharts']['samplePage']['sldSerie'] - sldSerie.clear() + series = self._chartRefs['QtCharts']['samplePage']['sldSerie'] + series.clear() nr_points = 0 for point in self.sld_data.data_points(): - sldSerie.append(point[0], point[1]) + series.append(point[0], point[1]) nr_points = nr_points + 1 console.debug(IO.formatMsg('sub', 'Sld curve', f'{nr_points} points', 'on sample page', 'replaced')) + + def qtchartsReplaceMeasuredOnExperimentChartAndRedraw(self): + series_measured = self._chartRefs['QtCharts']['experimentPage']['measuredSerie'] + series_variance_upper = self._chartRefs['QtCharts']['experimentPage']['varianceUpperSerie'] + series_variance_lower = self._chartRefs['QtCharts']['experimentPage']['varianceLowerSerie'] + series_measured.clear() + series_variance_upper.clear() + series_variance_lower.clear() + nr_points = 0 + for point in self.experiment_data.data_points(): + series_measured.append(point[0], np.log10(point[1])) + series_variance_upper.append(point[0], np.log10(point[1] + np.sqrt(point[2]))) + series_variance_lower.append(point[0], np.log10(point[1] - np.sqrt(point[2]))) + nr_points = nr_points + 1 + + console.debug(IO.formatMsg('sub', 'Measurede curve', f'{nr_points} points', 'on experiment page', 'replaced')) \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index 341646d3..80fdfcde 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -80,6 +80,7 @@ def logger(self): def _connect_backend_parts(self) -> None: self._connect_project_page() self._connect_sample_page() + self._connect_example_page() ######### Project def _connect_project_page(self) -> None: @@ -90,6 +91,9 @@ def _connect_sample_page(self) -> None: self._sample.modelsIndexChanged.connect(self._relay_sample_page_models_index) self._sample.sampleChanged.connect(self._relay_sample_page_sample_changed) + def _connect_example_page(self) -> None: + self._experiment.experimentChanged.connect(self._relay_experiment_page_experiment_changed) + def _relay_project_page_name(self): self._status.projectChanged.emit() self._report.asHtmlChanged.emit() @@ -104,4 +108,7 @@ def _relay_sample_page_models_index(self, index: int): def _relay_sample_page_sample_changed(self): self._plotting.sldChartRangesChanged.emit() self._plotting.sampleChartRangesChanged.emit() - self._plotting.refreshSamplePage() \ No newline at end of file + self._plotting.refreshSamplePage() + + def _relay_experiment_page_experiment_changed(self): + self._plotting.refreshExperimentPage() \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 4b0427d0..bfc00fce 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -197,5 +197,5 @@ QtObject { function plottingSetQtChartsReflectometrySerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsReflectometrySerieRef(value1, value2, value3) } function plottingSetQtChartsSldSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSldSerieRef(value1, value2, value3) } - + function plottingSetQtChartsExperimentSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsExperimentSerieRef(value1, value2, value3) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index cc63f3c9..59b20527 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -131,9 +131,20 @@ Rectangle { bottomPadding: EaStyle.Sizes.fontPixelSize * 0.5 EaElements.Label { - text: '━ I (experiment)' + text: '━ I (Measured)' + color: chartView.measSerie.color + } + + EaElements.Label { + text: '━ I (Error upper)' color: chartView.calcSerie.color } + + EaElements.Label { + text: '━ I (Error lower)' + color: chartView.bkgSerie.color + } + } } // Legend @@ -151,11 +162,16 @@ Rectangle { Component.onCompleted: { Globals.References.pages.experiment.mainContent.experimentView = chartView - Globals.BackendWrapper.plottingSetQtChartsReflectometrySerieRef('experimentPage', - 'experimentSerie', - chartView.calcSerie) + Globals.BackendWrapper.plottingSetQtChartsExperimentSerieRef('experimentPage', + 'measuredSerie', + chartView.measSerie) + Globals.BackendWrapper.plottingSetQtChartsExperimentSerieRef('experimentPage', + 'varianceUpperSerie', + chartView.calcSerie) + Globals.BackendWrapper.plottingSetQtChartsExperimentSerieRef('experimentPage', + 'varianceLowerSerie', + chartView.bkgSerie) } - } // Logic From 83b4ea65475406ad4e3514c833e3b8b36a7c09f2 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 23 Oct 2024 14:25:20 +0200 Subject: [PATCH 06/13] status bar update --- .../EasyReflectometryApp/Backends/Py/logic/status.py | 12 +++--------- .../EasyReflectometryApp/Backends/Py/py_backend.py | 3 ++- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/status.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/status.py index 88e79052..d061eefa 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/status.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/status.py @@ -3,8 +3,6 @@ class Status: def __init__(self, project_lib: ProjectLib): self._project_lib = project_lib - self._phaseCount = '1' - self._experimentsCount = '1' self._variables = '31 (3 free, 28 fixed)' @property @@ -13,19 +11,15 @@ def project(self): @property def minimizer(self): - return self._project_lib._minimizer + return self._project_lib._minimizer.name @property def calculator(self): - return self._project_lib._calculator - - @property - def phase_count(self): - return self._phaseCount + return self._project_lib._calculator().name @property def experiments_count(self): - return self._experimentsCount + return str(len(self._project_lib._experiments.keys())) @property def variables(self): diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index 80fdfcde..5770e364 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -111,4 +111,5 @@ def _relay_sample_page_sample_changed(self): self._plotting.refreshSamplePage() def _relay_experiment_page_experiment_changed(self): - self._plotting.refreshExperimentPage() \ No newline at end of file + self._plotting.refreshExperimentPage() + self._status.experimentsCountChanged.emit() From e4095a3ba2712c343bdd5f4050852fd7c6079995 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 23 Oct 2024 14:52:41 +0200 Subject: [PATCH 07/13] adjustment to experiments --- .../Backends/Py/plotting_1d.py | 31 +++++-------------- .../Backends/Py/py_backend.py | 1 + .../Gui/ApplicationWindow.qml | 2 +- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py index 41c828a9..f8217c77 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py @@ -11,14 +11,12 @@ from .helpers import IO - PLOT_BACKEND = 'QtCharts' class Plotting1d(QObject): currentLib1dChanged = Signal() useAcceleration1dChanged = Signal() chartRefsChanged = Signal() -# chartRangesChanged = Signal() sldChartRangesChanged = Signal() sampleChartRangesChanged = Signal() experimentChartRangesChanged = Signal() @@ -33,10 +31,6 @@ def __init__(self, project_lib: ProjectLib, parent=None): self._chartRefs = { 'QtCharts': { -# 'experimentPage': { -# 'measSerie': None, # QtCharts.QXYSeries, -# 'bkgSerie': None, # QtCharts.QXYSeries -# }, 'samplePage': { 'sampleSerie': None, 'sldSerie': None, @@ -46,10 +40,6 @@ def __init__(self, project_lib: ProjectLib, parent=None): 'varianceUpperSerie': None, 'varianceLowerSerie': None, }, -# 'analysisPage': { -# 'measSerie': None, # QtCharts.QXYSeries, -# 'bkgSerie': None, # QtCharts.QXYSeries, -# } } } @@ -168,8 +158,6 @@ def useAcceleration1d(self, newValue): def chartRefs(self): return self._chartRefs - # Frontend/Backend public methods - @Slot(int) def setModelIndex(self, value: int) -> None: self._model_index = value @@ -178,22 +166,16 @@ def setModelIndex(self, value: int) -> None: def setQtChartsReflectometrySerieRef(self, page:str, serie:str, ref: QObject): self._chartRefs['QtCharts'][page][serie] = ref console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) -# self.drawCalculatedOnSampleChart() -# self.chartRefsChanged.emit() @Slot(str, str, 'QVariant') def setQtChartsSldSerieRef(self, page:str, serie:str, ref: QObject): self._chartRefs['QtCharts'][page][serie] = ref console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) -# self.drawCalculatedOnSldChart() -# self.chartRefsChanged.emit() @Slot(str, str, 'QVariant') def setQtChartsExperimentSerieRef(self, page:str, serie:str, ref: QObject): self._chartRefs['QtCharts'][page][serie] = ref console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) -# self.drawMeasuredOnExperimentChart() -# self.chartRefsChanged.emit() def refreshSamplePage(self): self.drawCalculatedOnSampleChart() @@ -234,16 +216,17 @@ def qtchartsReplaceCalculatedOnSldChartAndRedraw(self): def qtchartsReplaceMeasuredOnExperimentChartAndRedraw(self): series_measured = self._chartRefs['QtCharts']['experimentPage']['measuredSerie'] - series_variance_upper = self._chartRefs['QtCharts']['experimentPage']['varianceUpperSerie'] - series_variance_lower = self._chartRefs['QtCharts']['experimentPage']['varianceLowerSerie'] series_measured.clear() + series_variance_upper = self._chartRefs['QtCharts']['experimentPage']['varianceUpperSerie'] series_variance_upper.clear() + series_variance_lower = self._chartRefs['QtCharts']['experimentPage']['varianceLowerSerie'] series_variance_lower.clear() nr_points = 0 for point in self.experiment_data.data_points(): - series_measured.append(point[0], np.log10(point[1])) - series_variance_upper.append(point[0], np.log10(point[1] + np.sqrt(point[2]))) - series_variance_lower.append(point[0], np.log10(point[1] - np.sqrt(point[2]))) - nr_points = nr_points + 1 + if point[0] < self._project_lib.q_max and self._project_lib.q_min < point[0]: + series_measured.append(point[0], np.log10(point[1])) + series_variance_upper.append(point[0], np.log10(point[1] + np.sqrt(point[2]))) + series_variance_lower.append(point[0], np.log10(point[1] - np.sqrt(point[2]))) + nr_points = nr_points + 1 console.debug(IO.formatMsg('sub', 'Measurede curve', f'{nr_points} points', 'on experiment page', 'replaced')) \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index 5770e364..30b818df 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -113,3 +113,4 @@ def _relay_sample_page_sample_changed(self): def _relay_experiment_page_experiment_changed(self): self._plotting.refreshExperimentPage() self._status.experimentsCountChanged.emit() + self._sample.sampleChanged.emit() diff --git a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml index 6f98036f..da90aea5 100644 --- a/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml +++ b/src_qt6/EasyReflectometryApp/Gui/ApplicationWindow.qml @@ -104,7 +104,7 @@ EaComponents.ApplicationWindow { // Experiment tab EaElements.AppBarTabButton { id: experimentTabButton - enabled: true + enabled: false fontIcon: "microscope" text: qsTr("Experiment") ToolTip.text: qsTr("Experimental settings and data page") From 0fcf11e63837f8bba099e1688fbacbe1359d24b8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Wed, 23 Oct 2024 15:00:39 +0200 Subject: [PATCH 08/13] code cleaning --- .../Backends/Mock/Plotting.qml | 8 ++++++-- .../Backends/Py/plotting_1d.py | 12 +----------- .../Gui/Globals/BackendWrapper.qml | 8 +++++--- .../Experiment/MainContent/ExperimentView.qml | 18 +++++++++--------- .../Pages/Sample/MainContent/SampleView.qml | 9 +++------ .../Gui/Pages/Sample/MainContent/SldView.qml | 6 +++--- 6 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml index 0ffc8de4..17481ea5 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml @@ -17,7 +17,11 @@ QtObject { property double experimentMinY: -20. property double experimentMaxY: 20. - function setQtChartsReflectometrySerieRef(value1, value2, value3) { + function setQtChartsSerieRef(value1, value2, value3) { + console.debug(`setQtChartsSerieRef ${value1}, ${value2}, ${value3}`) + } + +/* function setQtChartsReflectometrySerieRef(value1, value2, value3) { console.debug(`setQtChartsReflectometrySerieRef ${value1}, ${value2}, ${value3}`) } @@ -27,5 +31,5 @@ QtObject { function setQtChartsExperimentSerieRef(value1, value2, value3) { console.debug(`setQtChartsSldSerieRef ${value1}, ${value2}, ${value3}`) - } + }*/ } diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py index f8217c77..45a2204f 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py @@ -163,17 +163,7 @@ def setModelIndex(self, value: int) -> None: self._model_index = value @Slot(str, str, 'QVariant') - def setQtChartsReflectometrySerieRef(self, page:str, serie:str, ref: QObject): - self._chartRefs['QtCharts'][page][serie] = ref - console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) - - @Slot(str, str, 'QVariant') - def setQtChartsSldSerieRef(self, page:str, serie:str, ref: QObject): - self._chartRefs['QtCharts'][page][serie] = ref - console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) - - @Slot(str, str, 'QVariant') - def setQtChartsExperimentSerieRef(self, page:str, serie:str, ref: QObject): + def setQtChartsSerieRef(self, page:str, serie:str, ref: QObject): self._chartRefs['QtCharts'][page][serie] = ref console.debug(IO.formatMsg('sub', f'{serie} on {page}: {ref}')) diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index bfc00fce..e674a9ef 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -195,7 +195,9 @@ QtObject { readonly property var plottingExperimentMinY: activeBackend.plotting.sampleMinY readonly property var plottingExperimentMaxY: activeBackend.plotting.sampleMaxY - function plottingSetQtChartsReflectometrySerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsReflectometrySerieRef(value1, value2, value3) } - function plottingSetQtChartsSldSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSldSerieRef(value1, value2, value3) } - function plottingSetQtChartsExperimentSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsExperimentSerieRef(value1, value2, value3) } + function plottingSetQtChartsSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSerieRef(value1, value2, value3) } + + // function plottingSetQtChartsReflectometrySerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsReflectometrySerieRef(value1, value2, value3) } + // function plottingSetQtChartsSldSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSldSerieRef(value1, value2, value3) } + // function plottingSetQtChartsExperimentSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsExperimentSerieRef(value1, value2, value3) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index 59b20527..4d31ba6f 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -162,15 +162,15 @@ Rectangle { Component.onCompleted: { Globals.References.pages.experiment.mainContent.experimentView = chartView - Globals.BackendWrapper.plottingSetQtChartsExperimentSerieRef('experimentPage', - 'measuredSerie', - chartView.measSerie) - Globals.BackendWrapper.plottingSetQtChartsExperimentSerieRef('experimentPage', - 'varianceUpperSerie', - chartView.calcSerie) - Globals.BackendWrapper.plottingSetQtChartsExperimentSerieRef('experimentPage', - 'varianceLowerSerie', - chartView.bkgSerie) + Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', + 'measuredSerie', + chartView.measSerie) + Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', + 'varianceUpperSerie', + chartView.calcSerie) + Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', + 'varianceLowerSerie', + chartView.bkgSerie) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml index 457af020..ad628816 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml @@ -147,19 +147,16 @@ Rectangle { } // ToolTips - // Data is set in python backend - Component.onCompleted: { Globals.References.pages.sample.mainContent.sampleView = chartView - Globals.BackendWrapper.plottingSetQtChartsReflectometrySerieRef('samplePage', - 'sampleSerie', - chartView.calcSerie) + Globals.BackendWrapper.plottingSetQtChartsSerieRef('samplePage', + 'sampleSerie', + chartView.calcSerie) } } // Logic - function showMainTooltip(chart, point, state) { if (!chartView.allowHover) { return diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml index 3cc473ec..a7fcdc38 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml @@ -151,9 +151,9 @@ Rectangle { Component.onCompleted: { Globals.References.pages.sample.mainContent.sldView = chartView - Globals.BackendWrapper.plottingSetQtChartsSldSerieRef('samplePage', - 'sldSerie', - chartView.calcSerie) + Globals.BackendWrapper.plottingSetQtChartsSerieRef('samplePage', + 'sldSerie', + chartView.calcSerie) } } From ba81ac9cf9effa7e96be5a5660cbeb1c95106d07 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 24 Oct 2024 06:44:13 +0200 Subject: [PATCH 09/13] seems to be working --- src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml | 2 +- src_qt6/EasyReflectometryApp/Backends/Py/experiment.py | 6 +++--- src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py | 4 ++-- src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py | 4 ++-- src_qt6/EasyReflectometryApp/Backends/Py/status.py | 7 +++---- .../EasyReflectometryApp/Gui/Globals/BackendWrapper.qml | 4 ---- .../Sidebar/Basic/Groups/InstrumentParameters.qml | 3 ++- .../Basic/Groups/{SimulationRange.qml => QRange.qml} | 8 ++++---- .../Gui/Pages/Experiment/Sidebar/Basic/Layout.qml | 2 +- 9 files changed, 18 insertions(+), 22 deletions(-) rename src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/{SimulationRange.qml => QRange.qml} (94%) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml index c6b2ae28..14059cf9 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml @@ -5,7 +5,7 @@ import QtQuick QtObject { property double scaling: 1. property double background: 2. - property double resolution: 3. + property string resolution: '3.00' property double q_min: 4. property double q_max: 5. diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index 085ab36b..a2be854a 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -27,8 +27,8 @@ def scaling(self) -> float: def background(self) -> float: return self._model_logic.background_at_current_index - @Property(float, notify=experimentChanged) - def resolution(self) -> float: + @Property(str, notify=experimentChanged) + def resolution(self) -> str: return self._model_logic.resolution_at_current_index @Property(float, notify=experimentChanged) @@ -65,7 +65,7 @@ def setResolution(self, new_value: float) -> None: @Slot(float) def setQMin(self, new_value: float) -> None: - self._project_logic.set_q(new_value) + self._project_logic.set_q_min(new_value) self.experimentChanged.emit() @Slot(float) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py index 1b40a343..5b20303e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/models.py @@ -32,9 +32,9 @@ def background_at_current_index(self) -> float: return self._models[self._model_index].background.value @property - def resolution_at_current_index(self) -> float: + def resolution_at_current_index(self) -> str: if isinstance(self._models[self._model_index].resolution_function, PercentageFhwm): - return self._models[self._model_index].resolution_function.constant + return str(self._models[self._model_index].resolution_function.constant) else: return '-' diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py index 30b818df..c2724b4d 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py @@ -52,7 +52,7 @@ def sample(self) -> Project: return self._sample @Property('QVariant', constant=True) - def experiment(self) -> Home: + def experiment(self) -> Experiment: return self._experiment @Property('QVariant', constant=True) @@ -69,7 +69,7 @@ def status(self) -> Status: return self._status @Property('QVariant', constant=True) - def plotting(self) -> Status: + def plotting(self) -> Plotting1d: return self._plotting @Property('QVariant', constant=True) diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/status.py b/src_qt6/EasyReflectometryApp/Backends/Py/status.py index 4e831469..33ee2d4e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/status.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/status.py @@ -30,10 +30,6 @@ def setProject(self, new_value: str): self._logic.project = new_value self.projectChanged.emit() - @Property(str, notify=phaseCountChanged) - def phaseCount(self): - return self._logic.phase_count - @Property(str, notify=experimentsCountChanged) def experimentsCount(self): return self._logic.experiments_count @@ -50,3 +46,6 @@ def minimizer(self): def variables(self): return self._logic.variables + @Property(str, notify=phaseCountChanged) + def phaseCount(self): + return None \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index e674a9ef..b72d6888 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -196,8 +196,4 @@ QtObject { readonly property var plottingExperimentMaxY: activeBackend.plotting.sampleMaxY function plottingSetQtChartsSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSerieRef(value1, value2, value3) } - - // function plottingSetQtChartsReflectometrySerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsReflectometrySerieRef(value1, value2, value3) } - // function plottingSetQtChartsSldSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsSldSerieRef(value1, value2, value3) } - // function plottingSetQtChartsExperimentSerieRef(value1, value2, value3) { activeBackend.plotting.setQtChartsExperimentSerieRef(value1, value2, value3) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml index 3388fe61..9f851cd9 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml @@ -55,7 +55,8 @@ EaElements.GroupBox { id: xStep width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 units: "%" - text: Globals.BackendWrapper.experimentResolution.toFixed(2) + text: Globals.BackendWrapper.experimentResolution + enabled: Globals.BackendWrapper.experimentResolution !== "-" onEditingFinished: Globals.BackendWrapper.experimentSetResolution(text) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml similarity index 94% rename from src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml rename to src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml index c462f7a1..5a28c781 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/SimulationRange.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml @@ -9,7 +9,7 @@ import easyApp.Gui.Logic as EaLogic import Gui.Globals as Globals EaElements.GroupBox { - title: qsTr("Simulation range") + title: qsTr("Q range of interest") // visible: Globals.Constants.proxy.data.experimentSkipped // enabled: Globals.Constants.proxy.data.experimentSkipped @@ -47,17 +47,17 @@ EaElements.GroupBox { onEditingFinished: Globals.BackendWrapper.experimentSetQMax(text) } - // Step + // Resolution EaComponents.TableViewLabel{ horizontalAlignment: Text.AlignRight width: labelWidth() - text: qsTr("q-step:") + text: qsTr("q-res:") } EaElements.Parameter { id: xStep // enabled: !ExGlobals.Constants.proxy.data.experimentLoaded width: textFieldWidth() - units: "Å-1" +// units: "Å-1" text: Globals.BackendWrapper.experimentQElements onEditingFinished: Globals.BackendWrapper.experimentSetQElements(text) } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml index 4c03f154..3b68d592 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml @@ -24,7 +24,7 @@ EaComponents.SideBarColumn { enabled: Globals.BackendWrapper.analysisIsFitFinished } - Groups.SimulationRange{ + Groups.QRange{ enabled: Globals.BackendWrapper.analysisIsFitFinished } From 273def7c1f8d1518e5ce92a65fa80a42a17b2f9f Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 24 Oct 2024 08:47:14 +0200 Subject: [PATCH 10/13] from elements to resolution --- .../Backends/Mock/Experiment.qml | 2 +- .../Backends/Py/experiment.py | 6 ++--- .../Backends/Py/logic/project.py | 8 +++---- .../Gui/Globals/BackendWrapper.qml | 2 +- .../Experiment/MainContent/ExperimentView.qml | 22 +++++++++---------- .../Sidebar/Basic/Groups/QRange.qml | 3 +-- 6 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml index 14059cf9..d7d77d2d 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml @@ -9,7 +9,7 @@ QtObject { property double q_min: 4. property double q_max: 5. - property int q_elements: 6 + property int q_resolution: 6 // Setters function setScaling(value) { diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index a2be854a..887ca8b3 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -40,8 +40,8 @@ def q_max(self) -> float: return self._project_logic.q_max @Property(int, notify=experimentChanged) - def q_elements(self) -> float: - return self._project_logic.q_elements + def q_resolution(self) -> int: + return self._project_logic.q_resolution # Setters @Slot(int) @@ -75,7 +75,7 @@ def setQMax(self, new_value: float) -> None: @Slot(int) def setQElements(self, new_value: float) -> None: - self._project_logic.set_q_elements(new_value) + self._project_logic.set_q_resolution(new_value) self.experimentChanged.emit() # Actions diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py index d03a346e..9df7f77b 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py @@ -58,11 +58,11 @@ def set_q_max(self, new_value: str) -> None: self._project_lib.q_max = float(new_value) @property - def q_elements(self) -> int: - return self._project_lib.q_elements + def q_resolution(self) -> int: + return self._project_lib.q_resolution - def set_q_elements(self, new_value: str) -> None: - self._project_lib.q_elements = int(new_value) + def set_q_resolution(self, new_value: str) -> None: + self._project_lib.q_resolution = int(new_value) def info(self) -> dict: info = copy(self._project_lib._info) diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index b72d6888..6a0b63dc 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -160,7 +160,7 @@ QtObject { function experimentSetQMin(value) { activeBackend.experiment.setQMin(value) } readonly property var experimentQMax: activeBackend.experiment.q_max function experimentSetQMax(value) { activeBackend.experiment.setQMax(value) } - readonly property var experimentQElements: activeBackend.experiment.q_elements + readonly property var experimentQResolution: activeBackend.experiment.q_resolution function experimentSetQElements(value) { activeBackend.experiment.setQElements(value) } function experimentLoad(value) { activeBackend.experiment.load(value) } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index 4d31ba6f..9f2388ae 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -22,6 +22,13 @@ Rectangle { EaCharts.QtCharts1dMeasVsCalc { id: chartView + property alias measured: chartView.measSerie + property alias errorUpper: chartView.calcSerie + property alias errorLower: chartView.bkgSerie + errorLower.color: errorUpper.color +// errorUpper.width: 1 +// errorLower.width: 1 + anchors.topMargin: EaStyle.Sizes.toolButtonHeight - EaStyle.Sizes.fontPixelSize - 1 useOpenGL: EaGlobals.Vars.useOpenGL @@ -136,15 +143,9 @@ Rectangle { } EaElements.Label { - text: '━ I (Error upper)' + text: '━ (Error)' color: chartView.calcSerie.color } - - EaElements.Label { - text: '━ I (Error lower)' - color: chartView.bkgSerie.color - } - } } // Legend @@ -164,13 +165,13 @@ Rectangle { Globals.References.pages.experiment.mainContent.experimentView = chartView Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', 'measuredSerie', - chartView.measSerie) + measured) Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', 'varianceUpperSerie', - chartView.calcSerie) + errorUpper) Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', 'varianceLowerSerie', - chartView.bkgSerie) + errorLower) } } @@ -188,4 +189,3 @@ Rectangle { dataToolTip.visible = state } } - diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml index 5a28c781..e5246a53 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml @@ -57,8 +57,7 @@ EaElements.GroupBox { id: xStep // enabled: !ExGlobals.Constants.proxy.data.experimentLoaded width: textFieldWidth() -// units: "Å-1" - text: Globals.BackendWrapper.experimentQElements + text: Globals.BackendWrapper.experimentQResolution onEditingFinished: Globals.BackendWrapper.experimentSetQElements(text) } } From 2369b76cd8bebe3213141e909c0b64df2af32906 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 24 Oct 2024 09:59:44 +0200 Subject: [PATCH 11/13] code cleaning --- .../Backends/Mock/Experiment.qml | 1 + .../Backends/Py/experiment.py | 5 +++- .../Backends/Py/logic/project.py | 12 ++++++++- .../Gui/Globals/BackendWrapper.qml | 2 ++ .../Experiment/MainContent/ExperimentView.qml | 23 ++++++++-------- .../Basic/Groups/InstrumentParameters.qml | 23 +++++----------- .../Sidebar/Basic/Groups/QRange.qml | 26 +++++++------------ 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml index d7d77d2d..9fd8382e 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Experiment.qml @@ -3,6 +3,7 @@ pragma Singleton import QtQuick QtObject { + property bool experimentalData: true property double scaling: 1. property double background: 2. property string resolution: '3.00' diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py index 887ca8b3..bba6372b 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/experiment.py @@ -18,7 +18,6 @@ def __init__(self, project_lib: ProjectLib, parent=None): self._model_logic = ModelsLogic(project_lib) self._project_logic = ProjectLogic(project_lib) - @Property(float, notify=experimentChanged) def scaling(self) -> float: return self._model_logic.scaling_at_current_index @@ -43,6 +42,10 @@ def q_max(self) -> float: def q_resolution(self) -> int: return self._project_logic.q_resolution + @Property(bool, notify=experimentChanged) + def experimentalData(self) -> bool: + return self._project_logic.experimental_data_at_current_index + # Setters @Slot(int) def setModelIndex(self, value: int) -> None: diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py index 9df7f77b..fb34c7e4 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py @@ -63,7 +63,17 @@ def q_resolution(self) -> int: def set_q_resolution(self, new_value: str) -> None: self._project_lib.q_resolution = int(new_value) - + + @property + def experimental_data_at_current_index(self) -> bool: + experimental_data = False + try: + self._project_lib.experimental_data_for_model_at_index() + experimental_data = True + except IndexError: + pass + return experimental_data + def info(self) -> dict: info = copy(self._project_lib._info) info['location'] = self._project_lib.path diff --git a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml index 6a0b63dc..298e7f10 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Globals/BackendWrapper.qml @@ -150,6 +150,8 @@ QtObject { ////////////////// // Experiment page ////////////////// + readonly property bool experimentExperimentalData: activeBackend.experiment.experimentalData + readonly property var experimentScaling: activeBackend.experiment.scaling function experimentSetScaling(value) { activeBackend.experiment.setScaling(value) } readonly property var experimentBackground: activeBackend.experiment.background diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index 9f2388ae..1ecec075 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -18,16 +18,15 @@ Rectangle { id: container color: EaStyle.Colors.chartBackground - EaCharts.QtCharts1dMeasVsCalc { id: chartView - property alias measured: chartView.measSerie - property alias errorUpper: chartView.calcSerie + property alias measured: chartView.calcSerie + property alias errorUpper: chartView.measSerie property alias errorLower: chartView.bkgSerie - errorLower.color: errorUpper.color -// errorUpper.width: 1 -// errorLower.width: 1 + bkgSerie.color: measSerie.color + measSerie.width: 1 + bkgSerie.width: 1 anchors.topMargin: EaStyle.Sizes.toolButtonHeight - EaStyle.Sizes.fontPixelSize - 1 @@ -139,12 +138,12 @@ Rectangle { EaElements.Label { text: '━ I (Measured)' - color: chartView.measSerie.color + color: chartView.calcSerie.color } EaElements.Label { - text: '━ (Error)' - color: chartView.calcSerie.color + text: '━ Error' + color: chartView.measSerie.color } } } @@ -163,15 +162,15 @@ Rectangle { Component.onCompleted: { Globals.References.pages.experiment.mainContent.experimentView = chartView - Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', - 'measuredSerie', - measured) Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', 'varianceUpperSerie', errorUpper) Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', 'varianceLowerSerie', errorLower) + Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', + 'measuredSerie', + measured) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml index 9f851cd9..7913ca8b 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/InstrumentParameters.qml @@ -1,62 +1,53 @@ import QtQuick 2.14 import QtQuick.Controls 2.14 -//import easyApp.Gui.Globals as EaGlobals import easyApp.Gui.Style as EaStyle import easyApp.Gui.Elements as EaElements import easyApp.Gui.Components as EaComponents -//import easyApp.Gui.Logic as EaLogic import Gui.Globals as Globals EaElements.GroupBox { title: qsTr("Instrumental parameters") -// title: qsTr(Globals.Constants.proxy.data.currentDataName + " instrumental parameters") -// visible: Globals.Constants.proxy.data.experimentLoaded + visible: Globals.BackendWrapper.experimentExperimentalData collapsed: true Row { spacing: EaStyle.Sizes.fontPixelSize EaComponents.TableViewLabel{ + text: qsTr("Scaling:") horizontalAlignment: Text.AlignRight width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - text: qsTr("Scaling:") } EaElements.Parameter { - id: xMin - enabled: true width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - units: "" text: Globals.BackendWrapper.experimentScaling.toFixed(3) onEditingFinished: Globals.BackendWrapper.experimentSetScaling(text) + enabled: Globals.BackendWrapper.experimentExperimentalData } - // Max EaComponents.TableViewLabel{ + text: qsTr("Background:") horizontalAlignment: Text.AlignRight width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - text: qsTr("Background:") } EaElements.Parameter { - id: xMax width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - units: "" text: Globals.BackendWrapper.experimentBackground.toFixed(2) onEditingFinished: Globals.BackendWrapper.experimentSetBackground(text) + enabled: Globals.BackendWrapper.experimentExperimentalData } - // Step EaComponents.TableViewLabel{ + text: qsTr("Resolution:") horizontalAlignment: Text.AlignRight width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - text: qsTr("Resolution:") } EaElements.Parameter { - id: xStep width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 units: "%" text: Globals.BackendWrapper.experimentResolution - enabled: Globals.BackendWrapper.experimentResolution !== "-" + enabled: Globals.BackendWrapper.experimentExperimentalData && Globals.BackendWrapper.experimentResolution !== "-" onEditingFinished: Globals.BackendWrapper.experimentSetResolution(text) } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml index e5246a53..eec160d6 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml @@ -10,52 +10,46 @@ import Gui.Globals as Globals EaElements.GroupBox { title: qsTr("Q range of interest") -// visible: Globals.Constants.proxy.data.experimentSkipped - -// enabled: Globals.Constants.proxy.data.experimentSkipped - + visible: Globals.BackendWrapper.experimentExperimentalData Row { spacing: EaStyle.Sizes.fontPixelSize * 0.5 - // Min EaComponents.TableViewLabel{ + text: qsTr("q-min:") horizontalAlignment: Text.AlignRight width: labelWidth() - text: qsTr("q-min:") } EaElements.Parameter { - id: xMin -// enabled: !ExGlobals.Constants.proxy.data.experimentLoaded +// id: xMin + enabled: Globals.BackendWrapper.experimentExperimentalData width: textFieldWidth() units: "Å-1" text: Globals.BackendWrapper.experimentQMin.toFixed(3) onEditingFinished: Globals.BackendWrapper.experimentSetQMin(text) } - // Max EaComponents.TableViewLabel{ + text: qsTr("q-max:") horizontalAlignment: Text.AlignRight width: labelWidth() - text: qsTr("q-max:") } EaElements.Parameter { - id: xMax -// enabled: !ExGlobals.Constants.proxy.data.experimentLoaded +// id: xMax + enabled: Globals.BackendWrapper.experimentExperimentalData width: textFieldWidth() units: "Å-1" text: Globals.BackendWrapper.experimentQMax.toFixed(3) onEditingFinished: Globals.BackendWrapper.experimentSetQMax(text) } - // Resolution EaComponents.TableViewLabel{ + text: qsTr("q-res:") horizontalAlignment: Text.AlignRight width: labelWidth() - text: qsTr("q-res:") } EaElements.Parameter { - id: xStep - // enabled: !ExGlobals.Constants.proxy.data.experimentLoaded + // id: xStep + enabled: Globals.BackendWrapper.experimentExperimentalData width: textFieldWidth() text: Globals.BackendWrapper.experimentQResolution onEditingFinished: Globals.BackendWrapper.experimentSetQElements(text) From 9a9a31136646d47e3ed157ebb9fd33856a082d32 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 24 Oct 2024 10:10:22 +0200 Subject: [PATCH 12/13] code cleaning --- .../Gui/Pages/Experiment/MainContent/ExperimentView.qml | 2 -- .../Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index 1ecec075..69bf8a4e 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -140,7 +140,6 @@ Rectangle { text: '━ I (Measured)' color: chartView.calcSerie.color } - EaElements.Label { text: '━ Error' color: chartView.measSerie.color @@ -159,7 +158,6 @@ Rectangle { // ToolTips // Data is set in python backend - Component.onCompleted: { Globals.References.pages.experiment.mainContent.experimentView = chartView Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml index eec160d6..93bbf287 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/QRange.qml @@ -20,7 +20,6 @@ EaElements.GroupBox { width: labelWidth() } EaElements.Parameter { -// id: xMin enabled: Globals.BackendWrapper.experimentExperimentalData width: textFieldWidth() units: "Å-1" @@ -34,7 +33,6 @@ EaElements.GroupBox { width: labelWidth() } EaElements.Parameter { -// id: xMax enabled: Globals.BackendWrapper.experimentExperimentalData width: textFieldWidth() units: "Å-1" @@ -48,19 +46,17 @@ EaElements.GroupBox { width: labelWidth() } EaElements.Parameter { - // id: xStep enabled: Globals.BackendWrapper.experimentExperimentalData width: textFieldWidth() text: Globals.BackendWrapper.experimentQResolution onEditingFinished: Globals.BackendWrapper.experimentSetQElements(text) } } + // Logic - function labelWidth() { return (EaStyle.Sizes.sideBarContentWidth - spacing * 5 - textFieldWidth() * 3) / 3 } - function textFieldWidth() { return EaStyle.Sizes.fontPixelSize * 7.0 } From 948024a5631e3a282d7b53b6f765e9cb798ba130 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 24 Oct 2024 10:28:28 +0200 Subject: [PATCH 13/13] code cleaning --- .../Backends/Mock/Plotting.qml | 12 -- .../Backends/Py/plotting_1d.py | 16 +- .../Gui/Pages/Experiment/Layout.qml | 16 +- .../Experiment/MainContent/ExperimentView.qml | 8 +- .../Sidebar/Basic/Groups/ExperimentalData.qml | 18 -- .../Pages/Experiment/Sidebar/Basic/Layout.qml | 175 ------------------ .../Gui/Pages/Sample/Layout.qml | 13 +- .../Pages/Sample/MainContent/SampleView.qml | 3 +- .../Gui/Pages/Sample/MainContent/SldView.qml | 5 +- 9 files changed, 15 insertions(+), 251 deletions(-) diff --git a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml index 17481ea5..cb1f2ce5 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml +++ b/src_qt6/EasyReflectometryApp/Backends/Mock/Plotting.qml @@ -20,16 +20,4 @@ QtObject { function setQtChartsSerieRef(value1, value2, value3) { console.debug(`setQtChartsSerieRef ${value1}, ${value2}, ${value3}`) } - -/* function setQtChartsReflectometrySerieRef(value1, value2, value3) { - console.debug(`setQtChartsReflectometrySerieRef ${value1}, ${value2}, ${value3}`) - } - - function setQtChartsSldSerieRef(value1, value2, value3) { - console.debug(`setQtChartsSldSerieRef ${value1}, ${value2}, ${value3}`) - } - - function setQtChartsExperimentSerieRef(value1, value2, value3) { - console.debug(`setQtChartsSldSerieRef ${value1}, ${value2}, ${value3}`) - }*/ } diff --git a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py index 45a2204f..2c232c51 100644 --- a/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py +++ b/src_qt6/EasyReflectometryApp/Backends/Py/plotting_1d.py @@ -37,8 +37,8 @@ def __init__(self, project_lib: ProjectLib, parent=None): }, 'experimentPage': { 'measuredSerie': None, - 'varianceUpperSerie': None, - 'varianceLowerSerie': None, + 'errorUpperSerie': None, + 'errorLowerSerie': None, }, } } @@ -207,16 +207,16 @@ def qtchartsReplaceCalculatedOnSldChartAndRedraw(self): def qtchartsReplaceMeasuredOnExperimentChartAndRedraw(self): series_measured = self._chartRefs['QtCharts']['experimentPage']['measuredSerie'] series_measured.clear() - series_variance_upper = self._chartRefs['QtCharts']['experimentPage']['varianceUpperSerie'] - series_variance_upper.clear() - series_variance_lower = self._chartRefs['QtCharts']['experimentPage']['varianceLowerSerie'] - series_variance_lower.clear() + series_error_upper = self._chartRefs['QtCharts']['experimentPage']['errorUpperSerie'] + series_error_upper.clear() + series_error_lower = self._chartRefs['QtCharts']['experimentPage']['errorLowerSerie'] + series_error_lower.clear() nr_points = 0 for point in self.experiment_data.data_points(): if point[0] < self._project_lib.q_max and self._project_lib.q_min < point[0]: series_measured.append(point[0], np.log10(point[1])) - series_variance_upper.append(point[0], np.log10(point[1] + np.sqrt(point[2]))) - series_variance_lower.append(point[0], np.log10(point[1] - np.sqrt(point[2]))) + series_error_upper.append(point[0], np.log10(point[1] + np.sqrt(point[2]))) + series_error_lower.append(point[0], np.log10(point[1] - np.sqrt(point[2]))) nr_points = nr_points + 1 console.debug(IO.formatMsg('sub', 'Measurede curve', f'{nr_points} points', 'on experiment page', 'replaced')) \ No newline at end of file diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml index 0759dab1..67aed043 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Layout.qml @@ -11,16 +11,7 @@ import Gui.Globals as Globals EaComponents.ContentPage { -// defaultInfo: Globals.BackendWrapper.projectCreated ? -// '' : -// qsTr('No project defined') - mainView: EaComponents.MainContent { -/* tabs: [ - EaElements.TabButton { text: qsTr('Reflectivity') }, - EaElements.TabButton { text: qsTr('SLD') } - ]*/ - items: [ Loader { source: `MainContent/ExperimentView.qml` @@ -40,12 +31,7 @@ EaComponents.ContentPage { // Loader { source: 'Sidebar/Advanced/Layout.qml' } ] -// continueButton.visible: false - - continueButton.text: qsTr('Continue') //Globals.BackendWrapper.projectCreated ? - //qsTr('Continue') : - // qsTr('Continue without project') - + continueButton.text: qsTr('Continue') continueButton.onClicked: { console.debug(`Clicking '${continueButton.text}' button ::: ${this}`) Globals.References.applicationWindow.appBarCentralTabs.analysisButton.enabled = true diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml index 69bf8a4e..89686a64 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/MainContent/ExperimentView.qml @@ -148,23 +148,21 @@ Rectangle { } // Legend - // ToolTips EaElements.ToolTip { id: dataToolTip arrowLength: 0 textFormat: Text.RichText } - // ToolTips - // Data is set in python backend + // Data is set in python backend (plotting_1d.py) Component.onCompleted: { Globals.References.pages.experiment.mainContent.experimentView = chartView Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', - 'varianceUpperSerie', + 'errorUpperSerie', errorUpper) Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', - 'varianceLowerSerie', + 'errorLowerSerie', errorLower) Globals.BackendWrapper.plottingSetQtChartsSerieRef('experimentPage', 'measuredSerie', diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml index d01f346e..50b55e95 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Groups/ExperimentalData.qml @@ -2,13 +2,8 @@ import QtQuick 2.14 import QtQuick.Controls 2.14 import QtQuick.Dialogs as Dialogs1 -// import easyApp.Gui.Globals as EaGlobals import easyApp.Gui.Style as EaStyle import easyApp.Gui.Elements as EaElements -//import easyApp.Gui.Components as EaComponents -// import easyApp.Gui.Logic as EaLogic - - import Gui.Globals as Globals @@ -16,11 +11,6 @@ EaElements.GroupBox { title: qsTr("Experimental data") collapsible: false enabled: Globals.Constants.proxy.fitter.isFitFinished - - - -// ExComponents.ExperimentDataExplorer {} - Row { spacing: EaStyle.Sizes.fontPixelSize @@ -38,19 +28,11 @@ EaElements.GroupBox { Loader { source: '../Popups/OpenExperimentFile.qml' } - -// onClicked: loadExperimentDataFileDialog.open() } EaElements.SideBarButton { -// enabled: !Globals.Constants.proxy.data.experimentLoaded && -// !Globals.Constants.proxy.data.experimentSkipped - fontIcon: "arrow-circle-right" text: qsTr("Continue without experiment data") - -// onClicked: Globals.Constants.proxy.data.experimentSkipped = true - Component.onCompleted: Globals.Variables.continueWithoutExperimentDataButton = this } } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml index 3b68d592..6fef4346 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Experiment/Sidebar/Basic/Layout.qml @@ -1,19 +1,11 @@ import QtQuick 2.14 import QtQuick.Controls 2.14 -//import QtQuick.Dialogs as Dialogs1 -//import easyApp.Gui.Globals as EaGlobals -//import easyApp.Gui.Style as EaStyle -//import easyApp.Gui.Elements as EaElements import easyApp.Gui.Components as EaComponents -//import easyApp.Gui.Logic as EaLogic import Gui.Globals as Globals import "./Groups" as Groups -//import Gui.Components 1.0 as ExComponents - - EaComponents.SideBarColumn { Groups.ExperimentalData{ @@ -27,172 +19,5 @@ EaComponents.SideBarColumn { Groups.QRange{ enabled: Globals.BackendWrapper.analysisIsFitFinished } - -/* - EaElements.GroupBox { - title: qsTr("Experimental data") - collapsible: false - enabled: Globals.Constants.proxy.fitter.isFitFinished - -// ExComponents.ExperimentDataExplorer {} - - Row { - spacing: EaStyle.Sizes.fontPixelSize - - EaElements.SideBarButton { - enabled: true - - fontIcon: "upload" - text: qsTr("Import data from local drive") - - onClicked: loadExperimentDataFileDialog.open() - } - - EaElements.SideBarButton { - enabled: !Globals.Constants.proxy.data.experimentLoaded && - !Globals.Constants.proxy.data.experimentSkipped - - fontIcon: "arrow-circle-right" - text: qsTr("Continue without experiment data") - - onClicked: Globals.Constants.proxy.data.experimentSkipped = true - - Component.onCompleted: Globals.Variables.continueWithoutExperimentDataButton = this - } - } - - Component.onCompleted: Globals.Variables.experimentalDataGroup = this - } -*/ - - - - // EaElements.GroupBox { - // title: qsTr("Instrument and experiment type") - // enabled: Globals.Constants.proxy.data.experimentLoaded || - // Globals.Constants.proxy.data.experimentSkipped - - // Column { - - // Row { - // spacing: EaStyle.Sizes.fontPixelSize - - // Column { - // spacing: EaStyle.Sizes.fontPixelSize * -0.5 - - // EaElements.Label { - // enabled: false - // text: qsTr("Facility") - // } - - // EaElements.ComboBox { - // width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 - // model: ["Unknown"] - // } - // } - - // Column { - // spacing: EaStyle.Sizes.fontPixelSize * -0.5 - - // EaElements.Label { - // enabled: false - // text: qsTr("Instrument") - // } - - // EaElements.ComboBox { - // width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 - // model: ["Unknown"] - // } - // } - - // Column { - // spacing: EaStyle.Sizes.fontPixelSize * -0.5 - - // EaElements.Label { - // enabled: false - // text: qsTr("Configuration") - // } - - // EaElements.ComboBox { - // width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 - // model: ["Unknown"] - // } - // } - // } - // } - // } - -/* - EaElements.GroupBox { - title: qsTr(Globals.Constants.proxy.data.currentDataName + " instrumental parameters") - visible: Globals.Constants.proxy.data.experimentLoaded - collapsed: false - Row { - spacing: EaStyle.Sizes.fontPixelSize - - EaComponents.TableViewLabel{ - horizontalAlignment: Text.AlignRight - width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - text: qsTr("Scaling:") - } - EaElements.Parameter { - id: xMin - enabled: true - width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - units: "" - text: Globals.Constants.proxy.data.currentScaling.toFixed(3) - onEditingFinished: Globals.Constants.proxy.data.setScaling(text) - } - - // Max - EaComponents.TableViewLabel{ - horizontalAlignment: Text.AlignRight - width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - text: qsTr("Background:") - } - EaElements.Parameter { - id: xMax - width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - units: "" - text: Globals.Constants.proxy.data.currentBackground.toExponential(2) - onEditingFinished: Globals.Constants.proxy.data.setBackground(text) - } - - // Step - EaComponents.TableViewLabel{ - horizontalAlignment: Text.AlignRight - width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - text: qsTr("Resolution:") - } - EaElements.Parameter { - id: xStep - width: (EaStyle.Sizes.sideBarContentWidth - 5 * EaStyle.Sizes.fontPixelSize) / 6 - units: "%" - text: Globals.Constants.proxy.data.currentResolution.toFixed(2) - onEditingFinished: Globals.Constants.proxy.data.setResolution(text) - } - } - } -*/ -/* - EaElements.GroupBox { - title: qsTr("Simulation range") - visible: Globals.Constants.proxy.data.experimentSkipped - - enabled: Globals.Constants.proxy.data.experimentSkipped - -// ExComponents.ExperimentSimulationSetup {} - } -*/ - // Load experimental data file dialog -/* - Dialogs1.FileDialog{ - id: loadExperimentDataFileDialog - - nameFilters: [ qsTr("Data files") + " (*.dat *.txt *.ort)" ] - - onAccepted: Globals.Constants.proxy.data.addExperimentDataFromOrt(fileUrl) - } -*/ } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml index 6535f645..d9aaae3e 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/Layout.qml @@ -10,11 +10,6 @@ import Gui.Globals as Globals EaComponents.ContentPage { - -// defaultInfo: Globals.BackendWrapper.projectCreated ? -// '' : -// qsTr('No project defined') - mainView: EaComponents.MainContent { tabs: [ EaElements.TabButton { text: qsTr('Reflectivity') }, @@ -44,15 +39,10 @@ EaComponents.ContentPage { // Loader { source: 'Sidebar/Advanced/Layout.qml' } ] -// continueButton.visible: false - - continueButton.text: qsTr('Continue') //Globals.BackendWrapper.projectCreated ? - //qsTr('Continue') : - // qsTr('Continue without project') + continueButton.text: qsTr('Continue') continueButton.onClicked: { console.debug(`Clicking '${continueButton.text}' button ::: ${this}`) -// Globals.References.applicationWindow.appBarCentralTabs.sampleButton.enabled = true Globals.References.applicationWindow.appBarCentralTabs.experimentButton.enabled = true Globals.References.applicationWindow.appBarCentralTabs.experimentButton.toggle() } @@ -60,5 +50,4 @@ EaComponents.ContentPage { Component.onCompleted: console.debug(`Sample page loaded ::: ${this}`) Component.onDestruction: console.debug(`Sample page destroyed ::: ${this}`) - } diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml index ad628816..855fe0e3 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SampleView.qml @@ -138,15 +138,14 @@ Rectangle { } // Legend - // ToolTips EaElements.ToolTip { id: dataToolTip arrowLength: 0 textFormat: Text.RichText } - // ToolTips + // Data is set in python backend (plotting_1d.py) Component.onCompleted: { Globals.References.pages.sample.mainContent.sampleView = chartView Globals.BackendWrapper.plottingSetQtChartsSerieRef('samplePage', diff --git a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml index a7fcdc38..84a764a8 100644 --- a/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml +++ b/src_qt6/EasyReflectometryApp/Gui/Pages/Sample/MainContent/SldView.qml @@ -138,17 +138,14 @@ Rectangle { } // Legend - // ToolTips EaElements.ToolTip { id: dataToolTip arrowLength: 0 textFormat: Text.RichText } - // ToolTips - - // Data is set in python backend + // Data is set in python backend (plotting_1d.py) Component.onCompleted: { Globals.References.pages.sample.mainContent.sldView = chartView Globals.BackendWrapper.plottingSetQtChartsSerieRef('samplePage',