@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.
- package/package.json +9 -5
- package/.babelrc +0 -10
- package/.eslintrc.json +0 -11
- package/.gitattributes +0 -1
- package/.husky/post-checkout +0 -3
- package/.husky/post-commit +0 -3
- package/.husky/post-merge +0 -3
- package/.husky/pre-commit +0 -6
- package/.husky/pre-push +0 -3
- package/.mocharc.json +0 -5
- package/.pre-commit-config.yaml +0 -26
- package/.prettierignore +0 -2
- package/.prettierrc +0 -6
- package/AGENTS.md +0 -133
- package/MANIFEST.in +0 -1
- package/data/constants.json +0 -13
- package/data/reciprocal_paths.json +0 -111
- package/images/made/tools/tools_diagram_general.png +0 -3
- package/images/made/tools/tools_diagram_interface.png +0 -3
- package/pyproject.toml +0 -123
- package/scripts/generate-mixins.ts +0 -28
- package/src/__init__.py +0 -0
- package/src/js/Material.ts +0 -618
- package/src/js/basis/basis.ts +0 -634
- package/src/js/basis/constrained_basis.ts +0 -115
- package/src/js/basis/coordinates.ts +0 -92
- package/src/js/basis/elements.ts +0 -24
- package/src/js/basis/helpers.ts +0 -20
- package/src/js/basis/labels.ts +0 -6
- package/src/js/cell/cell.ts +0 -149
- package/src/js/cell/conventional_cell.ts +0 -86
- package/src/js/cell/primitive_cell.ts +0 -166
- package/src/js/constants/molecule.ts +0 -18
- package/src/js/constants.ts +0 -4
- package/src/js/constraints/constraints.ts +0 -45
- package/src/js/generated/MaterialSchemaMixin.ts +0 -79
- package/src/js/lattice/lattice.ts +0 -308
- package/src/js/lattice/lattice_types.ts +0 -134
- package/src/js/lattice/reciprocal/lattice_reciprocal.ts +0 -206
- package/src/js/lattice/reciprocal/paths.ts +0 -39
- package/src/js/lattice/reciprocal/symmetry_points.ts +0 -886
- package/src/js/lattice/unit_cell.ts +0 -66
- package/src/js/made.ts +0 -62
- package/src/js/parsers/cif.ts +0 -25
- package/src/js/parsers/errors.ts +0 -6
- package/src/js/parsers/espresso.ts +0 -29
- package/src/js/parsers/native_format_parsers.ts +0 -52
- package/src/js/parsers/parsers.ts +0 -13
- package/src/js/parsers/poscar.ts +0 -218
- package/src/js/parsers/xyz.ts +0 -190
- package/src/js/parsers/xyz_combinatorial_basis.ts +0 -268
- package/src/js/tools/basis.ts +0 -131
- package/src/js/tools/cell.ts +0 -40
- package/src/js/tools/index.ts +0 -11
- package/src/js/tools/material.ts +0 -64
- package/src/js/tools/supercell.ts +0 -89
- package/src/js/tools/surface.ts +0 -213
- package/src/py/__init__.py +0 -0
- package/src/py/mat3ra/__init__.py +0 -1
- package/src/py/mat3ra/made/__init__.py +0 -7
- package/src/py/mat3ra/made/basis/__init__.py +0 -255
- package/src/py/mat3ra/made/basis/coordinates.py +0 -43
- package/src/py/mat3ra/made/cell/__init__.py +0 -55
- package/src/py/mat3ra/made/cell/primitive_cell.py +0 -156
- package/src/py/mat3ra/made/data_helper.py +0 -5
- package/src/py/mat3ra/made/lattice.py +0 -195
- package/src/py/mat3ra/made/material.py +0 -135
- package/src/py/mat3ra/made/metadata.py +0 -45
- package/src/py/mat3ra/made/reciprocal/__init__.py +0 -5
- package/src/py/mat3ra/made/reciprocal/lattice_reciprocal.py +0 -147
- package/src/py/mat3ra/made/reciprocal/paths.py +0 -30
- package/src/py/mat3ra/made/reciprocal/symmetry_points.py +0 -385
- package/src/py/mat3ra/made/tools/README.md +0 -173
- package/src/py/mat3ra/made/tools/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/analyze/__init__.py +0 -31
- package/src/py/mat3ra/made/tools/analyze/basis/__init__.py +0 -3
- package/src/py/mat3ra/made/tools/analyze/basis/analyzer.py +0 -50
- package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer.py +0 -32
- package/src/py/mat3ra/made/tools/analyze/build_metadata_analyzer_factory.py +0 -31
- package/src/py/mat3ra/made/tools/analyze/coordination.py +0 -56
- package/src/py/mat3ra/made/tools/analyze/crystal_site/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_crystal_site_material_analyzer.py +0 -35
- package/src/py/mat3ra/made/tools/analyze/crystal_site/adatom_material_analyzer.py +0 -49
- package/src/py/mat3ra/made/tools/analyze/crystal_site/crystal_site_analyzer.py +0 -65
- package/src/py/mat3ra/made/tools/analyze/crystal_site/voronoi_crystal_site_analyzer.py +0 -47
- package/src/py/mat3ra/made/tools/analyze/enums.py +0 -33
- package/src/py/mat3ra/made/tools/analyze/fingerprint/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/layered_fingerprint_along_axis.py +0 -83
- package/src/py/mat3ra/made/tools/analyze/fingerprint/layers/unique_element_string_per_layer.py +0 -9
- package/src/py/mat3ra/made/tools/analyze/interface/__init__.py +0 -20
- package/src/py/mat3ra/made/tools/analyze/interface/commensurate.py +0 -156
- package/src/py/mat3ra/made/tools/analyze/interface/enums.py +0 -60
- package/src/py/mat3ra/made/tools/analyze/interface/grain_boundary.py +0 -80
- package/src/py/mat3ra/made/tools/analyze/interface/simple.py +0 -251
- package/src/py/mat3ra/made/tools/analyze/interface/twisted_nanoribbons.py +0 -91
- package/src/py/mat3ra/made/tools/analyze/interface/utils/__init__.py +0 -77
- package/src/py/mat3ra/made/tools/analyze/interface/utils/holders.py +0 -14
- package/src/py/mat3ra/made/tools/analyze/interface/utils/vector.py +0 -56
- package/src/py/mat3ra/made/tools/analyze/interface/zsl.py +0 -259
- package/src/py/mat3ra/made/tools/analyze/interface_material.py +0 -45
- package/src/py/mat3ra/made/tools/analyze/lattice/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/analyze/lattice/analyzer.py +0 -126
- package/src/py/mat3ra/made/tools/analyze/lattice/helpers.py +0 -31
- package/src/py/mat3ra/made/tools/analyze/lattice_lines.py +0 -30
- package/src/py/mat3ra/made/tools/analyze/lattice_planes.py +0 -192
- package/src/py/mat3ra/made/tools/analyze/lattice_swap_analyzer.py +0 -105
- package/src/py/mat3ra/made/tools/analyze/material.py +0 -276
- package/src/py/mat3ra/made/tools/analyze/other.py +0 -434
- package/src/py/mat3ra/made/tools/analyze/rdf.py +0 -74
- package/src/py/mat3ra/made/tools/analyze/slab.py +0 -76
- package/src/py/mat3ra/made/tools/analyze/solid_solution_analyzer.py +0 -171
- package/src/py/mat3ra/made/tools/analyze/terrace.py +0 -105
- package/src/py/mat3ra/made/tools/analyze/utils.py +0 -162
- package/src/py/mat3ra/made/tools/bond_directions/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions.py +0 -150
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions_for_element_list.py +0 -7
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_enum.py +0 -8
- package/src/py/mat3ra/made/tools/bond_directions/bond_directions_templates_for_element.py +0 -16
- package/src/py/mat3ra/made/tools/build/__init__.py +0 -25
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/helpers.py +0 -59
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/types.py +0 -26
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/heterostructure/utils.py +0 -139
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/__init__.py +0 -47
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/__init__.py +0 -11
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/builder.py +0 -164
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/configuration.py +0 -48
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/base/helpers.py +0 -134
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/__init__.py +0 -6
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/commensurate/helpers.py +0 -157
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/enums.py +0 -7
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/configuration.py +0 -13
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/twisted/helpers.py +0 -70
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/utils.py +0 -87
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/__init__.py +0 -6
- package/src/py/mat3ra/made/tools/build/compound_pristine_structures/two_dimensional/interface/zsl/helpers.py +0 -129
- package/src/py/mat3ra/made/tools/build/defective_structures/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/build_parameters.py +0 -12
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/builder.py +0 -17
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/configuration.py +0 -40
- package/src/py/mat3ra/made/tools/build/defective_structures/one_dimensional/grain_boundary_linear/helpers.py +0 -82
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/__init__.py +0 -1
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/__init__.py +0 -9
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/builder.py +0 -37
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/configuration.py +0 -30
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/enums.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/three_dimensional/solid_solution/helpers.py +0 -76
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/builder.py +0 -11
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/configuration.py +0 -18
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/helpers.py +0 -137
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/adatom/types.py +0 -22
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/builder.py +0 -28
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/configuration.py +0 -55
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/grain_boundary_planar/helpers.py +0 -75
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/builder.py +0 -15
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/configuration.py +0 -16
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/island/helpers.py +0 -116
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/build_parameters.py +0 -10
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/builder.py +0 -30
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/configuration.py +0 -11
- package/src/py/mat3ra/made/tools/build/defective_structures/two_dimensional/terrace/helpers.py +0 -78
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/builder.py +0 -31
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/configuration.py +0 -45
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/pair_defect/helpers.py +0 -80
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/__init__.py +0 -40
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/atom_placement_method_enum.py +0 -14
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/builder.py +0 -42
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/base/configuration.py +0 -27
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/complex_defect_type_enum.py +0 -5
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/factories.py +0 -69
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/helpers.py +0 -92
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/builder.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/configuration.py +0 -29
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/helpers.py +0 -48
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/interstitial/interstitial_placement_method_enum.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/point_defect_type_enum.py +0 -8
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/builder.py +0 -6
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/configuration.py +0 -41
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/helpers.py +0 -43
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/substitutional/substitution_placement_method_enum.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/types.py +0 -24
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/builder.py +0 -19
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/configuration.py +0 -27
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/helpers.py +0 -42
- package/src/py/mat3ra/made/tools/build/defective_structures/zero_dimensional/point_defect/vacancy/vacancy_placement_method_enum.py +0 -7
- package/src/py/mat3ra/made/tools/build/pristine_structures/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/builder.py +0 -80
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/configurations.py +0 -22
- package/src/py/mat3ra/made/tools/build/pristine_structures/three_dimensional/ideal_crystal/helpers.py +0 -40
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/__init__.py +0 -29
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/builders.py +0 -56
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/configuration.py +0 -33
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanoribbon/helpers.py +0 -76
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/__init__.py +0 -11
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/build_parameters.py +0 -9
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/builders.py +0 -83
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/configuration.py +0 -35
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/nanotape/helpers.py +0 -62
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/__init__.py +0 -9
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/build_parameters.py +0 -8
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/builder.py +0 -42
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/configuration.py +0 -99
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/helpers.py +0 -95
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/termination_utils.py +0 -14
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab/utils.py +0 -61
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/builder.py +0 -22
- package/src/py/mat3ra/made/tools/build/pristine_structures/two_dimensional/slab_strained_supercell/configuration.py +0 -17
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/__init__.py +0 -19
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/analyzer.py +0 -86
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/builder.py +0 -54
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/ase_based/configuration.py +0 -19
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/enums.py +0 -42
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/helpers.py +0 -127
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/builder.py +0 -33
- package/src/py/mat3ra/made/tools/build/pristine_structures/zero_dimensional/nanoparticle/merge_based/configuration.py +0 -16
- package/src/py/mat3ra/made/tools/build/processed_structures/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/__init__.py +0 -9
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/coordination_based_passivation_material_analyzer.py +0 -112
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/passivation_material_analyzer.py +0 -16
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/analyzers/surface_passivation_material_analyzer.py +0 -32
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/builder.py +0 -23
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/configuration.py +0 -31
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/enums.py +0 -7
- package/src/py/mat3ra/made/tools/build/processed_structures/two_dimensional/passivation/helpers.py +0 -151
- package/src/py/mat3ra/made/tools/build_components/__init__.py +0 -10
- package/src/py/mat3ra/made/tools/build_components/entities/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/one_dimensional/miller_indices_2d.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/miller_indices.py +0 -18
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/two_dimensional/termination.py +0 -33
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/crystal_site/crystal_site_list.py +0 -9
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/builder.py +0 -32
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/point_defect_site/configuration.py +0 -14
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/builder.py +0 -29
- package/src/py/mat3ra/made/tools/build_components/entities/auxiliary/zero_dimensional/void_region/configuration.py +0 -19
- package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/builder.py +0 -48
- package/src/py/mat3ra/made/tools/build_components/entities/core/two_dimensional/vacuum/configuration.py +0 -17
- package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/builder.py +0 -25
- package/src/py/mat3ra/made/tools/build_components/entities/core/zero_dimensional/atom/configuration.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/__init__.py +0 -16
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_configuration_pydantic.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/base_single_builder.py +0 -87
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/base_builder/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/builder.py +0 -46
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/configuration.py +0 -19
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/edge_types.py +0 -51
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines/helpers.py +0 -58
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/builder.py +0 -42
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/one_dimensional/crystal_lattice_lines_unique_repeated/configuration.py +0 -21
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/configuration.py +0 -11
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/three_dimensional/supercell/helpers.py +0 -38
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/__init__.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/builder.py +0 -62
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/configuration.py +0 -14
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/atomic_layers_unique_repeated/helpers.py +0 -42
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/__init__.py +0 -7
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/builder.py +0 -39
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/crystal_lattice_planes/configuration.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/__init__.py +0 -10
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/builder.py +0 -36
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/configuration.py +0 -31
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/two_dimensional/slab_stack/helpers.py +0 -80
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/entities/reusable/zero_dimensional/coordinates_shape_enum.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/metadata/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/build_components/metadata/build_metadata.py +0 -7
- package/src/py/mat3ra/made/tools/build_components/metadata/material_build_metadata.py +0 -35
- package/src/py/mat3ra/made/tools/build_components/metadata/material_with_build_metadata.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/mixins/__init__.py +0 -2
- package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_ase_atoms_mixin.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/mixins/convert_generated_items_pymatgen_structure_mixin.py +0 -8
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/__init__.py +0 -0
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/enums.py +0 -11
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/__init__.py +0 -6
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/build_parameters.py +0 -18
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/builder.py +0 -93
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/merge/configuration.py +0 -20
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/builder.py +0 -83
- package/src/py/mat3ra/made/tools/build_components/operations/core/combinations/stack/configuration.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/__init__.py +0 -15
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/build_parameters.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/base.py +0 -33
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/builders/isometric.py +0 -25
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/configuration.py +0 -24
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/__init__.py +0 -13
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/atomic_mass_dependent_function_holder.py +0 -32
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/function_holder.py +0 -80
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/maxwell_boltzmann.py +0 -39
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/perturbation_function_holder.py +0 -45
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/functions/sine_wave_perturbation_function_holder.py +0 -29
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/perturb/helpers.py +0 -83
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/__init__.py +0 -5
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/builder.py +0 -25
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/configuration.py +0 -23
- package/src/py/mat3ra/made/tools/build_components/operations/core/modifications/strain/helpers.py +0 -49
- package/src/py/mat3ra/made/tools/build_components/utils.py +0 -44
- package/src/py/mat3ra/made/tools/calculate/__init__.py +0 -149
- package/src/py/mat3ra/made/tools/calculate/ase/__init__.py +0 -133
- package/src/py/mat3ra/made/tools/calculate/ase/constraints.py +0 -91
- package/src/py/mat3ra/made/tools/calculate/calculators/__init__.py +0 -4
- package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator.py +0 -70
- package/src/py/mat3ra/made/tools/calculate/calculators/interface_material_calculator_parameters.py +0 -14
- package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator.py +0 -32
- package/src/py/mat3ra/made/tools/calculate/calculators/material_calculator_parameters.py +0 -17
- package/src/py/mat3ra/made/tools/calculate/interaction_functions.py +0 -23
- package/src/py/mat3ra/made/tools/convert/__init__.py +0 -286
- package/src/py/mat3ra/made/tools/convert/interface_parts_enum.py +0 -9
- package/src/py/mat3ra/made/tools/convert/utils.py +0 -96
- package/src/py/mat3ra/made/tools/entities/__init__.py +0 -5
- package/src/py/mat3ra/made/tools/entities/coordinate/__init__.py +0 -14
- package/src/py/mat3ra/made/tools/entities/coordinate/box_coordinate_condition.py +0 -15
- package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_condition.py +0 -16
- package/src/py/mat3ra/made/tools/entities/coordinate/coordinate_functions.py +0 -158
- package/src/py/mat3ra/made/tools/entities/coordinate/cylinder_coordinate_condition.py +0 -17
- package/src/py/mat3ra/made/tools/entities/coordinate/plane_coordinate_condition.py +0 -14
- package/src/py/mat3ra/made/tools/entities/coordinate/sphere_coordinate_condition.py +0 -15
- package/src/py/mat3ra/made/tools/entities/coordinate/triangular_prism_coordinate_condition.py +0 -26
- package/src/py/mat3ra/made/tools/entities/termination_holder.py +0 -12
- package/src/py/mat3ra/made/tools/helpers.py +0 -168
- package/src/py/mat3ra/made/tools/modify.py +0 -627
- package/src/py/mat3ra/made/tools/operations/core/binary.py +0 -106
- package/src/py/mat3ra/made/tools/operations/core/unary.py +0 -170
- package/src/py/mat3ra/made/tools/operations/core/utils.py +0 -138
- package/src/py/mat3ra/made/tools/operations/reusable/unary.py +0 -53
- package/src/py/mat3ra/made/tools/optimize.py +0 -55
- package/src/py/mat3ra/made/tools/third_party.py +0 -69
- package/src/py/mat3ra/made/tools/utils.py +0 -182
- package/src/py/mat3ra/made/utils.py +0 -144
- package/tests/.gitattributes +0 -1
- package/tests/fixtures/AsGe-basis.json +0 -3
- package/tests/fixtures/C2H4-translated.json +0 -3
- package/tests/fixtures/C2H4.json +0 -3
- package/tests/fixtures/FeLiSi-basis.json +0 -3
- package/tests/fixtures/FeO.json +0 -3
- package/tests/fixtures/Ge2-basis.json +0 -3
- package/tests/fixtures/Graphene.json +0 -3
- package/tests/fixtures/Graphene.poscar +0 -3
- package/tests/fixtures/H2+H-final.json +0 -3
- package/tests/fixtures/H2+H-image.json +0 -3
- package/tests/fixtures/H2+H-initial.json +0 -3
- package/tests/fixtures/H2O.poscar +0 -3
- package/tests/fixtures/LiFeSi-basis-labels.json +0 -3
- package/tests/fixtures/LiFeSi-basis.json +0 -3
- package/tests/fixtures/Na.json +0 -3
- package/tests/fixtures/Na4Cl4-cartesian.json +0 -3
- package/tests/fixtures/Na4Cl4.json +0 -3
- package/tests/fixtures/Na4Cl4.poscar +0 -3
- package/tests/fixtures/Ni-hex.json +0 -3
- package/tests/fixtures/Ni-hex.poscar +0 -3
- package/tests/fixtures/OSi-basis.json +0 -3
- package/tests/fixtures/Si-hex.poscar +0 -3
- package/tests/fixtures/Si-pwscf.in +0 -3
- package/tests/fixtures/Si-slab.json +0 -3
- package/tests/fixtures/Si-supercell.json +0 -3
- package/tests/fixtures/Si2-basis-repeated.json +0 -3
- package/tests/fixtures/Si2-basis.json +0 -3
- package/tests/fixtures/Zr1H23Zr1H1.json +0 -3
- package/tests/fixtures/Zr1H23Zr1H1.poscar +0 -3
- package/tests/fixtures/atomic-constraints.json +0 -3
- package/tests/fixtures/hashes.json +0 -3
- package/tests/fixtures/si-slab-100.json +0 -3
- package/tests/fixtures/si-slab-111-0-vacuum.json +0 -3
- package/tests/fixtures/si-slab-111-0.5-vacuum-gamma-120.json +0 -3
- package/tests/fixtures/si-slab-111-0.5-vacuum-ratio.json +0 -3
- package/tests/fixtures/si-standata.json +0 -3
- package/tests/js/basis/basis.ts +0 -247
- package/tests/js/cell/cell.ts +0 -182
- package/tests/js/cell/primitive_cell.ts +0 -21
- package/tests/js/constraints/constraints.ts +0 -11
- package/tests/js/fixtures.ts +0 -123
- package/tests/js/lattice/lattice.ts +0 -43
- package/tests/js/lattice/lattice_reciprocal.ts +0 -104
- package/tests/js/material/material.ts +0 -161
- package/tests/js/parsers/espresso.ts +0 -12
- package/tests/js/parsers/native_formats.ts +0 -35
- package/tests/js/parsers/poscar.ts +0 -89
- package/tests/js/parsers/xyz.ts +0 -33
- package/tests/js/parsers/xyz_combinatorial_basis.ts +0 -156
- package/tests/js/register-esse-schemas.cjs +0 -10
- package/tests/js/setup.ts +0 -6
- package/tests/js/tools/basis.ts +0 -22
- package/tests/js/tools/supercell.ts +0 -58
- package/tests/js/tools/surface.ts +0 -111
- package/tests/py/conftest.py +0 -34
- package/tests/py/mat3ra/debug_utils.py +0 -75
- package/tests/py/unit/__init__.py +0 -0
- package/tests/py/unit/fixtures/__init__.py +0 -0
- package/tests/py/unit/fixtures/adatom.py +0 -60
- package/tests/py/unit/fixtures/bulk.py +0 -162
- package/tests/py/unit/fixtures/cuts.py +0 -118
- package/tests/py/unit/fixtures/grain_boundary.py +0 -875
- package/tests/py/unit/fixtures/interface/commensurate.py +0 -498
- package/tests/py/unit/fixtures/interface/gaas_dia.py +0 -837
- package/tests/py/unit/fixtures/interface/gr_ni_111_top_hcp.py +0 -123
- package/tests/py/unit/fixtures/interface/simple.py +0 -84
- package/tests/py/unit/fixtures/interface/twisted_nanoribbons.py +0 -131
- package/tests/py/unit/fixtures/interface/zsl.py +0 -756
- package/tests/py/unit/fixtures/island.py +0 -336
- package/tests/py/unit/fixtures/merge.py +0 -147
- package/tests/py/unit/fixtures/monolayer.py +0 -46
- package/tests/py/unit/fixtures/nanoparticle.py +0 -116
- package/tests/py/unit/fixtures/nanoribbon/__init__.py +0 -0
- package/tests/py/unit/fixtures/nanoribbon/armchair.py +0 -102
- package/tests/py/unit/fixtures/nanoribbon/nanoribbon.py +0 -145
- package/tests/py/unit/fixtures/nanoribbon/zigzag.py +0 -54
- package/tests/py/unit/fixtures/pair_defects.py +0 -41
- package/tests/py/unit/fixtures/passivated/nanoribbon.py +0 -69
- package/tests/py/unit/fixtures/passivated/slab.py +0 -58
- package/tests/py/unit/fixtures/point_defects.py +0 -158
- package/tests/py/unit/fixtures/slab.py +0 -606
- package/tests/py/unit/fixtures/strain.py +0 -42
- package/tests/py/unit/fixtures/supercell.py +0 -64
- package/tests/py/unit/fixtures/terrace.py +0 -70
- package/tests/py/unit/fixtures/thrid_party/ase_atoms.py +0 -13
- package/tests/py/unit/test_analyze_lattice_planes.py +0 -131
- package/tests/py/unit/test_cell.py +0 -104
- package/tests/py/unit/test_data_files.py +0 -68
- package/tests/py/unit/test_lattice.py +0 -103
- package/tests/py/unit/test_lattice_type_extended.py +0 -53
- package/tests/py/unit/test_material.py +0 -158
- package/tests/py/unit/test_operations.py +0 -126
- package/tests/py/unit/test_primitive_cell.py +0 -118
- package/tests/py/unit/test_reciprocal_lattice.py +0 -86
- package/tests/py/unit/test_reciprocal_paths.py +0 -64
- package/tests/py/unit/test_symmetry_points.py +0 -151
- package/tests/py/unit/test_tools_analyze.py +0 -219
- package/tests/py/unit/test_tools_analyze_basis.py +0 -105
- package/tests/py/unit/test_tools_analyze_interface.py +0 -223
- package/tests/py/unit/test_tools_analyze_interface_material.py +0 -63
- package/tests/py/unit/test_tools_analyze_interface_zsl.py +0 -187
- package/tests/py/unit/test_tools_analyze_lattice.py +0 -74
- package/tests/py/unit/test_tools_analyze_swap.py +0 -80
- package/tests/py/unit/test_tools_build.py +0 -158
- package/tests/py/unit/test_tools_build_defect/__init__.py +0 -0
- package/tests/py/unit/test_tools_build_defect/test_adatom.py +0 -84
- package/tests/py/unit/test_tools_build_defect/test_island.py +0 -45
- package/tests/py/unit/test_tools_build_defect/test_pair_defect.py +0 -84
- package/tests/py/unit/test_tools_build_defect/test_point_defect.py +0 -196
- package/tests/py/unit/test_tools_build_defect/test_slab_stack.py +0 -30
- package/tests/py/unit/test_tools_build_defect/test_solid_solution.py +0 -90
- package/tests/py/unit/test_tools_build_defect/test_terrace.py +0 -44
- package/tests/py/unit/test_tools_build_grain_boundary.py +0 -133
- package/tests/py/unit/test_tools_build_heterostructure.py +0 -46
- package/tests/py/unit/test_tools_build_interface.py +0 -292
- package/tests/py/unit/test_tools_build_interface_zsl.py +0 -263
- package/tests/py/unit/test_tools_build_maxwell_disorder.py +0 -123
- package/tests/py/unit/test_tools_build_metadata.py +0 -79
- package/tests/py/unit/test_tools_build_monolayer.py +0 -33
- package/tests/py/unit/test_tools_build_nanoparticle.py +0 -42
- package/tests/py/unit/test_tools_build_nanoribbon.py +0 -45
- package/tests/py/unit/test_tools_build_passivation.py +0 -85
- package/tests/py/unit/test_tools_build_perturbation.py +0 -103
- package/tests/py/unit/test_tools_build_slab.py +0 -382
- package/tests/py/unit/test_tools_build_strain.py +0 -36
- package/tests/py/unit/test_tools_build_supercell.py +0 -47
- package/tests/py/unit/test_tools_calculate.py +0 -67
- package/tests/py/unit/test_tools_convert.py +0 -174
- package/tests/py/unit/test_tools_modify.py +0 -248
- package/tests/py/unit/utils.py +0 -142
- package/tsconfig-transpile.json +0 -3
- 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
|