1 个不稳定版本
0.1.0 | 2024年2月13日 |
---|
#133 在 科学
190KB
3.5K SLoC
Sirius
SIRIUS 是一个基于 Java 的软件框架,用于分析代谢物和其他“生物相关小分子”的 LC-MS/MS 数据。SIRIUS 集成了一系列工具,包括 CSI:FingerID(带有 COSMIC、ZODIAC 和 CANOPUS)。特别是,SIRIUS 的图形用户界面和命令行版本无缝集成了 CSI:FingerID 和 CANOPUS 网络服务。
阅读更多,我们建议您参考官方的 Sirius 网站。
安装
从版本 5.7.0 开始,SIRIUS 通过 conda(conda-forge)以包名 sirius-ms 正式提供。仅通过 conda 提供原生 MacOS arm64(Apple Silicon)构建。
此外,您还可以通过他们的 GitHub 仓库 安装 Sirius。
Sirius 绑定
在这里,我们提供了一个在 Rust 中的 Sirius 绑定。此绑定是 Sirius 命令行界面(CLI)的包装器,为运行 Sirius 提供了更友好的界面。它还通过在运行 Sirius 可执行文件之前使用类型安全和错误处理来提供更安全地运行 Sirius 的方法。
用法
首先,您需要在系统中安装 Sirius。然后,您还需要在您的 .env
文件中设置以下变量
SIRIUS_PATH=/path/to/sirius_executable (on macOS it should be something like `/Applications/sirius.app/Contents/MacOS/sirius`)
SIRIUS_USERNAME=your_username
SIRIUS_PASSWORD=your_password
然后,您可以在您的 Rust 项目中使用 Sirius 绑定。要做到这一点,请将以下内容添加到您的 Cargo.toml
[dependencies]
sirius = "0.1"
并将其添加到您的 crate 根目录
use sirius_bindings::prelude::*;
示例
以下是一个使用默认参数运行 Sirius 的示例
sirius -i tests/data/input_sirius.mgf --output tests/data/output_sirius_default --maxmz=800.0 formula zodiac fingerprint structure canopus write-summaries
等效的 Rust 代码是
use sirius_bindings::prelude::*;
use std::path::Path;
let sirius = SiriusBuilder::<Version5>::default()
.maximal_mz_default().unwrap()
.max_cpus_default().unwrap()
.enable_formula().unwrap()
.enable_zodiac().unwrap()
.enable_fingerprint().unwrap()
.enable_structure().unwrap()
.enable_canopus().unwrap()
.enable_write_summaries().unwrap()
.build();
let input_file_path = Path::new("tests/data/input_sirius.mgf");
let output_file_path = Path::new("tests/data/output_sirius_default");
// Check if the path exists before attempting to remove it
if output_file_path.exists() {
let _ = std::fs::remove_dir_all(output_file_path);
}
sirius.run(input_file_path, output_file_path).unwrap();
您还可以更具体地添加其他参数。以下示例使用 ENPKG 管道 使用的参数
sirius -i tests/data/input_sirius.mgf --output tests/data/output_sirius --maxmz 800 \
config --IsotopeSettings.filter=true --FormulaSearchDB=BIO --Timeout.secondsPerTree=0 \
--FormulaSettings.enforced=H,C,N,O,P --Timeout.secondsPerInstance=0 \
--AdductSettings.detectable='[[M+H]+,[M-H4O2+H]+,[M+Na]+,[M+K]+,[M+H3N+H]+,[M-H2O+H]+]' \
--UseHeuristic.mzToUseHeuristicOnly=650 --AlgorithmProfile=orbitrap --IsotopeMs2Settings=IGNORE \
--MS2MassDeviation.allowedMassDeviation=5.0ppm --NumberOfCandidatesPerIon=1 \
--UseHeuristic.mzToUseHeuristic=300 --FormulaSettings.detectable=B,Cl,Br,Se,S \
--NumberOfCandidates=10 --ZodiacNumberOfConsideredCandidatesAt300Mz=10 \
--ZodiacRunInTwoSteps=true --ZodiacEdgeFilterThresholds.minLocalConnections=10 \
--ZodiacEdgeFilterThresholds.thresholdFilter=0.95 --ZodiacEpochs.burnInPeriod=2000 \
--ZodiacEpochs.numberOfMarkovChains=10 --ZodiacNumberOfConsideredCandidatesAt800Mz=50 \
--ZodiacEpochs.iterations=20000 --AdductSettings.enforced=, \
--AdductSettings.fallback='[[M+H]+,[M+Na]+,[M+K]+]' --FormulaResultThreshold=true \
--InjectElGordoCompounds=true --StructureSearchDB=BIO \
--RecomputeResults=false formula zodiac fingerprint structure canopus write-summaries
等效的 Rust 代码是
use sirius_bindings::prelude::*;
use std::path::Path;
let sirius = SiriusBuilder::default()
.maximal_mz(800.0).unwrap()
.max_cpus_default().unwrap()
.isotope_settings_filter(true).unwrap()
.formula_search_db(DBVector::from(vec![SearchDB::Bio])).unwrap()
.timeout_seconds_per_tree(0).unwrap()
.formula_settings_enforced(AtomVector::from(vec![
Atoms::H,
Atoms::C,
Atoms::N,
Atoms::O,
Atoms::P,
])).unwrap()
.timeout_seconds_per_instance(0).unwrap()
.adduct_settings_detectable(AdductsVector::from(vec![
Adducts::MplusHplus,
Adducts::MplusHminusTwoH2Oplus,
Adducts::MplusNaplus,
Adducts::MplusKplus,
Adducts::MplusH3NplusHplus,
Adducts::MplusHminusH2Oplus,
])).unwrap()
.use_heuristic_mz_to_use_heuristic_only(650).unwrap()
.algorithm_profile(Instruments::Orbitrap).unwrap()
.isotope_ms2_settings(IsotopeMS2Settings::Ignore).unwrap()
.ms2_mass_deviation_allowed_mass_deviation(MassDeviation::Ppm(5.0)).unwrap()
.number_of_candidates_per_ion(1).unwrap()
.use_heuristic_mz_to_use_heuristic(300).unwrap()
.formula_settings_detectable(AtomVector::from(vec![
Atoms::B,
Atoms::Cl,
Atoms::Se,
Atoms::S,
])).unwrap()
.number_of_candidates(10).unwrap()
.zodiac_number_of_considered_candidates_at_300_mz(10).unwrap()
.zodiac_run_in_two_steps(true).unwrap()
.zodiac_edge_filter_thresholds_min_local_connections(10).unwrap()
.zodiac_edge_filter_thresholds_threshold_filter(0.95).unwrap()
.zodiac_epochs_burn_in_period(2000).unwrap()
.zodiac_epochs_number_of_markov_chains(10).unwrap()
.zodiac_number_of_considered_candidates_at_800_mz(50).unwrap()
.zodiac_epochs_iterations(20000).unwrap()
.adduct_settings_enforced_default().unwrap()
.adduct_settings_fallback(AdductsVector::from(vec![
Adducts::MplusHplus,
Adducts::MplusNaplus,
Adducts::MplusKplus,
])).unwrap()
.formula_result_threshold(true).unwrap()
.inject_el_gordo_compounds(true).unwrap()
.structure_search_db(DBVector::from(vec![SearchDB::Bio])).unwrap()
.recompute_results(false).unwrap()
.enable_formula().unwrap()
.enable_zodiac().unwrap()
.enable_fingerprint().unwrap()
.enable_structure().unwrap()
.enable_canopus().unwrap()
.enable_write_summaries().unwrap()
.build();
let input_file_path = Path::new("tests/data/input_sirius.mgf");
let output_file_path = Path::new("tests/data/output_sirius");
// Check if the path exists before attempting to remove it
if output_file_path.exists() {
let _ = std::fs::remove_dir_all(output_file_path);
}
sirius.run(input_file_path, output_file_path).unwrap();
错误情况
此绑定还提供了在运行Sirius CLI之前的错误处理。
以下示例将引发错误,因为 maximal_mz
被添加了两次
use sirius_bindings::prelude::*;
use std::path::Path;
let sirius = SiriusBuilder::<Version5>::default()
.maximal_mz_default().unwrap()
.maximal_mz(70.6).unwrap()
.enable_formula().unwrap()
.enable_zodiac().unwrap()
.enable_fingerprint().unwrap()
.enable_structure().unwrap()
.enable_canopus().unwrap()
.enable_write_summaries().unwrap()
.build();
let input_file_path = Path::new("tests/data/input_sirius.mgf");
let output_file_path = Path::new("tests/data/output_sirius_default");
// Check if the path exists before attempting to remove it
if output_file_path.exists() {
let _ = std::fs::remove_dir_all(output_file_path);
}
sirius.run(input_file_path, output_file_path).unwrap();
将导致以下错误
Error: "The core parameter MaximalMz(70.6) cannot be added to the configuration. There is already an existing parameter which is MaximalMz(800.0). You cannot add it twice."
局限性
目前,一些 配置 参数尚未完全实现,仅使用默认值。
如果您想查看默认值,可以运行 sirius config --help
。这里我们列出的参数仅为部分列表,其中只有默认值可以使用
- 可能加和开关 默认为
[M+Na]+:[M+H]+,[M+K]+:[M+H]+,[M+Cl]-:[M-H]-
- 强制执行加和设置 默认为
,
- 公式结果排名得分 默认为
AUTO
- 同位素MS2设置 默认为
IGNORE
- 噪声阈值设置基峰 默认为
NOT_PRECURSOR
- 加和 没有默认值,但可能有些加和没有被包含在枚举中。
将来,我们将添加为这些参数添加自定义值的功能。如果您需要为这些参数添加自定义值,请毫不犹豫地提交问题或拉取请求。
文档
您可以通过在存储库根目录中运行以下命令找到Sirius绑定的文档
cargo doc --open
模糊测试
模糊测试是一种通过向代码提供随机输入来查找软件中安全漏洞和错误的技术。它可以是一种有效地揭示可能通过其他测试方法无法发现的问题的方法。在我们的库中,我们认真对待模糊测试,并使用 cargo fuzz 工具来确保我们的代码健壮且安全。cargo fuzz 自动化生成和运行随机测试输入的过程,并有助于识别难以通过传统测试方法检测到的隐蔽错误。我们确保我们的模糊目标是持续更新的,并与库的最新版本一起运行,以确保任何漏洞或错误都能迅速识别并解决。
您可以在 这里 了解更多关于模糊测试的信息。
引用Sirius
Kai Dührkop, Markus Fleischauer, Marcus Ludwig, Alexander A. Aksenov, Alexey V. Melnik, Marvin Meusel, Pieter C. Dorrestein, Juho Rousu, and Sebastian Böcker,
[SIRIUS 4: Turning tandem mass spectra into metabolite structure information.](https://doi.org/10.1038/s41592-019-0344-8)
*Nature Methods* 16, 299–302, 2019.
依赖项
~85–435KB