Skip to main content

Complete rewrite of the C library SOFT 2.0, that computes fourier transforms on the rotation group SO(3)

Project description

Lates Release License Documentation Documentation Language Language

#3 Fast Fourier transforms on the 3D rotation group $\mathrm{SO}(3)$ PySOFFT provides high performance routines for harmonic analysis on the 3D rotation group written in Fortran and wrapped in Python.

$$ f:\mathrm{SO}(3) \rightarrow \mathbb{C} \quad \overset{\mathrm{PySOFFT}}{\longleftrightarrow} \quad f^l_{m,n} \text{ with } |m|,|n|\leq l<\infty $$

Some applications:

  • Rotational alignment of datasets given by their spherical harmonic coefficients.
  • Statistical analysis over SO(3).
  • X-ray scattering simulations of randomly oriented particles.

Main features:

  • Fast
  • OpenMP routines to speed up single transforms or compute many in parallel.
  • Dedicated faster transforms for real data.
  • Compute rotational cross-correlations.
  • Built in Python wrapper.
  • On-the-fly computation of Wigner matrices: saving memory.
  • Documentation at https://pysofft.readthedocs.io

Origin

PySOFFT started as a partial python port of soft-2.0 released by Peter Kostelec and Daniel Rockmore. Now it is an entire rewrite in Fortran featuring several improvements, e.g higher precission computation of Wigner-D matrices, OpenMP routines and convenient python wrappers.

For details on soft-2.0 see:
FFTs on the Rotation Group
J Fourier Anal Appl (2008) 14: 145–179
DOI 10.1007/s00041-008-9013-5 (pdf)

PySOFT is made available with consent of the original soft-2.0 authors and under the same GPL3 license.

Installation

See the documentation for details:

Untill I get to fix pypi the only way to get the current way of pysofft is to clone the repo go into its folder and call

pip install .

The only python dependency is numpy. Non-python dependencies are fftw, openmp, meson, gcc and gfortran.

Pixi

If you use pixi you can use the following pixi.toml for installation.

[workspace]
channels = ["conda-forge"]
description = "Workspace for pysofft"
name = "temp"
platforms = ["linux-64"]
version = "0.1.0"

[system-requirements]
libc = { family = "glibc", version = "2.34" }

[dependencies]
gfortran = ">=15.2,<15.5.0"
gcc = ">=15.2,<15.5.0"
cpython = ">=3.13.11,<4"
python = ">=3.13.11,<3.14"
pip = ">=26.0.1,<27"
numpy = ">=2.2.6,<2.2.7"
meson = ">=1.8.1,<1.9.0"
meson-python = ">=0.19.0,<0.20"
fftw = ">=3.3.10,<4"
openmp = ">=8.0.1,<9"

[pypi-dependencies]
pysofft = ">=0.9.0, <2.0.0"

Basic Usage Python

Forward and inverse transforms

from pysofft import Soft
bw = 64
s = Soft(bw)

# complex case: inverse then forward 
f_lmn = s.get_coeff(random=True)
f = s.isoft(f_lmn)
f_lmn2 = s.soft(f)

# real case: inverse then forward
g_lmn = s.get_coeff(real=True,random=True)
g = s.irsoft(g_lmn)
g_lmn2 = s.rsoft(g)

Accessing individual harmonic coefficients

from pysofft import Soft
bw = 64
s = Soft(bw)

f_lmn = s.get_coeff(random=True)

l=4
m=-1
n=2

# access single coefficient
print(f_lmn.lmn[l,m,n])

# slicing is also possible
print(f_lmn.lmn[l,m,:])

# as well as value asignment
f_lmn.lmn[l,m,:] = 1 + 1.j

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pysofft-0.9.1.tar.gz (2.3 MB view details)

Uploaded Source

File details

Details for the file pysofft-0.9.1.tar.gz.

File metadata

  • Download URL: pysofft-0.9.1.tar.gz
  • Upload date:
  • Size: 2.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for pysofft-0.9.1.tar.gz
Algorithm Hash digest
SHA256 deda33fda5bfbdff60c4a042c068a120a94fc0cb13f661bcf8f6476653a19fc7
MD5 e723a4d4e3d00dba76bd3ebf25752ebb
BLAKE2b-256 edb5bd5dd4a20f75a9a2ae577d414822a0b4faa4ff907d49e239d5a9a387b702

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page