#primitive #atom #bond #read #reading #smiles #language

喵喵

Rust 中读取和写入 SMILES 语言的库

13 个版本 (8 个重大更新)

0.9.0 2021年3月3日
0.7.0 2021年1月24日
0.6.3 2020年10月2日
0.6.1 2020年7月8日

#572 in 开发工具

Download history 184/week @ 2024-03-11 44/week @ 2024-03-18 50/week @ 2024-03-25 70/week @ 2024-04-01 149/week @ 2024-04-08 99/week @ 2024-04-15 39/week @ 2024-04-22 50/week @ 2024-04-29 58/week @ 2024-05-06 21/week @ 2024-05-13 21/week @ 2024-05-20 25/week @ 2024-05-27 24/week @ 2024-06-03 31/week @ 2024-06-10 19/week @ 2024-06-17 12/week @ 2024-06-24

86 每月下载量
4 crates 中使用

MIT 许可

170KB
5K SLoC

喵喵

Rust 中读取和写入 SMILES 语言的库。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
purr = "0.9"

示例

将乙酰胺解析为邻接表示

use purr::graph::{ Builder, Atom, Bond };
use purr::feature::{ AtomKind, BondKind, Aliphatic };
use purr::read::{ read, Error };

fn main() -> Result<(), Error> {
    let mut builder = Builder::new();

    read("CC(=O)N", &mut builder, None)?;

    assert_eq!(builder.build(), Ok(vec![
        Atom {
            kind: AtomKind::Aliphatic(Aliphatic::C),
            bonds: vec![
                Bond::new(BondKind::Elided, 1)
            ]
        },
        Atom {
            kind: AtomKind::Aliphatic(Aliphatic::C),
            bonds: vec![
                Bond::new(BondKind::Elided, 0),
                Bond::new(BondKind::Double, 2),
                Bond::new(BondKind::Elided, 3)
            ]
        },
        Atom {
            kind: AtomKind::Aliphatic(Aliphatic::O),
            bonds: vec![
                Bond::new(BondKind::Double, 1)
            ]
        },
        Atom {
            kind: AtomKind::Aliphatic(Aliphatic::N),
            bonds: vec![
                Bond::new(BondKind::Elided, 1)
            ]
        }
    ]));

    Ok(())
}

原子和其取代基的顺序反映了它们在相应的 SMILES 字符串中的隐含顺序。当原子配置(例如,@@@)在原子处存在时,这一点非常重要。

可选的 Trace 类型将邻接功能映射到原始字符串中的光标位置。这对于传达语义错误(如超价)很有用。

use purr::graph::Builder;
use purr::read::{ read, Error, Trace };

fn main() -> Result<(), Error> {
    let mut builder = Builder::new();
    let mut trace = Trace::new();

    //    012345678901234
    read("C(C)C(C)(C)(C)C", &mut builder, Some(&mut trace))?;

    // Texas carbon @ atom(2) with cursor range 4..5
    assert_eq!(trace.atom(2), Some(4..5));

    Ok(())
}

语法错误映射到它们发生的光标位置。

use purr::graph::Builder;
use purr::read::{ read, Error };

fn main() {
    let mut builder = Builder::new();

    assert_eq!(read("OCCXC", &mut builder, None), Err(Error::Character(3)));
}

可以使用 write 编写邻接。

use purr::graph::{ Builder, Atom, Bond };
use purr::feature::{ AtomKind, BondKind, Aliphatic };
use purr::read::{ read, Error };
use purr::write::Writer;
use purr::walk::walk;

fn main() -> Result<(), Error> {
    let mut builder = Builder::new();

    read("c1c([37Cl])cccc1", &mut builder, None)?;

    let atoms = builder.build().expect("atoms");
    let mut writer = Writer::new();

    walk(atoms, &mut writer).expect("walk");

    assert_eq!(writer.write(), "c(ccccc1[37Cl])1");

    Ok(())
}

输出字符串与输入字符串不匹配,尽管它们都表示相同的分子(Cl-37 氯苯)。write 以深度优先顺序跟踪 atoms,但邻接表示(atoms)缺乏有关原始 SMILES 树如何切割的信息。

版本

喵喵尚不稳定。补丁版本不会引入破坏性更改,但次要/主要版本可能会。

许可

喵喵根据 MIT 许可证分发。有关详细信息,请参阅 LICENSE-MITCOPYRIGHT

无运行时依赖