diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9028bf37..e1fd1cc8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,6 +27,7 @@ jobs: sudo apt-get -o Acquire::Retries=3 update sudo apt-get -o Acquire::Retries=3 install libxcb-xinerama0 sudo apt-get -o Acquire::Retries=3 install libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xfixes0 + sudo apt-get -o Acquire::Retries=3 install libxcb-shape0 sudo apt-get -o Acquire::Retries=3 install libpulse-mainloop-glib0 # sudo apt-get install libgfortran4 # echo "QT_DEBUG_PLUGINS=1" >> $GITHUB_ENV diff --git a/README.md b/README.md index f6bb3e95..717064da 100644 --- a/README.md +++ b/README.md @@ -2,26 +2,26 @@ -**easyDiffraction** is a scientific software for modelling and analysis of diffraction data. Currently, **easyDiffraction** covers classical 1D unpolarized neutron powder diffraction data collected using constant wavelength (CW) or time-of-flight (TOF) diffractometers. +**EasyDiffraction** is a scientific software for modelling and analysis of diffraction data. Currently, **EasyDiffraction** covers classical 1D unpolarized neutron powder diffraction data collected using constant wavelength (CW) or time-of-flight (TOF) diffractometers. ![easyDiffraction Screenshot](./resources/images/ed_analysis_dark.png) -## What is easydiffraction for? +## What is EasyDiffraction for? -**easyDiffraction** allows simulation of diffraction patterns based on a structural model and refinement of its parameters. For refinement, the program uses a number of fitting engines (minimizers) such as [lmfit](https://lmfit.github.io/lmfit-py), [bumps](https://github.com/bumps/bumps) and [DFO-LS](https://github.com/numericalalgorithmsgroup/dfols). +**EasyDiffraction** allows simulation of diffraction patterns based on a structural model and refinement of its parameters. For refinement, the program uses a number of fitting engines (minimizers) such as [lmfit](https://lmfit.github.io/lmfit-py), [bumps](https://github.com/bumps/bumps) and [DFO-LS](https://github.com/numericalalgorithmsgroup/dfols). -**easyDiffraction** is similar to crystallographic programs like FullProf, Jana, GSAS, ShelX, etc. Unlike these programs **easyDiffraction** is based on _external_ crystallographic libraries (calculation engines) such as [CrysPy](https://github.com/ikibalin/cryspy), [CrysFML](https://code.ill.fr/scientific-software/crysfml) and [GSAS-II](https://subversion.xray.aps.anl.gov/trac/pyGSAS). This allows **easyDiffraction** to cover different functionality aspects within a single, intuitive and user-friendly graphical interface. These libraries are included with the installation so there is no need to compile/install them separately. +**EasyDiffraction** is similar to crystallographic programs like FullProf, Jana, GSAS, ShelX, etc. Unlike these programs **EasyDiffraction** is based on _external_ crystallographic libraries (calculation engines) such as [CrysPy](https://github.com/ikibalin/cryspy), [CrysFML](https://code.ill.fr/scientific-software/crysfml) and [GSAS-II](https://subversion.xray.aps.anl.gov/trac/pyGSAS) (experimental). This allows **EasyDiffraction** to cover different functionality aspects within a single, intuitive and user-friendly graphical interface. These libraries are included with the installation so there is no need to compile/install them separately. ## Main features -**easyDiffraction** is an open source project under the [BSD-3-Clause License](LICENSE.md). +**EasyDiffraction** is an open source project under the [BSD-3-Clause License](LICENSE.md). -**easyDiffraction** application is cross-platform, with support for Windows, macOS and Linux (Ubuntu). Its intuitive tabbed interface allows for a clear and defined data modelling and analysis workflow. There are also built-in step-by-step user guides and tutorials for new users. +**EasyDiffraction** application is cross-platform, with support for Windows, macOS and Linux (Ubuntu). Its intuitive tabbed interface allows for a clear and defined data modelling and analysis workflow. There are also built-in step-by-step user guides and tutorials for new users. -Current main features of **easydiffraction**: +Current main features of **Easydiffraction**: - Support for both constant-wavelength and time-of-flight 1D unpolarized neutron powder diffraction data. -- Simulations of diffraction pattern using [CrysPy](https://github.com/ikibalin/cryspy), [CrysFML](https://code.ill.fr/scientific-software/crysfml) and [GSAS-II](https://subversion.xray.aps.anl.gov/trac/pyGSAS) calculation engines. +- Simulations of diffraction pattern using [CrysPy](https://github.com/ikibalin/cryspy), [CrysFML](https://code.ill.fr/scientific-software/crysfml) and [GSAS-II](https://subversion.xray.aps.anl.gov/trac/pyGSAS) (experimental) calculation engines. - Structure refinement (yet unstable) using aforementioned engines. - Multiple minimization engines: [lmfit](https://lmfit.github.io/lmfit-py), [bumps](https://github.com/bumps/bumps) and [DFO-LS](https://github.com/numericalalgorithmsgroup/dfols). - Parameter constraints during refinement. @@ -32,7 +32,7 @@ Current main features of **easydiffraction**: - Interactive HTML and standard PDF report generation. - Undo/redo for both parameter changes and fitting. -Planned improvements / new functionality for **easydiffraction**: +Planned improvements / new functionality for **EasyDiffraction**: - Improved refinement. - Time-of-flight support using [CrysFML](https://code.ill.fr/scientific-software/crysfml) and [GSAS-II](https://subversion.xray.aps.anl.gov/trac/pyGSAS). @@ -49,25 +49,25 @@ Planned improvements / new functionality for **easydiffraction**: ### Downloading -The official **easyDiffraction** installer for Windows, macOS and Linux (Ubuntu) can be found [here](https://github.com/easyScience/easyDiffractionApp/releases): +The official **EasyDiffraction** installer for Windows, macOS and Linux (Ubuntu) can be found [here](https://github.com/easyScience/easyDiffractionApp/releases): ### Installing -Run **easyDiffraction** installer and follow the instructions. +Run **EasyDiffraction** installer and follow the instructions. ### Uninstalling -Run **MaintenanceTool** from the **easydiffraction** installation directory, select _Remove all components_ and follow the instructions. +Run **MaintenanceTool** from the **EasyDiffraction** installation directory, select _Remove all components_ and follow the instructions. ## Common Issues -- On `macOS`, if you see the message _easyDiffractionSetup.app can't be opened because it is from an unidentified developer_, do the following: -In the **Finder**, locate the **easydiffraction** installer application, then _control-click_ the installer icon, then choose _Open_ from the shortcut menu and finally click _Open_. +- On `macOS`, if you see the message _EasyDiffractionSetup.app can't be opened because it is from an unidentified developer_, do the following: +In the **Finder**, locate the **EasyDiffraction** installer application, then _control-click_ the installer icon, then choose _Open_ from the shortcut menu and finally click _Open_. - On `Linux` based system there can be the following error on startup: _Failed to create OpenGL context for format QSurfaceFormat_. This is due to a system OpenGL driver problem. Please re-install your graphics card drivers. ## Contributing -We absolutely welcome contributions. **easyDiffraction** is maintained by the [European Spallation Source ERIC (ESS)](https://europeanspallationsource.se/) and on a volunteer basis and thus we need to foster a community that can support user questions and develop new features to make this software a useful tool for all users while encouraging every member of the community to share their ideas. +We absolutely welcome contributions. **EasyDiffraction** is maintained by the [European Spallation Source ERIC (ESS)](https://europeanspallationsource.se/) and on a volunteer basis and thus we need to foster a community that can support user questions and develop new features to make this software a useful tool for all users while encouraging every member of the community to share their ideas. ## Get in touch diff --git a/RELEASE.md b/RELEASE.md index 05d9f597..c69944eb 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,4 +1,4 @@ -### Changes +### Bug Fixes -- The application installer on macOS is now signed. -- The Python-based backend framework has been updated from version 3.7 to 3.8. +- CI for all 3 platforms now works, including making a test video. +- CrysFML simulation now shows Bragg peaks. diff --git a/easyDiffractionApp/Gui/Components/SampleAtoms.qml b/easyDiffractionApp/Gui/Components/SampleAtoms.qml index 9ff3b7a4..785dd3ba 100644 --- a/easyDiffractionApp/Gui/Components/SampleAtoms.qml +++ b/easyDiffractionApp/Gui/Components/SampleAtoms.qml @@ -31,7 +31,6 @@ EaComponents.TableView { XmlRole { name: "label"; query: "label/value/string()" } XmlRole { name: "type"; query: "specie/value/string()" } - //XmlRole { name: "color"; query: "color/string()" } XmlRole { name: "x"; query: "fract_x/value/number()" } XmlRole { name: "y"; query: "fract_y/value/number()" } XmlRole { name: "z"; query: "fract_z/value/number()" } @@ -250,9 +249,19 @@ EaComponents.TableView { 'Ts' : '#000000', 'Og' : '#000000' } + // Simple case, e.g. Co if (colors.hasOwnProperty(symbol)) { return colors[symbol] } + // First 2 symbols, if valency is given for 2 characters element, e.g. Mn3+ + if (colors.hasOwnProperty(symbol.substring(0, 2))) { + return colors[symbol.substring(0, 2)] + } + // First symbol, if valency is given for 1 characters element, e.g. O2- + if (colors.hasOwnProperty(symbol.substring(0, 1))) { + return colors[symbol.substring(0, 1)] + } + // Transparent color if no elements found return 'transparent' } diff --git a/easyDiffractionApp/Gui/Components/SampleMsps.qml b/easyDiffractionApp/Gui/Components/SampleMsps.qml index d09c909d..2c85e5e5 100644 --- a/easyDiffractionApp/Gui/Components/SampleMsps.qml +++ b/easyDiffractionApp/Gui/Components/SampleMsps.qml @@ -17,9 +17,9 @@ import Gui.Globals 1.0 as ExGlobals EaComponents.TableView { property int numColumnWidth: EaStyle.Sizes.fontPixelSize * 2.5 property int labelColumnWidth: EaStyle.Sizes.fontPixelSize * 2.5 - property int typeColumnWidth: EaStyle.Sizes.fontPixelSize * 4.0 + property int typeColumnWidth: EaStyle.Sizes.fontPixelSize * 4.5 property int numFixedColumn: 3 - property int numFlexColumn: 7 + property int numFlexColumn: 6 property int flexColumnWidth: (width - numColumnWidth - labelColumnWidth - @@ -76,17 +76,24 @@ EaComponents.TableView { enabled: false width: typeColumnWidth headerText: "Type" - model: ["Cani", "Ciso"] + model: ["None", "Cani", "Ciso"] //currentIndex: model.indexOf(modelMspType) - Component.onCompleted: currentIndex = model.indexOf(modelMspType) + Component.onCompleted: { + currentIndex = model.indexOf(modelMspType) + if (currentIndex === -1) { + currentIndex = 0 + } + } } + /* EaComponents.TableViewTextInput { width: flexColumnWidth - headerText: "\u03C7Iso" + headerText: "Iso"//"\u03C7Iso" text: EaLogic.Utils.toFixed(model.mspIso) onEditingFinished: editParameterValue(model.mspIsoId, text) } + */ EaComponents.TableViewTextInput { width: flexColumnWidth diff --git a/easyDiffractionApp/Gui/Pages/Experiment/SideBarBasic.qml b/easyDiffractionApp/Gui/Pages/Experiment/SideBarBasic.qml index 758158c4..8785ca87 100644 --- a/easyDiffractionApp/Gui/Pages/Experiment/SideBarBasic.qml +++ b/easyDiffractionApp/Gui/Pages/Experiment/SideBarBasic.qml @@ -54,7 +54,7 @@ EaComponents.SideBarColumn { } EaElements.GroupBox { - title: qsTr("Instrument and experiment type") + title: qsTr("Experiment type") // qsTr("Instrument and experiment type") enabled: ExGlobals.Constants.proxy.experiment.experimentLoaded || ExGlobals.Constants.proxy.experiment.experimentSkipped @@ -116,7 +116,7 @@ EaComponents.SideBarColumn { EaElements.ComboBox { enabled: !ExGlobals.Constants.proxy.experiment.experimentLoaded - width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize) / 2 model: ["Neutron"] } } @@ -131,7 +131,7 @@ EaComponents.SideBarColumn { property string experimentType: ExGlobals.Constants.proxy.sample.experimentType enabled: !ExGlobals.Constants.proxy.experiment.experimentLoaded - width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize) / 2 textRole: "text" valueRole: "value" @@ -154,6 +154,11 @@ EaComponents.SideBarColumn { } } } + } + + Row { + visible: true + spacing: EaStyle.Sizes.fontPixelSize Column { EaElements.Label { @@ -163,14 +168,10 @@ EaComponents.SideBarColumn { EaElements.ComboBox { enabled: !ExGlobals.Constants.proxy.experiment.experimentLoaded - width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize) / 2 model: ["Powder"] } } - } - Row { - visible: true - spacing: EaStyle.Sizes.fontPixelSize Column { EaElements.Label { @@ -181,7 +182,7 @@ EaComponents.SideBarColumn { EaElements.ComboBox { property bool experimentType: ExGlobals.Constants.proxy.experiment.isSpinPolarized enabled: !ExGlobals.Constants.proxy.experiment.experimentLoaded - width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize * 2 ) / 3 + width: (EaStyle.Sizes.sideBarContentWidth - EaStyle.Sizes.fontPixelSize) / 2 textRole: "text" valueRole: "value" @@ -290,6 +291,7 @@ EaComponents.SideBarColumn { EaElements.GroupBox { title: qsTr("Associated phases") + last: !ExGlobals.Constants.proxy.experiment.isSpinPolarized enabled: ExGlobals.Constants.proxy.experiment.experimentLoaded || ExGlobals.Constants.proxy.experiment.experimentSkipped diff --git a/pyproject.toml b/pyproject.toml index a268f83f..f80c0da7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,18 +32,17 @@ easyApp = { git = 'https://github.com/easyScience/easyApp.git', rev = 'polarized #[tool.poetry.dev-dependencies] # PyInstaller -pyinstaller = '4.5.1' # 4.6-4.7 give "ModuleNotFoundError: No module named 'pip'" on Ubuntu, when run app +pyinstaller = '4.5.1' # 4.6-5.2 give "ModuleNotFoundError: No module named 'pip'" on Ubuntu, when run app #pyinstaller = { git = 'https://github.com/pyinstaller/pyinstaller.git', rev = 'develop' } pywin32-ctypes = { version = '^0.2.0', platform = 'win32' } pypiwin32 = { version = '^223', platform = 'win32' } -pefile = { version = '^2019.4.18', platform = 'win32' } +pefile = { version = '^2022.5.30', platform = 'win32' } # Misc toml = '^0.10.2' requests = '^2.25.1' dephell_licenses = '^0.1.7' ffmpeg-python = '^0.2.0' mss = '^6.1.0' -#opencv-python = '^4.5.1' opencv-python = '4.5.1.48' google-trans-new = '^1.1.9' gTTS = '^2.2.2' @@ -55,7 +54,7 @@ easyDiffraction = 'easyDiffractionApp.main:main' # CUSTOM CONFIG [release] -app_name = 'easyDiffraction' +app_name = 'EasyDiffraction' tag_template = 'v{VERSION}' title_template = 'Version {VERSION} ({DATE})' description_file = 'RELEASE.md' @@ -165,16 +164,16 @@ manual_exclude = [ 'mfc*', 'msvcp*', 'VCRUNTIME*', '*Qt*Scxml*', '*Qt*Sensors*', '*Qt*Sql*', '*Qt*VirtualKeyboard*', '*Qt*Wayland*' ] [ci.qtifw.setup] -version = '4.1.0' +version = '4.4.1' https_mirrors = ['download.qt.io', 'ftp.fau.de/qtproject', 'mirrors.dotsrc.org/qtproject'] base_path = 'official_releases/qt-installer-framework' file_name_base = 'QtInstallerFramework' -file_platform = { macos = 'macOS-x86_64', ubuntu = 'linux-x64', windows = 'windows-x86' } +file_platform = { macos = 'macOS-x64', ubuntu = 'linux-x64', windows = 'windows-x64' } file_ext = { macos = 'dmg', ubuntu = 'run', windows = 'exe' } installation_path = { macOS = '/Users/runner/Qt', Linux = '/home/runner/Qt', Windows = 'C:\Qt' } [ci.ffmpeg.macos] # https://evermeet.cx/ffmpeg/ffmpeg-4.3.zip -version = '4.3.1' +version = '5.0.1' base_url = 'https://evermeet.cx/ffmpeg' file_name_base = 'ffmpeg-' file_ext = '.zip' diff --git a/tools/Scripts/Config.py b/tools/Scripts/Config.py index bcf1f093..c3b56a52 100644 --- a/tools/Scripts/Config.py +++ b/tools/Scripts/Config.py @@ -52,7 +52,7 @@ def __init__(self, branch_name=None): self.repository_dir_suffix = self.__dict__['ci']['app']['setup']['repository_dir_suffix'] # Project - self.package_name = f'{self.app_name}App' + self.package_name = self.__dict__['tool']['poetry']['name'] self.license_file = self.__dict__['ci']['project']['license_file'] def __getitem__(self, key): diff --git a/tools/Scripts/InstallerControlScript.js b/tools/Scripts/InstallerControlScript.js index bc519217..4ce21d63 100644 --- a/tools/Scripts/InstallerControlScript.js +++ b/tools/Scripts/InstallerControlScript.js @@ -14,8 +14,8 @@ Controller.prototype.IntroductionPageCallback = function() if (installer.isInstaller()) { var msg = "" - msg += "

Welcome to the easyDiffraction Setup Wizard.

" - msg += "

easyDiffraction is a scientific software for modelling and analysis of diffraction data.

" + msg += "

Welcome to the EasyDiffraction Setup Wizard.

" + msg += "

EasyDiffraction is a scientific software for modelling and analysis of diffraction data.

" msg += "

For more details, please visit https://easydiffraction.org

" page.MessageLabel.setText(msg) } diff --git a/tools/Scripts/InstallerInstallScript.js b/tools/Scripts/InstallerInstallScript.js index 0e0fa5f0..f536a2e0 100644 --- a/tools/Scripts/InstallerInstallScript.js +++ b/tools/Scripts/InstallerInstallScript.js @@ -97,15 +97,15 @@ Component.prototype.createOperations = function() component.addOperation( "Copy", - "@TargetDir@/easyDiffraction.desktop", - "@HomeDir@/.local/share/applications/easyDiffraction.desktop" + "@TargetDir@/@ProductName@.desktop", + "@HomeDir@/.local/share/applications/@ProductName@.desktop" ) /* component.addOperation( "Copy", - "@TargetDir@/easyDiffraction.desktop", - "/usr/share/applications/easyDiffraction.desktop" + "@TargetDir@/@ProductName@.desktop", + "/usr/share/applications/@ProductName@.desktop" ) */ } diff --git a/tools/Scripts/MakeInstaller.py b/tools/Scripts/MakeInstaller.py index cc36945e..e40f7020 100644 --- a/tools/Scripts/MakeInstaller.py +++ b/tools/Scripts/MakeInstaller.py @@ -307,7 +307,7 @@ def createInstallerSourceDir(): def createOfflineInstaller(): try: - message = 'create installer' + message = 'create offline installer' qtifw_bin_dir_path = os.path.join(qtifwDirPath(), 'bin') qtifw_binarycreator_path = os.path.join(qtifw_bin_dir_path, 'binarycreator') qtifw_installerbase_path = os.path.join(qtifw_bin_dir_path, 'installerbase')