Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,15 @@ pragma Singleton
import QtQuick

QtObject {
property bool created: true
readonly property bool created: true

readonly property var exportFormats: ["HTML", "PDF"]

readonly property string fileName: "summary"

readonly property string filePath: '/Users/andpe/ExampleProject/summary'

readonly property string fileUrl: 'file:///Users/andpe/ExampleProject/summary'

readonly property string asHtml: '
<!DOCTYPE html>
Expand Down Expand Up @@ -74,5 +82,16 @@ th, td { padding-right: 18px; }
</body>
</html>
'
function saveAsHtml() {
console.debug(`Saving HTML summary`)
}

function saveAsPdf() {
console.debug(`Saving PDF summary`)
}

function setFileName(value) {
console.debug(`setFileName ${value}`)
}

}
2 changes: 1 addition & 1 deletion src_qt6/EasyReflectometryApp/Backends/Mock/qmldir
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ singleton Analysis Analysis.qml
singleton Experiment Experiment.qml
singleton Home Home.qml
singleton Project Project.qml
singleton Report Report.qml
singleton Summary Summary.qml
singleton Sample Sample.qml
singleton Status Status.qml
singleton Plotting Plotting.qml
3 changes: 2 additions & 1 deletion src_qt6/EasyReflectometryApp/Backends/MockBackend.qml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ QtObject {
property var experiment: Backend.Experiment
property var home: Backend.Home
property var project: Backend.Project
property var report: Backend.Report
property var summary: Backend.Summary
property var sample: Backend.Sample
property var status: Backend.Status
property var plotting: Backend.Plotting
property var helpers: Backend.Helpers
}


5 changes: 3 additions & 2 deletions src_qt6/EasyReflectometryApp/Backends/Py/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
from PySide6.QtCore import Slot
from PySide6.QtCore import Property

from EasyApp.Logic.Utils.Utils import generalizePath
#from EasyApp.Logic.Utils.Utils import generalizePath
from easyreflectometry import Project as ProjectLib

from .helpers import IO
from .logic.models import Models as ModelsLogic
from .logic.project import Project as ProjectLogic

Expand Down Expand Up @@ -55,6 +56,6 @@ def setBackground(self, new_value: float) -> None:
# Actions
@Slot(str)
def load(self, path: str) -> None:
self._project_logic.load_experiment(generalizePath(path))
self._project_logic.load_experiment(IO.generalizePath(path))
self.experimentChanged.emit()
self.externalExperimentChanged.emit()
59 changes: 35 additions & 24 deletions src_qt6/EasyReflectometryApp/Backends/Py/helpers.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import numpy as np
import os
import sys
from uncertainties import ufloat
from urllib.parse import urlparse

from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QUrl
#from PySide6.QtCore import Slot
#from PySide6.QtCore import QObject


class IO:

@staticmethod
def generalizePath(fpath: str) -> str:
"""
Expand All @@ -14,13 +19,19 @@ def generalizePath(fpath: str) -> str:
:param URI rcfPath: URI to the file
:return URI filename: platform specific URI
"""
return fpath # NEED FIX: Check on different platforms
# filename = urlparse(fpath).path
# if not sys.platform.startswith("win"):
# return filename
# if filename[0] == '/':
# filename = filename[1:].replace('/', os.path.sep)
# return filename
filename = urlparse(fpath).path
if not sys.platform.startswith("win"):
return filename
if filename[0] == '/':
filename = filename[1:].replace('/', os.path.sep)
return filename

@staticmethod
def localFileToUrl(fpath: str) -> str:
if not sys.platform.startswith("win"):
return QUrl.fromLocalFile(fpath).toString()
url = QUrl.fromLocalFile(fpath.split(':')[-1]).toString()
return url

@staticmethod
def formatMsg(type, *args):
Expand Down Expand Up @@ -62,24 +73,24 @@ def toStdDevSmalestPrecision_OLD(value, std_dev):
value_with_std_dev_str = f'{ufloat(value, std_dev):{fmt}S}'
return value_str, std_dev_str, value_with_std_dev_str

def value_with_error_WEB(val, err, precision=2):
"""String with value and error in parenthesis with the number of digits given by precision."""
# Number of digits in the error
err_decimals = precision - int(np.floor(np.log10(err) + 1))
# Output error with a "precision" number of significant digits
err_out = round(err, err_decimals)
# Removes leading zeros for fractional errors
if err_out < 1:
err_out = int(round(err_out * 10**err_decimals))
err_format = 0
else:
err_format = int(np.clip(err_decimals, 0, np.inf))
# def value_with_error_WEB(val, err, precision=2):
# """String with value and error in parenthesis with the number of digits given by precision."""
# # Number of digits in the error
# err_decimals = precision - int(np.floor(np.log10(err) + 1))
# # Output error with a "precision" number of significant digits
# err_out = round(err, err_decimals)
# # Removes leading zeros for fractional errors
# if err_out < 1:
# err_out = int(round(err_out * 10**err_decimals))
# err_format = 0
# else:
# err_format = int(np.clip(err_decimals, 0, np.inf))

# Format the value to have the same significant digits as the error
val_out = round(val, err_decimals)
val_format = int(np.clip(err_decimals, 0, np.inf))
# # Format the value to have the same significant digits as the error
# val_out = round(val, err_decimals)
# val_format = int(np.clip(err_decimals, 0, np.inf))

return f'{val_out:.{val_format}f}({err_out:.{err_format}f})'
# return f'{val_out:.{val_format}f}({err_out:.{err_format}f})'


class Application(QApplication): # QGuiApplication crashes when using in combination with QtCharts
Expand Down
22 changes: 9 additions & 13 deletions src_qt6/EasyReflectometryApp/Backends/Py/logic/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
from easyscience.Constraints import NumericConstraint

from easyreflectometry import Project as ProjectLib
from easyreflectometry.utils import count_fixed_parameters
from easyreflectometry.utils import count_free_parameters

from typing import List


Expand All @@ -30,20 +33,10 @@ def set_current_index(self, new_value: int) -> None:
return False

def count_free_parameters(self) -> int:
count = 0
parameters = self._project_lib.parameters
for parameter in parameters:
if parameter.free:
count = count + 1
return count
return count_free_parameters(self._project_lib)

def count_fixed_parameters(self) -> int:
count = 0
parameters = self._project_lib.parameters
for parameter in parameters:
if not parameter.free:
count = count + 1
return count
return count_fixed_parameters(self._project_lib)

def set_current_parameter_value(self, new_value: str) -> bool:
parameters = self._project_lib.parameters
Expand Down Expand Up @@ -108,9 +101,12 @@ def add_constraint(
independent_obj=independent
)
elif arithmetic_operator == "" and independent_idx == -1:
relational_operator = relational_operator.replace("=", "==")
relational_operator = relational_operator.replace("&lt", ">")
relational_operator = relational_operator.replace("&gt", "<")
constaint = NumericConstraint(
dependent_obj=dependent,
operator=relational_operator.replace("=", "=="),
operator=relational_operator,
value=float(value)
)
else:
Expand Down
1 change: 1 addition & 0 deletions src_qt6/EasyReflectometryApp/Backends/Py/logic/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,4 @@ def load_experiment(self, path: str) -> None:

def reset(self) -> None:
self._project_lib.reset()
self._project_lib.default_model()
42 changes: 42 additions & 0 deletions src_qt6/EasyReflectometryApp/Backends/Py/logic/summary.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from pathlib import Path

from easyreflectometry import Project as ProjectLib
from easyreflectometry.summary import Summary as SummaryLib

class Summary:
def __init__(self, project_lib: ProjectLib):
self._created = True

self._project_lib = project_lib
self._summary = SummaryLib(project_lib)
self._file_name = "summary"

@property
def created(self) -> bool:
return self._created

@property
def file_name(self) -> str:
return self._file_name

@file_name.setter
def file_name(self, value: str) -> None:
self._file_name = value

@property
def file_path(self) -> Path:
return self._project_lib.path / self._file_name

@property
def as_html(self) -> str:
return self._summary.compile_html_summary()

def save_as_html(self) -> None:
if not self._project_lib.path.exists():
self._project_lib.path.mkdir(parents=True, exist_ok=True)
self._summary.save_html_summary(self.file_path.with_suffix('.html'))

def save_as_pdf(self) -> None:
if not self._project_lib.path.exists():
self._project_lib.path.mkdir(parents=True, exist_ok=True)
self._summary.save_pdf_summary(self.file_path.with_suffix('.pdf'))
2 changes: 2 additions & 0 deletions src_qt6/EasyReflectometryApp/Backends/Py/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Project(QObject):
externalCreatedChanged = Signal()
externalNameChanged = Signal()
externalProjectLoaded = Signal()
externalProjectReset = Signal()

def __init__(self, project_lib: ProjectLib, parent=None):
super().__init__(parent)
Expand Down Expand Up @@ -100,3 +101,4 @@ def reset(self) -> None:
self.locationChanged.emit()
self.externalCreatedChanged.emit()
self.externalNameChanged.emit()
self.externalProjectReset.emit()
22 changes: 14 additions & 8 deletions src_qt6/EasyReflectometryApp/Backends/Py/py_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from .project import Project
from .sample import Sample
from .status import Status
from .report import Report
from .summary import Summary


class PyBackend(QObject):
Expand All @@ -26,7 +26,7 @@ def __init__(self, parent=None):
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._summary = Summary(self._project_lib)
self._status = Status(self._project_lib)

# Plotting backend part
Expand Down Expand Up @@ -60,8 +60,8 @@ def analysis(self) -> Analysis:
return self._analysis

@Property('QVariant', constant=True)
def report(self) -> Report:
return self._report
def summary(self) -> Summary:
return self._summary

# Other elements
@Property('QVariant', constant=True)
Expand All @@ -87,7 +87,8 @@ def _connect_backend_parts(self) -> None:
def _connect_project_page(self) -> None:
self._project.externalNameChanged.connect(self._relay_project_page_name)
self._project.externalCreatedChanged.connect(self._relay_project_page_created)
self._project.externalProjectLoaded.connect(self._relay_project_page_project_loaded)
self._project.externalProjectLoaded.connect(self._relay_project_page_project_changed)
self._project.externalProjectReset.connect(self._relay_project_page_project_changed)

def _connect_sample_page(self) -> None:
self._sample.externalSampleChanged.connect(self._relay_sample_page_sample_changed)
Expand All @@ -106,12 +107,13 @@ def _connect_analysis_page(self) -> None:

def _relay_project_page_name(self):
self._status.statusChanged.emit()
self._report.asHtmlChanged.emit()
# self._summary.asHtmlChanged.emit()

def _relay_project_page_created(self):
self._report.createdChanged.emit()
self._summary.createdChanged.emit()
self._summary.summaryChanged.emit()

def _relay_project_page_project_loaded(self):
def _relay_project_page_project_changed(self):
self._sample.materialsTableChanged.emit()
self._sample.modelsTableChanged.emit()
self._sample.assembliesTableChanged.emit()
Expand All @@ -120,20 +122,24 @@ def _relay_project_page_project_loaded(self):
self._analysis.experimentsChanged.emit()
self._analysis._clearCacheAndEmitParametersChanged()
self._status.statusChanged.emit()
self._summary.summaryChanged.emit()
self._refresh_plots()

def _relay_sample_page_sample_changed(self):
self._analysis._clearCacheAndEmitParametersChanged()
self._status.statusChanged.emit()
self._summary.summaryChanged.emit()

def _relay_experiment_page_experiment_changed(self):
self._analysis.experimentsChanged.emit()
self._analysis._clearCacheAndEmitParametersChanged()
self._status.statusChanged.emit()
self._summary.summaryChanged.emit()

def _relay_analysis_page(self):
self._status.statusChanged.emit()
self._experiment.experimentChanged.emit()
self._summary.summaryChanged.emit()

def _refresh_plots(self):
self._plotting.sampleChartRangesChanged.emit()
Expand Down
Loading
Loading