| Crates.io | cdshealpix |
| lib.rs | cdshealpix |
| version | 0.9.0 |
| created_at | 2019-01-18 12:51:36.39257+00 |
| updated_at | 2026-01-22 12:55:46.135362+00 |
| description | Rust implementation of the HEALPix tesselation. |
| homepage | |
| repository | https://github.com/cds-astro/cds-healpix-rust/ |
| max_upload_size | |
| id | 109319 |
| size | 1,339,406 |
cdshealpix-rustCDS implementation of the HEALPix tesselation in Rust and modules to generate libraries in WebAssembly, Python, ...
This library is an implementation in Rust of the HEALPix tesselation. This implementation has been made by the Strasbourg astronomical Data Centre (Centre de Données astronomique de Strasbourg, CDS).
It is used in:
The CDS HEALPix Python package
HPXCli for command line HEALPix related manipulations
The CDS MOC library in Rust used in:
CDS internal developments
Please help me fill in this list
Initially, it is a port of a part of the CDS Java library available here, but improvement have been added while porting the code and new features are added.
For information on HEALPix in general, see:
Official implementations, are available here. It contains GPL v2 codes in Fortran, C++, Java, IDL, Python, ...
Other independent HEALPix implementations:
For best performances on your specific hardware, you can compile using:
RUSTFLAGS='-C target-cpu=native' cargo build --release
This uses BMI2 instructions PDEP and PEXT, if supported by your processor, for bit interleaving.
However, the implementaion of those instructions on AMD Ryzen processors are extremely slow (20x slower than a
lookup table,
doubling the hash computation time)!
You can test it using:
RUSTFLAGS='-C target-cpu=native' cargo bench
If the result of ZOrderCurve/BMI is slower thatn ZOrderCurve/LUPT, compile without the native support:
cargo build --release
rustup target install i686-unknown-linux-gnu
sudo apt-get install gcc-multilib
RUSTFLAGS=' - C target-cpu=native' cargo build - - target=i686-unknown-linux-gnu - - release
cone and elliptical cone coverage plus exact polygon coverage queriesBMOC (MOC with a flag telling if a cell is fully or partially covered by a surface) as a result of
cone, polygon ot elliptical cone coverage queriesBMOCs and BMOC creation from a list of cell number at a given depthcustom approx methods, one can handle the rate of false
positives)Compute the cell number of a given position on the unit-sphere at a given HEALPix depth.
use cdshealpix::nside;
use cdshealpix::nested::{get, Layer};
let depth = 12_u8;
let lon = 12.5_f64.to_radians();
let lat = 89.99999_f64.to_radians();
let nested_d12 = get(depth);
let nside = nside(depth) as u64;
let expected_cell_number = nside * nside - 1
assert_eq!(expected_cell_number, nested_d12.hash(lon, lat));
Get the spherical coorinates of the 4 vertices of a given cell at a given depth:
use cdshealpix::nested::{get_or_create, Layer};
let depth = 12_u8;
let cell_number= 10_u64;
let nested_d12 = get_or_create(depth);
let [
(lon_south, lat_south),
(lon_east, lat_east),
(lon_north, lat_north),
(lon_west, lat_west)
] = nested_d12.vertices(cell_number);
Get a hierarchical view (a MOC) on the cells overlapped by a given cone:
use cdshealpix::nested::{get, Layer};
let depth = 6_u8;
let nested_d6 = get(depth);
let lon = 13.158329_f64.to_radians();
let lat = - 72.80028_f64.to_radians();
let radius = 5.64323_f64.to_radians();
let moc = nested_d6.cone_overlap_approx(lon, lat, radius);
for cell in moc.into_iter() {
println ! ("cell: {:?}", cell);
}
See HPXCli.
(Not really maintained so far: if you need it, please let us know!)
To build and use the WebAssembly (and Javascript) files, the libwasmbingen directory.
We rely on wasm-bingen.
See cdshealpix python available on pypi:
pip install -U cdshealpix
If you use this code and work in a scientific public domain (especially astronomy), please acknowledge its usage and the CDS who developed it. It may help us in promoting our work to our financiers.
Like most projects in Rust, this project is licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
This code started has my first Rust code.