@mat3ra/made 2026.8.13-0 → 2026.8.26-0

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 (493) hide show
  1. package/package.json +9 -5
  2. package/.babelrc +0 -10
  3. package/.eslintrc.json +0 -11
  4. package/.gitattributes +0 -1
  5. package/.husky/post-checkout +0 -3
  6. package/.husky/post-commit +0 -3
  7. package/.husky/post-merge +0 -3
  8. package/.husky/pre-commit +0 -6
  9. package/.husky/pre-push +0 -3
  10. package/.mocharc.json +0 -5
  11. package/.pre-commit-config.yaml +0 -26
  12. package/.prettierignore +0 -2
  13. package/.prettierrc +0 -6
  14. package/AGENTS.md +0 -133
  15. package/MANIFEST.in +0 -1
  16. package/data/constants.json +0 -13
  17. package/data/reciprocal_paths.json +0 -111
  18. package/images/made/tools/tools_diagram_general.png +0 -3
  19. package/images/made/tools/tools_diagram_interface.png +0 -3
  20. package/pyproject.toml +0 -123
  21. package/scripts/generate-mixins.ts +0 -28
  22. package/src/__init__.py +0 -0
  23. package/src/js/Material.ts +0 -618
  24. package/src/js/basis/basis.ts +0 -634
  25. package/src/js/basis/constrained_basis.ts +0 -115
  26. package/src/js/basis/coordinates.ts +0 -92
  27. package/src/js/basis/elements.ts +0 -24
  28. package/src/js/basis/helpers.ts +0 -20
  29. package/src/js/basis/labels.ts +0 -6
  30. package/src/js/cell/cell.ts +0 -149
  31. package/src/js/cell/conventional_cell.ts +0 -86
  32. package/src/js/cell/primitive_cell.ts +0 -166
  33. package/src/js/constants/molecule.ts +0 -18
  34. package/src/js/constants.ts +0 -4
  35. package/src/js/constraints/constraints.ts +0 -45
  36. package/src/js/generated/MaterialSchemaMixin.ts +0 -79
  37. package/src/js/lattice/lattice.ts +0 -308
  38. package/src/js/lattice/lattice_types.ts +0 -134
  39. package/src/js/lattice/reciprocal/lattice_reciprocal.ts +0 -206
  40. package/src/js/lattice/reciprocal/paths.ts +0 -39
  41. package/src/js/lattice/reciprocal/symmetry_points.ts +0 -886
  42. package/src/js/lattice/unit_cell.ts +0 -66
  43. package/src/js/made.ts +0 -62
  44. package/src/js/parsers/cif.ts +0 -25
  45. package/src/js/parsers/errors.ts +0 -6
  46. package/src/js/parsers/espresso.ts +0 -29
  47. package/src/js/parsers/native_format_parsers.ts +0 -52
  48. package/src/js/parsers/parsers.ts +0 -13
  49. package/src/js/parsers/poscar.ts +0 -218
  50. package/src/js/parsers/xyz.ts +0 -190
  51. package/src/js/parsers/xyz_combinatorial_basis.ts +0 -268
  52. package/src/js/tools/basis.ts +0 -131
  53. package/src/js/tools/cell.ts +0 -40
  54. package/src/js/tools/index.ts +0 -11
  55. package/src/js/tools/material.ts +0 -64
  56. package/src/js/tools/supercell.ts +0 -89
  57. package/src/js/tools/surface.ts +0 -213
  58. package/src/py/__init__.py +0 -0
  59. package/src/py/mat3ra/__init__.py +0 -1
  60. package/src/py/mat3ra/made/__init__.py +0 -7
  61. package/src/py/mat3ra/made/basis/__init__.py +0 -255
  62. package/src/py/mat3ra/made/basis/coordinates.py +0 -43
  63. package/src/py/mat3ra/made/cell/__init__.py +0 -55
  64. package/src/py/mat3ra/made/cell/primitive_cell.py +0 -156
  65. package/src/py/mat3ra/made/data_helper.py +0 -5
  66. package/src/py/mat3ra/made/lattice.py +0 -195
  67. package/src/py/mat3ra/made/material.py +0 -135
  68. package/src/py/mat3ra/made/metadata.py +0 -45
  69. package/src/py/mat3ra/made/reciprocal/__init__.py +0 -5
  70. package/src/py/mat3ra/made/reciprocal/lattice_reciprocal.py +0 -147
  71. package/src/py/mat3ra/made/reciprocal/paths.py +0 -30
  72. package/src/py/mat3ra/made/reciprocal/symmetry_points.py +0 -385
  73. package/src/py/mat3ra/made/tools/README.md +0 -173
  74. package/src/py/mat3ra/made/tools/__init__.py +0 -0
  75. package/src/py/mat3ra/made/tools/analyze/__init__.py +0 -31
  76. package/src/py/mat3ra/made/tools/analyze/basis/__init__.py +0 -3
  77. package/src/py/mat3ra/made/tools/analyze/basis/analyzer.py +0 -50
  78. package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer.py +0 -32
  79. package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer_factory.py +0 -31
  80. package/src/py/mat3ra/made/tools/analyze/coordination.py +0 -56
  81. package/src/py/mat3ra/made/tools/analyze/crystal_site/__init__.py +0 -0
  82. package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_crystal_site_material_analyzer.py +0 -35
  83. package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_material_analyzer.py +0 -49
  84. package/src/py/mat3ra/made/tools/analyze/crystal_site/crystal_site_analyzer.py +0 -65
  85. package/src/py/mat3ra/made/tools/analyze/crystal_site/voronoi_crystal_site_analyzer.py +0 -47
  86. package/src/py/mat3ra/made/tools/analyze/enums.py +0 -33
  87. package/src/py/mat3ra/made/tools/analyze/fingerprint/__init__.py +0 -4
  88. package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/__init__.py +0 -0
  89. package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/layered_fingerprint_along_axis.py +0 -83
  90. package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/unique_element_string_per_layer.py +0 -9
  91. package/src/py/mat3ra/made/tools/analyze/interface/__init__.py +0 -20
  92. package/src/py/mat3ra/made/tools/analyze/interface/commensurate.py +0 -156
  93. package/src/py/mat3ra/made/tools/analyze/interface/enums.py +0 -60
  94. package/src/py/mat3ra/made/tools/analyze/interface/grain_boundary.py +0 -80
  95. package/src/py/mat3ra/made/tools/analyze/interface/simple.py +0 -251
  96. package/src/py/mat3ra/made/tools/analyze/interface/twisted_nanoribbons.py +0 -91
  97. package/src/py/mat3ra/made/tools/analyze/interface/utils/__init__.py +0 -77
  98. package/src/py/mat3ra/made/tools/analyze/interface/utils/holders.py +0 -14
  99. package/src/py/mat3ra/made/tools/analyze/interface/utils/vector.py +0 -56
  100. package/src/py/mat3ra/made/tools/analyze/interface/zsl.py +0 -259
  101. package/src/py/mat3ra/made/tools/analyze/interface_material.py +0 -45
  102. package/src/py/mat3ra/made/tools/analyze/lattice/__init__.py +0 -2
  103. package/src/py/mat3ra/made/tools/analyze/lattice/analyzer.py +0 -126
  104. package/src/py/mat3ra/made/tools/analyze/lattice/helpers.py +0 -31
  105. package/src/py/mat3ra/made/tools/analyze/lattice_lines.py +0 -30
  106. package/src/py/mat3ra/made/tools/analyze/lattice_planes.py +0 -192
  107. package/src/py/mat3ra/made/tools/analyze/lattice_swap_analyzer.py +0 -105
  108. package/src/py/mat3ra/made/tools/analyze/material.py +0 -276
  109. package/src/py/mat3ra/made/tools/analyze/other.py +0 -434
  110. package/src/py/mat3ra/made/tools/analyze/rdf.py +0 -74
  111. package/src/py/mat3ra/made/tools/analyze/slab.py +0 -76
  112. package/src/py/mat3ra/made/tools/analyze/solid_solution_analyzer.py +0 -171
  113. package/src/py/mat3ra/made/tools/analyze/terrace.py +0 -105
  114. package/src/py/mat3ra/made/tools/analyze/utils.py +0 -162
  115. package/src/py/mat3ra/made/tools/bond_directions/__init__.py +0 -0
  116. package/src/py/mat3ra/made/tools/bond_directions/bond_directions.py +0 -150
  117. package/src/py/mat3ra/made/tools/bond_directions/bond_directions_for_element_list.py +0 -7
  118. package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_enum.py +0 -8
  119. package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_for_element.py +0 -16
  120. package/src/py/mat3ra/made/tools/build/__init__.py +0 -25
  121. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/__init__.py +0 -7
  122. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/helpers.py +0 -59
  123. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/types.py +0 -26
  124. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/utils.py +0 -139
  125. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/__init__.py +0 -47
  126. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/__init__.py +0 -11
  127. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/build_parameters.py +0 -5
  128. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/builder.py +0 -164
  129. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/configuration.py +0 -48
  130. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/helpers.py +0 -134
  131. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/__init__.py +0 -6
  132. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/helpers.py +0 -157
  133. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/enums.py +0 -7
  134. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/__init__.py +0 -7
  135. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/configuration.py +0 -13
  136. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/helpers.py +0 -70
  137. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/utils.py +0 -87
  138. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/__init__.py +0 -6
  139. package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/helpers.py +0 -129
  140. package/src/py/mat3ra/made/tools/build/defective_structures/__init__.py +0 -0
  141. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/__init__.py +0 -0
  142. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/__init__.py +0 -0
  143. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/build_parameters.py +0 -12
  144. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/builder.py +0 -17
  145. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/configuration.py +0 -40
  146. package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/helpers.py +0 -82
  147. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/__init__.py +0 -1
  148. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/__init__.py +0 -9
  149. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/builder.py +0 -37
  150. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/configuration.py +0 -30
  151. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/enums.py +0 -8
  152. package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/helpers.py +0 -76
  153. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/__init__.py +0 -0
  154. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/__init__.py +0 -0
  155. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/builder.py +0 -11
  156. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/configuration.py +0 -18
  157. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/helpers.py +0 -137
  158. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/types.py +0 -22
  159. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/__init__.py +0 -0
  160. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/builder.py +0 -28
  161. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/configuration.py +0 -55
  162. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/helpers.py +0 -75
  163. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/builder.py +0 -15
  164. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/configuration.py +0 -16
  165. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/helpers.py +0 -116
  166. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/build_parameters.py +0 -10
  167. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/builder.py +0 -30
  168. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/configuration.py +0 -11
  169. package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/helpers.py +0 -78
  170. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/__init__.py +0 -0
  171. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/__init__.py +0 -0
  172. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/builder.py +0 -31
  173. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/configuration.py +0 -45
  174. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/helpers.py +0 -80
  175. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/__init__.py +0 -40
  176. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/atom_placement_method_enum.py +0 -14
  177. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/__init__.py +0 -7
  178. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/builder.py +0 -42
  179. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/configuration.py +0 -27
  180. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/complex_defect_type_enum.py +0 -5
  181. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/factories.py +0 -69
  182. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/helpers.py +0 -92
  183. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/__init__.py +0 -7
  184. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/builder.py +0 -8
  185. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/configuration.py +0 -29
  186. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/helpers.py +0 -48
  187. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/interstitial_placement_method_enum.py +0 -8
  188. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/point_defect_type_enum.py +0 -8
  189. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/__init__.py +0 -7
  190. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/builder.py +0 -6
  191. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/configuration.py +0 -41
  192. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/helpers.py +0 -43
  193. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/substitution_placement_method_enum.py +0 -7
  194. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/types.py +0 -24
  195. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/__init__.py +0 -7
  196. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/builder.py +0 -19
  197. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/configuration.py +0 -27
  198. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/helpers.py +0 -42
  199. package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/vacancy_placement_method_enum.py +0 -7
  200. package/src/py/mat3ra/made/tools/build/pristine_structures/__init__.py +0 -0
  201. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/__init__.py +0 -0
  202. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/builder.py +0 -80
  203. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/configurations.py +0 -22
  204. package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/helpers.py +0 -40
  205. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/__init__.py +0 -0
  206. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/__init__.py +0 -29
  207. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/build_parameters.py +0 -5
  208. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/builders.py +0 -56
  209. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/configuration.py +0 -33
  210. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/helpers.py +0 -76
  211. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/__init__.py +0 -11
  212. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/build_parameters.py +0 -9
  213. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/builders.py +0 -83
  214. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/configuration.py +0 -35
  215. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/helpers.py +0 -62
  216. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/__init__.py +0 -9
  217. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/build_parameters.py +0 -8
  218. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/builder.py +0 -42
  219. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/configuration.py +0 -99
  220. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/helpers.py +0 -95
  221. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/termination_utils.py +0 -14
  222. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/utils.py +0 -61
  223. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/builder.py +0 -22
  224. package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/configuration.py +0 -17
  225. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/__init__.py +0 -0
  226. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/__init__.py +0 -19
  227. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/analyzer.py +0 -86
  228. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/__init__.py +0 -7
  229. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/builder.py +0 -54
  230. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/configuration.py +0 -19
  231. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/enums.py +0 -42
  232. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/helpers.py +0 -127
  233. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/__init__.py +0 -7
  234. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/builder.py +0 -33
  235. package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/configuration.py +0 -16
  236. package/src/py/mat3ra/made/tools/build/processed_structures/__init__.py +0 -0
  237. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/__init__.py +0 -0
  238. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/__init__.py +0 -0
  239. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/__init__.py +0 -9
  240. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/coordination_based_passivation_material_analyzer.py +0 -112
  241. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/passivation_material_analyzer.py +0 -16
  242. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/surface_passivation_material_analyzer.py +0 -32
  243. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/builder.py +0 -23
  244. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/configuration.py +0 -31
  245. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/enums.py +0 -7
  246. package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/helpers.py +0 -151
  247. package/src/py/mat3ra/made/tools/build_components/__init__.py +0 -10
  248. package/src/py/mat3ra/made/tools/build_components/entities/__init__.py +0 -0
  249. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/__init__.py +0 -0
  250. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/one_dimensional/miller_indices_2d.py +0 -0
  251. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/miller_indices.py +0 -18
  252. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/termination.py +0 -33
  253. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/__init__.py +0 -0
  254. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/__init__.py +0 -2
  255. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site.py +0 -24
  256. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site_list.py +0 -9
  257. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/builder.py +0 -32
  258. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/configuration.py +0 -14
  259. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/__init__.py +0 -0
  260. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/builder.py +0 -29
  261. package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/configuration.py +0 -19
  262. package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/builder.py +0 -48
  263. package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/configuration.py +0 -17
  264. package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/builder.py +0 -25
  265. package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/configuration.py +0 -8
  266. package/src/py/mat3ra/made/tools/build_components/entities/reusable/__init__.py +0 -0
  267. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/__init__.py +0 -16
  268. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_configuration_pydantic.py +0 -5
  269. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_single_builder.py +0 -87
  270. package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/build_parameters.py +0 -5
  271. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/__init__.py +0 -0
  272. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/__init__.py +0 -4
  273. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/builder.py +0 -46
  274. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/configuration.py +0 -19
  275. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/edge_types.py +0 -51
  276. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/helpers.py +0 -58
  277. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/__init__.py +0 -4
  278. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/builder.py +0 -42
  279. package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/configuration.py +0 -21
  280. package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/__init__.py +0 -0
  281. package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/configuration.py +0 -11
  282. package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/helpers.py +0 -38
  283. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/__init__.py +0 -24
  284. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/__init__.py +0 -7
  285. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/builder.py +0 -62
  286. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/configuration.py +0 -14
  287. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/helpers.py +0 -42
  288. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/__init__.py +0 -7
  289. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/builder.py +0 -39
  290. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/configuration.py +0 -24
  291. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/__init__.py +0 -10
  292. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/builder.py +0 -36
  293. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/configuration.py +0 -31
  294. package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/helpers.py +0 -80
  295. package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/__init__.py +0 -0
  296. package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/coordinates_shape_enum.py +0 -8
  297. package/src/py/mat3ra/made/tools/build_components/metadata/__init__.py +0 -2
  298. package/src/py/mat3ra/made/tools/build_components/metadata/build_metadata.py +0 -7
  299. package/src/py/mat3ra/made/tools/build_components/metadata/material_build_metadata.py +0 -35
  300. package/src/py/mat3ra/made/tools/build_components/metadata/material_with_build_metadata.py +0 -8
  301. package/src/py/mat3ra/made/tools/build_components/mixins/__init__.py +0 -2
  302. package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_ase_atoms_mixin.py +0 -8
  303. package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_pymatgen_structure_mixin.py +0 -8
  304. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/__init__.py +0 -0
  305. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/enums.py +0 -11
  306. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/__init__.py +0 -6
  307. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/build_parameters.py +0 -18
  308. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/builder.py +0 -93
  309. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/configuration.py +0 -20
  310. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/builder.py +0 -83
  311. package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/configuration.py +0 -24
  312. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/__init__.py +0 -15
  313. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/build_parameters.py +0 -5
  314. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/base.py +0 -33
  315. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/isometric.py +0 -25
  316. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/configuration.py +0 -24
  317. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/__init__.py +0 -13
  318. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/atomic_mass_dependent_function_holder.py +0 -32
  319. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/function_holder.py +0 -80
  320. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/maxwell_boltzmann.py +0 -39
  321. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/perturbation_function_holder.py +0 -45
  322. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/sine_wave_perturbation_function_holder.py +0 -29
  323. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/helpers.py +0 -83
  324. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py +0 -5
  325. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py +0 -25
  326. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py +0 -23
  327. package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py +0 -49
  328. package/src/py/mat3ra/made/tools/build_components/utils.py +0 -44
  329. package/src/py/mat3ra/made/tools/calculate/__init__.py +0 -149
  330. package/src/py/mat3ra/made/tools/calculate/ase/__init__.py +0 -133
  331. package/src/py/mat3ra/made/tools/calculate/ase/constraints.py +0 -91
  332. package/src/py/mat3ra/made/tools/calculate/calculators/__init__.py +0 -4
  333. package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator.py +0 -70
  334. package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator_parameters.py +0 -14
  335. package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator.py +0 -32
  336. package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator_parameters.py +0 -17
  337. package/src/py/mat3ra/made/tools/calculate/interaction_functions.py +0 -23
  338. package/src/py/mat3ra/made/tools/convert/__init__.py +0 -286
  339. package/src/py/mat3ra/made/tools/convert/interface_parts_enum.py +0 -9
  340. package/src/py/mat3ra/made/tools/convert/utils.py +0 -96
  341. package/src/py/mat3ra/made/tools/entities/__init__.py +0 -5
  342. package/src/py/mat3ra/made/tools/entities/coordinate/__init__.py +0 -14
  343. package/src/py/mat3ra/made/tools/entities/coordinate/box_coordinate_condition.py +0 -15
  344. package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_condition.py +0 -16
  345. package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_functions.py +0 -158
  346. package/src/py/mat3ra/made/tools/entities/coordinate/cylinder_coordinate_condition.py +0 -17
  347. package/src/py/mat3ra/made/tools/entities/coordinate/plane_coordinate_condition.py +0 -14
  348. package/src/py/mat3ra/made/tools/entities/coordinate/sphere_coordinate_condition.py +0 -15
  349. package/src/py/mat3ra/made/tools/entities/coordinate/triangular_prism_coordinate_condition.py +0 -26
  350. package/src/py/mat3ra/made/tools/entities/termination_holder.py +0 -12
  351. package/src/py/mat3ra/made/tools/helpers.py +0 -168
  352. package/src/py/mat3ra/made/tools/modify.py +0 -627
  353. package/src/py/mat3ra/made/tools/operations/core/binary.py +0 -106
  354. package/src/py/mat3ra/made/tools/operations/core/unary.py +0 -170
  355. package/src/py/mat3ra/made/tools/operations/core/utils.py +0 -138
  356. package/src/py/mat3ra/made/tools/operations/reusable/unary.py +0 -53
  357. package/src/py/mat3ra/made/tools/optimize.py +0 -55
  358. package/src/py/mat3ra/made/tools/third_party.py +0 -69
  359. package/src/py/mat3ra/made/tools/utils.py +0 -182
  360. package/src/py/mat3ra/made/utils.py +0 -144
  361. package/tests/.gitattributes +0 -1
  362. package/tests/fixtures/AsGe-basis.json +0 -3
  363. package/tests/fixtures/C2H4-translated.json +0 -3
  364. package/tests/fixtures/C2H4.json +0 -3
  365. package/tests/fixtures/FeLiSi-basis.json +0 -3
  366. package/tests/fixtures/FeO.json +0 -3
  367. package/tests/fixtures/Ge2-basis.json +0 -3
  368. package/tests/fixtures/Graphene.json +0 -3
  369. package/tests/fixtures/Graphene.poscar +0 -3
  370. package/tests/fixtures/H2+H-final.json +0 -3
  371. package/tests/fixtures/H2+H-image.json +0 -3
  372. package/tests/fixtures/H2+H-initial.json +0 -3
  373. package/tests/fixtures/H2O.poscar +0 -3
  374. package/tests/fixtures/LiFeSi-basis-labels.json +0 -3
  375. package/tests/fixtures/LiFeSi-basis.json +0 -3
  376. package/tests/fixtures/Na.json +0 -3
  377. package/tests/fixtures/Na4Cl4-cartesian.json +0 -3
  378. package/tests/fixtures/Na4Cl4.json +0 -3
  379. package/tests/fixtures/Na4Cl4.poscar +0 -3
  380. package/tests/fixtures/Ni-hex.json +0 -3
  381. package/tests/fixtures/Ni-hex.poscar +0 -3
  382. package/tests/fixtures/OSi-basis.json +0 -3
  383. package/tests/fixtures/Si-hex.poscar +0 -3
  384. package/tests/fixtures/Si-pwscf.in +0 -3
  385. package/tests/fixtures/Si-slab.json +0 -3
  386. package/tests/fixtures/Si-supercell.json +0 -3
  387. package/tests/fixtures/Si2-basis-repeated.json +0 -3
  388. package/tests/fixtures/Si2-basis.json +0 -3
  389. package/tests/fixtures/Zr1H23Zr1H1.json +0 -3
  390. package/tests/fixtures/Zr1H23Zr1H1.poscar +0 -3
  391. package/tests/fixtures/atomic-constraints.json +0 -3
  392. package/tests/fixtures/hashes.json +0 -3
  393. package/tests/fixtures/si-slab-100.json +0 -3
  394. package/tests/fixtures/si-slab-111-0-vacuum.json +0 -3
  395. package/tests/fixtures/si-slab-111-0.5-vacuum-gamma-120.json +0 -3
  396. package/tests/fixtures/si-slab-111-0.5-vacuum-ratio.json +0 -3
  397. package/tests/fixtures/si-standata.json +0 -3
  398. package/tests/js/basis/basis.ts +0 -247
  399. package/tests/js/cell/cell.ts +0 -182
  400. package/tests/js/cell/primitive_cell.ts +0 -21
  401. package/tests/js/constraints/constraints.ts +0 -11
  402. package/tests/js/fixtures.ts +0 -123
  403. package/tests/js/lattice/lattice.ts +0 -43
  404. package/tests/js/lattice/lattice_reciprocal.ts +0 -104
  405. package/tests/js/material/material.ts +0 -161
  406. package/tests/js/parsers/espresso.ts +0 -12
  407. package/tests/js/parsers/native_formats.ts +0 -35
  408. package/tests/js/parsers/poscar.ts +0 -89
  409. package/tests/js/parsers/xyz.ts +0 -33
  410. package/tests/js/parsers/xyz_combinatorial_basis.ts +0 -156
  411. package/tests/js/register-esse-schemas.cjs +0 -10
  412. package/tests/js/setup.ts +0 -6
  413. package/tests/js/tools/basis.ts +0 -22
  414. package/tests/js/tools/supercell.ts +0 -58
  415. package/tests/js/tools/surface.ts +0 -111
  416. package/tests/py/conftest.py +0 -34
  417. package/tests/py/mat3ra/debug_utils.py +0 -75
  418. package/tests/py/unit/__init__.py +0 -0
  419. package/tests/py/unit/fixtures/__init__.py +0 -0
  420. package/tests/py/unit/fixtures/adatom.py +0 -60
  421. package/tests/py/unit/fixtures/bulk.py +0 -162
  422. package/tests/py/unit/fixtures/cuts.py +0 -118
  423. package/tests/py/unit/fixtures/grain_boundary.py +0 -875
  424. package/tests/py/unit/fixtures/interface/commensurate.py +0 -498
  425. package/tests/py/unit/fixtures/interface/gaas_dia.py +0 -837
  426. package/tests/py/unit/fixtures/interface/gr_ni_111_top_hcp.py +0 -123
  427. package/tests/py/unit/fixtures/interface/simple.py +0 -84
  428. package/tests/py/unit/fixtures/interface/twisted_nanoribbons.py +0 -131
  429. package/tests/py/unit/fixtures/interface/zsl.py +0 -756
  430. package/tests/py/unit/fixtures/island.py +0 -336
  431. package/tests/py/unit/fixtures/merge.py +0 -147
  432. package/tests/py/unit/fixtures/monolayer.py +0 -46
  433. package/tests/py/unit/fixtures/nanoparticle.py +0 -116
  434. package/tests/py/unit/fixtures/nanoribbon/__init__.py +0 -0
  435. package/tests/py/unit/fixtures/nanoribbon/armchair.py +0 -102
  436. package/tests/py/unit/fixtures/nanoribbon/nanoribbon.py +0 -145
  437. package/tests/py/unit/fixtures/nanoribbon/zigzag.py +0 -54
  438. package/tests/py/unit/fixtures/pair_defects.py +0 -41
  439. package/tests/py/unit/fixtures/passivated/nanoribbon.py +0 -69
  440. package/tests/py/unit/fixtures/passivated/slab.py +0 -58
  441. package/tests/py/unit/fixtures/point_defects.py +0 -158
  442. package/tests/py/unit/fixtures/slab.py +0 -606
  443. package/tests/py/unit/fixtures/strain.py +0 -42
  444. package/tests/py/unit/fixtures/supercell.py +0 -64
  445. package/tests/py/unit/fixtures/terrace.py +0 -70
  446. package/tests/py/unit/fixtures/thrid_party/ase_atoms.py +0 -13
  447. package/tests/py/unit/test_analyze_lattice_planes.py +0 -131
  448. package/tests/py/unit/test_cell.py +0 -104
  449. package/tests/py/unit/test_data_files.py +0 -68
  450. package/tests/py/unit/test_lattice.py +0 -103
  451. package/tests/py/unit/test_lattice_type_extended.py +0 -53
  452. package/tests/py/unit/test_material.py +0 -158
  453. package/tests/py/unit/test_operations.py +0 -126
  454. package/tests/py/unit/test_primitive_cell.py +0 -118
  455. package/tests/py/unit/test_reciprocal_lattice.py +0 -86
  456. package/tests/py/unit/test_reciprocal_paths.py +0 -64
  457. package/tests/py/unit/test_symmetry_points.py +0 -151
  458. package/tests/py/unit/test_tools_analyze.py +0 -219
  459. package/tests/py/unit/test_tools_analyze_basis.py +0 -105
  460. package/tests/py/unit/test_tools_analyze_interface.py +0 -223
  461. package/tests/py/unit/test_tools_analyze_interface_material.py +0 -63
  462. package/tests/py/unit/test_tools_analyze_interface_zsl.py +0 -187
  463. package/tests/py/unit/test_tools_analyze_lattice.py +0 -74
  464. package/tests/py/unit/test_tools_analyze_swap.py +0 -80
  465. package/tests/py/unit/test_tools_build.py +0 -158
  466. package/tests/py/unit/test_tools_build_defect/__init__.py +0 -0
  467. package/tests/py/unit/test_tools_build_defect/test_adatom.py +0 -84
  468. package/tests/py/unit/test_tools_build_defect/test_island.py +0 -45
  469. package/tests/py/unit/test_tools_build_defect/test_pair_defect.py +0 -84
  470. package/tests/py/unit/test_tools_build_defect/test_point_defect.py +0 -196
  471. package/tests/py/unit/test_tools_build_defect/test_slab_stack.py +0 -30
  472. package/tests/py/unit/test_tools_build_defect/test_solid_solution.py +0 -90
  473. package/tests/py/unit/test_tools_build_defect/test_terrace.py +0 -44
  474. package/tests/py/unit/test_tools_build_grain_boundary.py +0 -133
  475. package/tests/py/unit/test_tools_build_heterostructure.py +0 -46
  476. package/tests/py/unit/test_tools_build_interface.py +0 -292
  477. package/tests/py/unit/test_tools_build_interface_zsl.py +0 -263
  478. package/tests/py/unit/test_tools_build_maxwell_disorder.py +0 -123
  479. package/tests/py/unit/test_tools_build_metadata.py +0 -79
  480. package/tests/py/unit/test_tools_build_monolayer.py +0 -33
  481. package/tests/py/unit/test_tools_build_nanoparticle.py +0 -42
  482. package/tests/py/unit/test_tools_build_nanoribbon.py +0 -45
  483. package/tests/py/unit/test_tools_build_passivation.py +0 -85
  484. package/tests/py/unit/test_tools_build_perturbation.py +0 -103
  485. package/tests/py/unit/test_tools_build_slab.py +0 -382
  486. package/tests/py/unit/test_tools_build_strain.py +0 -36
  487. package/tests/py/unit/test_tools_build_supercell.py +0 -47
  488. package/tests/py/unit/test_tools_calculate.py +0 -67
  489. package/tests/py/unit/test_tools_convert.py +0 -174
  490. package/tests/py/unit/test_tools_modify.py +0 -248
  491. package/tests/py/unit/utils.py +0 -142
  492. package/tsconfig-transpile.json +0 -3
  493. package/tsconfig.json +0 -3
@@ -1,192 +0,0 @@
1
- from functools import cached_property
2
- from typing import List, Tuple, Union
3
-
4
- from mat3ra.code.vector import Vector3D
5
- from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
6
- from mat3ra.made.material import Material
7
-
8
- from ..build_components.metadata import MaterialWithBuildMetadata
9
- from ..convert import from_pymatgen, to_pymatgen
10
- from ..entities import MillerIndices, Termination, TerminationHolder
11
- from ..third_party import PymatgenSlab, PymatgenSlabGenerator, label_pymatgen_slab_termination
12
- from .lattice import LatticeMaterialAnalyzer
13
-
14
-
15
- def select_slab_with_termination_by_formula(slabs: List[PymatgenSlab], termination: Termination) -> PymatgenSlab:
16
- for slab in slabs:
17
- if Termination.from_string(label_pymatgen_slab_termination(slab)).formula == termination.formula:
18
- return slab
19
- raise ValueError(f"No slab found with termination: {termination}")
20
-
21
-
22
- class CrystalLatticePlanesMaterialAnalyzer(LatticeMaterialAnalyzer):
23
- # Values used to generate slabs with terminations, these values are set to allow for all terminations to be found.
24
- # Heuristic showed that these values are sufficient for all slabs configurations.
25
- DEFAULT_THICKNESS_FOR_TERMINATIONS: int = 3
26
- DEFAULT_VACUUM_SIZE_FOR_TERMINATIONS: int = 1
27
- # Values used to generate slabs for later use. A single layer thickness and no vacuum.
28
- DEFAULT_THICKNESS_FOR_GENERATION: int = 1
29
- DEFAULT_VACUUM_SIZE_FOR_GENERATION: int = 0
30
- DEFAULT_SYMMETRIZE: bool = False
31
- miller_indices: Union[List[int], Tuple[int, int, int]]
32
-
33
- def get_pymatgen_slab_generator(
34
- self,
35
- min_slab_size: float = DEFAULT_VACUUM_SIZE_FOR_GENERATION,
36
- min_vacuum_size: float = DEFAULT_VACUUM_SIZE_FOR_GENERATION,
37
- in_unit_planes: bool = True,
38
- make_primitive: bool = False,
39
- ):
40
- return PymatgenSlabGenerator(
41
- initial_structure=to_pymatgen(self.material_with_conventional_lattice),
42
- miller_index=MillerIndices(root=self.miller_indices).to_tuple(),
43
- min_slab_size=min_slab_size,
44
- min_vacuum_size=min_vacuum_size,
45
- in_unit_planes=in_unit_planes,
46
- primitive=make_primitive,
47
- )
48
-
49
- @cached_property
50
- def pymatgen_slab_generator_with_vacuum(self) -> PymatgenSlabGenerator:
51
- # This generator is used to create slabs with vacuum and thick enough to allow for all terminations to be found.
52
- return self.get_pymatgen_slab_generator(
53
- min_slab_size=self.DEFAULT_THICKNESS_FOR_TERMINATIONS,
54
- min_vacuum_size=self.DEFAULT_VACUUM_SIZE_FOR_TERMINATIONS,
55
- )
56
-
57
- @cached_property
58
- def pymatgen_slab_generator_without_vacuum(self) -> PymatgenSlabGenerator:
59
- # This generator is used to create slabs without vacuum and with a single layer thickness.
60
- return self.get_pymatgen_slab_generator(
61
- min_slab_size=self.DEFAULT_THICKNESS_FOR_GENERATION, min_vacuum_size=self.DEFAULT_VACUUM_SIZE_FOR_GENERATION
62
- )
63
-
64
- @cached_property
65
- def all_planes_as_pymatgen_slabs_with_vacuum(self) -> List[PymatgenSlab]:
66
- return [
67
- *self.pymatgen_slab_generator_with_vacuum.get_slabs(symmetrize=True),
68
- # Leaving option to create a non-symmetrized slabs too for additional terminations.
69
- # As of now, looks like symmetrize=True gives all the unique terminations needed.
70
- # *self.pymatgen_slab_generator_with_vacuum.get_slabs(symmetrize=False),
71
- ]
72
-
73
- @cached_property
74
- def all_planes_as_pymatgen_slabs_without_vacuum(self) -> List[PymatgenSlab]:
75
- return [
76
- *self.pymatgen_slab_generator_without_vacuum.get_slabs(symmetrize=self.DEFAULT_SYMMETRIZE),
77
- # Leaving option to create symmetrized slabs for layers generation.
78
- # *self.pymatgen_slab_generator_without_vacuum.get_slabs(symmetrize=not self.DEFAULT_SYMMETRIZE),
79
- ]
80
-
81
- def _create_fallback_termination_for_failed_slab_generation(self) -> TerminationHolder:
82
- """
83
- Creates a fallback termination when pymatgen's SlabGenerator fails to generate slabs.
84
-
85
- This happens for certain materials where SlabGenerator removes "too many sites"
86
- and returns empty slab lists (e.g., some nanoribbons, thin 2D materials).
87
-
88
- Returns:
89
- TerminationHolder: A basic termination using the material's chemical formula
90
- """
91
- formula = self.formula
92
- fallback_termination = Termination(chemical_elements=formula, space_group_symmetry_label="")
93
-
94
- return TerminationHolder(
95
- termination_with_vacuum=fallback_termination,
96
- termination_without_vacuum=fallback_termination,
97
- shift_with_vacuum=0.0,
98
- shift_without_vacuum=0.0,
99
- )
100
-
101
- @cached_property
102
- def termination_holders(self):
103
- termination_holders = []
104
- slabs_with_vacuum = self.all_planes_as_pymatgen_slabs_with_vacuum
105
- slabs_without_vacuum = self.all_planes_as_pymatgen_slabs_without_vacuum
106
-
107
- # Handle case where pymatgen fails to generate slabs for certain materials
108
- # (e.g., some nanoribbons where "Too many sites removed" by SlabGenerator)
109
- if not slabs_with_vacuum:
110
- fallback_holder = self._create_fallback_termination_for_failed_slab_generation()
111
- termination_holders.append(fallback_holder)
112
-
113
- for slab_with_vacuum in slabs_with_vacuum:
114
- termination_with_vacuum_string = label_pymatgen_slab_termination(slab_with_vacuum)
115
- termination_with_vacuum = Termination.from_string(termination_with_vacuum_string)
116
-
117
- try:
118
- matching_slab_without_vacuum = select_slab_with_termination_by_formula(
119
- slabs_without_vacuum, termination_with_vacuum
120
- )
121
- termination_without_vacuum_string = label_pymatgen_slab_termination(matching_slab_without_vacuum)
122
- termination_without_vacuum = Termination.from_string(termination_without_vacuum_string)
123
- shift_without_vacuum = matching_slab_without_vacuum.shift
124
- except ValueError:
125
- termination_without_vacuum = None
126
- shift_without_vacuum = 0.0
127
- shift_with_vacuum = slab_with_vacuum.shift
128
-
129
- termination_holders.append(
130
- TerminationHolder(
131
- termination_with_vacuum=termination_with_vacuum,
132
- termination_without_vacuum=termination_without_vacuum,
133
- shift_with_vacuum=shift_with_vacuum,
134
- shift_without_vacuum=shift_without_vacuum,
135
- )
136
- )
137
-
138
- return termination_holders
139
-
140
- @cached_property
141
- def terminations_with_vacuum(self) -> List[Termination]:
142
- return [holder.termination_with_vacuum for holder in self.termination_holders]
143
-
144
- @cached_property
145
- def terminations_without_vacuum(self) -> List[Termination]:
146
- return [holder.termination_without_vacuum for holder in self.termination_holders]
147
-
148
- @cached_property
149
- def terminations(self):
150
- return self.terminations_with_vacuum
151
-
152
- @property
153
- def default_termination(self) -> Termination:
154
- return self.terminations[0]
155
-
156
- @property
157
- def miller_supercell_matrix(self) -> Matrix3x3Schema:
158
- return self.pymatgen_slab_generator_without_vacuum.slab_scale_factor.tolist()
159
-
160
- def get_material_name_for_termination(self, termination: Termination) -> str:
161
- # for example: "Si(001), termination Si_P4/mmm_1, Slab"
162
- return f"{self.material.formula}({self.miller_indices}), termination {termination}, Slab"
163
-
164
- def get_material_with_termination_without_vacuum(self, termination: Termination) -> Material:
165
- # Note: termination is passed with vacuum, but we return the material without vacuum
166
- holder = next((h for h in self.termination_holders if h.termination_with_vacuum == termination), None)
167
- if holder is None:
168
- raise ValueError(f"Termination {termination} not found.")
169
-
170
- slabs_without_vacuum = self.all_planes_as_pymatgen_slabs_without_vacuum
171
- slab = select_slab_with_termination_by_formula(slabs_without_vacuum, termination)
172
- material = MaterialWithBuildMetadata.create(from_pymatgen(slab))
173
- material.name = self.get_material_name_for_termination(termination)
174
- return material
175
-
176
- def get_translation_vector_for_termination_without_vacuum(self, termination: Termination) -> Vector3D:
177
- holder = next((h for h in self.termination_holders if h.termination_with_vacuum == termination), None)
178
- if holder is None:
179
- raise ValueError(f"Termination {termination} not found.")
180
-
181
- # NOTE: pymatgen shift values are in fractional crystal coordinates and need to be negated
182
- # Convert from crystal to cartesian coordinates using the conventional lattice
183
- crystal_shift = [0.0, 0.0, -holder.shift_without_vacuum]
184
- cartesian_shift = self.material_with_conventional_lattice.basis.cell.convert_point_to_cartesian(crystal_shift)
185
- return cartesian_shift
186
-
187
- def get_materials_for_all_terminations_without_vacuum(self) -> List[Material]:
188
- return [
189
- self.get_material_with_termination_without_vacuum(holder.termination_with_vacuum)
190
- for holder in self.termination_holders
191
- if holder.termination_without_vacuum is not None
192
- ]
@@ -1,105 +0,0 @@
1
- from typing import Union
2
-
3
- import numpy as np
4
- from mat3ra.esse.models.core.abstract.matrix_3x3 import Matrix3x3Schema
5
- from mat3ra.made.material import Material
6
- from pydantic import BaseModel, Field
7
-
8
- from ..build_components.metadata.material_with_build_metadata import MaterialWithBuildMetadata
9
- from ..operations.reusable.unary import transform_material_by_matrix
10
- from .basis import BasisMaterialAnalyzer
11
- from .enums import POSSIBLE_TRANSFORMATION_MATRICES
12
-
13
-
14
- class LatticeSwapDetectionResult(BaseModel):
15
- model_config = {"arbitrary_types_allowed": True}
16
- is_swapped: bool = Field(..., description="Whether a lattice swap was detected")
17
- permutation: Matrix3x3Schema = Field(..., description="Transformation matrix representing the swap")
18
- confidence: float = Field(..., description="Confidence score (0.0 to 1.0)")
19
-
20
-
21
- class MaterialLatticeSwapAnalyzer(BaseModel):
22
- """
23
- Analyzer to detect lattice vector swaps/permutations between materials.
24
-
25
- This detects when lattice vectors have been reoriented (e.g., a->a, b->c, c->-b)
26
- rather than the basis being rotated within the lattice.
27
- """
28
-
29
- material: Union[Material, MaterialWithBuildMetadata]
30
- tolerance: float = 0.01
31
-
32
- def _compute_transformation_score(self, matrix: np.ndarray, target_fingerprint) -> float:
33
- transformed_material = transform_material_by_matrix(self.material, matrix)
34
- new_analyzer = BasisMaterialAnalyzer(material=transformed_material)
35
- new_fingerprint = new_analyzer.get_layer_fingerprint(target_fingerprint.layer_thickness)
36
- return target_fingerprint.get_similarity_score(new_fingerprint)
37
-
38
- def _create_detection_result(self, matrix: np.ndarray, score: float) -> LatticeSwapDetectionResult:
39
- is_identity = np.allclose(matrix, np.eye(3), atol=self.tolerance)
40
- return LatticeSwapDetectionResult(
41
- is_swapped=not is_identity,
42
- permutation=Matrix3x3Schema(root=matrix.tolist()),
43
- confidence=score,
44
- )
45
-
46
- def detect_swap_from_original(
47
- self, original_material: MaterialWithBuildMetadata, layer_thickness: float = 1.0, threshold: float = 0.1
48
- ) -> LatticeSwapDetectionResult:
49
- """
50
- Detect lattice swap from the original material.
51
-
52
- We apply every transformation matrix to lattice and basis, compute the fingerprint along z, then compare
53
- to the original material's fingerprint. The best matching transformation (if above threshold) is considered
54
- a detected swap.
55
-
56
-
57
- Args:
58
- original_material: The original material before transformation
59
- layer_thickness: Thickness of layers for fingerprint comparison
60
- threshold: Minimum improvement threshold to consider a swap detected
61
-
62
- Returns:
63
- LatticeSwapDetectionResult: Swap detection results with permutation and new lattice
64
- """
65
- target_analyzer = BasisMaterialAnalyzer(material=original_material)
66
- target_fingerprint = target_analyzer.get_layer_fingerprint(layer_thickness)
67
- possible_matrices = list(map(np.array, POSSIBLE_TRANSFORMATION_MATRICES))
68
-
69
- best_match = None
70
- max_score = 0
71
-
72
- for matrix in possible_matrices:
73
- score = self._compute_transformation_score(matrix, target_fingerprint)
74
- if score > max_score:
75
- best_match = self._create_detection_result(matrix, score)
76
- max_score = score
77
-
78
- if best_match and best_match.is_swapped and best_match.confidence >= threshold:
79
- return best_match
80
- # If no swap detected, return identity result
81
- return self._create_detection_result(np.eye(3), 1.0)
82
-
83
- def get_corrected_material(
84
- self,
85
- target: MaterialWithBuildMetadata,
86
- layer_thickness: float = 1.0,
87
- threshold: float = 0.1,
88
- ) -> MaterialWithBuildMetadata:
89
- """
90
- Correct the material's lattice to match the target material's orientation if a swap is detected.
91
-
92
- Args:
93
- target: The target material to match
94
- layer_thickness: Thickness of layers for fingerprint comparison
95
- threshold: Minimum improvement threshold to consider a swap detected
96
-
97
- Returns:
98
- MaterialWithBuildMetadata: Corrected material with lattice matching the target orientation
99
- """
100
- swap_info = self.detect_swap_from_original(target, layer_thickness, threshold)
101
- if swap_info.is_swapped:
102
- matrix_list = [list(row.root) if hasattr(row, "root") else row for row in swap_info.permutation.root]
103
- matrix_array = np.array(matrix_list)
104
- return transform_material_by_matrix(self.material, matrix_array)
105
- return self.material
@@ -1,276 +0,0 @@
1
- from typing import List, Optional, Tuple
2
-
3
- import numpy as np
4
- from mat3ra.code.array_with_ids import ArrayWithIds
5
- from mat3ra.made.material import Material
6
- from scipy.spatial._ckdtree import cKDTree
7
-
8
- from ..bond_directions.bond_directions import BondDirections
9
- from ..bond_directions.bond_directions_templates_for_element import BondDirectionsTemplatesForElement
10
- from ..build_components.entities.auxiliary.zero_dimensional.crystal_site import CrystalSite, CrystalSiteList
11
- from .rdf import RadialDistributionFunction
12
- from .utils import decorator_handle_periodic_boundary_conditions
13
-
14
-
15
- class MaterialWithCrystalSites(Material):
16
- crystal_sites: CrystalSiteList = CrystalSiteList.from_values([])
17
- nearest_neighbor_vectors: ArrayWithIds = ArrayWithIds.from_values([])
18
-
19
- @classmethod
20
- def from_material(cls, material: Material):
21
- new_material = material.clone()
22
- new_material.to_cartesian()
23
- return cls(name=material.name, basis=new_material.basis, lattice=new_material.lattice)
24
-
25
- def analyze(self):
26
- """
27
- Analyze the material in place and generate the crystal sites with properties.
28
-
29
- Generated properties:
30
- - nearest_neighbor_vectors: The nearest neighbor vectors for all sites.
31
- """
32
- self.nearest_neighbor_vectors = self.get_neighbors_vectors_for_all_sites(cutoff=3.0)
33
- self.crystal_sites = CrystalSiteList(
34
- values=[CrystalSite(nearest_neighbor_vectors=item) for item in self.nearest_neighbor_vectors.values],
35
- ids=self.nearest_neighbor_vectors.ids,
36
- )
37
-
38
- @property
39
- def coordinates_as_kdtree(self):
40
- return cKDTree(self.basis.coordinates.values)
41
-
42
- def get_neighbors_vectors_for_site(
43
- self, site_index: int, cutoff: float = 3.0, max_number_of_neighbors: Optional[int] = None
44
- ) -> List[np.ndarray]:
45
- """
46
- Get the nearest neighbor vectors for a specific site.
47
-
48
- Args:
49
- site_index (int): The index of the site to
50
- cutoff (float): The maximum cutoff radius for identifying neighbors.
51
- max_number_of_neighbors (int): The max number of neighbors possible.
52
-
53
- Returns:
54
- List[np.ndarray]: List of vectors to the nearest neighbors.
55
- """
56
- coordinates = self.basis.coordinates.values
57
- neighbors, distances = self.get_neighbors_for_site(site_index, cutoff, max_number_of_neighbors)
58
- vectors = [np.array(coordinates[neighbor]) - np.array(coordinates[site_index]) for neighbor in neighbors]
59
- return vectors
60
-
61
- @decorator_handle_periodic_boundary_conditions(cutoff=0.25)
62
- def get_neighbors_vectors_for_all_sites(
63
- self, cutoff: float = 3.0, max_number_of_neighbors: Optional[int] = None
64
- ) -> ArrayWithIds:
65
- """
66
- Get the nearest neighbor vectors for all sites.
67
-
68
- Args:
69
- cutoff (float): The maximum cutoff radius for identifying neighbors.
70
- max_number_of_neighbors (int): The max number of neighbors possible.
71
-
72
- Returns:
73
- ArrayWithIds: Array with the nearest neighbor vectors for all sites.
74
- """
75
- nearest_neighbors = ArrayWithIds(values=[], ids=[])
76
- for site_index in range(len(self.basis.coordinates.values)):
77
- vectors = self.get_neighbors_vectors_for_site(site_index, cutoff, max_number_of_neighbors)
78
- nearest_neighbors.add_item(vectors, site_index)
79
- return nearest_neighbors
80
-
81
- def get_neighbors_for_site(
82
- self,
83
- site_index: int,
84
- cutoff: float = 3.0,
85
- max_number_of_neighbors: Optional[int] = None,
86
- nearest_only: bool = True,
87
- ) -> Tuple[np.ndarray, np.ndarray]:
88
- """
89
- Get the nearest neighbors for a specific site.
90
-
91
- Args:
92
- site_index (int): The index of the site to
93
- cutoff (float): The maximum cutoff radius for identifying neighbors.
94
- max_number_of_neighbors (int): The max number of neighbors possible.
95
- nearest_only (bool): If True, only consider the first shell of neighbors.
96
-
97
- Returns:
98
- Tuple[np.ndarray, np.ndarray]: Tuple of neighbors and distances.
99
- """
100
- coordinates = self.basis.coordinates
101
- max_number_of_neighbors = (
102
- len(coordinates.values) if max_number_of_neighbors is None else max_number_of_neighbors
103
- )
104
- coordinate = coordinates.get_element_value_by_index(site_index)
105
- distances, neighbors = self.coordinates_as_kdtree.query(
106
- coordinate, k=max_number_of_neighbors, distance_upper_bound=cutoff
107
- )
108
- valid_indices = (distances != np.inf) & (distances != 0)
109
- distances = distances[valid_indices]
110
- neighbors = neighbors[valid_indices]
111
-
112
- if nearest_only:
113
- rdf = RadialDistributionFunction.from_material(self)
114
- valid_indices = np.where([rdf.is_within_first_peak(distance) for distance in distances])
115
- distances = distances[valid_indices]
116
- neighbors = neighbors[valid_indices]
117
- return neighbors, distances
118
-
119
- def get_nearest_neighbors_for_all_sites(
120
- self, cutoff: float = 3.0, max_number_of_neighbors: Optional[int] = None
121
- ) -> ArrayWithIds:
122
- """
123
- Get the nearest neighbors for all sites.
124
-
125
- Args:
126
- cutoff (float): The maximum cutoff radius for identifying neighbors.
127
- max_number_of_neighbors (int): The max number of neighbors possible.
128
-
129
- Returns:
130
- ArrayWithIds: Array with the nearest neighbors for all sites.
131
- """
132
- nearest_neighbors = ArrayWithIds(values=[], ids=[])
133
- for site_index in self.basis.coordinates.ids:
134
- neighbors, distances = self.get_neighbors_for_site(site_index, cutoff, max_number_of_neighbors)
135
- nearest_neighbors.add_item(neighbors, site_index)
136
- return nearest_neighbors
137
-
138
- @decorator_handle_periodic_boundary_conditions(cutoff=0.25)
139
- def get_coordination_numbers(self, cutoff: float = 3.0) -> ArrayWithIds:
140
- """
141
- Calculate the coordination numbers for all atoms in the material.
142
-
143
- Args:
144
- cutoff (float): The cutoff radius for identifying neighbors.
145
-
146
- Returns:
147
- ArrayWithIds: Array with the coordination numbers for all sites.
148
- """
149
- nearest_neighbors = self.get_nearest_neighbors_for_all_sites(cutoff)
150
- coordination_numbers = [len(neighbors) for neighbors in nearest_neighbors.values]
151
- return ArrayWithIds(values=coordination_numbers, ids=nearest_neighbors.ids)
152
-
153
- def get_undercoordinated_atom_indices(self, cutoff: float, coordination_threshold: int) -> List[int]:
154
- """
155
- Identify undercoordinated atoms based on the coordination threshold (inclusive).
156
-
157
- Args:
158
- cutoff (float): The cutoff radius for identifying neighbors.
159
- coordination_threshold (int): The coordination number threshold for an atom
160
- to be considered undercoordinated, inclusive.
161
-
162
- Returns:
163
- List[int]: List of indices of undercoordinated atoms.
164
- """
165
- coordination_numbers = self.get_coordination_numbers(cutoff)
166
- return [
167
- item.id
168
- for item in coordination_numbers.to_array_of_values_with_ids()
169
- if item.value <= coordination_threshold
170
- ]
171
-
172
- def get_unique_coordination_numbers(self, cutoff: float) -> List[int]:
173
- """
174
- Get the unique coordination numbers for all atoms in the material.
175
-
176
- Args:
177
- self (MaterialWithCrystalSites): The material object with crystal sites.
178
- cutoff (float): The cutoff radius for identifying neighbors.
179
-
180
- Returns:
181
- List[int]: A list of unique coordination numbers present in the material.
182
- """
183
- coordination_numbers = self.get_coordination_numbers(cutoff)
184
- return sorted(list(set(coordination_numbers.values)))
185
-
186
- @decorator_handle_periodic_boundary_conditions(cutoff=0.25)
187
- def find_missing_bonds_for_all_sites(
188
- self,
189
- bond_templates_list: List[BondDirectionsTemplatesForElement],
190
- max_bonds_to_add: int = 1,
191
- angle_tolerance: float = 0.1,
192
- ) -> List[BondDirections]:
193
- """
194
- Find missing bonds for all sites in the material.
195
-
196
- Args:
197
- self (MaterialWithCrystalSites): The material object with crystal sites.
198
- bond_templates_list (List[BondDirectionsTemplatesForElement]): List of bond templates for each element.
199
-
200
- Returns:
201
- List[BondDirections]: List of missing bonds for each site.
202
- """
203
- missing_bonds: List[BondDirections] = []
204
- for coordinate in self.basis.coordinates.to_array_of_values_with_ids():
205
- existing_bond_directions = BondDirections(self.get_neighbors_vectors_for_site(coordinate.id, cutoff=3.0))
206
- element = self.basis.elements.get_element_value_by_index(coordinate.id)
207
- bond_templates = [
208
- bond_templates_for_element.to_ndarray()
209
- for bond_templates_for_element in bond_templates_list
210
- if bond_templates_for_element.element == element
211
- ]
212
- if bond_templates is None:
213
- continue
214
- missing_bonds_for_site = existing_bond_directions.find_missing_directions(
215
- bond_templates=bond_templates,
216
- angle_tolerance=angle_tolerance,
217
- max_bonds_to_add=max_bonds_to_add,
218
- )
219
- missing_bonds.append(BondDirections(missing_bonds_for_site))
220
-
221
- return missing_bonds
222
-
223
- def find_unique_bond_directions(self) -> List[BondDirectionsTemplatesForElement]:
224
- """
225
- Find unique bond templates for each element type.
226
-
227
- Args:
228
- self (Material): The material object.
229
-
230
- Returns:
231
- List[BondDirectionsTemplatesForElement]: List of unique bond templates for each element.
232
-
233
- Example schematic structure for Graphene with 2 unique bond directions:
234
- {"C": [[0, 1, 0], [-2, -1, 0], [2, -1, 0]], [[0,-1,0], [-2, 1, 0], [2, 1, 0]]}
235
- """
236
- element_templates: List[BondDirectionsTemplatesForElement] = []
237
-
238
- for element in set(self.basis.elements.values):
239
- element_templates.append(self.find_bond_directions_for_element(element))
240
-
241
- return element_templates
242
-
243
- def find_bond_directions_for_element(self, element: str) -> BondDirectionsTemplatesForElement:
244
- """
245
- Find bond directions templates for each element.
246
-
247
- Args:
248
- self (MaterialWithCrystalSites): The material object with crystal sites.
249
- element (str): Chemical element to find templates for.
250
-
251
- Returns:
252
- List[BondDirectionsTemplatesForElement]: List of unique bond templates for the element.
253
- """
254
- atom_vectors = self.nearest_neighbor_vectors
255
- atom_elements = self.basis.elements.values
256
-
257
- element_indices = [i for i, e in enumerate(atom_elements) if e == element]
258
- element_vector_lists = [np.array(atom_vectors.get_element_value_by_index(i)) for i in element_indices]
259
-
260
- if not element_vector_lists:
261
- return BondDirectionsTemplatesForElement(bond_directions_templates=[], element=element)
262
-
263
- max_coordination_number = max(len(vectors) for vectors in element_vector_lists)
264
- max_coordination_number_vectors = [v for v in element_vector_lists if len(v) == max_coordination_number]
265
-
266
- unique_templates: BondDirectionsTemplatesForElement = BondDirectionsTemplatesForElement(
267
- bond_directions_templates=[], element=element
268
- )
269
- for template in max_coordination_number_vectors:
270
- bond_direction = BondDirections(template)
271
- if not any(
272
- np.array_equal(bond_direction, existing) for existing in unique_templates.bond_directions_templates
273
- ):
274
- unique_templates.bond_directions_templates.append(bond_direction)
275
-
276
- return unique_templates