環境DNAで使用するデータベースを構築するスクリプトを作ってみたので解説します。分類群に依存せず魚類の他にも鳥類や両生類などにも対応しています。

どのようなツール?

NCBI EntrezのAPIを使用してワード検索でヒットした情報を取得します。検索ワードの構成や取得するデータフォーマットは決まっているので、検索結果より必要な情報を抽出して最終的にFasta形式に変換します。

PMiFishパイプライン用のFastaであれば下記のようなフォーマットにする必要があります。

>gb|PX940051.1|Anthias_nicholsi
CAAAGGCTTGGTCCTGACTTTACTATCAGCTCTAGCTAGGTTTACACATGCAAGTCTCCG...

このようなファイルを生成するツールです。

使い方

まず、環境構築を構築する必要があります。基本的にターミナルを使用します。次に検索対象の情報を取得します。

実行環境の構築

TaxonDBBuilderを実行するための実行環境を構築します。uvを使って構築する方法を説明します。

uvは多数あるpythonのパッケージマネージャーの一つです。環境構築は今いるフォルダ (カレントディレクトリ) 配下で完結するようにします。

curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR="$PWD/uv" sh

出力

downloading uv 0.10.0 x86_64-unknown-linux-gnu
no checksums to verify
installing to <Path to dir>/uv
  uv
  uvx
everything's installed!

To add <Path to dir>/uv to your PATH, either restart your shell or run:

    source <Path to dir>/uv/env (sh, bash, zsh)
    source <Path to dir>/uv/env.fish (fish)
WARN: The following commands are shadowed by other commands in your PATH: uv uvx

続いて、仮想環境を作成します。

source $PWD/uv/env
# 確認
which uv
# <Path to dir>/uv/uv
# 仮想環境作成
uv venv
# Using CPython 3.11.14
# Creating virtual environment at: .venv
# Activate with: source .venv/bin/activate

TaxonDBBuilderはpythonで書いたので、使用するpyhtonパッケージをインストールします。必要なパッケージはTaxonDBBuilderのリポジトリにあるrequirements.txtに記載しています。

ということで、TaxonDBBuilderのリポジトリをGitHubからクローンします。

gitコマンドがある場合はgit cloneでリポジトリをダウンロードできます。gitコマンドがない場合はDownload ZIPよりカレントディレクトリにダウンロードして解凍します。

git clone https://github.com/NaokiShibata/TaxonDBBuilder.git

仮想環境をActivateしてrequirements.txtに記載のパッケージをインストールします。

source .venv/bin/activate

uv pip install -r TaxonDBBuilder/requirements.txt
Resolved 10 packages in 440ms
Prepared 10 packages in 485ms
Installed 10 packages in 23ms
 + biopython==1.86
 + click==8.3.1
 + markdown-it-py==4.0.0
 + mdurl==0.1.2
 + numpy==2.4.2
 + pygments==2.19.2
 + rich==14.3.2
 + shellingham==1.5.4
 + typer==0.21.1
 + typing-extensions==4.15.0

TaxonDBBuilderの実行

実行コマンドは以下のようになります。

python3 TaxonDBBuilder/taxondbbuilder.py build -c TaxonDBBuilder/configs/db.toml -t 32443 -t 7777 -t 97265 -m 12s --output-prefix "MiFish" --dump-gb Results/MiFish_gb --workers 32 --resume --post-prep

taxondbbuilder.pyの引数は下記のとおりです。

 Usage: taxondbbuilder.py build [OPTIONS]

 Build a FASTA database by downloading GenBank records and extracting features.

 Examples (Teleostomi):   taxondbbuilder.py build -c configs/db.toml -t 117570 -m 12s   taxondbbuilder.py build -c configs/db.toml -t "Salmo salar" -m mitogenome   taxondbbuilder.py
 build -c configs/db.toml -t 117570 -m 12s --workers 2   taxondbbuilder.py build -c configs/db.toml -t 117570 -m 12s --output-prefix "mifish"   taxondbbuilder.py build -c configs/db.toml
 -t 117570 -m 12s --dump-gb Results/gb --resume   taxondbbuilder.py build -c configs/db.toml -t 117570 -m 12s --from-gb Results/gb

╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ *  --config                -c      PATH                                          Path to TOML config file. [default: None] [required]│ *  --taxon                 -t      TEXT                                          Taxon (taxid or scientific name). [default: None] [required]│ *  --marker                -m      TEXT                                          Marker key or prefix. [default: None] [required]│    --out                   -o      PATH                                          Output file or directory. [default: None]│    --dump-gb                       PATH                                          Directory to store GenBank chunks for caching. [default: None]│    --from-gb                       PATH                                          Directory of GenBank chunks to extract without downloading. [default: None]│    --resume                                                                      Resume using cached GenBank chunks.                                                                    │
│    --dry-run                                                                     Print query and exit.                                                                                  │
│    --workers               -w      INTEGER                                       Number of extraction workers. [default: 2]│    --output-prefix                 TEXT                                          Prefix added to output FASTA filename. [default: taxondbbuilder_]│    --post-prep                                                                   Apply [post_prep] FASTA processing after extraction.                                                   │
│    --post-prep-step                [primer_trim|length_filter|duplicate_report]  Post-prep step(s) to run. Repeat to select multiple. Choices: primer_trim, length_filter,              │
│                                                                                  duplicate_report.                                                                                      │
[default: None]│    --post-prep-primer-set          TEXT                                          Primer set name(s) for primer_trim. Repeat to select multiple (overrides config). [default: None]│    --help                                                                        Show this message and exit.                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

情報を集めていきます。

対象分類群のtaxid

まず対象分類群のtaxidを知る必要があります。taxidはNCBIのtaxonomy browserで確認可能です。

https://www.ncbi.nlm.nih.gov/datasets/taxonomy/tree/

MiFishプライマーのデータを扱うことを想定した場合、硬骨魚類 (Teleostei) / 軟骨魚類 (Chondrichthyes) / 円口類 (Cyclostomatida) が対象になります。

分類リンク
硬骨魚類https://www.ncbi.nlm.nih.gov/datasets/taxonomy/32443
軟骨魚類https://www.ncbi.nlm.nih.gov/datasets/taxonomy/7777
円口類https://www.ncbi.nlm.nih.gov/datasets/taxonomy/1476529

ページ中のNCBI Taxonomy IDが目的のtaxidです。

対象領域

続いて、プライマーが増幅した領域を知る必要があります。MiFishは論文からも分かるとおり12s rRNA領域を増幅してます。

記載パターンについてはTaxonDBBuilder/configs/markers_mitogenome.tomlを参照してください。コマンドによる確認はpython3 TaxonDBBuilder/taxondbbuilder.py list-markers -c TaxonDBBuilder/configs/db.tomlで可能です。現在は下記に対応していますが、12sと16sしかまだ使ったことがありません。

Marker IDAliasesHeader Format
12s12, 12s, rrnsmifish_pipeline
16s16, 16s, rrnlmifish_pipeline
atp6atp6mifish_pipeline
atp8atp8mifish_pipeline
coicoi, co1, cox1mifish_pipeline
coiicoii, cox2mifish_pipeline
coiiicoiii, cox3mifish_pipeline
control_regioncontrol, control-region, dloop, d-loopmifish_pipeline
cytbcytb, cyt b, cytb1mifish_pipeline
mitogenomemitogenome, mtgenome, mtDNA, mtmifish_pipeline
nd1nd1mifish_pipeline
nd2nd2mifish_pipeline
nd3nd3mifish_pipeline
nd4nd4mifish_pipeline
nd4lnd4lmifish_pipeline
nd5nd5mifish_pipeline
nd6nd6mifish_pipeline

設定ファイル (db.toml) の編集

最後に設定ファイルに情報を反映させます。初期設定は下記のとおりです。

[ncbi]
# Provide either in config or via env vars NCBI_EMAIL / NCBI_API_KEY.
email = "your.email@example.com"
api_key = "YOUR_API_KEY"

db = "nucleotide"
rettype = "gb"
retmode = "text"
per_query = 1000
use_history = true
# delay_sec overrides default rate-limit delay.
# delay_sec = 0.34

# Output header format
[output]
default_header_format = "{acc_id}|{organism}|{marker}|{label}|{type}|{loc}|{strand}"

[output.header_formats]
simple = "{acc_id}|{marker}|{loc}"
verbose = "{acc_id}|{organism_raw}|{marker_raw}|{label_raw}|{type_raw}|{loc}|{strand}"
mifish_pipeline = "gb|{acc_id}|{organism}"

# Taxon options
[taxon]
# If true, do not expand descendants in taxon search.
noexp = false

[markers]
# Marker definitions are loaded from an external file.
file = "configs/markers_mitogenome.toml"

# Optional filters. If unset, no filtering is applied.
[filters]
filter = ["mitochondrion","ddbj_embl_genbank"]
properties = ["biomol_genomic"]
sequence_length_min = 120
sequence_length_max = 30000
# publication_date_from = "1990/01/01"
# publication_date_to = "2025/12/31"
# modification_date_from = "2024/01/01"
# modification_date_to = "2026/12/31"
# all_fields_include = ["12S"]
# all_fields_exclude = ["WGS"]
# raw = "complete[prop]"

# Optional post-processing for the generated FASTA.
[post_prep]
# Enable with CLI option: --post-prep
# Runtime step selection example:
# --post-prep-step primer_trim --post-prep-step duplicate_report
# Parameters are required only for enabled steps:
# - length_filter: sequence_length_min + sequence_length_max
# - primer_trim: primer_file + primer_set
# primer candidates: `python3 taxondbbuilder.py list-primer-sets -c configs/db.toml`
sequence_length_min = 120
# sequence_length_max = 300
primer_file = "configs/primers.toml"
primer_set = ["mifish_u","mifish_ev2","mifish_u2","mifish_l"]
# primer_set = ["mifish_12s", "mifish_ev2"]

主要な項目だけ説明します。

[ncbi]

emailapi_keyはNCBIにアカウント登録することで取得可能です。使用しない場合は # でコメントアウトして下さい。

また、1回の取得レコード数を増やしたい場合は、per_queryの値を増やします。ただ、増やし過ぎには注意して下さい。

[ncbi]
# Provide either in config or via env vars NCBI_EMAIL / NCBI_API_KEY.
email = "your.email@example.com"
api_key = "YOUR_API_KEY"

db = "nucleotide"
rettype = "gb"
retmode = "text"
per_query = 1000
use_history = true
# delay_sec overrides default rate-limit delay.
# delay_sec = 0.34

[output]

出力するFastaのヘッダー構成を指定可能です。markers_mitogenome.tomlにマーカーごとに設定可能です。デフォルトはmarkers_mitogenome.tomlmifish_pipeoineが指定され、PMiFishパイプラインが受け付けるフォーマットになっています。

# Output header format
[output]
default_header_format = "{acc_id}|{organism}|{marker}|{label}|{type}|{loc}|{strand}"

[output.header_formats]
simple = "{acc_id}|{marker}|{loc}"
verbose = "{acc_id}|{organism_raw}|{marker_raw}|{label_raw}|{type_raw}|{loc}|{strand}"
mifish_pipeline = "gb|{acc_id}|{organism}"

[markers]

コマンドラインの指定に紐づく、検索ワードに関する情報が記載されている、markers_mitogenome.tomlまでのファイルパスを記載します。同様のフォーマットであれば自身で編集したファイルを指定することも可能です。

[markers]
# Marker definitions are loaded from an external file.
file = "configs/markers_mitogenome.toml"

[filters]

NCBI entrezで検索する際に使用するパラメーターを指定します。例えば、検索対象の配列長や対象データベースなど。

# Optional filters. If unset, no filtering is applied.
[filters]
filter = ["mitochondrion","ddbj_embl_genbank"]
properties = ["biomol_genomic"]
sequence_length_min = 120
sequence_length_max = 30000
# publication_date_from = "1990/01/01"
# publication_date_to = "2025/12/31"
# modification_date_from = "2024/01/01"
# modification_date_to = "2026/12/31"
# all_fields_include = ["12S"]
# all_fields_exclude = ["WGS"]
# raw = "complete[prop]"

詳細はこちらを参照下さい。デフォルトはMiFish DBを作るような設定となっています。

[post_prep]

GenbankファイルからFastaファイルを作成後、配列長フィルタリングとトリムするプライマーに関する情報を指定可能です。コマンドライン引数で--post-prepを指定した場合、db.tomlに記載の情報から処理パターンを自動推定して処理が走ります。処理の個別指定もコマンドライン引数から可能です。

# Optional post-processing for the generated FASTA.
[post_prep]
# Enable with CLI option: --post-prep
# Runtime step selection example:
# --post-prep-step primer_trim --post-prep-step duplicate_report
# Parameters are required only for enabled steps:
# - length_filter: sequence_length_min + sequence_length_max
# - primer_trim: primer_file + primer_set
# primer candidates: `python3 taxondbbuilder.py list-primer-sets -c configs/db.toml`
sequence_length_min = 120
# sequence_length_max = 300
primer_file = "configs/primers.toml"
primer_set = ["mifish_u","mifish_ev2","mifish_u2","mifish_l"]
# primer_set = ["mifish_12s", "mifish_ev2"]

primer_fileでプライマーに関する情報が記載されているconfigs/primers.tomlを指定しています。メタバーコーディングプライマーの情報をまとめているページの情報に基づいています。

# Primer definitions for [post_prep] primer trimming.
# Source: https://edna-blog.com/metaba-primer/ (accessed 2026-02-08)
# forward: primer candidates expected at 5' end
# reverse: primer candidates expected at 3' end (reverse-complement side is matched automatically)

# Fish (Osteichthyes, Chondrichthyes, Cyclostomata)
[primer_sets.mifish_u]
forward = ["GTCGGTAAAACTCGTGCCAGC"]
reverse = ["CATAGTGGGGTATCTAATCCCAGTTTG"]

[primer_sets.mifish_ev2]
forward = ["RGTTGGTAAATCTCGTGCCAGC"]
reverse = ["GCATAGTGGGGTATCTAATCCTAGTTTG"]

[primer_sets.mifish_u2]
forward = ["GCCGGTAAAACTCGTGCCAGC"]
reverse = ["CATAGGAGGGTGTCTAATCCCCGTTTG"]

[primer_sets.mifish_l]
forward = ["GCTGGTAAACCTCGTGCCAGC"]
reverse = ["CATAGCGGGGTATCTAATCCCGGTTTG"]

フォーマットに従えばオリジナルプライマーを使用することも可能です。

configs/primers.tomlの情報を使用する場合、primer_setにどのプライマーを指定するのか記載します。カンマ区切りで複数指定可能です。

詳細はコマンドラインのhelpかREADMEを参照下さい。

最終的に下記のようになりました。

[ncbi]
# Provide either in config or via env vars NCBI_EMAIL / NCBI_API_KEY.
email = "your.email@example.com"
api_key = "YOUR_API_KEY"

db = "nucleotide"
rettype = "gb"
retmode = "text"
per_query = 500
use_history = true
# delay_sec overrides default rate-limit delay.
# delay_sec = 0.34

# Output header format
[output]
default_header_format = "{acc_id}|{organism}|{marker}|{label}|{type}|{loc}|{strand}"

[output.header_formats]
simple = "{acc_id}|{marker}|{loc}"
verbose = "{acc_id}|{organism_raw}|{marker_raw}|{label_raw}|{type_raw}|{loc}|{strand}"
mifish_pipeline = "gb|{acc_id}|{organism}"

# Taxon options
[taxon]
# If true, do not expand descendants in taxon search.
noexp = false

[markers]
# Marker definitions are loaded from an external file.
file = "configs/markers_mitogenome.toml"

# Optional filters. If unset, no filtering is applied.
[filters]
filter = ["mitochondrion","ddbj_embl_genbank"]
properties = ["biomol_genomic"]
sequence_length_min = 120
sequence_length_max = 30000
# publication_date_from = "1990/01/01"
# publication_date_to = "2025/12/31"
# modification_date_from = "2024/01/01"
# modification_date_to = "2026/12/31"
# all_fields_include = ["12S"]
# all_fields_exclude = ["WGS"]
# raw = "complete[prop]"

# Optional post-processing for the generated FASTA.
[post_prep]
# Enable with CLI option: --post-prep
# Runtime step selection example:
# --post-prep-step primer_trim --post-prep-step duplicate_report
# Parameters are required only for enabled steps:
# - length_filter: sequence_length_min + sequence_length_max
# - primer_trim: primer_file + primer_set
# primer candidates: `python3 taxondbbuilder.py list-primer-sets -c configs/db.toml`
sequence_length_min = 120
# sequence_length_max = 300
primer_file = "configs/primers.toml"
primer_set = ["mifish_u","mifish_ev2","mifish_u2","mifish_l"]
# primer_set = ["mifish_12s", "mifish_ev2"]

実行

python3 TaxonDBBuilder/taxondbbuilder.py build -c TaxonDBBuilder/configs/db.toml -t 32443 -t 7777 -t 97265 -m 12s --output-prefix "MiFish" --dump-gb Results/MiFish_gb --workers 32 --resume --post-prep
╭──────────────── TaxonDBBuilder ─────────────────╮
│ Generic NCBI GenBank fetch + feature extraction │
╰─────────────── DB FASTA builder ────────────────╯
                               Run Summary
┏━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Item          ┃ Value                                                ┃
┡━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Config  │ TaxonDBBuilder/configs/db.toml                               │
│ Taxids  │ 32443, 7777, 1476529                                         │
│ Markers │ 12s                                                          │
│ Output  │ Results/db/20260208/MiFish_multi_taxon__12s.fasta            │
│ Filters │ filter, properties, sequence_length_max, sequence_length_min │
│ Dump GB │ Results/MiFish_gb                                            │
│ Resume  │ true                                                         │
└─────────┴──────────────────────────────────────────────────────────────┘
  taxid 32443   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 60358/60358 0:18:37
  taxid 7777    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4500/4169   0:00:04
  taxid 1476529 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 500/203     0:00:00
post_prep duplicate ACC records CSV:
Results/db/20260208/MiFish_multi_taxon__12s.fasta.duplicate_acc.records.csv
post_prep duplicate ACC groups CSV:
Results/db/20260208/MiFish_multi_taxon__12s.fasta.duplicate_acc.groups.csv
                                        Result Summary
┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric                              ┃ Value                                               ┃
┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Total records                        │ 65358                                               │
│ Matched records                      │ 61882                                               │
│ Matched features                     │ 63041                                               │
│ Kept records                         │ 56014                                               │
│ Skipped duplicates (same acc+seq)    │ 6131                                                │
│ Kept duplicates (same acc, diff seq) │ 17                                                  │
│ Output                               │ Results/db/20260208/MiFish_multi_taxon__12s.fasta   │
│ Log                                  │ Results/db/20260208/MiFish_multi_taxon__12s.fasta.… │
└──────────────────────────────────────┴─────────────────────────────────────────────────────┘
WARNING: duplicate accessions with different sequences were kept. See log for details.
ACC-organism mapping CSV: Results/db/20260208/MiFish_multi_taxon__12s.fasta.acc_organism.csv

私の環境では20分程度で終了しました。

出力

標準で以下のファイルが出力されます。

データベース用Fastaファイル

出力先は**Results/db/YYYYMMDD/**です。ファイル名は、taxid{ID}__{marker}.fastaとなります。複数指定時はIDの部分がmulti_taxonになるか、makerの部分がmulti_markernになります。

下記のような一般的なFasta formatです。

>gb|PX940051.1|Anthias_nicholsi
CAAAGGCTTGGTCCTGACTTTACTATCAGCTCTAGCTAGGTTTACACATGCAAGTCTCCG
CAATCCTGTGAGGATGCCCTGTCCCTCCCATCGGGAGGCCAGGAGCGGGCATCAGGCACA
TTCCTATAGCCCACGACGCCTTGCTTAGCCACACCCCCAAGGGAACTCAGCAGTGGTAAA
TATTAAGCCATGAGTGAAAACTTGACTTAATTATGGCTAAGAGGGCCGGTAAACCTCGTG
...
>gb|PX940048.1|Syngnathus_fuscus
CAAAGGCCTGGTCCTAACTTTACTGTCCCCTATAGCTATACTTACACATGCAAGTATCCG
CACCCCTGTGAGAATGCCCTTCACCCTCTTATGAGACCAAGGAGCCGGTATCAGGCACAC
TTTGTAGCCCATAACACCTTGCTTAGCCACACCCCCAAGGGAACTCAGCAGTGATAAACA

Acession numberと生物種名の対応表

*.fasta.acc_organism.csvとして出力されます。列はacc_id, accession, organism_name, headerで構成されます。

以下のような構成となっています。

acc_idaccessionorganism_nameheader
AB000667.1AB000667.1Paralichthys olivaceusgb
AB006953.1AB006953.1Carassius langsdorfiigb
AB016274.1AB016274.1Sigmops gracilisgb
AB018224.1AB018224.1Coryphaenoides armatusgb
AB018225.1AB018225.1Coryphaenoides yaquinaegb

Fasta headerの情報も併記されるので、データベース管理する用にでも使用して下さい。

実行ログ

出力FASTA.logの形式で出力されます。

# started: 2026-02-08T14:20:01.260333
# config: TaxonDBBuilder/configs/db.toml
# taxon input: ['32443', '7777', '1476529']
# taxids: ['32443', '7777', '1476529']
# markers: ['12s']
# output_prefix: MiFish
# dump_gb: Results/MiFish_gb
# from_gb: none
# resume: True
# post_prep: True
# post_prep.steps: primer_trim, length_filter, duplicate_report
# post_prep.sequence_length_min: 120
# post_prep.primer_file: <Path to dir>/TaxonDBBuilder/configs/primers.toml
# post_prep.primer_set: mifish_u, mifish_ev2, mifish_u2, mifish_l
# post_prep.primer_forward_count: 4
# post_prep.primer_reverse_count: 4
# workers: 32
# query taxid=32443: (txid32443[Organism]) AND ((("12S"[All Fields]) OR ("rrnS"[All Fields]) OR ("small subunit ribosomal RNA"[All Fields]))) AND (mitochondrion[filter]) AND (ddbj_embl_genbank[filter]) AND (biomol_genomic[prop]) AND (120[SLEN] : 30000[SLEN])
# query count taxid=32443: 60358
# query taxid=7777: (txid7777[Organism]) AND ((("12S"[All Fields]) OR ("rrnS"[All Fields]) OR ("small subunit ribosomal RNA"[All Fields]))) AND (mitochondrion[filter]) AND (ddbj_embl_genbank[filter]) AND (biomol_genomic[prop]) AND (120[SLEN] : 30000[SLEN])
# query count taxid=7777: 4169
# query taxid=1476529: (txid1476529[Organism]) AND ((("12S"[All Fields]) OR ("rrnS"[All Fields]) OR ("small subunit ribosomal RNA"[All Fields]))) AND (mitochondrion[filter]) AND (ddbj_embl_genbank[filter]) AND (biomol_genomic[prop]) AND (120[SLEN] : 30000[SLEN])
# query count taxid=1476529: 203
# kept records before post_prep: 56910
# post_prep primer trim: before=56910 after=56910 removed=0 trimmed_both=358 trimmed_left_only=51 trimmed_right_only=565 untrimmed=55936 dropped_empty=0 canonical_orientation=974 reverse_orientation=0
# post_prep length filter: before=56910 after=56014 removed=896
# post_prep duplicate_acc_report: total=56014 parsed=56014 unparsed=0 groups=6793 records=25683 cross_organism_groups=1360
# post_prep duplicate_acc_records_csv: Results/db/20260208/MiFish_multi_taxon__12s.fasta.duplicate_acc.records.csv
# post_prep duplicate_acc_groups_csv: Results/db/20260208/MiFish_multi_taxon__12s.fasta.duplicate_acc.groups.csv
# acc_organism_map: total=56014 mapped=56014 unmapped=0 unused_source_records=896 unique_accessions=55997 unique_organisms=15270
# acc_organism_map_csv: Results/db/20260208/MiFish_multi_taxon__12s.fasta.acc_organism.csv
# total records: 65358
# matched records: 61882
# matched features: 63041
# kept records: 56014
# skipped duplicates (same accession+sequence): 6131
# kept duplicates (same accession, different sequence): 17
# duplicate accessions with different sequences:
# - AH013008.2: 2 sequences
# - AH013009.2: 2 sequences
# - AH013010.2: 2 sequences
# - AH013011.2: 2 sequences
# - AH013012.2: 2 sequences
# - AH013013.2: 2 sequences
# - AH013014.2: 2 sequences
# - AH013015.2: 2 sequences
# - AH013016.2: 2 sequences
# - AH013017.2: 2 sequences
# - AH013018.2: 2 sequences
# - AH013019.2: 2 sequences
# - AH013020.2: 2 sequences
# - AH013021.2: 2 sequences
# - AP005998.1: 2 sequences
# - KJ643927.1: 2 sequences
# - OP326524.1: 2 sequences
# output: Results/db/20260208/MiFish_multi_taxon__12s.fasta
# finished: 2026-02-08T14:38:53.197825

実際に使用された検索クエリや処理ステップでどのように配列数が変化したのかなどを確認することが可能です。

配列がデータベース内でどのように重複しているか確認

何をしているかというと、配列に対して区別できない生物種リストをここで作成しています。その時のデータセットに応じたで生物多様性センターの「誤同定チェックシート」に関連する情報を提供するイメージですが、参考情報程度です。

*.fasta.duplicate_acc.records.csv*.fasta.duplicate_acc.groups.csvが対象ファイルになります。

*.fasta.duplicate_acc.records.csvは最終出力Fastaの配列で共通しているものにグループIDを割り振った1行1レコードのテーブルデータになります。また、*.fasta.duplicate_acc.groups.csvはグループIDごとに関連するAccession IDと生物種名を1行にまとめたファイルです。

オオクチバス属 Micropterus を対象に確認すると*.fasta.duplicate_acc.records.csvは下記のような結果となっています(一部)。organism_nameかheaderをみてみると種名が2つあります。

group_id,sequence_hash,sequence_length,records_in_group,unique_accessions,unique_organisms,cross_organism_duplicate,acc_id,accession,organism_name,header
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,LC882225.1,LC882225.1,Micropterus_salmoides,gb|LC882225.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,LC069536.1,LC069536.1,Micropterus_nigricans,gb|LC069536.1|Micropterus_nigricans
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR380107.1,OR380107.1,Micropterus_salmoides,gb|OR380107.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR380106.1,OR380106.1,Micropterus_salmoides,gb|OR380106.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR380105.1,OR380105.1,Micropterus_salmoides,gb|OR380105.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR380103.1,OR380103.1,Micropterus_salmoides,gb|OR380103.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR379507.1,OR379507.1,Micropterus_salmoides,gb|OR379507.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR379506.1,OR379506.1,Micropterus_salmoides,gb|OR379506.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,OR379505.1,OR379505.1,Micropterus_salmoides,gb|OR379505.1|Micropterus_salmoides
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,LC474183.1,LC474183.1,Micropterus_nigricans,gb|LC474183.1|Micropterus_nigricans
...

*.fasta.duplicate_acc.records.csvの該当グループIDの情報を*.fasta.duplicate_acc.groups.csvで確認すると下記のようになっています。

group_id,sequence_hash,sequence_length,records_in_group,unique_accessions,unique_organisms,cross_organism_duplicate,accessions,organism_names
283,ca10abaa969662cded6eba24df2960dad3485719,169,10,10,2,true,LC069536.1;LC474183.1;LC882225.1;OR379505.1;OR379506.1;OR379507.1;OR380103.1;OR380105.1;OR380106.1;OR380107.1,Micropterus_nigricans;Micropterus_salmoides
347,e70f6788f9df280b99b5c2485bddf7ad26e2609e,947,9,9,2,true,HQ391896.1;MH301074.1;MH301075.1;MH301076.1;OK945939.1;OL339398.1;OL339402.1;OL693877.1;OM736837.1,Micropterus_salmoides;Micropterus_salmoides_salmoides
...

1行にどのAccession Numberとどの種が同一配列を持つのか確認することができますね。

ただ、1点注意点があります。*.fasta.duplicate_acc.groups.csvのseqeuence_lengthの列を見ると169と947の記載があります。169bpはMiFishの増幅領域の配列長ですが、947bpは12s rRNAの全長配列に近い値です。処理の中でbiopythonにてMiFishプライマーでトリミングを実施していますが、完全では無いためトリムされなかった配列はそのまま残ることがあります。

ここで期待しているのは増幅領域で判別できない種の情報を得ることです。そのため、増幅配列長よりかなり長い数値がsequence_lengthに記載されている場合は注意して下さい。

まとめ

メタバーコーディングで必ず必要になるリファレンスデータベースを作成するためのツールを作成しました。不完全なところはありますが、手元に分類群に依存しないオリジナルデータベース用のFastaを取得するには十分かなと考えています。

記事公開後も使い勝手が良くなるように更新すると思うので気になったら覗いてみて下さい。