#integration #crystallography #powder #x-rays #synchrotron

integrustio

pyFAI 在 Rust 上的强化版:快速粉末 X 射线散射集成和畸变校正

13 个不稳定版本 (4 个破坏性版本)

0.6.1 2022 年 4 月 21 日
0.6.0 2022 年 1 月 7 日
0.5.1 2021 年 12 月 13 日
0.5.0 2021 年 10 月 27 日
0.1.0 2019 年 11 月 25 日

#320 in 图像

Download history 32/week @ 2024-04-02

每月 61 次下载
用于 bubbles

GPL-3.0+

105KB
2.5K SLoC

integrustio

此 crate 提供了用于通过 2D 探测器获取的衍射数据的方位积分器和畸变校正器。这是在 Rust 编程语言中对伟大的 Python 库 pyFAI 的重做。

此库主要打算在 SNBL 集成服务器 Bubble 中使用。Integrustio 并不试图重做 pyFAI 中实现的全部可能的集成算法,其目标是选择一个足够鲁棒的算法,可用于 SNBL 测量的数据。

目前选择的是带像素分割的 BoundingBox。

使用示例

  • Poni 解析器
use integrustio::poni::Poni;
use std::path::Path;
use std::fmt;

fn read_poni<P: AsRef<Path> + fmt::Debug>(path: P) {
    let test = path;
    let poni2 = match Poni::read_file(&test) {
        Ok(poni) => poni,
        Err(e) => panic!("Could not read file {:?}: {}", test, e),
    };
}
  • 与 Spine 文件一起进行畸变校正
use std::io;
use integrustio::spline::Spline;
use integrustio::distortion::Distortion;
use std::io::BufReader;
use std::fs::File;
use cryiorust::frame::{Array, Frame};
use cryiorust::cbf::Cbf;
use std::path::Path;

fn correct_file<P: AsRef<Path>>(frame: P, spline: P) -> io::Result<Array> {
    let frame = Cbf::read_file(frame)?;
    let spline = Spline::init(BufReader::new(File::open(spline)?), frame.array())?;
    let mut d = Distortion::new();
    d.init(frame.array(), &spline);
    let corrected_array: Array = d.correct(frame.array())?;
    Ok(corrected_array)
}
  • 集成
use integrustio::integrator::{Integrable, IntegrationType, Integrator, Diffractogram};
use integrustio::poni::Poni;
use cryiorust::cbf::Cbf;
use cryiorust::frame::{Frame, FrameResult};
use std::path::Path;

fn integrate<P: AsRef<Path>>(frame: P, poni: P) -> FrameResult<Diffractogram> {
    let frame = Cbf::read_file(frame)?;
    let ranges = [0., 0.];
    let data = Integrable {
        array: frame.array(),
        radial_range: &ranges,
        azimuthal_range: &ranges,
        integration_type: IntegrationType::Radial,
    };
    let mut i = Integrator::new();
    i.set_poni(Poni::read_file(poni)?);
    i.set_radial_bins(3500);
    i.set_polarization(0.99);
    i.init(frame.array());
    Ok(i.integrate(&data).unwrap())
}

许可证:GPL-3.0+

依赖项

~29MB
~444K SLoC