Skip to content

fourier_slice

Useful functions for extracting and filtering Fourier slices.

get_real_space_projections_from_volume(volume, phi, theta, psi, degrees=True)

Real-space projections of a 3D volume.

Note that Euler angles are in 'ZYZ' convention.

Parameters:

Name Type Description Default
volume Tensor

The 3D volume to get projections from.

required
phi Tensor

The phi Euler angle.

required
theta Tensor

The theta Euler angle.

required
psi Tensor

The psi Euler angle.

required
degrees bool

True if Euler angles are in degrees, False if in radians.

True

Returns:

Type Description
Tensor

The real-space projections.

Source code in src/leopard_em/utils/fourier_slice.py
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def get_real_space_projections_from_volume(
    volume: torch.Tensor,
    phi: torch.Tensor,
    theta: torch.Tensor,
    psi: torch.Tensor,
    degrees: bool = True,
) -> torch.Tensor:
    """Real-space projections of a 3D volume.

    Note that Euler angles are in 'ZYZ' convention.

    Parameters
    ----------
    volume : torch.Tensor
        The 3D volume to get projections from.
    phi : torch.Tensor
        The phi Euler angle.
    theta : torch.Tensor
        The theta Euler angle.
    psi : torch.Tensor
        The psi Euler angle.
    degrees : bool
        True if Euler angles are in degrees, False if in radians.

    Returns
    -------
    torch.Tensor
        The real-space projections.
    """
    fourier_slices = get_rfft_slices_from_volume(
        volume=volume,
        phi=phi,
        theta=theta,
        psi=psi,
        degrees=degrees,
    )
    projections = _rfft_slices_to_real_projections(fourier_slices)

    return projections

get_rfft_slices_from_volume(volume, phi, theta, psi, degrees=True)

Helper function to get Fourier slices of a real-space volume.

Parameters:

Name Type Description Default
volume Tensor

The 3D volume to get Fourier slices from.

required
phi Tensor

The phi Euler angle.

required
theta Tensor

The theta Euler angle.

required
psi Tensor

The psi Euler angle.

required
degrees bool

True if Euler angles are in degrees, False if in radians.

True

Returns:

Type Description
Tensor

The Fourier slices of the volume.

Source code in src/leopard_em/utils/fourier_slice.py
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
def get_rfft_slices_from_volume(
    volume: torch.Tensor,
    phi: torch.Tensor,
    theta: torch.Tensor,
    psi: torch.Tensor,
    degrees: bool = True,
) -> torch.Tensor:
    """Helper function to get Fourier slices of a real-space volume.

    Parameters
    ----------
    volume : torch.Tensor
        The 3D volume to get Fourier slices from.
    phi : torch.Tensor
        The phi Euler angle.
    theta : torch.Tensor
        The theta Euler angle.
    psi : torch.Tensor
        The psi Euler angle.
    degrees : bool
        True if Euler angles are in degrees, False if in radians.

    Returns
    -------
    torch.Tensor
        The Fourier slices of the volume.

    """
    shape = volume.shape
    volume_rfft = _fftshift_3d(volume, rfft=False)
    # pylint: disable=not-callable
    volume_rfft = torch.fft.fftn(volume_rfft, dim=(-3, -2, -1))
    volume_rfft = _fftshift_3d(volume_rfft, rfft=True)

    # Use roma to keep angles on same device
    rot_matrix = roma.euler_to_rotmat("ZYZ", (phi, theta, psi), degrees=degrees)

    # Use torch_fourier_slice to take the Fourier slice
    fourier_slices = extract_central_slices_rfft_3d(
        volume_rfft=volume_rfft,
        image_shape=shape,
        rotation_matrices=rot_matrix,
    )

    # Invert contrast to match image
    fourier_slices = -fourier_slices

    return fourier_slices