# {py:mod}`abtem.bloch.dynamical`

```{py:module} abtem.bloch.dynamical
```

```{autodoc2-docstring} abtem.bloch.dynamical
:parser: rst
:allowtitles:
```

## Module Contents

### Classes

````{list-table}
:class: autosummary longtable
:align: left

* - {py:obj}`BaseStructureFactor <abtem.bloch.dynamical.BaseStructureFactor>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor
    :parser: rst
    :summary:
    ```
* - {py:obj}`BlochWaves <abtem.bloch.dynamical.BlochWaves>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves
    :parser: rst
    :summary:
    ```
* - {py:obj}`BlochwaveEnsemble <abtem.bloch.dynamical.BlochwaveEnsemble>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble
    :parser: rst
    :summary:
    ```
* - {py:obj}`StructureFactor <abtem.bloch.dynamical.StructureFactor>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor
    :parser: rst
    :summary:
    ```
* - {py:obj}`StructureFactorArray <abtem.bloch.dynamical.StructureFactorArray>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray
    :parser: rst
    :summary:
    ```
````

### Functions

````{list-table}
:class: autosummary longtable
:align: left

* - {py:obj}`allowed_chars <abtem.bloch.dynamical.allowed_chars>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.allowed_chars
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_M_matrix <abtem.bloch.dynamical.calculate_M_matrix>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_M_matrix
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_dynamical_scattering <abtem.bloch.dynamical.calculate_dynamical_scattering>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_dynamical_scattering
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_scattering_factors <abtem.bloch.dynamical.calculate_scattering_factors>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_scattering_factors
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_scattering_matrix <abtem.bloch.dynamical.calculate_scattering_matrix>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_scattering_matrix
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_structure_factors <abtem.bloch.dynamical.calculate_structure_factors>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_structure_factors
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_structure_matrix <abtem.bloch.dynamical.calculate_structure_matrix>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_structure_matrix
    :parser: rst
    :summary:
    ```
* - {py:obj}`calculate_wave_functions <abtem.bloch.dynamical.calculate_wave_functions>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.calculate_wave_functions
    :parser: rst
    :summary:
    ```
* - {py:obj}`equal_slice_thicknesses <abtem.bloch.dynamical.equal_slice_thicknesses>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.equal_slice_thicknesses
    :parser: rst
    :summary:
    ```
* - {py:obj}`exctinction_distances <abtem.bloch.dynamical.exctinction_distances>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.exctinction_distances
    :parser: rst
    :summary:
    ```
* - {py:obj}`expm <abtem.bloch.dynamical.expm>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.expm
    :parser: rst
    :summary:
    ```
* - {py:obj}`is_base_distribution_tuple <abtem.bloch.dynamical.is_base_distribution_tuple>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.is_base_distribution_tuple
    :parser: rst
    :summary:
    ```
* - {py:obj}`is_rotations_ensemble <abtem.bloch.dynamical.is_rotations_ensemble>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.is_rotations_ensemble
    :parser: rst
    :summary:
    ```
* - {py:obj}`is_valid_rotation_axes <abtem.bloch.dynamical.is_valid_rotation_axes>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.is_valid_rotation_axes
    :parser: rst
    :summary:
    ```
* - {py:obj}`is_valid_rotations <abtem.bloch.dynamical.is_valid_rotations>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.is_valid_rotations
    :parser: rst
    :summary:
    ```
* - {py:obj}`plane_wave_basis <abtem.bloch.dynamical.plane_wave_basis>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.plane_wave_basis
    :parser: rst
    :summary:
    ```
* - {py:obj}`plane_wave_coefficients <abtem.bloch.dynamical.plane_wave_coefficients>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.plane_wave_coefficients
    :parser: rst
    :summary:
    ```
* - {py:obj}`reduce_plane_wave_expansion <abtem.bloch.dynamical.reduce_plane_wave_expansion>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.reduce_plane_wave_expansion
    :parser: rst
    :summary:
    ```
* - {py:obj}`slice_potential <abtem.bloch.dynamical.slice_potential>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.slice_potential
    :parser: rst
    :summary:
    ```
* - {py:obj}`structure_factor_1d_to_3d <abtem.bloch.dynamical.structure_factor_1d_to_3d>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.structure_factor_1d_to_3d
    :parser: rst
    :summary:
    ```
* - {py:obj}`structure_factor_to_potential <abtem.bloch.dynamical.structure_factor_to_potential>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.structure_factor_to_potential
    :parser: rst
    :summary:
    ```
* - {py:obj}`validate_g_max <abtem.bloch.dynamical.validate_g_max>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.validate_g_max
    :parser: rst
    :summary:
    ```
* - {py:obj}`validate_rotations <abtem.bloch.dynamical.validate_rotations>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.validate_rotations
    :parser: rst
    :summary:
    ```
````

### Data

````{list-table}
:class: autosummary longtable
:align: left

* - {py:obj}`AllowedRotations <abtem.bloch.dynamical.AllowedRotations>`
  - ```{autodoc2-docstring} abtem.bloch.dynamical.AllowedRotations
    :parser: rst
    :summary:
    ```
````

### API

````{py:data} AllowedRotations
:canonical: abtem.bloch.dynamical.AllowedRotations
:value: >
   None

```{autodoc2-docstring} abtem.bloch.dynamical.AllowedRotations
:parser: rst
```

````

`````{py:class} BaseStructureFactor(...)
:canonical: abtem.bloch.dynamical.BaseStructureFactor

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor
:parser: rst
```

```{rubric} Initialization
```

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.__init__
:parser: rst
```

````{py:property} cell
:canonical: abtem.bloch.dynamical.BaseStructureFactor.cell
:abstractmethod:
:type: ase.cell.Cell

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.cell
:parser: rst
```

````

````{py:property} centering
:canonical: abtem.bloch.dynamical.BaseStructureFactor.centering
:type: str

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.centering
:parser: rst
```

````

````{py:property} device
:canonical: abtem.bloch.dynamical.BaseStructureFactor.device
:abstractmethod:
:type: str

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.device
:parser: rst
```

````

````{py:property} g_max
:canonical: abtem.bloch.dynamical.BaseStructureFactor.g_max
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.g_max
:parser: rst
```

````

````{py:property} g_vec
:canonical: abtem.bloch.dynamical.BaseStructureFactor.g_vec
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.g_vec
:parser: rst
```

````

````{py:property} g_vec_length
:canonical: abtem.bloch.dynamical.BaseStructureFactor.g_vec_length
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.g_vec_length
:parser: rst
```

````

````{py:method} get_potential_3d() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.BaseStructureFactor.get_potential_3d
:abstractmethod:

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.get_potential_3d
:parser: rst
```

````

````{py:method} get_projected_potential(...) -> abtem.potentials.iam.PotentialArray
:canonical: abtem.bloch.dynamical.BaseStructureFactor.get_projected_potential
:abstractmethod:

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.get_projected_potential
:parser: rst
```

````

````{py:property} gpts
:canonical: abtem.bloch.dynamical.BaseStructureFactor.gpts
:type: tuple[int, int, int]

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.gpts
:parser: rst
```

````

````{py:property} hkl
:canonical: abtem.bloch.dynamical.BaseStructureFactor.hkl
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BaseStructureFactor.hkl
:parser: rst
```

````

`````

`````{py:class} BlochWaves(...)
:canonical: abtem.bloch.dynamical.BlochWaves

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves
:parser: rst
```

```{rubric} Initialization
```

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.__init__
:parser: rst
```

````{py:method} calculate_diffraction_patterns(...) -> abtem.measurements.IndexedDiffractionPatterns
:canonical: abtem.bloch.dynamical.BlochWaves.calculate_diffraction_patterns

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.calculate_diffraction_patterns
:parser: rst
```

````

````{py:method} calculate_exit_waves(...) -> abtem.waves.Waves
:canonical: abtem.bloch.dynamical.BlochWaves.calculate_exit_waves

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.calculate_exit_waves
:parser: rst
```

````

````{py:method} calculate_scattering_matrix(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.BlochWaves.calculate_scattering_matrix

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.calculate_scattering_matrix
:parser: rst
```

````

````{py:method} calculate_structure_matrix(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.BlochWaves.calculate_structure_matrix

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.calculate_structure_matrix
:parser: rst
```

````

````{py:property} cell
:canonical: abtem.bloch.dynamical.BlochWaves.cell
:type: ase.cell.Cell

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.cell
:parser: rst
```

````

````{py:property} device
:canonical: abtem.bloch.dynamical.BlochWaves.device
:type: str

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.device
:parser: rst
```

````

````{py:property} energy
:canonical: abtem.bloch.dynamical.BlochWaves.energy
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.energy
:parser: rst
```

````

````{py:method} excitation_errors() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.BlochWaves.excitation_errors

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.excitation_errors
:parser: rst
```

````

````{py:property} g_max
:canonical: abtem.bloch.dynamical.BlochWaves.g_max
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.g_max
:parser: rst
```

````

````{py:property} g_vec
:canonical: abtem.bloch.dynamical.BlochWaves.g_vec
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.g_vec
:parser: rst
```

````

````{py:property} g_vec_length
:canonical: abtem.bloch.dynamical.BlochWaves.g_vec_length
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.g_vec_length
:parser: rst
```

````

````{py:method} get_kinematical_diffraction_pattern(...) -> abtem.measurements.IndexedDiffractionPatterns
:canonical: abtem.bloch.dynamical.BlochWaves.get_kinematical_diffraction_pattern

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.get_kinematical_diffraction_pattern
:parser: rst
```

````

````{py:property} hkl
:canonical: abtem.bloch.dynamical.BlochWaves.hkl
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.hkl
:parser: rst
```

````

````{py:property} hkl_mask
:canonical: abtem.bloch.dynamical.BlochWaves.hkl_mask
:type: numpy.ndarray

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.hkl_mask
:parser: rst
```

````

````{py:property} num_bloch_waves
:canonical: abtem.bloch.dynamical.BlochWaves.num_bloch_waves
:type: int

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.num_bloch_waves
:parser: rst
```

````

````{py:method} rotate(...) -> abtem.bloch.dynamical.BlochWaves | abtem.bloch.dynamical.BlochwaveEnsemble
:canonical: abtem.bloch.dynamical.BlochWaves.rotate

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.rotate
:parser: rst
```

````

````{py:property} sg_max
:canonical: abtem.bloch.dynamical.BlochWaves.sg_max
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.sg_max
:parser: rst
```

````

````{py:property} structure_factor
:canonical: abtem.bloch.dynamical.BlochWaves.structure_factor
:type: abtem.bloch.dynamical.BaseStructureFactor

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.structure_factor
:parser: rst
```

````

````{py:property} structure_matrix_nbytes
:canonical: abtem.bloch.dynamical.BlochWaves.structure_matrix_nbytes
:type: int

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.structure_matrix_nbytes
:parser: rst
```

````

````{py:property} use_wave_eq
:canonical: abtem.bloch.dynamical.BlochWaves.use_wave_eq
:type: bool

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.use_wave_eq
:parser: rst
```

````

````{py:property} wavelength
:canonical: abtem.bloch.dynamical.BlochWaves.wavelength
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochWaves.wavelength
:parser: rst
```

````

`````

`````{py:class} BlochwaveEnsemble(...)
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble

Bases: {py:obj}`abtem.core.ensemble.Ensemble`, {py:obj}`abtem.core.utils.CopyMixin`

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble
:parser: rst
```

```{rubric} Initialization
```

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.__init__
:parser: rst
```

````{py:property} axes
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.axes
:type: typing.Sequence[str]

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.axes
:parser: rst
```

````

````{py:method} calculate_diffraction_patterns(...) -> abtem.measurements.IndexedDiffractionPatterns
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.calculate_diffraction_patterns

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.calculate_diffraction_patterns
:parser: rst
```

````

````{py:method} calculate_exit_waves(...) -> abtem.waves.Waves
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.calculate_exit_waves

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.calculate_exit_waves
:parser: rst
```

````

````{py:property} centering
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.centering
:type: str

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.centering
:parser: rst
```

````

````{py:property} device
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.device
:type: str

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.device
:parser: rst
```

````

````{py:property} energy
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.energy
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.energy
:parser: rst
```

````

````{py:property} ensemble_axes_metadata
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.ensemble_axes_metadata
:type: list[abtem.core.axes.AxisMetadata]

````

````{py:property} ensemble_shape
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.ensemble_shape
:type: tuple[int, ...]

````

````{py:property} g_max
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.g_max
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.g_max
:parser: rst
```

````

````{py:method} get_ensemble_hkl_mask() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.get_ensemble_hkl_mask

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.get_ensemble_hkl_mask
:parser: rst
```

````

````{py:method} get_orientation_matrices() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.get_orientation_matrices

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.get_orientation_matrices
:parser: rst
```

````

````{py:property} rotations
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.rotations
:type: tuple[abtem.distributions.BaseDistribution | numbers.Number, ...]

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.rotations
:parser: rst
```

````

````{py:property} sg_max
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.sg_max
:type: float

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.sg_max
:parser: rst
```

````

````{py:property} structure_factor
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.structure_factor
:type: abtem.bloch.dynamical.BaseStructureFactor

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.structure_factor
:parser: rst
```

````

````{py:property} use_degrees
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.use_degrees
:type: bool

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.use_degrees
:parser: rst
```

````

````{py:property} use_wave_eq
:canonical: abtem.bloch.dynamical.BlochwaveEnsemble.use_wave_eq
:type: bool

```{autodoc2-docstring} abtem.bloch.dynamical.BlochwaveEnsemble.use_wave_eq
:parser: rst
```

````

`````

`````{py:class} StructureFactor(...)
:canonical: abtem.bloch.dynamical.StructureFactor

Bases: {py:obj}`abtem.bloch.dynamical.BaseStructureFactor`, {py:obj}`abtem.core.utils.CopyMixin`

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor
:parser: rst
```

```{rubric} Initialization
```

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.__init__
:parser: rst
```

````{py:property} atoms
:canonical: abtem.bloch.dynamical.StructureFactor.atoms
:type: ase.Atoms

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.atoms
:parser: rst
```

````

````{py:method} build(...) -> abtem.bloch.dynamical.StructureFactorArray
:canonical: abtem.bloch.dynamical.StructureFactor.build

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.build
:parser: rst
```

````

````{py:method} calculate_scattering_factors() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.StructureFactor.calculate_scattering_factors

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.calculate_scattering_factors
:parser: rst
```

````

````{py:property} cell
:canonical: abtem.bloch.dynamical.StructureFactor.cell
:type: ase.cell.Cell

````

````{py:property} device
:canonical: abtem.bloch.dynamical.StructureFactor.device
:type: str

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.device
:parser: rst
```

````

````{py:property} g_max
:canonical: abtem.bloch.dynamical.StructureFactor.g_max
:type: float

````

````{py:method} get_potential_3d(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.StructureFactor.get_potential_3d

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.get_potential_3d
:parser: rst
```

````

````{py:method} get_projected_potential(...) -> abtem.potentials.iam.PotentialArray
:canonical: abtem.bloch.dynamical.StructureFactor.get_projected_potential

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.get_projected_potential
:parser: rst
```

````

````{py:property} occupancy
:canonical: abtem.bloch.dynamical.StructureFactor.occupancy
:type: numpy.ndarray | dict[str, numpy.ndarray]

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.occupancy
:parser: rst
```

````

````{py:property} parametrization
:canonical: abtem.bloch.dynamical.StructureFactor.parametrization
:type: abtem.parametrizations.Parametrization

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.parametrization
:parser: rst
```

````

````{py:property} thermal_sigma
:canonical: abtem.bloch.dynamical.StructureFactor.thermal_sigma
:type: numpy.ndarray | dict[str, numpy.ndarray]

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactor.thermal_sigma
:parser: rst
```

````

`````

`````{py:class} StructureFactorArray(...)
:canonical: abtem.bloch.dynamical.StructureFactorArray

Bases: {py:obj}`abtem.array.ArrayObject`, {py:obj}`abtem.bloch.dynamical.BaseStructureFactor`

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray
:parser: rst
```

```{rubric} Initialization
```

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray.__init__
:parser: rst
```

````{py:property} cell
:canonical: abtem.bloch.dynamical.StructureFactorArray.cell
:type: ase.cell.Cell

````

````{py:method} from_array_and_metadata(...) -> abtem.bloch.dynamical.StructureFactorArray
:canonical: abtem.bloch.dynamical.StructureFactorArray.from_array_and_metadata
:abstractmethod:
:classmethod:

````

````{py:method} get_potential_3d() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.StructureFactorArray.get_potential_3d

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray.get_potential_3d
:parser: rst
```

````

````{py:method} get_projected_potential(...) -> abtem.potentials.iam.PotentialArray
:canonical: abtem.bloch.dynamical.StructureFactorArray.get_projected_potential

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray.get_projected_potential
:parser: rst
```

````

````{py:property} gpts
:canonical: abtem.bloch.dynamical.StructureFactorArray.gpts
:type: tuple[int, int, int]

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray.gpts
:parser: rst
```

````

````{py:method} to_3d_array() -> numpy.ndarray
:canonical: abtem.bloch.dynamical.StructureFactorArray.to_3d_array

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray.to_3d_array
:parser: rst
```

````

````{py:method} to_dict() -> dict
:canonical: abtem.bloch.dynamical.StructureFactorArray.to_dict

```{autodoc2-docstring} abtem.bloch.dynamical.StructureFactorArray.to_dict
:parser: rst
```

````

`````

````{py:function} allowed_chars(...) -> bool
:canonical: abtem.bloch.dynamical.allowed_chars

```{autodoc2-docstring} abtem.bloch.dynamical.allowed_chars
:parser: rst
```
````

````{py:function} calculate_M_matrix(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.calculate_M_matrix

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_M_matrix
:parser: rst
```
````

````{py:function} calculate_dynamical_scattering(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.calculate_dynamical_scattering

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_dynamical_scattering
:parser: rst
```
````

````{py:function} calculate_scattering_factors(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.calculate_scattering_factors

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_scattering_factors
:parser: rst
```
````

````{py:function} calculate_scattering_matrix(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.calculate_scattering_matrix

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_scattering_matrix
:parser: rst
```
````

````{py:function} calculate_structure_factors(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.calculate_structure_factors

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_structure_factors
:parser: rst
```
````

````{py:function} calculate_structure_matrix(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.calculate_structure_matrix

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_structure_matrix
:parser: rst
```
````

````{py:function} calculate_wave_functions(...)
:canonical: abtem.bloch.dynamical.calculate_wave_functions

```{autodoc2-docstring} abtem.bloch.dynamical.calculate_wave_functions
:parser: rst
```
````

````{py:function} equal_slice_thicknesses(...) -> tuple[tuple[float, ...], tuple[int, ...]]
:canonical: abtem.bloch.dynamical.equal_slice_thicknesses

```{autodoc2-docstring} abtem.bloch.dynamical.equal_slice_thicknesses
:parser: rst
```
````

````{py:function} exctinction_distances(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.exctinction_distances

```{autodoc2-docstring} abtem.bloch.dynamical.exctinction_distances
:parser: rst
```
````

````{py:function} expm(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.expm

```{autodoc2-docstring} abtem.bloch.dynamical.expm
:parser: rst
```
````

````{py:function} is_base_distribution_tuple(...) -> typing.TypeGuard[tuple[abtem.distributions.BaseDistribution, ...]]
:canonical: abtem.bloch.dynamical.is_base_distribution_tuple

```{autodoc2-docstring} abtem.bloch.dynamical.is_base_distribution_tuple
:parser: rst
```
````

````{py:function} is_rotations_ensemble(...) -> bool
:canonical: abtem.bloch.dynamical.is_rotations_ensemble

```{autodoc2-docstring} abtem.bloch.dynamical.is_rotations_ensemble
:parser: rst
```
````

````{py:function} is_valid_rotation_axes(...) -> typing.TypeGuard[tuple[str, ...]]
:canonical: abtem.bloch.dynamical.is_valid_rotation_axes

```{autodoc2-docstring} abtem.bloch.dynamical.is_valid_rotation_axes
:parser: rst
```
````

````{py:function} is_valid_rotations(...) -> typing.TypeGuard[tuple[abtem.bloch.dynamical.AllowedRotations, ...]]
:canonical: abtem.bloch.dynamical.is_valid_rotations

```{autodoc2-docstring} abtem.bloch.dynamical.is_valid_rotations
:parser: rst
```
````

````{py:function} plane_wave_basis(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.plane_wave_basis

```{autodoc2-docstring} abtem.bloch.dynamical.plane_wave_basis
:parser: rst
```
````

````{py:function} plane_wave_coefficients(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.plane_wave_coefficients

```{autodoc2-docstring} abtem.bloch.dynamical.plane_wave_coefficients
:parser: rst
```
````

````{py:function} reduce_plane_wave_expansion(...)
:canonical: abtem.bloch.dynamical.reduce_plane_wave_expansion

```{autodoc2-docstring} abtem.bloch.dynamical.reduce_plane_wave_expansion
:parser: rst
```
````

````{py:function} slice_potential(...) -> tuple[numpy.ndarray, numpy.ndarray]
:canonical: abtem.bloch.dynamical.slice_potential

```{autodoc2-docstring} abtem.bloch.dynamical.slice_potential
:parser: rst
```
````

````{py:function} structure_factor_1d_to_3d(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.structure_factor_1d_to_3d

```{autodoc2-docstring} abtem.bloch.dynamical.structure_factor_1d_to_3d
:parser: rst
```
````

````{py:function} structure_factor_to_potential(...) -> numpy.ndarray
:canonical: abtem.bloch.dynamical.structure_factor_to_potential

```{autodoc2-docstring} abtem.bloch.dynamical.structure_factor_to_potential
:parser: rst
```
````

````{py:function} validate_g_max(...) -> float
:canonical: abtem.bloch.dynamical.validate_g_max

```{autodoc2-docstring} abtem.bloch.dynamical.validate_g_max
:parser: rst
```
````

````{py:function} validate_rotations(...) -> tuple[tuple[str, ...], tuple[abtem.bloch.dynamical.AllowedRotations, ...]]
:canonical: abtem.bloch.dynamical.validate_rotations

```{autodoc2-docstring} abtem.bloch.dynamical.validate_rotations
:parser: rst
```
````
