Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions MANIFEST.in

This file was deleted.

2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ test-cov: all
py.test --cov=q2_usearch

install: all
$(PYTHON) setup.py install
$(PYTHON) -m pip install -v .

dev: all
pip install pre-commit
Expand Down
29 changes: 13 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
---
editor_options:
markdown:
wrap: 72
---

# q2-usearch

QIIME2 plug-in for [USEARCH](https://github.com/rcedgar/usearch12/)
Expand Down Expand Up @@ -43,7 +37,7 @@ git clone https://github.com/magicprotoss/q2-usearch .
Step 2: Activate the QIIME2 conda enviroment you wish to install to

``` bash
# conda activate qiime2-amplicon-2024.5
# conda activate qiime2-amplicon-2025.4
conda activate <replace-with-your-q2-conda-env-name>
```

Expand All @@ -57,23 +51,26 @@ conda env list | grep qiime2
The env's name should appear in your terminal

``` bash
# qiime2-amplicon-2024.5 /home/navi/miniconda3/envs/qiime2-amplicon-2024.5
# qiime2-amplicon-2025.4 /home/navi/miniconda3/envs/qiime2-amplicon-2025.4
```

Step 3: Change directory to the project folder and execute the following
command

``` bash
cd q2-usearch && python ./setup.py install
cd q2-usearch && pip install .
qiime dev refresh-cache
```

Step 4: Install [seqkit2](https://bioinf.shenwei.me/seqkit/) and
[usearch12](https://github.com/rcedgar/usearch12) using mamba/conda
[usearch12](https://github.com/rcedgar/usearch12) using conda

Note: the q2-usearch plug-in is compatible with usearch11 as well. If you wish to use usearch11, just skip installing usearch using conda. You can manually download the binary file from [GitHub](https://github.com/rcedgar/usearch_old_binaries), rename it to "usearch", add execute permission to it and move it to one of the executable paths on your system.

``` bash
mamba install -c bioconda seqkit">=2.0.0" usearch
# conda install -c bioconda seqkit">=2.0.0" usearch
conda install -c bioconda --no-deps seqkit">=2.0.0" usearch
# if you were using an older version of conda and got stuck at the "solving environment" stage for too long, consider using mamba
# mamba install -c bioconda seqkit">=2.0.0" usearch
```

If every thing went smoothly, you should be seeing sth. like this
Expand Down Expand Up @@ -216,7 +213,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences fastq-seqs.qza \
--i-demultiplexed-seqs fastq-seqs.qza \
--p-min-size 4 \
--o-representative-sequences rep-seqs-unoise3.qza \
--o-table table-unoise3.qza \
Expand All @@ -231,7 +228,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences ddbj_dl.qza \
--i-demultiplexed-seqs ddbj_dl.qza \
--p-min-size 4 \
--o-representative-sequences rep-seqs-unoise3.qza \
--o-table table-unoise3.qza \
Expand Down Expand Up @@ -275,7 +272,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences demux.qza \
--i-demultiplexed-seqs demux.qza \
--p-min-size 4 \
--p-trunc-len 120 \
--o-representative-sequences rep-seqs-unoise3.qza \
Expand Down Expand Up @@ -325,7 +322,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences merged.qza \
--i-demultiplexed-seqs merged.qza \
--p-min-size 4 \
--o-representative-sequences rep-seqs-unoise3.qza \
--o-table table-unoise3.qza \
Expand Down
32 changes: 14 additions & 18 deletions README_ZH_CN.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
---
editor_options:
markdown:
wrap: 72
---

# q2-usearch

这是一个把 [USEARCH](https://github.com/rcedgar/usearch12/) 装进
Expand All @@ -30,7 +24,7 @@ editor_options:
第一步: 激活我们想要安装到的 QIIME2 conda 环境

``` bash
# conda activate qiime2-amplicon-2024.5
# conda activate qiime2-amplicon-2025.4
conda activate <目标q2环境名称>
```

Expand All @@ -43,7 +37,7 @@ conda env list | grep qiime2
这样当前conda下所有环境名中带有qiime2字符的虚拟环境都会被检索出来

``` bash
# qiime2-amplicon-2024.5 /home/navi/miniconda3/envs/qiime2-amplicon-2024.5
# qiime2-amplicon-2025.4 /home/navi/miniconda3/envs/qiime2-amplicon-2025.4
```

第二步: 下载插件
Expand All @@ -56,18 +50,20 @@ git clone https://github.com/magicprotoss/q2-usearch .

``` bash
cd q2-usearch # 切换路径
python ./setup.py install # 安装插件
pip install . # 安装插件
qiime dev refresh-cache # 刷新QIIME2命令行界面缓存
```

第四步:
使用mamba或者conda安装[seqkit2](https://mp.weixin.qq.com/s/ucCA4-eZINkppdyQFItXHw)和[usearch12](https://mp.weixin.qq.com/s/i0zzOP5IRNdY9PfqHbpDEQ)
使用conda安装[seqkit2](https://mp.weixin.qq.com/s/ucCA4-eZINkppdyQFItXHw)和[usearch12](https://mp.weixin.qq.com/s/i0zzOP5IRNdY9PfqHbpDEQ)

注意:
本插件也支持usearch11,如果要用老版本的话跳过conda安装usearch,去[GitHub](https://github.com/rcedgar/usearch_old_binaries)上下载可执行文件,重命名成"usearch"后加权并放到$PATH的文件夹里.

``` bash
# 建议使用mamba
# 国内网络不稳conda圈圈转到一半容易报断连错误
mamba install -c bioconda seqkit">=2.0.0" usearch
# conda install -c bioconda seqkit">=2.0.0" usearch
conda install -c bioconda --no-deps seqkit">=2.0.0" usearch
# 如果电脑上conda版本太老卡“solving environment”的话,可以使用mamba
# mamba install -c bioconda --no-deps seqkit">=2.0.0" usearch
```

测试一下usearch是否可以被正常调用
Expand Down Expand Up @@ -199,7 +195,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences fastq-seqs.qza \
--i-demultiplexed-seqs fastq-seqs.qza \
--p-min-size 4 \
--o-representative-sequences rep-seqs-unoise3.qza \
--o-table table-unoise3.qza \
Expand All @@ -213,7 +209,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences ddbj_dl.qza \
--i-demultiplexed-seqs ddbj_dl.qza \
--p-min-size 4 \
--o-representative-sequences rep-seqs-unoise3.qza \
--o-table table-unoise3.qza \
Expand Down Expand Up @@ -253,7 +249,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences demux.qza \
--i-demultiplexed-seqs demux.qza \
--p-min-size 4 \
--p-trunc-len 120 \
--o-representative-sequences rep-seqs-unoise3.qza \
Expand Down Expand Up @@ -298,7 +294,7 @@ cd .. && rm -rf q2-usearch

``` bash
qiime usearch denoise-no-primer-pooled \
--i-demultiplexed-sequences merged.qza \
--i-demultiplexed-seqs merged.qza \
--p-min-size 4 \
--o-representative-sequences rep-seqs-unoise3.qza \
--o-table table-unoise3.qza \
Expand Down
50 changes: 50 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
[project]
name = "q2-usearch"
authors = [
{ name = "RobertEdgar, magicprotoss and biodps", email = "magicprotoss@hotmail.com" }
]
description = "This is a plug-in for USEARCH integration into QIIME2."
readme = {file = "README.md", content-type = "text/markdown"}
license = {file = "LICENSE"}
dynamic = ["version"]

[project.urls]
Homepage = "https://github.com/magicprotoss/q2-usearch"
Repository = "https://github.com/magicprotoss/q2-usearch"

[project.entry-points.'qiime2.plugins']
"q2-usearch" = "q2_usearch.plugin_setup:plugin"

[build-system]
requires = [
"setuptools",
"versioningit",
"wheel"
]
build-backend = "setuptools.build_meta"

[tool.versioningit.vcs]
method = "git-archive"
describe-subst = "$Format:%(describe)$"
default-tag = "0.0.1"

[tool.versioningit.next-version]
method = "minor"

[tool.versioningit.format]
distance = "{base_version}+{distance}.{vcs}{rev}"
dirty = "{base_version}+{distance}.{vcs}{rev}.dirty"
distance-dirty = "{base_version}+{distance}.{vcs}{rev}.dirty"

[tool.versioningit.write]
file = "q2_usearch/_version.py"

[tool.setuptools]
include-package-data = false

[tool.setuptools.packages.find]
where = ["."]
include = ["q2_usearch*"]

[tool.setuptools.package-data]
q2_usearch = ["**/*"]
8 changes: 4 additions & 4 deletions q2_usearch/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
# modified from q2-vsearch
from ._merge_pairs import merge_pairs

from ._version import get_versions

__version__ = get_versions()["version"]
del get_versions
try:
from ._version import __version__
except ModuleNotFoundError:
__version__ = '0.0.0+notfound'

__all__ = ['denoise_no_primer_pooled', 'cluster_no_primer_pooled',
'denoise_then_cluster_no_primer_pooled', 'merge_pairs', 'sintax']
97 changes: 97 additions & 0 deletions q2_usearch/_examples.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# ----------------------------------------------------------------------------
# Modified from q2-dada2
#
# Copyright (c) 2016-2024, QIIME 2 development team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
# ----------------------------------------------------------------------------


demux_single_url = \
'https://data.qiime2.org/usage-examples/moving-pictures/demux.qza'
demux_paired_url = \
'https://data.qiime2.org/usage-examples/atacama-soils/demux-full.qza'


def denoise_no_primer_pooled(use):
demux_single = use.init_artifact_from_url('demux_single', demux_single_url)

rep_seqs, table_unoise3, denoise_stats = use.action(
use.UsageAction('usearch', 'denoise_no_primer_pooled'),
use.UsageInputs(
demultiplexed_seqs=demux_single,
trunc_len=120
),
use.UsageOutputNames(
representative_sequences='zOTUs',
table='zOTU_Table',
denoising_stats='denoising_stats'
)
)

rep_seqs.assert_output_type('FeatureData[Sequence]')
table_unoise3.assert_output_type('FeatureTable[Frequency]')
denoise_stats.assert_output_type('SampleData[USEARCHStats]')


def denoise_then_cluster_no_primer_pooled(use):
demux_single = use.init_artifact_from_url('demux_single', demux_single_url)

rep_seqs, table_uclust, denoise_uclust_stats = use.action(
use.UsageAction('usearch', 'denoise_then_cluster_no_primer_pooled'),
use.UsageInputs(
demultiplexed_seqs=demux_single,
trunc_len=120,
min_size=4
),
use.UsageOutputNames(
representative_sequences='99_OTUs',
table='OTU_Table',
stats='denoising_and_uclusting_stats'
)
)

rep_seqs.assert_output_type('FeatureData[Sequence]')
table_uclust.assert_output_type('FeatureTable[Frequency]')
denoise_uclust_stats.assert_output_type('SampleData[USEARCHStats]')


def cluster_no_primer_pooled(use):
demux_single = use.init_artifact_from_url('demux_single', demux_single_url)

rep_seqs, table_uparse, cluster_stats = use.action(
use.UsageAction('usearch', 'cluster_no_primer_pooled'),
use.UsageInputs(
demultiplexed_seqs=demux_single,
trunc_len=120
),
use.UsageOutputNames(
representative_sequences='97_OTUs',
table='OTU_Table',
stats='clustering_stats'
)
)

rep_seqs.assert_output_type('FeatureData[Sequence]')
table_uparse.assert_output_type('FeatureTable[Frequency]')
cluster_stats.assert_output_type('SampleData[USEARCHStats]')


def merge_pairs(use):
demux_paired = use.init_artifact_from_url('demux_paired', demux_paired_url)

merged_sequences, unmerged_sequences = use.action(
use.UsageAction('usearch', 'merge_pairs'),
use.UsageInputs(
demultiplexed_seqs=demux_paired
),
use.UsageOutputNames(
merged_sequences='merged_seqs',
unmerged_sequences='unmerged_seqs'
)
)

merged_sequences.assert_output_type('SampleData[JoinedSequencesWithQuality]')
unmerged_sequences.assert_output_type('SampleData[PairedEndSequencesWithQuality]')
Loading
Loading