omgkit_chem/lib.rs
1//! # omgkit-chem
2//!
3//! omgkit 的 L2 层:化学语义 —— 净化管线、芳香性、价键与隐式氢。
4//!
5//! ## 净化管线的 12 个步骤
6//!
7//! 步骤之间有依赖,**不可乱序**。"实现在"一列为空的是尚未实现的:
8//!
9//! | # | 步骤 | 实现在 |
10//! |---|---|---|
11//! | 1 | 修正硝基 / 叠氮 / 磷酰 / 高卤酸的非标准画法 | [`cleanup`] |
12//! | 2 | 有机金属键改配位键 | [`organometallics`] |
13//! | 3 | 价键计算 + 隐式氢推断 | [`valence`] |
14//! | 4 | 环感知 | [`rings`] |
15//! | 5 | 芳香环 → 交替单双键 | [`mod@kekulize`] |
16//! | 6 | 自由基电子数 | [`radicals`] |
17//! | 7 | 芳香性感知 | [`aromaticity`] |
18//! | 8 | 共轭标记 | [`conjugation`] |
19//! | 9 | 杂化标记 | [`conjugation`] |
20//! | 10 | 阻转异构 | 未实现 |
21//! | 11 | 剔除几何上不成立的立体标记 | [`mod@cleanup_chirality`] |
22//! | 12 | 显式/隐式氢调整 | [`mod@adjust_hs`] |
23//!
24//! ## 净化之外:两个**读**它结果的模块
25//!
26//! 本 crate 里还有三个模块**不是净化的步骤**:[`gasteiger`]、[`descriptors`]
27//! 是净化输出的消费者,[`explicit_hs`] 是一次独立的图编辑(与 `remove_hs` 一对)。
28//! 前两个放在这里
29//! 是因为它们要读第 3、4、7、8、9 步填的东西(隐式氢、环、芳香、共轭、杂化),
30//! 拆出去就成了一个只依赖 `omgkit-chem` 的空壳 crate。
31//!
32//! | 模块 | 是什么 |
33//! |---|---|
34//! | [`gasteiger`] | Gasteiger–Marsili 部分电荷(PEOE 迭代) |
35//! | [`descriptors`] | 图神经网络特征化要读的原子/键描述符(12 + 7 个字段),汇到一处交付 |
36//! | [`explicit_hs`] | 把隐式氢补成真原子。**改原子数**,所以不在那 12 步里 —— 与 [`mod@remove_hs`] 是一对 |
37//!
38//! 它们**不会**被 [`pipeline::sanitize`] 调用 —— 净化不该顺手算一批
39//! 没人要的数。反过来,它们要求分子已经净化过:没净化不报错,只会让每一项都
40//! 是解析时的占位值。
41//!
42//! [`descriptors`] 还有一处前置在**本 crate 之外**:双键顺反由
43//! `omgkit_io::stereo::perceive_bond_stereo` 填,而 `omgkit-io` 是本 crate 的
44//! 同级,调不到。详见该模块的文档。
45//!
46//! ## `removeHs` 不属于净化
47//!
48//! 删除显式 `[H]` 原子会改变原子数,是一个独立的编辑操作,不在这 12 步里。
49//! 实现在 [`mod@remove_hs`],由调用方按需显式调用。
50//!
51//! ## 净化基本不改动连通性
52//!
53//! 只有第 2 步会把某些键改成配位键并**交换端点**;除此之外净化只改属性,
54//! 不增删原子和键。这是"在解析结果的图上直接做环感知"成立的前提。
55
56pub mod adjust_hs;
57pub mod aromaticity;
58pub mod cleanup;
59pub mod cleanup_chirality;
60pub mod conjugation;
61pub mod descriptors;
62pub mod explicit_hs;
63pub mod gasteiger;
64pub mod kekulize;
65pub mod organometallics;
66pub mod pipeline;
67pub mod radicals;
68pub mod remove_hs;
69pub mod rings;
70pub mod sssr;
71pub mod valence;
72
73pub use adjust_hs::adjust_hs;
74pub use aromaticity::set_aromaticity;
75pub use cleanup::clean_up;
76pub use cleanup_chirality::cleanup_chirality;
77pub use conjugation::{mark_conjugated_atoms, set_conjugation, set_hybridization};
78pub use descriptors::{atom_descriptors, bond_descriptors, AtomDescriptors, BondDescriptors};
79pub use explicit_hs::add_explicit_hs;
80pub use gasteiger::gasteiger_charges;
81pub use kekulize::{kekulize, KekulizeError};
82pub use organometallics::{cleanup_organometallics, is_metal};
83pub use pipeline::{sanitize, SanitizeError};
84pub use radicals::assign_radicals;
85pub use remove_hs::{is_removable, remove_hs};
86pub use rings::{fused_ring_systems, perceive_rings, RingPerception};
87pub use sssr::{ring_set, Ring};
88pub use valence::{
89 update_property_cache, valence_shift, ValenceError, ValenceErrorKind, ValenceResult,
90};