mat3ra-esse 2025.8.14.post0__py3-none-any.whl → 2025.10.8.post0__py3-none-any.whl

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.

Potentially problematic release.


This version of mat3ra-esse might be problematic. Click here for more details.

Files changed (136) hide show
  1. mat3ra/esse/data/examples.py +1 -1
  2. mat3ra/esse/data/schemas.py +1 -1
  3. mat3ra/esse/models/core/abstract/_2d_data.py +2 -2
  4. mat3ra/esse/models/core/abstract/_2d_plot.py +2 -6
  5. mat3ra/esse/models/core/primitive/_1d_data_series.py +3 -3
  6. mat3ra/esse/models/core/primitive/axis_3d_names_enum.py +13 -0
  7. mat3ra/esse/models/core/reference/__init__.py +8 -8
  8. mat3ra/esse/models/core/reference/exabyte.py +2 -8
  9. mat3ra/esse/models/core/reference/experiment/__init__.py +2 -2
  10. mat3ra/esse/models/core/reusable/coordinate_conditions/__init__.py +1 -78
  11. mat3ra/esse/models/core/reusable/coordinate_conditions/index.py +80 -0
  12. mat3ra/esse/models/core/reusable/hubbard_parameters.py +48 -0
  13. mat3ra/esse/models/core/reusable/kpoint.py +16 -0
  14. mat3ra/esse/models/core/reusable/repetition.py +14 -0
  15. mat3ra/esse/models/definitions/material.py +13 -0
  16. mat3ra/esse/models/element.py +10 -8
  17. mat3ra/esse/models/job/__init__.py +62 -62
  18. mat3ra/esse/models/material/__init__.py +12 -12
  19. mat3ra/esse/models/materials_category/compound_pristine_structures/two_dimensional/interface/configuration.py +80 -80
  20. mat3ra/esse/models/materials_category/defective_structures/one_dimensional/grain_boundary_linear/configuration.py +80 -80
  21. mat3ra/esse/models/materials_category/defective_structures/two_dimensional/adatom/configuration.py +35 -35
  22. mat3ra/esse/models/materials_category/defective_structures/two_dimensional/grain_boundary_planar/configuration.py +80 -80
  23. mat3ra/esse/models/materials_category/defective_structures/two_dimensional/island/configuration.py +53 -53
  24. mat3ra/esse/models/materials_category/defective_structures/two_dimensional/terrace/configuration.py +53 -53
  25. mat3ra/esse/models/materials_category/defective_structures/zero_dimensional/point_defect/interstitial.py +29 -29
  26. mat3ra/esse/models/materials_category/defective_structures/zero_dimensional/point_defect/substitutional.py +32 -32
  27. mat3ra/esse/models/materials_category/defective_structures/zero_dimensional/point_defect/vacancy.py +12 -12
  28. mat3ra/esse/models/materials_category/pristine_structures/three_dimensional/ideal_crystal.py +12 -12
  29. mat3ra/esse/models/materials_category/pristine_structures/two_dimensional/nanoribbon.py +52 -52
  30. mat3ra/esse/models/materials_category/pristine_structures/two_dimensional/nanotape.py +32 -32
  31. mat3ra/esse/models/materials_category/pristine_structures/two_dimensional/slab.py +32 -32
  32. mat3ra/esse/models/materials_category/pristine_structures/two_dimensional/slab_strained_supercell.py +32 -32
  33. mat3ra/esse/models/materials_category/pristine_structures/two_dimensional/slab_strained_supercell_with_gap.py +1151 -0
  34. mat3ra/esse/models/materials_category/processed_structures/two_dimensional/passivation/configuration.py +17 -17
  35. mat3ra/esse/models/materials_category_components/entities/auxiliary/zero_dimensional/crystal_site.py +8 -8
  36. mat3ra/esse/models/materials_category_components/entities/auxiliary/zero_dimensional/point_defect_site.py +12 -12
  37. mat3ra/esse/models/materials_category_components/entities/auxiliary/zero_dimensional/void_region.py +12 -12
  38. mat3ra/esse/models/materials_category_components/entities/core/three_dimensional/crystal.py +8 -8
  39. mat3ra/esse/models/materials_category_components/entities/core/two_dimensional/vacuum.py +12 -12
  40. mat3ra/esse/models/materials_category_components/entities/reusable/one_dimensional/crystal_lattice_lines.py +8 -8
  41. mat3ra/esse/models/materials_category_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated.py +8 -8
  42. mat3ra/esse/models/materials_category_components/entities/reusable/three_dimensional/crystal_lattice_base.py +8 -8
  43. mat3ra/esse/models/materials_category_components/entities/reusable/three_dimensional/strained_non_uniform.py +12 -12
  44. mat3ra/esse/models/materials_category_components/entities/reusable/three_dimensional/strained_uniform.py +12 -12
  45. mat3ra/esse/models/materials_category_components/entities/reusable/three_dimensional/supercell.py +12 -12
  46. mat3ra/esse/models/materials_category_components/entities/reusable/two_dimensional/crystal_lattice_planes.py +8 -8
  47. mat3ra/esse/models/materials_category_components/entities/reusable/two_dimensional/slab_stack_configuration.py +52 -52
  48. mat3ra/esse/models/materials_category_components/operations/core/modifications/perturb.py +12 -12
  49. mat3ra/esse/models/methods_directory/physical/psp/__init__.py +2 -2
  50. mat3ra/esse/models/methods_directory/physical/psp/file.py +2 -2
  51. mat3ra/esse/models/methods_directory/physical/psp/file_data_item.py +2 -2
  52. mat3ra/esse/models/properties_directory/derived_properties.py +6 -6
  53. mat3ra/esse/models/properties_directory/elemental/atomic_radius.py +1 -1
  54. mat3ra/esse/models/properties_directory/elemental/electronegativity.py +1 -2
  55. mat3ra/esse/models/properties_directory/elemental/ionization_potential.py +3 -4
  56. mat3ra/esse/models/properties_directory/jupyter_notebook_endpoint.py +20 -0
  57. mat3ra/esse/models/properties_directory/non_scalar/average_potential_profile.py +4 -8
  58. mat3ra/esse/models/properties_directory/non_scalar/band_gaps.py +2 -2
  59. mat3ra/esse/models/properties_directory/non_scalar/band_structure.py +5 -9
  60. mat3ra/esse/models/properties_directory/non_scalar/charge_density_profile.py +4 -8
  61. mat3ra/esse/models/properties_directory/non_scalar/density_of_states.py +5 -8
  62. mat3ra/esse/models/properties_directory/non_scalar/dielectric_tensor.py +2 -2
  63. mat3ra/esse/models/properties_directory/non_scalar/file_content.py +2 -2
  64. mat3ra/esse/models/properties_directory/non_scalar/final_structure.py +22 -0
  65. mat3ra/esse/models/properties_directory/non_scalar/hubbard_u.py +4 -4
  66. mat3ra/esse/models/properties_directory/non_scalar/hubbard_v.py +3 -4
  67. mat3ra/esse/models/properties_directory/non_scalar/hubbard_v_nn.py +3 -4
  68. mat3ra/esse/models/properties_directory/non_scalar/is_relaxed.py +22 -0
  69. mat3ra/esse/models/properties_directory/non_scalar/phonon_dispersions.py +10 -14
  70. mat3ra/esse/models/properties_directory/non_scalar/phonon_dos.py +10 -14
  71. mat3ra/esse/models/properties_directory/non_scalar/potential_profile.py +8 -12
  72. mat3ra/esse/models/properties_directory/non_scalar/reaction_energy_profile.py +8 -12
  73. mat3ra/esse/models/properties_directory/non_scalar/stress_tensor.py +5 -7
  74. mat3ra/esse/models/properties_directory/non_scalar/total_energy_contributions.py +64 -51
  75. mat3ra/esse/models/properties_directory/non_scalar/vibrational_spectrum.py +10 -14
  76. mat3ra/esse/models/properties_directory/non_scalar/workflow.py +2234 -0
  77. mat3ra/esse/models/properties_directory/reusable/hubbard_parameters.py +48 -0
  78. mat3ra/esse/models/properties_directory/scalar/electron_affinity.py +1 -1
  79. mat3ra/esse/models/properties_directory/scalar/fermi_energy.py +1 -1
  80. mat3ra/esse/models/properties_directory/scalar/formation_energy.py +1 -1
  81. mat3ra/esse/models/properties_directory/scalar/ionization_potential.py +3 -3
  82. mat3ra/esse/models/properties_directory/scalar/pressure.py +3 -4
  83. mat3ra/esse/models/properties_directory/scalar/reaction_energy_barrier.py +3 -3
  84. mat3ra/esse/models/properties_directory/scalar/surface_energy.py +3 -3
  85. mat3ra/esse/models/properties_directory/scalar/total_energy.py +3 -3
  86. mat3ra/esse/models/properties_directory/scalar/total_force.py +3 -4
  87. mat3ra/esse/models/properties_directory/scalar/valence_band_offset.py +3 -3
  88. mat3ra/esse/models/properties_directory/scalar/zero_point_energy.py +3 -3
  89. mat3ra/esse/models/properties_directory/structural/atomic_forces.py +5 -5
  90. mat3ra/esse/models/properties_directory/structural/basis/atomic_constraints_property.py +3 -3
  91. mat3ra/esse/models/properties_directory/structural/basis/boundary_conditions.py +30 -0
  92. mat3ra/esse/models/properties_directory/structural/basis/predicted_properties.py +82 -0
  93. mat3ra/esse/models/properties_directory/structural/lattice/units/__init__.py +23 -1
  94. mat3ra/esse/models/properties_directory/structural/magnetic_moments.py +5 -5
  95. mat3ra/esse/models/properties_directory/structural/molecular_pattern.py +5 -5
  96. mat3ra/esse/models/properties_directory/structural/patterns/functional_group.py +1 -1
  97. mat3ra/esse/models/properties_directory/structural/patterns/ring.py +1 -1
  98. mat3ra/esse/models/properties_directory/structural/patterns/special_bond.py +1 -1
  99. mat3ra/esse/models/properties_directory/workflow/convergence/electronic.py +4 -4
  100. mat3ra/esse/models/properties_directory/workflow/convergence/ionic.py +6 -6
  101. mat3ra/esse/models/property/base.py +1492 -14
  102. mat3ra/esse/models/property/holder.py +3568 -0
  103. mat3ra/esse/models/property/meta_holder/Reusable_schema_for_energy_value_with_unit_corresponding_to_a_specific_accuracy_level__e/g.py +31 -0
  104. mat3ra/esse/models/property/meta_holder.py +140 -0
  105. mat3ra/esse/models/property/proto_holder.py +86 -0
  106. mat3ra/esse/models/property/raw.py +27 -11
  107. mat3ra/esse/models/property/source.py +24 -1
  108. mat3ra/esse/models/workflow/__init__.py +54 -54
  109. mat3ra/esse/models/workflow/base_flow.py +4 -4
  110. mat3ra/esse/models/workflow/subworkflow/__init__.py +7 -7
  111. mat3ra/esse/models/workflow/subworkflow/unit.py +10 -10
  112. mat3ra/esse/models/workflow/unit/__init__.py +12 -12
  113. mat3ra/esse/models/workflow/unit/io/__init__.py +4 -4
  114. mat3ra/esse/models/workflow/unit/io/db.py +2 -2
  115. mat3ra/esse/models/workflow/unit/io/object_storage.py +1 -1
  116. {mat3ra_esse-2025.8.14.post0.dist-info → mat3ra_esse-2025.10.8.post0.dist-info}/METADATA +1 -1
  117. {mat3ra_esse-2025.8.14.post0.dist-info → mat3ra_esse-2025.10.8.post0.dist-info}/RECORD +122 -118
  118. mat3ra/esse/models/property/meta.py +0 -200
  119. mat3ra/esse/models/software_directory/ml/exabyteml.py +0 -28
  120. mat3ra/esse/models/software_directory/ml/unit/execution/__init__.py +0 -879
  121. mat3ra/esse/models/software_directory/ml/unit/execution/evaluate/__init__.py +0 -3
  122. mat3ra/esse/models/software_directory/ml/unit/execution/evaluate/cross_validate.py +0 -293
  123. mat3ra/esse/models/software_directory/ml/unit/execution/initialize.py +0 -293
  124. mat3ra/esse/models/software_directory/ml/unit/execution/score.py +0 -286
  125. mat3ra/esse/models/software_directory/ml/unit/execution/train.py +0 -297
  126. mat3ra/esse/models/software_directory/ml/unit/processing/__init__.py +0 -276
  127. mat3ra/esse/models/software_directory/ml/unit/processing/data_transformation/__init__.py +0 -167
  128. mat3ra/esse/models/software_directory/ml/unit/processing/data_transformation/manipulation.py +0 -144
  129. mat3ra/esse/models/software_directory/ml/unit/processing/data_transformation/scale_and_reduce.py +0 -163
  130. mat3ra/esse/models/software_directory/ml/unit/processing/feature_selection/__init__.py +0 -148
  131. mat3ra/esse/models/software_directory/ml/unit/processing/feature_selection/filter_based.py +0 -144
  132. /mat3ra/esse/models/{software_directory/ml → properties_directory/reusable}/__init__.py +0 -0
  133. /mat3ra/esse/models/{software_directory/ml/unit → property/meta_holder/Reusable_schema_for_energy_value_with_unit_corresponding_to_a_specific_accuracy_level__e}/__init__.py +0 -0
  134. {mat3ra_esse-2025.8.14.post0.dist-info → mat3ra_esse-2025.10.8.post0.dist-info}/WHEEL +0 -0
  135. {mat3ra_esse-2025.8.14.post0.dist-info → mat3ra_esse-2025.10.8.post0.dist-info}/licenses/LICENSE.md +0 -0
  136. {mat3ra_esse-2025.8.14.post0.dist-info → mat3ra_esse-2025.10.8.post0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,31 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/meta_holder.json
3
+ # version: 0.28.5
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+
9
+ from pydantic import BaseModel
10
+
11
+
12
+ class Unit(Enum):
13
+ Ry = "Ry"
14
+
15
+
16
+ class AccuracyLevel(Enum):
17
+ standard = "standard"
18
+ low = "low"
19
+ high = "high"
20
+
21
+
22
+ class FieldUsedForSuggestedWavefunctionAndChargeDensityCutoffs(BaseModel):
23
+ unit: Unit
24
+ """
25
+ Unit of the energy value corresponding to a accuracy_level. The values are expressed in Ry.
26
+ """
27
+ accuracy_level: AccuracyLevel
28
+ """
29
+ Accuracy level determines suggested scalar value.
30
+ """
31
+ value: float
@@ -0,0 +1,140 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/meta_holder.json
3
+ # version: 0.28.5
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import Any, Dict, List, Optional
9
+
10
+ from pydantic import BaseModel, ConfigDict, Field, confloat, conint, constr
11
+
12
+ from .Reusable_schema_for_energy_value_with_unit_corresponding_to_a_specific_accuracy_level__e import (
13
+ g,
14
+ )
15
+
16
+
17
+ class Type(Enum):
18
+ us = "us"
19
+ nc = "nc"
20
+ nc_fr = "nc-fr"
21
+ paw = "paw"
22
+ coulomb = "coulomb"
23
+
24
+
25
+ class ExchangeCorrelation(BaseModel):
26
+ approximation: Optional[str] = None
27
+ """
28
+ DFT approximation
29
+ """
30
+ functional: Optional[str] = None
31
+ """
32
+ Exchange correlation functional
33
+ """
34
+ path: Optional[str] = Field(None, title="category path schema")
35
+ """
36
+ TODO: Use regex once schema draft version has been updated
37
+ """
38
+
39
+
40
+ class AtomicOrbitalSchema(BaseModel):
41
+ orbitalName: Optional[constr(pattern=r"^[1-7][sSpPdDfF]$")] = None
42
+ orbitalIndex: Optional[conint(ge=1)] = None
43
+ principalNumber: Optional[conint(ge=1, le=7)] = None
44
+ angularMomentum: Optional[conint(ge=0, le=3)] = None
45
+ occupation: Optional[confloat(ge=0.0, le=14.0)] = None
46
+ """
47
+ Shell occupation
48
+ """
49
+
50
+
51
+ class Name(Enum):
52
+ pseudopotential = "pseudopotential"
53
+
54
+
55
+ class Cutoffs(BaseModel):
56
+ model_config = ConfigDict(
57
+ extra="forbid",
58
+ )
59
+ wavefunction: Optional[List[g.FieldUsedForSuggestedWavefunctionAndChargeDensityCutoffs]] = None
60
+ """
61
+ Energy cutoff values for wavefunction plane wave expansion.
62
+ """
63
+ density: Optional[List[g.FieldUsedForSuggestedWavefunctionAndChargeDensityCutoffs]] = None
64
+ """
65
+ Energy cutoff values for charge density plane wave expansion.
66
+ """
67
+
68
+
69
+ class FileDataItem(BaseModel):
70
+ element: str
71
+ """
72
+ chemical element
73
+ """
74
+ hash: str
75
+ """
76
+ MD5 hash of the pseudopotential file
77
+ """
78
+ type: Type
79
+ source: str
80
+ """
81
+ explains where this came from
82
+ """
83
+ version: Optional[str] = None
84
+ """
85
+ explains the version of where this came from
86
+ """
87
+ exchangeCorrelation: ExchangeCorrelation
88
+ valenceConfiguration: Optional[List[AtomicOrbitalSchema]] = None
89
+ """
90
+ contains pseudo orbital information, including orbital names and occupations
91
+ """
92
+ path: str
93
+ """
94
+ location of the pseudopotential file on filesystem
95
+ """
96
+ apps: List[str]
97
+ """
98
+ The names of the simulation engines that can use this pseudopotential, e.g. espresso
99
+ """
100
+ filename: Optional[str] = None
101
+ """
102
+ filename of pseudopotential file on filesystem
103
+ """
104
+ name: Name
105
+ """
106
+ name of the data category
107
+ """
108
+ cutoffs: Optional[Cutoffs] = None
109
+ """
110
+ Suggested cutoff values for wave function and charge density.
111
+ """
112
+
113
+
114
+ class Source(BaseModel):
115
+ type: str
116
+ """
117
+ Type of the material property's source.
118
+ """
119
+ info: Optional[Dict[str, Any]] = None
120
+
121
+
122
+ class MetaPropertyHolderSchema(BaseModel):
123
+ data: FileDataItem
124
+ """
125
+ container of the information, specific to each property
126
+ """
127
+ source: Source
128
+ field_id: Optional[str] = Field(None, alias="_id")
129
+ """
130
+ entity identity
131
+ """
132
+ slug: Optional[str] = None
133
+ """
134
+ entity slug
135
+ """
136
+ systemName: Optional[str] = None
137
+ schemaVersion: Optional[str] = "2022.8.16"
138
+ """
139
+ entity's schema version. Used to distinct between different schemas.
140
+ """
@@ -0,0 +1,86 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: property/proto_holder.json
3
+ # version: 0.28.5
4
+
5
+ from __future__ import annotations
6
+
7
+ from enum import Enum
8
+ from typing import List, Optional, Union
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+
13
+ class Name(Enum):
14
+ atomic_constraints = "atomic_constraints"
15
+
16
+
17
+ class AtomicConstraintSchema(BaseModel):
18
+ value: List[bool] = Field(..., title="vector boolean 3d schema")
19
+ """
20
+ value of this entry
21
+ """
22
+ id: int
23
+ """
24
+ integer id of this entry
25
+ """
26
+
27
+
28
+ class AtomicConstraintsPropertySchema(BaseModel):
29
+ name: Name
30
+ values: List[AtomicConstraintSchema] = Field(..., title="atomic constraints schema")
31
+ """
32
+ atomic constraints schema
33
+ """
34
+
35
+
36
+ class Name634(Enum):
37
+ boundary_conditions = "boundary_conditions"
38
+
39
+
40
+ class Type(Enum):
41
+ pbc = "pbc"
42
+ bc1 = "bc1"
43
+ bc2 = "bc2"
44
+ bc3 = "bc3"
45
+
46
+
47
+ class BoundaryConditionsPropertySchema(BaseModel):
48
+ name: Name634
49
+ type: Optional[Type] = "pbc"
50
+ """
51
+ If assume_isolated = 'esm', determines the boundary conditions used for either side of the slab.
52
+ """
53
+ offset: float
54
+
55
+
56
+ class Info(BaseModel):
57
+ materialId: Optional[str] = None
58
+
59
+
60
+ class Source(BaseModel):
61
+ type: str
62
+ """
63
+ Type of the material property's source.
64
+ """
65
+ info: Info
66
+
67
+
68
+ class ProtoPropertyHolderSchema(BaseModel):
69
+ data: Union[AtomicConstraintsPropertySchema, BoundaryConditionsPropertySchema]
70
+ """
71
+ container of the information, specific to each property
72
+ """
73
+ source: Source
74
+ field_id: Optional[str] = Field(None, alias="_id")
75
+ """
76
+ entity identity
77
+ """
78
+ slug: Optional[str] = None
79
+ """
80
+ entity slug
81
+ """
82
+ systemName: Optional[str] = None
83
+ schemaVersion: Optional[str] = "2022.8.16"
84
+ """
85
+ entity's schema version. Used to distinct between different schemas.
86
+ """
@@ -5,13 +5,20 @@
5
5
  from __future__ import annotations
6
6
 
7
7
  from enum import Enum
8
- from typing import Any, Dict, List, Optional
8
+ from typing import Any, Dict, List, Optional, Union
9
9
 
10
10
  from pydantic import BaseModel, Field
11
11
 
12
- from .The_source_of_a_property import (
13
- field_This_could_be_an_article__a_simulation_on_Exabyte__an_external_simulation__etc,
14
- )
12
+
13
+ class Info(BaseModel):
14
+ jobId: str
15
+ """
16
+ Job's identity
17
+ """
18
+ unitId: str
19
+ """
20
+ Id of the unit that extracted the result
21
+ """
15
22
 
16
23
 
17
24
  class Type(Enum):
@@ -55,7 +62,7 @@ class LocationSchema(BaseModel):
55
62
  """
56
63
 
57
64
 
58
- class Type67(Enum):
65
+ class Type71(Enum):
59
66
  literature = "literature"
60
67
 
61
68
 
@@ -65,7 +72,7 @@ class PagesSchema(BaseModel):
65
72
 
66
73
 
67
74
  class LiteratureReferenceSchema(BaseModel):
68
- type: Optional[Type67] = None
75
+ type: Optional[Type71] = None
69
76
  doi: Optional[str] = None
70
77
  """
71
78
  Digital Object Identifier of the reference.
@@ -154,12 +161,24 @@ class InfoForCharacteristicObtainedByExperiment(BaseModel):
154
161
  """
155
162
 
156
163
 
164
+ class PropertySourceSchema(BaseModel):
165
+ type: Optional[str] = None
166
+ """
167
+ Type of the material property's source.
168
+ """
169
+ url: Optional[str] = None
170
+ """
171
+ Internet address of the reference.
172
+ """
173
+ info: Union[Info, InfoForCharacteristicObtainedByExperiment]
174
+
175
+
157
176
  class SystemTag(Enum):
158
177
  isRefined = "isRefined"
159
178
  isBest = "isBest"
160
179
 
161
180
 
162
- class SchemaOfMaterialSPreliminaryProperty(BaseModel):
181
+ class PropertyRawSchema(BaseModel):
163
182
  slug: Optional[str] = None
164
183
  """
165
184
  property slug, e.g. total_energy
@@ -172,10 +191,7 @@ class SchemaOfMaterialSPreliminaryProperty(BaseModel):
172
191
  """
173
192
  container of the information, specific to each property
174
193
  """
175
- source: field_This_could_be_an_article__a_simulation_on_Exabyte__an_external_simulation__etc.Field = Field(
176
- ...,
177
- title="The source of a property. This could be an article, a simulation on Exabyte, an external simulation, etc.",
178
- )
194
+ source: PropertySourceSchema = Field(..., title="Property source schema")
179
195
  exabyteId: Optional[List[str]] = None
180
196
  """
181
197
  Id of the corresponding item in the entity bank that this property is obtained for
@@ -5,11 +5,22 @@
5
5
  from __future__ import annotations
6
6
 
7
7
  from enum import Enum
8
- from typing import Any, Dict, List, Optional
8
+ from typing import Any, Dict, List, Optional, Union
9
9
 
10
10
  from pydantic import BaseModel, Field
11
11
 
12
12
 
13
+ class Info(BaseModel):
14
+ jobId: str
15
+ """
16
+ Job's identity
17
+ """
18
+ unitId: str
19
+ """
20
+ Id of the unit that extracted the result
21
+ """
22
+
23
+
13
24
  class Type(Enum):
14
25
  experiment = "experiment"
15
26
 
@@ -148,3 +159,15 @@ class InfoForCharacteristicObtainedByExperiment(BaseModel):
148
159
  """
149
160
  references to literature articles
150
161
  """
162
+
163
+
164
+ class PropertySourceSchema(BaseModel):
165
+ type: Optional[str] = None
166
+ """
167
+ Type of the material property's source.
168
+ """
169
+ url: Optional[str] = None
170
+ """
171
+ Internet address of the reference.
172
+ """
173
+ info: Union[Info, InfoForCharacteristicObtainedByExperiment]