nomad-material-processing 1.0.3__tar.gz → 1.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/CITATION.cff +10 -3
  2. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/PKG-INFO +5 -4
  3. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/explanation/levelsofschema.md +1 -1
  4. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/explanation/schemas.md +26 -14
  5. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/how_to/develop.md +1 -1
  6. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/index.md +7 -7
  7. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/tutorial/tutorial.md +1 -1
  8. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/pyproject.toml +9 -5
  9. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/general.py +1 -0
  10. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/solution/general.py +60 -19
  11. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/general.py +25 -11
  12. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing.egg-info/PKG-INFO +5 -4
  13. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/solution/test_solution_schema.py +25 -0
  14. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/.github/workflows/mkdocs-deploy.yml +0 -0
  15. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/.github/workflows/python-publish.yml +0 -0
  16. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/.github/workflows/python-test.yml +0 -0
  17. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/.gitignore +0 -0
  18. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/.vscode/settings.json +0 -0
  19. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/LICENSE +0 -0
  20. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/README.md +0 -0
  21. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/.gitignore +0 -0
  22. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/favicon.png +0 -0
  23. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/levelsschema.png +0 -0
  24. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/nomad-logo.png +0 -0
  25. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/nomad-plugin-logo.png +0 -0
  26. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/use-built-in-schema-1.png +0 -0
  27. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/assets/use-built-in-schema-2.png +0 -0
  28. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/contact.md +0 -0
  29. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/explanation/data_model.md +0 -0
  30. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/how_to/install.md +0 -0
  31. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/how_to/use_this_plugin.md +0 -0
  32. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/how_to/use_this_plugin_old.md +0 -0
  33. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/reference/references.md +0 -0
  34. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/stylesheets/extra.css +0 -0
  35. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/docs/theme/partials/header.html +0 -0
  36. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/mkdocs.yml +0 -0
  37. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/setup.cfg +0 -0
  38. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/setup.py +0 -0
  39. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/__init__.py +0 -0
  40. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/combinatorial.py +0 -0
  41. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/crystal_growth.py +0 -0
  42. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/epitaxy.py +0 -0
  43. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/solution/__init__.py +0 -0
  44. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/solution/utils.py +0 -0
  45. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/utils.py +0 -0
  46. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/__init__.py +0 -0
  47. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/cvd/__init__.py +0 -0
  48. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/cvd/general.py +0 -0
  49. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/cvd/movpe.py +0 -0
  50. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/pvd/__init__.py +0 -0
  51. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/pvd/general.py +0 -0
  52. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/pvd/mbe.py +0 -0
  53. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/pvd/pld.py +0 -0
  54. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/pvd/sputtering.py +0 -0
  55. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing/vapor_deposition/pvd/thermal.py +0 -0
  56. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing.egg-info/SOURCES.txt +0 -0
  57. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing.egg-info/dependency_links.txt +0 -0
  58. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing.egg-info/entry_points.txt +0 -0
  59. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing.egg-info/requires.txt +0 -0
  60. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/src/nomad_material_processing.egg-info/top_level.txt +0 -0
  61. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/conftest.py +0 -0
  62. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_crystal_growth.archive.yaml +0 -0
  63. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_czochralski_process.archive.yaml +0 -0
  64. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_epitaxy.archive.yaml +0 -0
  65. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_metal_organic_vapor_phase_epitaxy.archive.yaml +0 -0
  66. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_molecular_beam_epitaxy.archive.yaml +0 -0
  67. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_physical_vapor_deposition.archive.yaml +0 -0
  68. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_pulsed_laser_deposition.archive.yaml +0 -0
  69. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_sample_deposition.archive.yaml +0 -0
  70. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_solution.archive.yaml +0 -0
  71. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_solution_component.archive.yaml +0 -0
  72. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_sputter_deposition.archive.yaml +0 -0
  73. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_substrate.archive.yaml +0 -0
  74. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_thermal_evaporation.archive.yaml +0 -0
  75. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_thin_film.archive.yaml +0 -0
  76. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_thin_film_stack.archive.yaml +0 -0
  77. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/data/test_vapor_phase_epitaxy.archive.yaml +0 -0
  78. {nomad_material_processing-1.0.3 → nomad_material_processing-1.0.5}/tests/test_schema.py +0 -0
@@ -1,5 +1,5 @@
1
1
  cff-version: 1.2.0
2
- title: nomad-material-processing
2
+ title: NOMAD Material Processing Plugin
3
3
  message: >-
4
4
  If you use this software, please cite it using the
5
5
  metadata from this file.
@@ -31,6 +31,13 @@ doi: 10.5281/zenodo.13786015
31
31
  repository-code: 'https://github.com/FAIRmat-NFDI/nomad-material-processing'
32
32
  url: 'https://fairmat-nfdi.github.io/nomad-material-processing/'
33
33
  abstract: >-
34
- A NOMAD plugin containing base sections for material
35
- processing.
34
+ `nomad-material-processing` is a plugin for the NOMAD software (https://zenodo.org/doi/10.5281/zenodo.8366162)
35
+ adding data schemas and parsers for material processing data.
36
+ For example, it can be used to store process data from various vapor deposition techniques,
37
+ such as metal-organic vapor phase epitaxy (MOVPE) or pulsed laser deposition (PLD),
38
+ into a common data format that can be analyzed, explored, and published in NOMAD.
39
+ The plugin is community driven and primarily aims at providing usability to users
40
+ through practical data parsers and common data schemas.
41
+ The data schemas continue to develop with the community to ultimately provide Findable,
42
+ Accessible, Interoperable, and Reusable (FAIR) data.
36
43
  license: Apache-2.0
@@ -1,9 +1,10 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: nomad-material-processing
3
- Version: 1.0.3
3
+ Version: 1.0.5
4
4
  Summary: A plugin for NOMAD containing base sections for material processing.
5
- Author: Michael Götte, Ahmed Ilyas, Markus Scheidgen
6
- Author-email: Andrea Albino <andrea.albino@physik.hu-berlin.de>, Sebastian Brückner <sebastian.brueckner@ikz-berlin.de>, Sarthak Kapoor <sarthak.kapoor@physik.hu-berlin.de>, "José A. Márquez" <jose.marquez@physik.hu-berlin.de>, Hampus Näsström <hampus.naesstroem@physik.hu-berlin.de>
5
+ Author: Andrea Albino, Sebastian Brückner, Michael Götte, Ahmed Ilyas, Sarthak Kapoor, José A. Márquez, Hampus Näsström, Markus Scheidgen
6
+ Author-email: fairmat@physik.hu-berlin.de
7
+ Maintainer-email: FAIRmat <fairmat@physik.hu-berlin.de>
7
8
  License: Apache License
8
9
  Version 2.0, January 2004
9
10
  http://www.apache.org/licenses/
@@ -17,7 +17,7 @@ Every entry in NOMAD must inherit from `EntryData`, whenever a class is only use
17
17
 
18
18
 
19
19
  1. **Community/Standard Plugins**: FAIRmat offers standardized schemas for common methods, processes, and instruments that are generalized and not tied to any individual lab or setup. These schemas are derived from recurring patterns identified across user schemas. Users can inherit from these standard plugins in a similar manner as the base sections, further specializing them as needed while still maintaining a consistent structure for broader community use.
20
- FAIRmat's Area A for synthesis data provides two community plugins, NOMAD Measurements and NOMAD Materials Processing.
20
+ FAIRmat's Area A for synthesis data provides two community plugins, NOMAD Measurements and NOMAD Material Processing.
21
21
 
22
22
  1. **User Defined Sections**: These schemas are developed by users and are tailored for a method or an instrument, a lab, or a research institute. They build upon the base sections and community plugins, tailoring them to meet specific research needs. In this level, users can define more specialized structures that directly reflect the unique characteristics of their experiments or simulations.
23
23
 
@@ -123,21 +123,21 @@ The `nomad_material_processing.vapor_deposition.pvd.mbe` module uses the thermal
123
123
  source and also adds a plasma source.
124
124
 
125
125
 
126
- ### nomad_material_processing.solution.general
126
+ ### Solutions
127
127
 
128
- The main entry sections in this module are
128
+ `nomad_material_processing.solution.general` provides
129
129
  [`Solution`](#nomad_material_processing.solution.general.Solution) and
130
- [`SolutionPreparation`](#nomad_material_processing.solution.general.SolutionPreparation) which can
131
- be used to create NOMAD
130
+ [`SolutionPreparation`](#nomad_material_processing.solution.general.SolutionPreparation)
131
+ entry sections which can be used to create NOMAD
132
132
  [entries](https://nomad-lab.eu/prod/v1/docs/reference/glossary.html#entry).
133
- There's a long list of other auxiliary sections supporting these entry section which
133
+ It also contains other auxiliary sections supporting these entry section which
134
134
  can be accessed in the
135
135
  [metainfo browser](https://nomad-lab.eu/prod/v1/oasis/gui/analyze/metainfo/nomad_material_processing)
136
136
  by searching for: `"nomad_material_processing.solution.general"`
137
137
 
138
- #### `nomad_material_processing.solution.general.Solution`
138
+ #### Solution
139
139
 
140
- Describes liquid solutions by extending the
140
+ `nomad_material_processing.solution.general.Solution` describes liquid solutions by extending the
141
141
  [`CompositeSystem`](https://nomad-lab.eu/prod/v1/docs/howto/customization/base_sections.html#system) with quantities: _pH_, _mass_,
142
142
  _calculated_volume_, _measured_volume_, _density_, and sub-sections:
143
143
  _solvents_, _solutes_, and _solution_storage_.
@@ -172,14 +172,24 @@ _calculated_volume_ of the solution. The component can either nest a
172
172
  sub-section describing its composition, or can be another `Solution` entry connected
173
173
  via reference.
174
174
  These options are are handled by
175
- `SolutionComponent` and `SolutionComponentReference` sections respectively. Let's take a closer look at each of them.
175
+ `SolutionComponent` and `SolutionComponentReference` sections respectively.
176
176
 
177
- `SolutionComponent` extends `PureSubstanceComponent` with quantities:
178
- _component_role_, _mass_, _volume_, _density_, and sub-section: _molar_concentration_.
177
+ Let's take a closer look at each of them.
178
+
179
+ __`SolutionComponent`__ extends `PureSubstanceComponent` with quantities:
180
+ _component_role_, _mass_, _volume_, _density_, _amount_of_substance_ (in moles),
181
+ and sub-section: _molar_concentration_.
179
182
  The _pure_substance_ sub-section inherited from `PureSubstanceComponent` specifies the
180
- chemical compound. This information along with the mass of the component and
183
+ chemical compound. This information along with the amount of the component and
181
184
  total volume of the solution is used to automatically determine the molar concentration of
182
185
  the component, populating the corresponding sub-section.
186
+
187
+ If not provided, _amount_of_substance_ can be determined from _mass_ and
188
+ _pure_substance.molecular_mass_.
189
+ On other hand, if _amount_of_substance_ is available, but _mass_ is missing, it can be
190
+ determined using _amount_of_substance_ and _pure_substance.molecular_mass_.
191
+ _mass_ can also be determined if _volume_ and _density_ are available.
192
+
183
193
  Based on the _component_role_, the components are copied over to either
184
194
  `Solution.solvents` or `Solution.solutes`.
185
195
 
@@ -189,10 +199,11 @@ class SolutionComponent(PureSubstanceComponent):
189
199
  mass: float
190
200
  volume: float
191
201
  density: float
202
+ amount_of_substance: float
192
203
  molar_concentration: MolarConcentration
193
204
  ```
194
205
 
195
- `SolutionComponentReference` makes a reference to another `Solution` entry and specifies
206
+ __`SolutionComponentReference`__ makes a reference to another `Solution` entry and specifies
196
207
  the amount used. Based on this, _solutes_ and _solvents_ of the referenced solution are
197
208
  copied over to the first solution. Their mass and volume are adjusted based on the
198
209
  amount of the referenced solution used.
@@ -212,9 +223,10 @@ combined into one.
212
223
  The _solution_storage_ uses `SolutionStorage` section to describe storage conditions
213
224
  , i.e., temperature and atmosphere, along with preparation and expiry dates.
214
225
 
215
- #### `nomad_material_processing.solution.general.SolutionPreparation`
226
+ #### SolutionPreparation
216
227
 
217
- Describes the steps of solution preparation by extending
228
+ `nomad_material_processing.solution.general.SolutionPreparation`
229
+ describes the steps of solution preparation by extending
218
230
  [`Process`](https://nomad-lab.eu/prod/v1/docs/howto/customization/base_sections.html#process).
219
231
  Based on the steps added, it also creates a `Solution` entry and references it under the
220
232
  _solution_ sub-section.
@@ -1,6 +1,6 @@
1
1
  # How to Contribute to the NOMAD-material-processing Plugin
2
2
 
3
- The **NOMAD-material-processing plugin** is a community-driven effort aimed at providing shared data schemas, readers, and parsers for materials processing data. We encourage contributions from all users to help enhance and expand the plugin, making it more robust and broadly applicable. If you have any questions or need assistance, feel free to [contact us](../contact.md) — we’re here to help you get involved!
3
+ The **NOMAD Material Processing Plugin** is a community-driven effort aimed at providing shared data schemas, readers, and parsers for material processing data. We encourage contributions from all users to help enhance and expand the plugin, making it more robust and broadly applicable. If you have any questions or need assistance, feel free to [contact us](../contact.md) — we’re here to help you get involved!
4
4
 
5
5
  Here’s how you can contribute:
6
6
 
@@ -1,10 +1,10 @@
1
- # Welcome to the NOMAD-materials-processing Plugin Documentation
1
+ # Welcome to the NOMAD Material Processing Plugin Documentation
2
2
 
3
- Welcome to the official documentation for the **NOMAD-materials-processing Plugin**! This plugin provides NOMAD schemas, readers, and parsers for data of materials science synthesis processes in alignment with the FAIR (Findable, Accessible, Interoperable, and Reusable) principles. It serves as a community or standard plugin, offering commonly used schemas and classes/sections for materials processing data that can be shared across a community.
3
+ Welcome to the official documentation for the **NOMAD Material Processing Plugin**! This plugin provides NOMAD schemas, readers, and parsers for data of materials science synthesis processes in alignment with the FAIR (Findable, Accessible, Interoperable, and Reusable) principles. It serves as a community or standard plugin, offering commonly used schemas and classes/sections for material processing data that can be shared across a community.
4
4
 
5
- ## Supported Materials Processing Techniques
5
+ ## Supported Material Processing Techniques
6
6
 
7
- Currently, this plugin supports the following materials processing techniques:
7
+ Currently, this plugin supports the following material processing techniques:
8
8
 
9
9
  - **Synthesis from Gas Phase**:
10
10
  Supports different *Vapor Deposition* methods:
@@ -23,7 +23,7 @@ Currently, this plugin supports the following materials processing techniques:
23
23
  - **Synthesis from Solution**:
24
24
  Supports Solution Preparation
25
25
 
26
- Additional materials processing techniques are actively being developed and will be included soon, including Synthesis from the Melt (bulk crystal growth), Synthesis by Assembly (e.g. polymerization).
26
+ Additional material processing techniques are actively being developed and will be included soon, including Synthesis from the Melt (bulk crystal growth), Synthesis by Assembly (e.g. polymerization).
27
27
 
28
28
  Stay tuned for updates as more methods become available!
29
29
 
@@ -31,8 +31,8 @@ Stay tuned for updates as more methods become available!
31
31
 
32
32
  This documentation builds upon the general [NOMAD documentation](https://nomad-lab.eu/prod/v1/staging/docs/explanation/data.html). Here, you will find comprehensive guides on:
33
33
 
34
- - **Using the Plugin**: Step-by-step instructions on how to integrate and use the NOMAD Materials Processing Plugin in your NOMAD Oasis.
35
- - **Data Structures and Supported Methods**: Detailed descriptions of the available schemas, sections, and supported materials processing techniques.
34
+ - **Using the Plugin**: Step-by-step instructions on how to integrate and use the NOMAD Material Processing Plugin in your NOMAD Oasis.
35
+ - **Data Structures and Supported Methods**: Detailed descriptions of the available schemas, sections, and supported material processing techniques.
36
36
  - **Contributing**: Learn how you can contribute to the ongoing development of this plugin.
37
37
 
38
38
  ## About NOMAD
@@ -1,4 +1,4 @@
1
- There is no specific tutorial available for the **NOMAD-material-processing plugin** at the moment. However, to learn more about related topics, we encourage you to explore the **FAIRmat Tutorial series**. These tutorials cover a wide range of topics related to data management, materials processing, and the principles of the FAIR (Findable, Accessible, Interoperable, and Reusable) approach.
1
+ There is no specific tutorial available for the **NOMAD-material-processing plugin** at the moment. However, to learn more about related topics, we encourage you to explore the **FAIRmat Tutorial series**. These tutorials cover a wide range of topics related to data management, material processing, and the principles of the FAIR (Findable, Accessible, Interoperable, and Reusable) approach.
2
2
 
3
3
  The FAIRmat tutorials will provide you with valuable insights into how to manage and structure materials data in NOMAD and how to contribute to community efforts like this plugin. Stay tuned for future updates, as specific tutorials for this plugin may be developed.
4
4
 
@@ -21,14 +21,18 @@ dynamic = ["version"]
21
21
  description = "A plugin for NOMAD containing base sections for material processing."
22
22
  readme = "README.md"
23
23
  authors = [
24
- { name = "Andrea Albino", email = 'andrea.albino@physik.hu-berlin.de' },
25
- { name = "Sebastian Brückner", email = 'sebastian.brueckner@ikz-berlin.de' },
24
+ { name = "Andrea Albino" },
25
+ { name = "Sebastian Brückner" },
26
26
  { name = "Michael Götte" },
27
27
  { name = "Ahmed Ilyas" },
28
- { name = "Sarthak Kapoor", email = 'sarthak.kapoor@physik.hu-berlin.de' },
29
- { name = "José A. Márquez", email = 'jose.marquez@physik.hu-berlin.de' },
30
- { name = "Hampus Näsström", email = 'hampus.naesstroem@physik.hu-berlin.de' },
28
+ { name = "Sarthak Kapoor" },
29
+ { name = "José A. Márquez" },
30
+ { name = "Hampus Näsström" },
31
31
  { name = "Markus Scheidgen" },
32
+ { email = "fairmat@physik.hu-berlin.de" },
33
+ ]
34
+ maintainers = [
35
+ { name = "FAIRmat", email = "fairmat@physik.hu-berlin.de" },
32
36
  ]
33
37
  license = { file = "LICENSE" }
34
38
  dependencies = [
@@ -757,6 +757,7 @@ class ElectronicProperties(ArchiveSection):
757
757
  'P-type',
758
758
  'N-type',
759
759
  'Semi-insulating',
760
+ 'Insulating',
760
761
  ),
761
762
  description="""The type of semiconductor, N-type being electrons
762
763
  the majority carriers and P-type being holes the majority carriers.""",
@@ -3,6 +3,7 @@ from typing import TYPE_CHECKING, Union
3
3
  from nomad.datamodel.data import (
4
4
  ArchiveSection,
5
5
  EntryData,
6
+ EntryDataCategory,
6
7
  )
7
8
  from nomad.datamodel.metainfo.annotations import (
8
9
  ELNAnnotation,
@@ -21,6 +22,7 @@ from nomad.datamodel.metainfo.basesections import (
21
22
  SystemComponent,
22
23
  )
23
24
  from nomad.metainfo import (
25
+ Category,
24
26
  Datetime,
25
27
  MEnum,
26
28
  Quantity,
@@ -52,6 +54,17 @@ configuration = config.get_plugin_entry_point(
52
54
  )
53
55
 
54
56
 
57
+ class SolutionCategory(EntryDataCategory):
58
+ """
59
+ Category for entry schemas related to solutions.
60
+ """
61
+
62
+ m_def = Category(
63
+ label='Solutions',
64
+ categories=[EntryDataCategory],
65
+ )
66
+
67
+
55
68
  class MolarConcentration(ArchiveSection):
56
69
  """
57
70
  The molar concentration of a component in a solution.
@@ -62,10 +75,9 @@ class MolarConcentration(ArchiveSection):
62
75
  )
63
76
  calculated_concentration = Quantity(
64
77
  type=float,
65
- description=(
66
- 'The expected concentration calculated from the component moles and '
67
- 'total volume.'
68
- ),
78
+ description="""
79
+ The expected concentration calculated from the component moles and total volume.
80
+ """,
69
81
  a_eln=ELNAnnotation(
70
82
  defaultDisplayUnit='mol / liter',
71
83
  ),
@@ -73,10 +85,9 @@ class MolarConcentration(ArchiveSection):
73
85
  )
74
86
  measured_concentration = Quantity(
75
87
  type=float,
76
- description=(
77
- """The concentration observed or measured
78
- with some characterization technique."""
79
- ),
88
+ description="""
89
+ The concentration observed or measured with some characterization technique.
90
+ """,
80
91
  a_eln=ELNAnnotation(
81
92
  component='NumberEditQuantity',
82
93
  defaultDisplayUnit='mol / liter',
@@ -157,7 +168,6 @@ class SolutionComponent(PureSubstanceComponent, BaseSolutionComponent):
157
168
  Section for a component added to the solution.
158
169
  """
159
170
 
160
- # TODO get the density of the component automatically if not provided
161
171
  m_def = Section(
162
172
  description='A component added to the solution.',
163
173
  a_eln=ELNAnnotation(
@@ -198,7 +208,11 @@ class SolutionComponent(PureSubstanceComponent, BaseSolutionComponent):
198
208
  )
199
209
  mass = Quantity(
200
210
  type=float,
201
- description='The mass of the component without the container.',
211
+ description="""
212
+ The mass of the component without the container. Can be calculated automatically
213
+ if `volume` and `density` are available or if `amount_of_substance`
214
+ and `pure_substance.molecular_mass` are available.
215
+ """,
202
216
  a_eln=ELNAnnotation(
203
217
  component='NumberEditQuantity',
204
218
  defaultDisplayUnit='gram',
@@ -206,15 +220,29 @@ class SolutionComponent(PureSubstanceComponent, BaseSolutionComponent):
206
220
  ),
207
221
  unit='kilogram',
208
222
  )
223
+ amount_of_substance = Quantity(
224
+ link='https://doi.org/10.1351/goldbook.A00297',
225
+ type=float,
226
+ description="""
227
+ The number of elementary entities of the given substance. Can be calculated
228
+ automatically if `mass` and `pure_substance.molecular_mass` are available.
229
+ """,
230
+ a_eln=ELNAnnotation(
231
+ component='NumberEditQuantity',
232
+ defaultDisplayUnit='mole',
233
+ minValue=0,
234
+ ),
235
+ unit='mole',
236
+ )
209
237
  density = Quantity(
210
238
  type=float,
211
239
  description='The density of the liquid component.',
212
240
  a_eln=ELNAnnotation(
213
241
  component='NumberEditQuantity',
214
- defaultDisplayUnit='gram / liter',
242
+ defaultDisplayUnit='gram / milliliter',
215
243
  minValue=0,
216
244
  ),
217
- unit='kilogram / liter',
245
+ unit='gram / milliliter',
218
246
  )
219
247
  molar_concentration = SubSection(section_def=MolarConcentration)
220
248
  pure_substance = SubSection(section_def=PubChemPureSubstanceSection)
@@ -254,8 +282,8 @@ class SolutionComponent(PureSubstanceComponent, BaseSolutionComponent):
254
282
  self, volume: Quantity, logger: 'BoundLogger' = None
255
283
  ) -> None:
256
284
  """
257
- Calculate the molar concentration of the component
258
- in a given volume of solution.
285
+ Calculate the molar concentration of the component in a given volume of
286
+ solution.
259
287
 
260
288
  Args:
261
289
  volume (Quantity): The volume of the solution.
@@ -270,9 +298,10 @@ class SolutionComponent(PureSubstanceComponent, BaseSolutionComponent):
270
298
  return
271
299
  if not self.molar_concentration:
272
300
  self.molar_concentration = MolarConcentration()
273
- moles = self._calculate_moles(logger)
274
- if moles:
275
- self.molar_concentration.calculated_concentration = moles / volume
301
+ if self.amount_of_substance:
302
+ self.molar_concentration.calculated_concentration = (
303
+ self.amount_of_substance / volume
304
+ )
276
305
 
277
306
  def normalize(self, archive: 'EntryArchive', logger: 'BoundLogger') -> None:
278
307
  """
@@ -288,6 +317,12 @@ class SolutionComponent(PureSubstanceComponent, BaseSolutionComponent):
288
317
  self.pure_substance.normalize(archive, logger)
289
318
  if self.volume and self.density:
290
319
  self.mass = self.volume * self.density
320
+ if self.mass and self.pure_substance and not self.amount_of_substance:
321
+ self.amount_of_substance = self._calculate_moles(logger)
322
+ if self.amount_of_substance and self.pure_substance and not self.mass:
323
+ self.mass = self.amount_of_substance * (
324
+ self.pure_substance.molecular_mass * ureg.N_A
325
+ )
291
326
  super().normalize(archive, logger)
292
327
 
293
328
 
@@ -298,6 +333,7 @@ class Solution(CompositeSystem, EntryData):
298
333
 
299
334
  # TODO make the solvents, solutes, and elemental_composition subsection noneditable.
300
335
  m_def = Section(
336
+ categories=[SolutionCategory],
301
337
  description='A homogeneous liquid mixture composed of two or more substances.',
302
338
  a_eln=ELNAnnotation(
303
339
  properties=SectionProperties(
@@ -334,7 +370,7 @@ class Solution(CompositeSystem, EntryData):
334
370
  a_eln=ELNAnnotation(
335
371
  defaultDisplayUnit='gram / milliliter',
336
372
  ),
337
- unit='kilogram / liter',
373
+ unit='gram / milliliter',
338
374
  )
339
375
  mass = Quantity(
340
376
  description='The mass of the solution.',
@@ -412,7 +448,7 @@ class Solution(CompositeSystem, EntryData):
412
448
  continue
413
449
  comparison_key = component.pure_substance.pub_chem_cid
414
450
  if comparison_key in combined_components:
415
- for prop in ['mass', 'volume']:
451
+ for prop in ['mass', 'volume', 'amount_of_substance']:
416
452
  val1 = getattr(combined_components[comparison_key], prop, None)
417
453
  val2 = getattr(component, prop, None)
418
454
  if val1 and val2:
@@ -503,6 +539,8 @@ class Solution(CompositeSystem, EntryData):
503
539
  self.solvents[-1].volume *= scaler
504
540
  if self.solvents[-1].mass:
505
541
  self.solvents[-1].mass *= scaler
542
+ if self.solvents[-1].amount_of_substance:
543
+ self.solvents[-1].amount_of_substance *= scaler
506
544
  if component.system.solutes:
507
545
  for solute in component.system.solutes:
508
546
  self.solutes.append(solute.m_copy(deep=True))
@@ -510,6 +548,8 @@ class Solution(CompositeSystem, EntryData):
510
548
  self.solutes[-1].volume *= scaler
511
549
  if self.solutes[-1].mass:
512
550
  self.solutes[-1].mass *= scaler
551
+ if self.solutes[-1].amount_of_substance:
552
+ self.solutes[-1].amount_of_substance *= scaler
513
553
 
514
554
  self.solvents = self.combine_components(self.solvents, logger)
515
555
  self.solutes = self.combine_components(self.solutes, logger)
@@ -827,6 +867,7 @@ class SolutionPreparation(Process, EntryData):
827
867
 
828
868
  # TODO populate the instruments section based on the steps.methodology.instrument
829
869
  m_def = Section(
870
+ categories=[SolutionCategory],
830
871
  description='Section for describing steps of solution preparation.',
831
872
  a_eln=ELNAnnotation(
832
873
  properties=SectionProperties(
@@ -31,6 +31,7 @@ from nomad.datamodel.metainfo.basesections import (
31
31
  Component,
32
32
  CompositeSystemReference,
33
33
  Entity,
34
+ EntityReference,
34
35
  PubChemPureSubstanceSection,
35
36
  PureSubstanceSection,
36
37
  )
@@ -118,6 +119,21 @@ class InsertReduction(Entity):
118
119
  )
119
120
 
120
121
 
122
+ class InsertReductionReference(EntityReference):
123
+ """
124
+ A section used for referencing a FilledSubstrateHolderPDI.
125
+ """
126
+
127
+ reference = Quantity(
128
+ type=InsertReduction,
129
+ description='Optional description of insert if used.',
130
+ a_eln=ELNAnnotation(
131
+ component='ReferenceEditQuantity',
132
+ label='Insert Reduction Reference',
133
+ ),
134
+ )
135
+
136
+
121
137
  class SubstrateHolderPosition(ArchiveSection):
122
138
  """
123
139
  One casing position of the substrate holder.
@@ -159,14 +175,6 @@ class SubstrateHolderPosition(ArchiveSection):
159
175
  slot_geometry = SubSection(
160
176
  section_def=Geometry,
161
177
  )
162
- insert_reduction = Quantity(
163
- type=InsertReduction,
164
- description='Optional description of insert if used.',
165
- a_eln=ELNAnnotation(
166
- component='ReferenceEditQuantity',
167
- label='ThinFilmStackMbe Reference',
168
- ),
169
- )
170
178
 
171
179
 
172
180
  class SubstrateHolder(Entity):
@@ -189,10 +197,10 @@ class SubstrateHolder(Entity):
189
197
  The lab ID of the substrate holder.
190
198
  """,
191
199
  a_eln=ELNAnnotation(
192
- component=ELNComponentEnum.StringEditQuantity,
200
+ component=ELNComponentEnum.StringEditQuantity, label='holder_id'
193
201
  ),
194
202
  )
195
- material = SubSection(section_def=PubChemPureSubstanceSection, repeats=True)
203
+ holder_material = SubSection(section_def=PubChemPureSubstanceSection, repeats=True)
196
204
  thickness = Quantity(
197
205
  type=float,
198
206
  unit='meter',
@@ -243,6 +251,12 @@ class FilledSubstrateHolderPosition(SubstrateHolderPosition):
243
251
  One casing position of the filled substrate holder.
244
252
  """
245
253
 
254
+ insert_reduction = SubSection(
255
+ section_def=InsertReductionReference,
256
+ description="""
257
+ The Insert reduction placed in this position.
258
+ """,
259
+ )
246
260
  substrate = SubSection(
247
261
  section_def=CompositeSystemReference,
248
262
  description="""
@@ -261,7 +275,7 @@ class FilledSubstrateHolder(SubstrateHolder):
261
275
  description='A reference to an empty substrate holder.',
262
276
  a_eln=ELNAnnotation(
263
277
  component='ReferenceEditQuantity',
264
- label='ThinFilmStackMbe Reference',
278
+ label='Empty Substrate Holder Reference',
265
279
  ),
266
280
  )
267
281
  positions = SubSection(
@@ -1,9 +1,10 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: nomad-material-processing
3
- Version: 1.0.3
3
+ Version: 1.0.5
4
4
  Summary: A plugin for NOMAD containing base sections for material processing.
5
- Author: Michael Götte, Ahmed Ilyas, Markus Scheidgen
6
- Author-email: Andrea Albino <andrea.albino@physik.hu-berlin.de>, Sebastian Brückner <sebastian.brueckner@ikz-berlin.de>, Sarthak Kapoor <sarthak.kapoor@physik.hu-berlin.de>, "José A. Márquez" <jose.marquez@physik.hu-berlin.de>, Hampus Näsström <hampus.naesstroem@physik.hu-berlin.de>
5
+ Author: Andrea Albino, Sebastian Brückner, Michael Götte, Ahmed Ilyas, Sarthak Kapoor, José A. Márquez, Hampus Näsström, Markus Scheidgen
6
+ Author-email: fairmat@physik.hu-berlin.de
7
+ Maintainer-email: FAIRmat <fairmat@physik.hu-berlin.de>
7
8
  License: Apache License
8
9
  Version 2.0, January 2004
9
10
  http://www.apache.org/licenses/
@@ -58,12 +58,16 @@ def test_solution():
58
58
  starter_water_concentration = starter_solution_archive.data.solvents[
59
59
  0
60
60
  ].molar_concentration.calculated_concentration
61
+ starter_water_amount = starter_solution_archive.data.solvents[0].amount_of_substance
61
62
  starter_salt_concentration = starter_solution_archive.data.solutes[
62
63
  0
63
64
  ].molar_concentration.calculated_concentration
64
65
  starter_salt_mass = starter_solution_archive.data.solutes[0].mass
65
66
 
66
67
  assert pytest.approx(starter_water_concentration, 1e-3) == 55.523 * ureg('mol/l')
68
+ assert pytest.approx(starter_water_amount, 1e-3) == 0.5 * ureg('l') * 55.523 * ureg(
69
+ 'mol/l'
70
+ )
67
71
  assert pytest.approx(starter_salt_concentration, 1e-3) == 0.345 * ureg('mol/l')
68
72
  assert pytest.approx(starter_salt_mass, 1e-3) == 0.01 * ureg('kg')
69
73
 
@@ -90,6 +94,13 @@ def test_solution():
90
94
  )
91
95
  == starter_water_concentration
92
96
  )
97
+ assert (
98
+ pytest.approx(
99
+ main_solution_archive.data.solvents[0].amount_of_substance,
100
+ 1e-3,
101
+ )
102
+ == starter_water_amount / 5
103
+ )
93
104
  assert (
94
105
  pytest.approx(
95
106
  main_solution_archive.data.solutes[
@@ -129,6 +140,13 @@ def test_solution():
129
140
  )
130
141
  == starter_water_concentration
131
142
  )
143
+ assert (
144
+ pytest.approx(
145
+ main_solution_archive.data.solvents[0].amount_of_substance,
146
+ 1e-3,
147
+ )
148
+ == (starter_water_amount / 5) * 2
149
+ )
132
150
  assert (
133
151
  pytest.approx(
134
152
  main_solution_archive.data.solutes[
@@ -154,6 +172,13 @@ def test_solution():
154
172
  )
155
173
  == starter_water_concentration
156
174
  )
175
+ assert (
176
+ pytest.approx(
177
+ starter_solution_archive.data.solvents[0].amount_of_substance,
178
+ 1e-3,
179
+ )
180
+ == starter_water_amount
181
+ )
157
182
  assert (
158
183
  pytest.approx(
159
184
  starter_solution_archive.data.solutes[