From 782f87dc8b9eba7bf4ef18e74b515dc0ad51c22f Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Tue, 14 May 2024 14:32:15 +0200 Subject: [PATCH 01/12] easyscience and eassyreflectometry packages, one line per import --- EasyReflectometryApp/Logic/DataStore.py | 12 +- .../Logic/Proxies/Calculator.py | 6 +- EasyReflectometryApp/Logic/Proxies/Data.py | 13 ++- EasyReflectometryApp/Logic/Proxies/Fitter.py | 12 +- .../Logic/Proxies/Material.py | 26 +++-- .../Logic/Proxies/Minimizer.py | 6 +- EasyReflectometryApp/Logic/Proxies/Model.py | 106 +++++++++++------- .../Logic/Proxies/Parameter.py | 17 ++- EasyReflectometryApp/Logic/Proxies/Project.py | 17 +-- .../Logic/Proxies/Simulation.py | 7 +- EasyReflectometryApp/Logic/Proxies/State.py | 9 +- .../Logic/Proxies/UndoRedo.py | 13 ++- EasyReflectometryApp/Logic/PyQmlProxy.py | 6 +- pyproject.toml | 4 +- tools/Scripts/FreezeApp.py | 22 ++-- 15 files changed, 167 insertions(+), 109 deletions(-) diff --git a/EasyReflectometryApp/Logic/DataStore.py b/EasyReflectometryApp/Logic/DataStore.py index 61dc6398..f629fc01 100644 --- a/EasyReflectometryApp/Logic/DataStore.py +++ b/EasyReflectometryApp/Logic/DataStore.py @@ -1,14 +1,14 @@ __author__ = 'github.com/wardsimon' -from abc import abstractmethod -from typing import Union, overload, TypeVar +from typing import Union +from typing import TypeVar -from easyCore import np -from easyCore.Objects.core import ComponentSerializer -from easyCore.Utils.io.dict import DictSerializer +import numpy as np +from easyscience.Objects.core import ComponentSerializer +from easyscience.Utils.io.dict import DictSerializer from collections.abc import Sequence -from EasyReflectometry.experiment.model import Model +from easyreflectometry.experiment.model import Model T = TypeVar('T') diff --git a/EasyReflectometryApp/Logic/Proxies/Calculator.py b/EasyReflectometryApp/Logic/Proxies/Calculator.py index 6cbb6a22..d0421344 100644 --- a/EasyReflectometryApp/Logic/Proxies/Calculator.py +++ b/EasyReflectometryApp/Logic/Proxies/Calculator.py @@ -1,8 +1,10 @@ __author__ = 'github.com/arm61' -from PySide2.QtCore import QObject, Signal, Property +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property -from easyCore.Utils.UndoRedo import property_stack_deco +from easyscience.Utils.UndoRedo import property_stack_deco class CalculatorProxy(QObject): diff --git a/EasyReflectometryApp/Logic/Proxies/Data.py b/EasyReflectometryApp/Logic/Proxies/Data.py index 4c21de02..ee9b9e7f 100644 --- a/EasyReflectometryApp/Logic/Proxies/Data.py +++ b/EasyReflectometryApp/Logic/Proxies/Data.py @@ -1,17 +1,20 @@ __author__ = 'github.com/arm61' -import pathlib from os import path from dicttoxml import dicttoxml -from PySide2.QtCore import QObject, Signal, Property, Slot +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot -from easyCore import np +import numpy as np from easyApp.Logic.Utils.Utils import generalizePath -from EasyReflectometryApp.Logic.DataStore import DataSet1D, DataStore +from EasyReflectometryApp.Logic.DataStore import DataSet1D +from EasyReflectometryApp.Logic.DataStore import DataStore -from EasyReflectometry.data import load +from easyreflectometry.data import load class DataProxy(QObject): diff --git a/EasyReflectometryApp/Logic/Proxies/Fitter.py b/EasyReflectometryApp/Logic/Proxies/Fitter.py index 39b38d3c..fd1d9f2c 100644 --- a/EasyReflectometryApp/Logic/Proxies/Fitter.py +++ b/EasyReflectometryApp/Logic/Proxies/Fitter.py @@ -1,12 +1,14 @@ __author__ = 'github.com/arm61' -import sys +from PySide2.QtCore import Signal +from PySide2.QtCore import QThread +from PySide2.QtCore import QObject +from PySide2.QtCore import Property +from PySide2.QtCore import Slot -from PySide2.QtCore import Signal, QThread, QObject, Property, Slot +from easyscience import borg -from easyCore import borg - -from EasyReflectometry.fitting import Fitter as easyFitter +from easyreflectometry.fitting import Fitter as easyFitter class Fitter(QThread): diff --git a/EasyReflectometryApp/Logic/Proxies/Material.py b/EasyReflectometryApp/Logic/Proxies/Material.py index 6287b48b..f88da129 100644 --- a/EasyReflectometryApp/Logic/Proxies/Material.py +++ b/EasyReflectometryApp/Logic/Proxies/Material.py @@ -1,14 +1,18 @@ __author__ = 'github.com/arm61' -from matplotlib import cm, colors +from matplotlib import cm +from matplotlib import colors -from PySide2.QtCore import QObject, Signal, Property, Slot +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot -from easyCore import borg -from easyCore.Utils.io.xml import XMLSerializer +from easyscience import borg +from easyscience.Utils.io.xml import XMLSerializer -from EasyReflectometry.sample import Material -from EasyReflectometry.sample import MaterialCollection +from easyreflectometry.sample import Material +from easyreflectometry.sample import MaterialCollection COLOURMAP = cm.get_cmap('Blues', 100) MIN_SLD = -3 @@ -43,9 +47,9 @@ def _defaultMaterials(self) -> MaterialCollection: :return: Three materials; Air, D2O and Si. """ return MaterialCollection( - Material.from_pars(0., 0., name='Air'), - Material.from_pars(6.335, 0., name='D2O'), - Material.from_pars(2.074, 0., name='Si') + Material(0., 0., name='Air'), + Material(6.335, 0., name='D2O'), + Material(2.074, 0., name='Si') ) # # # @@ -114,7 +118,7 @@ def addNewMaterials(self): """ borg.stack.enabled = False self._materials.append( - Material.from_pars(2.074, + Material(2.074, 0.000, name=f'Si', interface=self.parent._interface)) @@ -134,7 +138,7 @@ def duplicateSelectedMaterials(self): # Manual duplication instead of creating a copy to_dup = self._materials[self.currentMaterialsIndex] self._materials.append( - Material.from_pars(to_dup.sld.raw_value, + Material(to_dup.sld.raw_value, to_dup.isld.raw_value, name=to_dup.name, interface=self.parent._interface)) diff --git a/EasyReflectometryApp/Logic/Proxies/Minimizer.py b/EasyReflectometryApp/Logic/Proxies/Minimizer.py index 47988e37..26ff60f3 100644 --- a/EasyReflectometryApp/Logic/Proxies/Minimizer.py +++ b/EasyReflectometryApp/Logic/Proxies/Minimizer.py @@ -1,8 +1,10 @@ __author__ = 'github.com/arm61' -from PySide2.QtCore import QObject, Signal, Property +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property -from easyCore.Utils.UndoRedo import property_stack_deco +from easyscience.Utils.UndoRedo import property_stack_deco class MinimizerProxy(QObject): diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index b1f8386b..48e6fd5f 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -1,22 +1,24 @@ __author__ = 'github.com/arm61' -from ast import Mult - -from PySide2.QtCore import QObject, Signal, Property, Slot - -from easyCore import np, borg -from easyCore.Utils.io.xml import XMLSerializer -from easyCore.Utils.UndoRedo import property_stack_deco - -from EasyReflectometry.sample import Layer -from EasyReflectometry.sample import Multilayer -from EasyReflectometry.sample import RepeatingMultilayer -from EasyReflectometry.sample import SurfactantLayer -from EasyReflectometry.sample import Sample -from EasyReflectometry.experiment.model import Model -from EasyReflectometry.experiment.models import Models -from EasyReflectometry.calculators import CalculatorFactory -from numpy import isin +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot + +import numpy as np +from easyscience import borg +from easyscience.Utils.io.xml import XMLSerializer +from easyscience.Utils.UndoRedo import property_stack_deco + +from easyreflectometry.sample import Layer +from easyreflectometry.sample import Multilayer +from easyreflectometry.sample import RepeatingMultilayer +from easyreflectometry.sample import SurfactantLayer +from easyreflectometry.sample import Sample +from easyreflectometry.experiment import Model +from easyreflectometry.experiment import ModelCollection +from easyreflectometry.experiment import percentage_fhwm_resolution_function +from easyreflectometry.calculators import CalculatorFactory ITEM_LOOKUP = {'Multi-layer': Multilayer, 'Repeating Multi-layer': RepeatingMultilayer, 'Surfactant Layer': SurfactantLayer} COLORS =["#0173B2", "#DE8F05", "#029E73", "#D55E00", "#CC78BC", "#CA9161", "#FBAFE4", "#949494", "#ECE133", "#56B4E9"] @@ -43,7 +45,10 @@ def __init__(self, parent=None): self._items_as_xml = "" self._layers_as_xml = "" self._structure = self._defaultStructure() - self._model = Models.from_pars(self._defaultModel(structure=self._structure, interface=parent._interface)) + self._model = ModelCollection( + self._defaultModel(structure=self._structure, interface=parent._interface), + interface=parent._interface + ) self._colors = [COLORS[0]] self._current_layers_index = 0 @@ -57,32 +62,40 @@ def __init__(self, parent=None): def _defaultStructure(self) -> Sample: layers = [ - Layer.from_pars(self.parent._material_proxy._materials[0], + Layer(self.parent._material_proxy._materials[0], 0.0, 0.0, name='Vacuum Layer'), - Layer.from_pars(self.parent._material_proxy._materials[1], + Layer(self.parent._material_proxy._materials[1], 100.0, 3.0, name='Multi-layer'), - Layer.from_pars(self.parent._material_proxy._materials[2], + Layer(self.parent._material_proxy._materials[2], 0.0, 1.2, name='Si Layer'), ] items = [ - Multilayer.from_pars(layers[0], name='Superphase'), - Multilayer.from_pars(layers[1], name='Multi-layer'), - Multilayer.from_pars(layers[2], name='Subphase') + Multilayer(layers[0], name='Superphase'), + Multilayer(layers[1], name='Multi-layer'), + Multilayer(layers[2], name='Subphase') ] - structure = Sample.from_pars(*items) + structure = Sample(*items) structure[0].layers[0].thickness.enabled = False structure[0].layers[0].roughness.enabled = False structure[-1].layers[-1].thickness.enabled = False return structure def _defaultModel(self, structure: Sample, interface=None, name="Air-D2O-Si") -> Model: - return Model.from_pars(structure, 1, 0, 0, interface=interface, name=name) + resolution_function = percentage_fhwm_resolution_function(0) + return Model( + sample=structure, + scale=1, + background=0, + resolution_function=resolution_function, + interface=interface, + name=name, + ) # # # # Setters and getters @@ -215,22 +228,22 @@ def currentItemsType(self, type: str): return current_layers = self._model[self.currentModelIndex].sample[self.currentItemsIndex].layers if self._model[self.currentModelIndex].sample[self.currentItemsIndex].type == 'Surfactant Layer': - current_layers = Layer.from_pars(self.parent._material_proxy._materials[0], 10, 3) + current_layers = Layer(self.parent._material_proxy._materials[0], 10, 3) target_position = self.currentItemsIndex self._model[self.currentModelIndex].remove_item(self.currentItemsIndex) if type == 'Multi-layer': - new_item = Multilayer.from_pars( + new_item = Multilayer( layers=current_layers, name=type ) elif type == 'Repeating Multi-layer': - new_item = RepeatingMultilayer.from_pars( + new_item = RepeatingMultilayer( layers=current_layers, repetitions=1, name=type ) elif type == 'Surfactant Layer': - new_item = SurfactantLayer.from_pars( + new_item = SurfactantLayer( 'C32D64', 16, self.parent._material_proxy._materials[0], 0.0, 48.0, 3.0, 'C10H18NO8P', 10, self.parent._material_proxy._materials[0], 0.2, 48.0, 3.0, name=type @@ -347,7 +360,16 @@ def _onLayersChanged(self): j.name = j.material.name + ' Layer' sample = self._model[self.currentModelIndex].sample structure_dict = sample.as_dict() - self._pure = Model.from_pars(Sample.from_dict(structure_dict), 1, 0, 0, interface=self._pure_interface) + + resolution_function = percentage_fhwm_resolution_function(0) + self._pure = Model( + sample=Sample.from_dict(structure_dict), + scale=1, + background=0, + resolution_function=resolution_function, + interface=self._pure_interface, + ) +# self._pure = Model(Sample.from_dict(structure_dict), 1, 0, 0, interface=self._pure_interface) self._setLayersAsXml() # # # @@ -456,15 +478,15 @@ def addNewItems(self): self._model[self.currentModelIndex].sample[-1].layers[-1].thickness.enabled = True try: self._model[self.currentModelIndex].add_item( - Multilayer.from_pars( - Layer.from_pars(self.parent._material_proxy._materials[0], 10., + Multilayer( + Layer(self.parent._material_proxy._materials[0], 10., 1.2), f'Multi-layer {len(self._model[self.currentModelIndex].sample)+1}')) except IndexError: self.parent._material_proxy.addNewMaterials() self._model[self.currentModelIndex].add_item( - Multilayer.from_pars( - Layer.from_pars(self.parent._material_proxy._materials[0], 10., + Multilayer( + Layer(self.parent._material_proxy._materials[0], 10., 1.2), f'Multi-layer {len(self._model[self.currentModelIndex].sample)+1}')) self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False @@ -485,12 +507,12 @@ def duplicateSelectedItems(self): to_dup_layers = [] for i in to_dup.layers: to_dup_layers.append( - Layer.from_pars(i.material, + Layer(i.material, i.thickness.raw_value, i.roughness.raw_value, name=i.name, interface=self.parent._interface)) - dup_item = RepeatingMultilayer.from_pars(*to_dup_layers, + dup_item = RepeatingMultilayer(*to_dup_layers, to_dup.repetitions.raw_value, name=to_dup.name) elif isinstance(to_dup, SurfactantLayer): @@ -501,12 +523,12 @@ def duplicateSelectedItems(self): to_dup_layers = [] for i in to_dup.layers: to_dup_layers.append( - Layer.from_pars(i.material, + Layer(i.material, i.thickness.raw_value, i.roughness.raw_value, name=i.name, interface=self.parent._interface)) - dup_item = Multilayer.from_pars(*to_dup_layers, name=to_dup.name) + dup_item = Multilayer(*to_dup_layers, name=to_dup.name) self._model[self.currentModelIndex].add_item(dup_item) self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False self._model[self.currentModelIndex].sample[0].layers[0].roughness.enabled = False @@ -623,7 +645,7 @@ def addNewLayers(self): self._model[self.currentModelIndex].sample[-1].layers[-1].thickness.enabled = True try: self._model[self.currentModelIndex].sample[self.currentItemsIndex].add_layer( - Layer.from_pars( + Layer( self.parent._material_proxy._materials[0], 10.0, 1.2, @@ -646,7 +668,7 @@ def duplicateSelectedLayers(self): to_dup = self._model[self.currentModelIndex].sample[self.currentItemsIndex].layers[ self.currentLayersIndex] self._model[self.currentModelIndex].sample[self.currentItemsIndex].add_layer( - Layer.from_pars(to_dup.material, + Layer(to_dup.material, to_dup.thickness.raw_value, to_dup.roughness.raw_value, name=to_dup.name)) @@ -855,4 +877,4 @@ def getPureModelSld(self): def resetModel(self): self._structure = self._defaultStructure() - self._model = Models.from_pars(self._defaultModel(structure=self._structure, interface=self.parent._interface)) + self._model = ModelCollection(self._defaultModel(structure=self._structure, interface=self.parent._interface)) diff --git a/EasyReflectometryApp/Logic/Proxies/Parameter.py b/EasyReflectometryApp/Logic/Proxies/Parameter.py index 4e0f1518..cc1b6d8d 100644 --- a/EasyReflectometryApp/Logic/Proxies/Parameter.py +++ b/EasyReflectometryApp/Logic/Proxies/Parameter.py @@ -2,12 +2,17 @@ from typing import Union from distutils.util import strtobool -from PySide2.QtCore import QObject, Signal, Property, Slot -from easyCore.Fitting.Constraints import ObjConstraint, NumericConstraint, FunctionalConstraint -from easyCore.Utils.io.xml import XMLSerializer -from easyCore import borg -from easyCore import np -from easyCore.Utils.classTools import generatePath +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot +import numpy as np +from easyscience.Fitting.Constraints import ObjConstraint +from easyscience.Fitting.Constraints import NumericConstraint +from easyscience.Fitting.Constraints import FunctionalConstraint +from easyscience.Utils.io.xml import XMLSerializer +from easyscience import borg +from easyscience.Utils.classTools import generatePath class ParameterProxy(QObject): diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index 534b1591..3a4a17fb 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -4,19 +4,20 @@ import datetime import json -from PySide2.QtCore import QObject, Signal, Property, Slot +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec -import matplotlib.backends.backend_pdf -from easyCore import np +import numpy as np from easyApp.Logic.Utils.Utils import generalizePath from EasyReflectometryApp.Logic.DataStore import DataSet1D -from EasyReflectometry.sample import MaterialCollection -from EasyReflectometry.experiment.model import Model -from EasyReflectometry.experiment.models import Models +from easyreflectometry.sample import MaterialCollection +from easyreflectometry.experiment.model_collection import ModelCollection class ProjectProxy(QObject): @@ -230,8 +231,8 @@ def _loadProject(self): self.parent._interface.switch(inter) self.parent._model_proxy._colors = descr['colors'] - self.parent._model_proxy._model = Models.from_dict(descr['model']) - self.parent._material_proxy._materials = MaterialCollection.from_pars() + self.parent._model_proxy._model = ModelCollection.from_dict(descr['model']) + self.parent._material_proxy._materials = MaterialCollection() for model in self.parent._model_proxy._model: for sample in model.sample: for layer in sample.layers: diff --git a/EasyReflectometryApp/Logic/Proxies/Simulation.py b/EasyReflectometryApp/Logic/Proxies/Simulation.py index 7a3cd447..fa84edf8 100644 --- a/EasyReflectometryApp/Logic/Proxies/Simulation.py +++ b/EasyReflectometryApp/Logic/Proxies/Simulation.py @@ -2,9 +2,12 @@ import json -from PySide2.QtCore import QObject, Signal, Property, Slot +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot -from easyCore import np +import numpy as np class SimulationProxy(QObject): diff --git a/EasyReflectometryApp/Logic/Proxies/State.py b/EasyReflectometryApp/Logic/Proxies/State.py index 1edcd247..0a7444fe 100644 --- a/EasyReflectometryApp/Logic/Proxies/State.py +++ b/EasyReflectometryApp/Logic/Proxies/State.py @@ -1,9 +1,12 @@ __author__ = 'github.com/arm61' -from PySide2.QtCore import QObject, Signal, Property, Slot +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot -from easyCore import np -from easyCore.Utils.io.xml import XMLSerializer +import numpy as np +from easyscience.Utils.io.xml import XMLSerializer class StateProxy(QObject): diff --git a/EasyReflectometryApp/Logic/Proxies/UndoRedo.py b/EasyReflectometryApp/Logic/Proxies/UndoRedo.py index ce35a4cb..53969f8b 100644 --- a/EasyReflectometryApp/Logic/Proxies/UndoRedo.py +++ b/EasyReflectometryApp/Logic/Proxies/UndoRedo.py @@ -2,11 +2,14 @@ import re -from PySide2.QtCore import QObject, Signal, Property, Slot - -from easyCore import borg -from easyCore.Objects.Groups import BaseCollection -from easyCore.Objects.ObjectClasses import BaseObj +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property +from PySide2.QtCore import Slot + +from easyscience import borg +from easyscience.Objects.Groups import BaseCollection +from easyscience.Objects.ObjectClasses import BaseObj class UndoRedoProxy(QObject): diff --git a/EasyReflectometryApp/Logic/PyQmlProxy.py b/EasyReflectometryApp/Logic/PyQmlProxy.py index 520c12e7..0971bc01 100644 --- a/EasyReflectometryApp/Logic/PyQmlProxy.py +++ b/EasyReflectometryApp/Logic/PyQmlProxy.py @@ -1,8 +1,10 @@ __author__ = 'github.com/arm61' -from PySide2.QtCore import QObject, Signal, Property +from PySide2.QtCore import QObject +from PySide2.QtCore import Signal +from PySide2.QtCore import Property -from EasyReflectometry.calculators import CalculatorFactory +from easyreflectometry.calculators import CalculatorFactory from .Proxies.Calculator import CalculatorProxy from .Proxies.Data import DataProxy diff --git a/pyproject.toml b/pyproject.toml index 6499c636..fbf3d4cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ build-backend = "hatchling.build" # Information about the EasyReflectometryApp project. # Note that while the project is called EasyReflectometryApp # the application itself is EasyReflectometry. -name = "EasyReflectometry" +name = "easyreflectometryapp" version = "0.0.10-dev" description = "Making reflectometry data analysis and modelling easy." authors = [ @@ -31,7 +31,7 @@ classifiers = [ requires-python = ">=3.9, <3.10" dependencies = [ 'darkdetect>=0.3.1', - 'EasyReflectometryLib>=0.0.6', + 'easyreflectometry>=1.0.0', 'easyApp @ git+https://github.com/easyScience/easyApp.git@develop', 'matplotlib>=3.4.2', 'toml>=0.10.2', diff --git a/tools/Scripts/FreezeApp.py b/tools/Scripts/FreezeApp.py index a0285d27..52644066 100755 --- a/tools/Scripts/FreezeApp.py +++ b/tools/Scripts/FreezeApp.py @@ -1,14 +1,20 @@ __author__ = "github.com/AndrewSazonov" __version__ = '0.0.1' -import os, sys +import os +import sys from typing import List -import importlib import glob -import PySide2, shiboken2 -import refnx, refl1d, periodictable -import easyCore, EasyReflectometry, easyApp -import Functions, Config +import PySide2 +import shiboken2 +import refnx +import refl1d +import periodictable +import easyscience +import easyreflectometry +import easyApp +import Functions +import Config from PyInstaller.__main__ import run as pyInstallerMain @@ -38,8 +44,8 @@ def addedData() -> List[str]: {'from': refnx.__path__[0], 'to': 'refnx'}, {'from': refl1d.__path__[0], 'to': 'refl1d'}, {'from': periodictable.__path__[0], 'to': 'periodictable'}, - {'from': easyCore.__path__[0], 'to': 'easyCore'}, - {'from': EasyReflectometry.__path__[0], 'to': 'EasyReflectometryLib'}, + {'from': easyscience.__path__[0], 'to': 'easyscience'}, + {'from': easyreflectometry.__path__[0], 'to': 'easyreflectometryLib'}, {'from': easyApp.__path__[0], 'to': 'easyApp'}, {'from': 'utils.py', 'to': '.'}, {'from': 'pyproject.toml', 'to': '.'}] From 7c861b1bc8dfab2ebbeda3ed91f3c773bc472e2c Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 16 May 2024 11:53:37 +0200 Subject: [PATCH 02/12] minor adjustments to how project is saved and loaded --- EasyReflectometryApp/Logic/Proxies/Project.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Project.py b/EasyReflectometryApp/Logic/Proxies/Project.py index 3a4a17fb..3fa8662f 100644 --- a/EasyReflectometryApp/Logic/Proxies/Project.py +++ b/EasyReflectometryApp/Logic/Proxies/Project.py @@ -152,34 +152,34 @@ def _saveProject(self): projectPath = self.currentProjectPath project_save_filepath = os.path.join(projectPath, 'project.json') materials_in_model = [] - for i in self.parent._model_proxy._model: - for j in i.structure: - for k in j.layers: - materials_in_model.append(k.material) + for model in self.parent._model_proxy._model: + for assembly in model.sample: + for layer in assembly.layers: + materials_in_model.append(layer.material) materials_not_in_model = [] - for i in self.parent._material_proxy._materials: - if i not in materials_in_model: - materials_not_in_model.append(i) + for material in self.parent._material_proxy._materials: + if material not in materials_in_model: + materials_not_in_model.append(material) descr = { 'model': self.parent._model_proxy._model.as_dict(skip=['interface']), 'materials_not_in_model': - MaterialCollection(*materials_not_in_model).as_dict(skip=['interface']) + MaterialCollection(materials_not_in_model).as_dict(skip=['interface']) } if self.parent._data_proxy._data.experiments: descr['experiments'] = [] descr['experiments_models'] = [] descr['experiments_names'] = [] - for i in self.parent._data_proxy._data.experiments: + for experiment in self.parent._data_proxy._data.experiments: if self.parent._data_proxy._data.experiments[0].xe is not None: descr['experiments'].append([ - i.x, i.y, i.ye, i.xe + experiment.x, experiment.y, experiment.ye, experiment.xe ]) else: - descr['experiments'].append([i.x, i.y, i.ye]) - descr['experiments_models'].append(i.model.name) - descr['experiments_names'].append(i.name) + descr['experiments'].append([experiment.x, experiment.y, experiment.ye]) + descr['experiments_models'].append(experiment.model.name) + descr['experiments_names'].append(experiment.name) descr['experiment_skipped'] = self.parent._data_proxy._experiment_skipped descr['project_info'] = self._project_info @@ -232,7 +232,7 @@ def _loadProject(self): self.parent._model_proxy._colors = descr['colors'] self.parent._model_proxy._model = ModelCollection.from_dict(descr['model']) - self.parent._material_proxy._materials = MaterialCollection() + self.parent._material_proxy._materials = MaterialCollection([]) # Should be initialized with empty list to enforce no elements in collection for model in self.parent._model_proxy._model: for sample in model.sample: for layer in sample.layers: From 3bbf943ad659cffac007a7518daf55882b679ad8 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 16 May 2024 11:54:08 +0200 Subject: [PATCH 03/12] change to resolution class --- EasyReflectometryApp/Logic/Proxies/Model.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index 48e6fd5f..f1abd5d6 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -17,7 +17,7 @@ from easyreflectometry.sample import Sample from easyreflectometry.experiment import Model from easyreflectometry.experiment import ModelCollection -from easyreflectometry.experiment import percentage_fhwm_resolution_function +from easyreflectometry.experiment import PercentageFhwm from easyreflectometry.calculators import CalculatorFactory ITEM_LOOKUP = {'Multi-layer': Multilayer, 'Repeating Multi-layer': RepeatingMultilayer, 'Surfactant Layer': SurfactantLayer} @@ -87,12 +87,11 @@ def _defaultStructure(self) -> Sample: return structure def _defaultModel(self, structure: Sample, interface=None, name="Air-D2O-Si") -> Model: - resolution_function = percentage_fhwm_resolution_function(0) return Model( sample=structure, scale=1, background=0, - resolution_function=resolution_function, + resolution_function=PercentageFhwm(0), interface=interface, name=name, ) @@ -361,12 +360,11 @@ def _onLayersChanged(self): sample = self._model[self.currentModelIndex].sample structure_dict = sample.as_dict() - resolution_function = percentage_fhwm_resolution_function(0) self._pure = Model( sample=Sample.from_dict(structure_dict), scale=1, background=0, - resolution_function=resolution_function, + resolution_function=PercentageFhwm(0), interface=self._pure_interface, ) # self._pure = Model(Sample.from_dict(structure_dict), 1, 0, 0, interface=self._pure_interface) From 41a6010a9f2c41def4aa98f4a20553a2687d002b Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 16 May 2024 12:57:46 +0200 Subject: [PATCH 04/12] update for instance creation --- .../Logic/Proxies/Material.py | 28 +++++---- EasyReflectometryApp/Logic/Proxies/Model.py | 63 +++++++++++-------- 2 files changed, 55 insertions(+), 36 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Material.py b/EasyReflectometryApp/Logic/Proxies/Material.py index f88da129..07f8afe3 100644 --- a/EasyReflectometryApp/Logic/Proxies/Material.py +++ b/EasyReflectometryApp/Logic/Proxies/Material.py @@ -47,9 +47,9 @@ def _defaultMaterials(self) -> MaterialCollection: :return: Three materials; Air, D2O and Si. """ return MaterialCollection( - Material(0., 0., name='Air'), - Material(6.335, 0., name='D2O'), - Material(2.074, 0., name='Si') + Material(sld=0., isld=0., name='Air'), + Material(sld=6.335, isld=0., name='D2O'), + Material(sld=2.074, isld=0., name='Si') ) # # # @@ -118,10 +118,13 @@ def addNewMaterials(self): """ borg.stack.enabled = False self._materials.append( - Material(2.074, - 0.000, - name=f'Si', - interface=self.parent._interface)) + Material( + sld=2.074, + isld=0.000, + name='Si', + interface=self.parent._interface + ) + ) borg.stack.enabled = True self.materialsChanged.emit() self.parent.layersMaterialsChanged.emit() @@ -138,10 +141,13 @@ def duplicateSelectedMaterials(self): # Manual duplication instead of creating a copy to_dup = self._materials[self.currentMaterialsIndex] self._materials.append( - Material(to_dup.sld.raw_value, - to_dup.isld.raw_value, - name=to_dup.name, - interface=self.parent._interface)) + Material( + sld=to_dup.sld.raw_value, + isld=to_dup.isld.raw_value, + name=to_dup.name, + interface=self.parent._interface + ) + ) borg.stack.enabled = True self.materialsChanged.emit() self.parent.layersMaterialsChanged.emit() diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index f1abd5d6..c026b6cc 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -62,18 +62,24 @@ def __init__(self, parent=None): def _defaultStructure(self) -> Sample: layers = [ - Layer(self.parent._material_proxy._materials[0], - 0.0, - 0.0, - name='Vacuum Layer'), - Layer(self.parent._material_proxy._materials[1], - 100.0, - 3.0, - name='Multi-layer'), - Layer(self.parent._material_proxy._materials[2], - 0.0, - 1.2, - name='Si Layer'), + Layer( + material=self.parent._material_proxy._materials[0], + thichness=0.0, + rougheness=0.0, + name='Vacuum Layer' + ), + Layer( + material=self.parent._material_proxy._materials[1], + thickness=100.0, + roughness=3.0, + name='Multi-layer' + ), + Layer( + material=self.parent._material_proxy._materials[2], + thickness=0.0, + roughness=1.2, + name='Si Layer' + ), ] items = [ Multilayer(layers[0], name='Superphase'), @@ -521,11 +527,14 @@ def duplicateSelectedItems(self): to_dup_layers = [] for i in to_dup.layers: to_dup_layers.append( - Layer(i.material, - i.thickness.raw_value, - i.roughness.raw_value, - name=i.name, - interface=self.parent._interface)) + Layer( + material=i.material, + thickness=i.thickness.raw_value, + roughness=i.roughness.raw_value, + name=i.name, + interface=self.parent._interface + ) + ) dup_item = Multilayer(*to_dup_layers, name=to_dup.name) self._model[self.currentModelIndex].add_item(dup_item) self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False @@ -644,11 +653,12 @@ def addNewLayers(self): try: self._model[self.currentModelIndex].sample[self.currentItemsIndex].add_layer( Layer( - self.parent._material_proxy._materials[0], - 10.0, - 1.2, + material=self.parent._material_proxy._materials[0], + thickness=10.0, + roguhness=1.2, name=f'Layer {len(self._model[self.currentModelIndex].sample[self.currentItemsIndex].layers)}' - )) + ) + ) except IndexError: self.addNewItems() self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False @@ -666,10 +676,13 @@ def duplicateSelectedLayers(self): to_dup = self._model[self.currentModelIndex].sample[self.currentItemsIndex].layers[ self.currentLayersIndex] self._model[self.currentModelIndex].sample[self.currentItemsIndex].add_layer( - Layer(to_dup.material, - to_dup.thickness.raw_value, - to_dup.roughness.raw_value, - name=to_dup.name)) + Layer( + material=to_dup.material, + thickness=to_dup.thickness.raw_value, + roughness=to_dup.roughness.raw_value, + name=to_dup.name + ) + ) self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False self._model[self.currentModelIndex].sample[0].layers[0].roughness.enabled = False self._model[self.currentModelIndex].sample[-1].layers[-1].thickness.enabled = False From b0fabdb9fa87fa0c3ab6223b29e2f981ba68a16c Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Thu, 16 May 2024 14:26:53 +0200 Subject: [PATCH 05/12] class instantiation --- EasyReflectometryApp/Logic/Proxies/Model.py | 81 +++++++++++++++------ 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index c026b6cc..26b2352b 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -11,10 +11,12 @@ from easyscience.Utils.UndoRedo import property_stack_deco from easyreflectometry.sample import Layer +from easyreflectometry.sample import LayerAreaPerMolecule from easyreflectometry.sample import Multilayer from easyreflectometry.sample import RepeatingMultilayer from easyreflectometry.sample import SurfactantLayer from easyreflectometry.sample import Sample +from easyreflectometry.sample import Material from easyreflectometry.experiment import Model from easyreflectometry.experiment import ModelCollection from easyreflectometry.experiment import PercentageFhwm @@ -64,8 +66,8 @@ def _defaultStructure(self) -> Sample: layers = [ Layer( material=self.parent._material_proxy._materials[0], - thichness=0.0, - rougheness=0.0, + thickness=0.0, + roughness=0.0, name='Vacuum Layer' ), Layer( @@ -248,9 +250,30 @@ def currentItemsType(self, type: str): name=type ) elif type == 'Surfactant Layer': + air = Material(0, 0, 'Air') + tail_layer = LayerAreaPerMolecule( + molecular_formula='C32D64', + thickness=16, + solvent=air, + solvent_fraction=0.0, + area_per_molecule=48.0, + roughness=3, + name='DPPC Tail', + ) + d2o = Material(6.36, 0, 'D2O') + head_layer = LayerAreaPerMolecule( + molecular_formula='C10H18NO8P', + thickness=10.0, + solvent=d2o, + solvent_fraction=0.2, + area_per_molecule=48.0, + roughness=3.0, + name='DPPC Head', + ) + new_item = SurfactantLayer( - 'C32D64', 16, self.parent._material_proxy._materials[0], 0.0, 48.0, 3.0, - 'C10H18NO8P', 10, self.parent._material_proxy._materials[0], 0.2, 48.0, 3.0, + tail_layer=tail_layer, + head_layer=head_layer, name=type ) self._model[self.currentModelIndex].add_item(new_item) @@ -313,7 +336,7 @@ def conformalRoughness(self): else: return - @constrainApm.setter + @conformalRoughness.setter def conformalRoughness(self, x: bool): if self._model[self.currentModelIndex].sample[self.currentItemsIndex].conformal_roughness == x: return @@ -373,7 +396,6 @@ def _onLayersChanged(self): resolution_function=PercentageFhwm(0), interface=self._pure_interface, ) -# self._pure = Model(Sample.from_dict(structure_dict), 1, 0, 0, interface=self._pure_interface) self._setLayersAsXml() # # # @@ -483,16 +505,25 @@ def addNewItems(self): try: self._model[self.currentModelIndex].add_item( Multilayer( - Layer(self.parent._material_proxy._materials[0], 10., - 1.2), - f'Multi-layer {len(self._model[self.currentModelIndex].sample)+1}')) + Layer( + material=self.parent._material_proxy._materials[0], + thickness=10., + roughness=1.2 + ), + name=f'Multi-layer {len(self._model[self.currentModelIndex].sample)+1}' + ) + ) except IndexError: self.parent._material_proxy.addNewMaterials() self._model[self.currentModelIndex].add_item( Multilayer( - Layer(self.parent._material_proxy._materials[0], 10., - 1.2), - f'Multi-layer {len(self._model[self.currentModelIndex].sample)+1}')) + Layer( + material=self.parent._material_proxy._materials[0], + thicness=10., + roughness=1.2), + name=f'Multi-layer {len(self._model[self.currentModelIndex].sample)+1}' + ) + ) self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False self._model[self.currentModelIndex].sample[0].layers[0].roughness.enabled = False self._model[self.currentModelIndex].sample[-1].layers[-1].thickness.enabled = False @@ -511,14 +542,19 @@ def duplicateSelectedItems(self): to_dup_layers = [] for i in to_dup.layers: to_dup_layers.append( - Layer(i.material, - i.thickness.raw_value, - i.roughness.raw_value, - name=i.name, - interface=self.parent._interface)) - dup_item = RepeatingMultilayer(*to_dup_layers, - to_dup.repetitions.raw_value, - name=to_dup.name) + Layer( + material=i.material, + thickness=i.thickness.raw_value, + roughness=i.roughness.raw_value, + name=i.name, + interface=self.parent._interface + ) + ) + dup_item = RepeatingMultilayer( + *to_dup_layers, + repetitions=to_dup.repetitions.raw_value, + name=to_dup.name + ) elif isinstance(to_dup, SurfactantLayer): dup_item = SurfactantLayer.from_dict(to_dup.as_dict()) for i, layer in enumerate(dup_item.layers): @@ -535,7 +571,10 @@ def duplicateSelectedItems(self): interface=self.parent._interface ) ) - dup_item = Multilayer(*to_dup_layers, name=to_dup.name) + dup_item = Multilayer( + *to_dup_layers, + name=to_dup.name + ) self._model[self.currentModelIndex].add_item(dup_item) self._model[self.currentModelIndex].sample[0].layers[0].thickness.enabled = False self._model[self.currentModelIndex].sample[0].layers[0].roughness.enabled = False From eecab40a2c3275cee35e95ffdca9502588628cd2 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 09:34:53 +0200 Subject: [PATCH 06/12] new easyreflectometry version --- andpe/project.cif | 5 +++++ pyproject.toml | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 andpe/project.cif diff --git a/andpe/project.cif b/andpe/project.cif new file mode 100644 index 00000000..6de42e19 --- /dev/null +++ b/andpe/project.cif @@ -0,0 +1,5 @@ +_name 'Example Project' +_short_description 'reflectometry, 1D' +_samples None +_experiments None +_modified '17.05.2024 08:24' \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index fbf3d4cc..ba536199 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,8 +7,8 @@ build-backend = "hatchling.build" # Information about the EasyReflectometryApp project. # Note that while the project is called EasyReflectometryApp # the application itself is EasyReflectometry. -name = "easyreflectometryapp" -version = "0.0.10-dev" +name = "EasyReflectometryApp" +version = "0.0.10" description = "Making reflectometry data analysis and modelling easy." authors = [ {name = "Andrew R. McCluskey", email = "andrew.mccluskey@ess.eu"}, @@ -31,7 +31,7 @@ classifiers = [ requires-python = ">=3.9, <3.10" dependencies = [ 'darkdetect>=0.3.1', - 'easyreflectometry>=1.0.0', + 'easyreflectometry>=1.0.2', 'easyApp @ git+https://github.com/easyScience/easyApp.git@develop', 'matplotlib>=3.4.2', 'toml>=0.10.2', From 689e5fc033e12d099184d7d5d38489c0a4e9b14c Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 09:39:31 +0200 Subject: [PATCH 07/12] pyproject --- andpe/project.cif | 5 ----- pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) delete mode 100644 andpe/project.cif diff --git a/andpe/project.cif b/andpe/project.cif deleted file mode 100644 index 6de42e19..00000000 --- a/andpe/project.cif +++ /dev/null @@ -1,5 +0,0 @@ -_name 'Example Project' -_short_description 'reflectometry, 1D' -_samples None -_experiments None -_modified '17.05.2024 08:24' \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index ba536199..a0522987 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ build-backend = "hatchling.build" # Note that while the project is called EasyReflectometryApp # the application itself is EasyReflectometry. name = "EasyReflectometryApp" -version = "0.0.10" +version = "0.0.10-dev" description = "Making reflectometry data analysis and modelling easy." authors = [ {name = "Andrew R. McCluskey", email = "andrew.mccluskey@ess.eu"}, From 0934f41ea8c8c56ef25a91445c8884004d3f1571 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 09:51:02 +0200 Subject: [PATCH 08/12] pip upgrade --- .github/workflows/macos-windows-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos-windows-build.yml b/.github/workflows/macos-windows-build.yml index c6fbe3e3..b1b2d09c 100644 --- a/.github/workflows/macos-windows-build.yml +++ b/.github/workflows/macos-windows-build.yml @@ -36,7 +36,7 @@ jobs: python-version: 3.9 - name: Upgrade Pip - run: python -m pip install --upgrade pip + run: pip install --upgrade pip - name: Install with EasyReflectometry ci-dependencies run: pip install '.[ci]' From 6c661dbb1984fb1230affa184e79821d11f3cc3c Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 10:15:07 +0200 Subject: [PATCH 09/12] removed appended App --- tools/Scripts/Config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Scripts/Config.py b/tools/Scripts/Config.py index 21b83a10..af47038a 100644 --- a/tools/Scripts/Config.py +++ b/tools/Scripts/Config.py @@ -46,7 +46,7 @@ def __init__(self): self.repository_dir_suffix = self.__dict__['ci']['setup']['repository_dir_suffix'] # Project - self.package_name = f'{self.app_name}App' + self.package_name = f'{self.app_name}' self.license_file = self.__dict__['ci']['setup']['license_file'] # Certificates From 437f893b7188746d13d031b0f277e1626e76a65c Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 10:51:13 +0200 Subject: [PATCH 10/12] handle deprecated functionality --- EasyReflectometryApp/Logic/Proxies/Material.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Material.py b/EasyReflectometryApp/Logic/Proxies/Material.py index 07f8afe3..3194e06b 100644 --- a/EasyReflectometryApp/Logic/Proxies/Material.py +++ b/EasyReflectometryApp/Logic/Proxies/Material.py @@ -1,5 +1,6 @@ __author__ = 'github.com/arm61' +import matplotlib from matplotlib import cm from matplotlib import colors @@ -14,7 +15,7 @@ from easyreflectometry.sample import Material from easyreflectometry.sample import MaterialCollection -COLOURMAP = cm.get_cmap('Blues', 100) +COLOURMAP = matplotlib.colormaps['Blues'].resampled(100) MIN_SLD = -3 MAX_SLD = 15 From 50361387bac807eedd77492e852d7d7600880c1a Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 11:10:49 +0200 Subject: [PATCH 11/12] remove cm import --- EasyReflectometryApp/Logic/Proxies/Material.py | 1 - 1 file changed, 1 deletion(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Material.py b/EasyReflectometryApp/Logic/Proxies/Material.py index 3194e06b..7a02ea41 100644 --- a/EasyReflectometryApp/Logic/Proxies/Material.py +++ b/EasyReflectometryApp/Logic/Proxies/Material.py @@ -1,7 +1,6 @@ __author__ = 'github.com/arm61' import matplotlib -from matplotlib import cm from matplotlib import colors from PySide2.QtCore import QObject From a5140c2ed021da12c893827fd040f73483e2ed86 Mon Sep 17 00:00:00 2001 From: Andreas Pedersen Date: Fri, 17 May 2024 11:22:25 +0200 Subject: [PATCH 12/12] kv for instance creation --- EasyReflectometryApp/Logic/Proxies/Model.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/EasyReflectometryApp/Logic/Proxies/Model.py b/EasyReflectometryApp/Logic/Proxies/Model.py index 26b2352b..ee9058b4 100644 --- a/EasyReflectometryApp/Logic/Proxies/Model.py +++ b/EasyReflectometryApp/Logic/Proxies/Model.py @@ -250,7 +250,11 @@ def currentItemsType(self, type: str): name=type ) elif type == 'Surfactant Layer': - air = Material(0, 0, 'Air') + air = Material( + sld=0, + isld=0, + name='Air' + ) tail_layer = LayerAreaPerMolecule( molecular_formula='C32D64', thickness=16, @@ -260,7 +264,11 @@ def currentItemsType(self, type: str): roughness=3, name='DPPC Tail', ) - d2o = Material(6.36, 0, 'D2O') + d2o = Material( + sld=6.36, + isld=0, + name='D2O' + ) head_layer = LayerAreaPerMolecule( molecular_formula='C10H18NO8P', thickness=10.0,