ITS2 RefSeq Integration Workflow-1

 植物ITS2データベースの構築

Duboisらにより提唱された参照用データベース作成フローを一部改変。

1. 植物ITS2領域のDNAデータを取得

NCBIウェブサイトの検索窓から「植物」、「ITS2」などのキーワードでDNAデータを抽出。

((viridiplantae[Organism] AND its2) AND 100:10000000[Sequence Length]) NOT (uncultured OR environmental sample OR incertae sedis OR unverified)

取得した配列数をカウントする。2024年3月6日時点では249,660配列が得られた。

grep -c '>' sequence.fasta #249660

2. Accession number と紐づいている Taxonomic identifier を得る

最初に1.で得たsequence.fastaからAccession numberを抜き出し、AccessionNumbersというファイルに保存する。

grep ">" sequence.fasta | cut -d ">" -f 2 | cut -d " " -f 1 > AccessionNumbers

次に、アクセッション番号と配列だけが紐づいたテーブルAccessionNumbers_seqs_linking_tableを作成する。一つの配列が複数行に渡り改行で格納されている場合は、後のGlobal_table作成時に結合できない可能性があるため、最初に配列を整形してからAccessionNumbers_seqs_linking_tableを作成する。

awk '/^>/ {if (seq) print seq; seq=""; print; next} {seq=seq $0} END {if (seq) print seq}' sequence.fasta > sequence_temp.fasta
mv sequence_temp.fasta sequence.fasta

paste \
  <(cat AccessionNumbers) \
  <(sed '/^>/d' sequence.fasta) > AccessionNumbers_seqs_linking_table

NCBIからTaxonomic identifierを得る。解凍後は11.5Gになった(ディスク容量に注意)。

wget ftp://ftp.ncbi.nih.gov/pub/taxonomy/accession2taxid/nucl_gb.accession2taxid.gz

gzip -d nucl_gb.accession2taxid.gz

AccessionNumbersをクエリとしてnucl_gb.accession2taxidから対応するレコードを抜き出して保存する。nucl_gb.accession2taxidにはaccession,accession.version,taxid,gi の4つのデータが格納されている。なお、使用するPCのリソースよって時間がかかるケースがある。

fgrep -w -f AccessionNumbers nucl_gb.accession2taxid > AccessionNumbers_taxids_linking_table

出来上がったAccessionNumbers_taxids_linking_tableファイルのレコード数と、最初に得たsequence.fasta の配列数が一致するか確認する。

wc -l AccessionNumbers_taxids_linking_table 
# 249660 =>OK

必要な列(accession.version, taxid)のみ残し、他は削除する

awk 'BEGIN {FS=OFS="\t"} {print $2,$3}' AccessionNumbers_taxids_linking_table > AccessionNumbers_taxids_linking_table_final

不要な中間ファイルを削除

rm AccessionNumbers
rm AccessionNumbers_taxids_linking_table

3. taxid と対応している生物種名のリストを得る

最初に重複の無いTaxidを得る。生物種の数は86281。

awk -F '\t' '{print $2}' AccessionNumbers_taxids_linking_table_final | sort | uniq > Taxids_uniq

wc -l Taxids_uniq
# 86281

taxidsに対応する生物分類を得る

NCBIからレファレンスファイルをFTPウェブサイトから得る

mkdir taxdump

wget https://ftp.ncbi.nlm.nih.gov/pub/taxonomy/new_taxdump/new_taxdump.tar.gz
mv new_taxdump.tar.gz taxdump/

tar -xvzf taxdump/new_taxdump.tar.gz -C taxdump

rankedlineage.dmpファイルにはタブ文字が含まれているため削除する

sed -i "s/\t//g" taxdump/rankedlineage.dmp

rankedlineage.dmpの並び替えをする

sort -t "|" -k 1b,1 taxdump/rankedlineage.dmp > taxdump/rankedlineage_sorted

タクソノミー情報(rankedlineage_sorted)をTaxids(Taxids_uniq) に結合させる

join -t "|" -1 1 -2 1 -a 1 Taxids_uniq taxdump/rankedlineage_sorted > Taxids_taxonomic_lineages_linking_table

wc -l Taxids_taxonomic_lineages_linking_table

#86281

結合できなかったタクソノミー情報が無いか2列目の空のレコード数を確認する(taxidIdが変更されているものがあるため、マッピングできないレコードがある)。

awk -F '|' '{print $2}' Taxids_taxonomic_lineages_linking_table | grep -c '^$'     

#4

空のタクソノミー情報が4あるため、空のtaxids を抽出⇒照会用URLを作成し照会⇒xmlファイルに結果を保存。

awk -F '|' '$2=="" {print $0}' Taxids_taxonomic_lineages_linking_table > Taxids_not_found

url="https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=taxonomy&rettype=xml&id="
url+=$(paste -s -d "," Taxids_not_found)

curl $url > Taxids_not_found.xml

xmlファイルから必要な部分を取りだし、空のタクソノミー情報のレコードと入れ替える。xmlファイルの処理のため、pythonコード(irw_1.pynb)の最初のセクションを使用。入力ファイルは①Taxids_not_found、②Taxids_not_found.xml、③Taxids_taxonomic_lineages_linking_table、④AccessionNumbers_taxids_linking_table_finalが必要となる。入力ファイルをirw_1.ipynbと同じフォルダに保存し、同コードを実行する。出力ファイルはUpdated_Taxids_taxonomic_lineages および Updated_AccessionNumbers_taxids_linking_table

入れ替えによりUpdated_Taxids_taxonomic_lineagesに重複が生じている可能性があるため、重複を削除する。

awk -F'|' '!seen[$1]++' Updated_Taxids_taxonomic_lineages > Updated_Taxids_taxonomic_lineages_tmp

mv Updated_Taxids_taxonomic_lineages_tmp Updated_Taxids_taxonomic_lineages

結合できなかったタクソノミー情報がないか2列目の空のレコードを確認する。

awk -F '|' '{print $2}' Updated_Taxids_taxonomic_lineages| grep -c '^$'     

#0

Qiime2のフォーマットに合う様にUpdated_Taxids_taxonomic_lineages_linking_tableを変える

paste \
  <(awk -F "|" '$2!="" {print $1}' Updated_Taxids_taxonomic_lineages) \
  <(awk -F "|" 'BEGIN {OFS=""} $2!="" {print "k__",$9,"; p__",$8,"; c__",$7,"; o__",$6,"; f__",$5,"; g__",$4,"; s__",$2}' Updated_Taxids_taxonomic_lineages) > Updated_Taxids_taxonomic_lineages_reformatted

RESCRIPtで取得した配列データの構造に合わせるために、種名のアノテーションランクから属名を削除する(例:Acer yangbiense ⇒ yangbiense)

paste -d "" \
  <(awk -F 's__' '{OFS=""} {print $1,"s__"}' Updated_Taxids_taxonomic_lineages_reformatted) \
  <(awk -F 's__' '{print $2}' Updated_Taxids_taxonomic_lineages_reformatted | cut -d " " -f 2-) > Updated_Taxids_taxonomic_lineages_final

元となるファイル①:Updated_AccessionNumbers_taxids_linking_table_final (irw_1.ipynbで生成)

元となるファイル②:Updated_Taxids_taxonomic_lineages_final (前述のUnixコマンドで生成)

元となるファイルをpythonコード(irw_1.ipynb)と同じフォルダに保存し、irw_1.ipynbの2セクション目を実行しAccessionNumbers_taxids_Taxonomic_lineages_linking_table を得る。

4. アクセッション番号、タクソノミーID、分類情報、DNA配列が集約しているglobal table を作成する

Global_tableを生成する

join -t $'\t' -1 1 -2 1 -a 1 \
      <(sort -t $'\t' -k 1b,1 AccessionNumbers_taxids_Taxonomic_lineages_linking_table)\
      <(sort -t $'\t' -k 1b,1 AccessionNumbers_seqs_linking_table) > Global_table

Global_table のレコード例:

AB000322.1 85472 kViridiplantae; pStreptophyta; cMagnoliopsida; oCaryophyllales; fPolygonaceae; gFagopyrum; s__callianthum TCGAAACCTGCCCCAAAGC…

すべてのレコードに空白値がないかを確認する

awk -F '\t' '{print $1}' Global_table | grep -c "^$"       # 0 => Ok
awk -F '\t' '{print $2}' Global_table | grep -c "^$"       # 0 => Ok
awk -F '\t' '{print $3}' Global_table | grep -c "^$"       # 0 => Ok
awk -F '\t' '{print $4}' Global_table | grep -c "^$"       # 0 => Ok

使用するファイルを残して使用しない中間ファイルを削除する

find . -maxdepth 1 ! -name 'Global_table' ! -name 'sequence.fasta' ! -name 'Taxids_not_found.xml' ! -name 'taxdump' ! -name 'nucl_gb.accession2taxid' ! -name '.' -exec rm -rf {} +

5. Qiime2フォーマットのfastaファイルとタクソノミー情報ファイルを作成し、Qiime2にインポートする

Qiime2フォーマットのfastaファイル(メタ情報にバージョン付きアクセッション番号、配列情報)を作成。配列数をカウントすると249660であった。

awk -F '\t' 'BEGIN {OFS=""} {print ">",$1,"\n",$4}' Global_table | sed 's/-//g' > Fasta_file
grep -c '>' Fasta_file 
#249660

タクソノミー情報ファイル(バージョン付きアクセッション番号にタクソノミー情報)を作成

awk 'BEGIN {FS=OFS="\t"} {print $1,$3}' Global_table > Taxonomic_lineages

Qiime2にインポート。もし、Fasta_fileの配列が小文字の場合は大文字に変えておく。

qiime tools import \
  --type 'FeatureData[Sequence]' \
  --input-path Fasta_file \
  --output-path Fasta_file.qza

6. 低クオリティ配列の除去

RESCRIPtプラグインを使い、ホモポリマーが12以上連続する部分を含むシーケンスを除外。(使用するマシンのコア数に応じてjobsの数を変える)。除外後のシーケンス配列を出力し、次の対応するタクソノミー情報の削除の時に利用する。

qiime rescript cull-seqs \
    --i-sequences Fasta_file.qza \
    --p-homopolymer-length 12 \
    --p-n-jobs 8 \
    --o-clean-sequences Fasta_file_tmp.qza

mv Fasta_file_tmp.qza Fasta_file.qza

qiime tools export \
  --input-path Fasta_file.qza \
  --output-path .

grep -c '>' dna-sequences.fasta
# 234688

削除後の配列数が234688となり14972配列除去された

シーケンスがRESCRIPtプラグインで除去された場合には、対応するタクソノミー情報を削除する必要がある。削除後、タクソノミー情報をQiime2で使用するqzaファイルに格納する

fgrep -v -f <(
  cat <(grep ">" dna-sequences.fasta | cut -d ">" -f 2) \
      <(cut -d $'\t' -f 1 Taxonomic_lineages) | sort | uniq -u
) Taxonomic_lineages > Taxonomic_lineages_tmp

mv Taxonomic_lineages_tmp Taxonomic_lineages

qiime tools import \
  --type 'FeatureData[Taxonomy]' \
  --input-format HeaderlessTSVTaxonomyFormat \
  --input-path Taxonomic_lineages \
  --output-path Taxonomic_lineages.qza

7. 同様の塩基配列データが存在した場合は、重複を削除する(オプション)

 DNA配列が全く同じのレコードを削除する。処理後の配列数は182470となり、52218配列削除された。ナイーブベイズ分類器の過学習の回避、結果の信頼性の確保、コンピューターリソースの節約の観点から重複を削除した配列を使用する。一方で、データの重複を保持することで、万が一の際の復旧や結果の信頼性を検証する場合に活用するなど、重複を保持することが目的によって必要に場合もあるtため、実験目的に応じて実行するかどうかを決める必要がある。なお、初期設定では、同じ配列であっても生物名が異なる場合は同一とみなされず、生物種単位で同一の配列が削除される。

qiime rescript dereplicate \
    --i-sequences Fasta_file.qza \
    --i-taxa Taxonomic_lineages.qza \
    --p-mode 'uniq' \
    --p-threads 8 \
    --o-dereplicated-sequences Fasta_file_tmp.qza \
    --o-dereplicated-taxa Taxonomic_lineages_tmp.qza

mv Fasta_file_tmp.qza Fasta_file.qza
mv Taxonomic_lineages_tmp.qza Taxonomic_lineages.qza

8. 菌類と思われる配列を植物ITSデータベースから削除する

最初に現在の配列データと分類データを抽出しておく。

qiime tools export \
--input-path Fasta_file.qza \
--output-path . && mv dna-sequences.fasta Exported_fasta_file.fasta

qiime tools export \
--input-path Taxonomic_lineages.qza \
--output-path . && awk 'NR>1' taxonomy.tsv > Exported_taxonomic_lineages.tsv

菌類と疑われる配列を特定するために、RefSeqsとUNITEデータベースの真菌ITS配列に対してブラスト検索する。最初はRefSeqから。

RefSeqからのデータをダウンロード

for i in $(curl -l ftp://ftp.ncbi.nlm.nih.gov/refseq/release/fungi/ | grep "genomic.fna");do wget https://ftp.ncbi.nlm.nih.gov/refseq/release/fungi/$i;done

ファイルを1つに連結。解凍と結合時に一時的にディスク容量が必要になるので注意する。今回は40GBほど必要になった。

gzip -d *.gz

cat *fna > fungi_genomic_refseqs.fna

taxidsの取得

grep ">" fungi_genomic_refseqs.fna | cut -d ">" -f 2 | cut -d " " -f 1 > AccessionNumbers

fgrep -w -f AccessionNumbers nucl_gb.accession2taxid > AccessionNumbers_taxids_linking_table

分類情報を得られなかったtaxidsの取得。

awk -F '\t' '{print $2}' AccessionNumbers_taxids_linking_table > AccessionNumbers_found_in_accession2taxid

cat AccessionNumbers AccessionNumbers_found_in_accession2taxid | sort | uniq -u > AccessionNumbers_not_found

今回は、分類情報が得られなかったtaxidは無かったので、fungi_genomic_refseqs.fna と AccessionNumbers_taxids_linking_table でblastデータベースを作成する。もし、分類情報が得られない配列がある場合には、植物の場合同様にxmlファイルから、足りない情報を得る。pythonコードを利用するか、数が少なければ手動で追加しても差し支えない。

BLASTデータベースの作成

makeblastdb \
-in fungi_genomic_refseqs.fna \
-parse_seqids \
-blastdb_version 5 \
-taxid_map AccessionNumbers_taxids_linking_table \
-title "fungi_genomic_refseqs" \
-dbtype nucl

Blast検索を植物ITS2配列に対して行う

blastn \
-db fungi_genomic_refseqs.fna \
-query Exported_fasta_file.fasta \
-num_threads 8 \
-max_target_seqs 1 \
-outfmt "6 qacc sacc evalue bitscore length pident ssciname scomname staxid" \
-out blastn_outfile_fungi_genomic_refseqs

配列の一致度が90%以上で且つ、アラインメントされた部分がクエリ配列の95%以上だった場合にその配列をデータベースから削除する

まずBlast検索の結果ファイルの様式を調整する。

sort -buk 1,1 blastn_outfile_fungi_genomic_refseqs | sed "s/100.000/100/g" > blastn_outfile_fungi_genomic_refseqs_uniq

awk -F '\t' '{print $1}' blastn_outfile_fungi_genomic_refseqs_uniq > AccessionNumbers_in_blastn_outfile

paste \
  <(cat AccessionNumbers_in_blastn_outfile) \
  <(fgrep -w -f AccessionNumbers_in_blastn_outfile Global_table | awk -F '\t' '{print length($4)*0.95}' | cut -d ',' -f 1) > AccessionNumbers_seqs_length_linking_table

join -t $'\t' -1 1 -2 1 -a 1 \
      <(sort -t $'\t' -k 1b,1 blastn_outfile_fungi_genomic_refseqs_uniq)\
      <(sort -t $'\t' -k 1b,1 AccessionNumbers_seqs_length_linking_table) > blastn_outfile_fungi_genomic_refseqs_uniq_withlengthdata

該当した配列のアクセッション番号を取得する。41配列該当した。

awk -F '\t' '$6>=90' blastn_outfile_fungi_genomic_refseqs_uniq_withlengthdata | awk -F '\t' '$5>=$NF' | awk -F '\t' '{print $1}' > Sequences_to_remove_fungi_genomic_refseqs

wc -l Sequences_to_remove_fungi_genomic_refseqs
#41

次にUNITEから菌類ITSのデータを得る。UNITEはウェブサイトからダウンロードする。今回はVersion10.0(2024.04)を使用。ダウンロード後、様式を調整

tar -xzvf sh_general_release_04.04.2024.tgz

paste \
<(grep ">" sh_general_release_dynamic_04.04.2024.fasta | cut -d "|" -f 2) \
<(sed '/^>/d' sh_general_release_dynamic_04.04.2024.fasta) > AccessionNumbers_seqs_linking_table

awk -F '\t' 'BEGIN {OFS=""} {print ">",$1,"\n",$2}' AccessionNumbers_seqs_linking_table > UNITE_fungi_seqs.fasta

UNITEデータベースを作成
makeblastdb \
  -in UNITE_fungi_seqs.fasta \
  -parse_seqids \
  -blastdb_version 5 \
  -title "UNITE_fungi_seqs" \
  -dbtype nucl

Blast検索を行う

blastn \
  -db UNITE_fungi_seqs.fasta \
  -query Exported_fasta_file.fasta \
  -num_threads 8 \
  -max_target_seqs 1 \
  -outfmt "6 qacc sacc evalue bitscore length pident ssciname scomname staxid" \
  -out blastn_outfile_UNITE_fungi

様式を調整する(先ほどのRefseqと同様の操作)。

sort -buk 1,1 blastn_outfile_UNITE_fungi | sed "s/100.000/100/g" > blastn_outfile_UNITE_fungi_uniq

awk -F '\t' '{print $1}' blastn_outfile_UNITE_fungi_uniq > AccessionNumbers_in_blastn_outfile

paste \
  <(cat AccessionNumbers_in_blastn_outfile) \
  <(fgrep -w -f AccessionNumbers_in_blastn_outfile Global_table | awk -F '\t' '{print length($4)*0.95}' | cut -d ',' -f 1) > AccessionNumbers_seqs_length_linking_table

join -t $'\t' -1 1 -2 1 -a 1 \
      <(sort -t $'\t' -k 1b,1 blastn_outfile_UNITE_fungi_uniq)\
      <(sort -t $'\t' -k 1b,1 AccessionNumbers_seqs_length_linking_table) > blastn_outfile_UNITE_fungi_uniq_withlengthdata

該当した配列のアクセッション番号を取得する。17配列ピックアップされた。

awk -F '\t' '$6>=90' blastn_outfile_UNITE_fungi_uniq_withlengthdata | awk -F '\t' '$5>=$NF' | awk -F '\t' '{print $1}' > Sequences_to_remove_UNITE_seqs

wc -l Sequences_to_remove_UNITE_seqs
#17

RefseqとUNITEデータベースで得られた菌類と思われる配列のアクセッション番号を結合し、重複を削除する。42配列得られた。

cat Sequences_to_remove_fungi_genomic_refseqs Sequences_to_remove_UNITE_seqs | sort | uniq > Sequences_to_remove

wc -l Sequences_to_remove
#42

菌類と疑われる配列を作成中の配列データと、生物分類データから削除する。

grep -n -A 1 -f Sequences_to_remove Exported_fasta_file.fasta | \
sed -n 's/^\([0-9]\{1,\}\).*/\1d/p' | \
sed -f - Exported_fasta_file.fasta > Fasta_file_without_fungi

grep -v -f Sequences_to_remove Exported_taxonomic_lineages.tsv > Taxonomic_lineages_without_fungi

grep -c '>' Fasta_file_without_fungi
#182428

9. 誤って生物分類されていると思われる配列の削除

誤って生物名がアノテーションされている配列を除くために、交差検証を行う。自身の配列をクエリ配列としてデータベースに問い合わせ、familyランクで一致する配列が自身の1配列しか存在しない場合、誤ってアノテーションされていると判断する。

植物ITSでのBlastデータベースを作る。Blastデータベースに必要なファイルを生成する。

grep ">" Fasta_file_without_fungi | cut -d ">" -f 2 > AccessionNumbers

fgrep -f AccessionNumbers Global_table | awk 'BEGIN {FS=OFS="\t"} {print $1,$2}' > AccessionNumbers_taxids_linking_table

植物ITSの仮Blastデータベースを作る。

makeblastdb \
  -in Fasta_file_without_fungi \
  -parse_seqids \
  -blastdb_version 5 \
  -taxid_map AccessionNumbers_taxids_linking_table \
  -title "Fasta_file_without_fungi" \
  -dbtype nucl

自身をクエリ配列としてBlast検索を行う。

blastn \
  -db ./Fasta_file_without_fungi \
  -query Fasta_file_without_fungi \
  -num_threads 8 \
  -max_target_seqs 5 \
  -outfmt "6 qacc sacc evalue bitscore length pident ssciname scomname staxid" \
  -out blastn_outfile_leakedCV

予想していた分類結果とそうならなかった分類結果をBlast検索の結果から得る。

マッチング順位上位5の結果を抽出する。最初はアクセッション番号とtaxidIDを得る。

awk -F '\t' '{print $1}' blastn_outfile_leakedCV | sort | uniq > AccessionNumbers_in_blastn_outfile

awk 'BEGIN {FS=OFS="\t"} {print $1,$9}' blastn_outfile_leakedCV > AccessionNumbers_PredictedTaxids_linking_table

次にアクセッション番号1つと、このアクセッション番号に対応する5つのtaxidsIDを得て、さらにアクセッション番号と対応するtaxidsIDを1対1対応にする。データ処理のための行番号もつける。

awk 'seen[$1]++{ $1="" }1' OFS='\t' AccessionNumbers_PredictedTaxids_linking_table \
  | fgrep -w -A 4 -f AccessionNumbers_in_blastn_outfile \
  | sed '/--/d' > AccessionNumbers_PredictedTaxids_linking_table_top5

paste \
  <(awk -F '\t' '{print $1}' AccessionNumbers_PredictedTaxids_linking_table_top5 | awk 'BEGIN {FS=OFS="\t"} NF {p = $0} {print p}') \
  <(awk -F '\t' 'BEGIN {FS=OFS="\t"} {print $2}' AccessionNumbers_PredictedTaxids_linking_table_top5) > AccessionNumbers_PredictedTaxids_linking_table_top5_tmp && mv AccessionNumbers_PredictedTaxids_linking_table_top5_tmp AccessionNumbers_PredictedTaxids_linking_table_top5

awk 'BEGIN {FS=OFS="\t"} {print NR,$0}' AccessionNumbers_PredictedTaxids_linking_table_top5 > AccessionNumbers_PredictedTaxids_linking_table_top5_tmp && mv AccessionNumbers_PredictedTaxids_linking_table_top5_tmp AccessionNumbers_PredictedTaxids_linking_table_top5

familyレベルの該当する生物分類を追加する。

Global_tableからアクセッション番号とfamilyの組み合わせファイル、およびtaxidIDとfamilyの組み合わせファイルを得る。

paste \
  <(awk 'BEGIN {FS=OFS="\t"} {print $1}' Global_table) \
  <(awk 'BEGIN {FS=OFS="\t"} {print $3}' Global_table | awk -F '; ' '{print $5}') > AccessionNumbers_taxonomic_lineages_linking_table

paste \
  <(awk 'BEGIN {FS=OFS="\t"} {print $2}' Global_table) \
  <(awk 'BEGIN {FS=OFS="\t"} {print $3}' Global_table | awk -F '; ' '{print $5}') | sort -buk 1,1 > Taxids_taxonomic_lineages_linking_table

次にBlast検索の結果ファイル(アクセッション番号にtaxidIDが記載)に上記で得られたTaxids_taxonomic_lineages_linking_tableのfamilyを追加する。キーになるのはtaxidIDとなる。

LC_ALL=C join -t $'\t' -1 3 -2 1 -a 1 \
  <(LC_ALL=C sort -t $'\t' -k 3 AccessionNumbers_PredictedTaxids_linking_table_top5) \
  <(LC_ALL=C sort -t $'\t' -k 1 Taxids_taxonomic_lineages_linking_table) > AccessionNumbers_PredictedTaxids_linking_table_top5_tmp && mv AccessionNumbers_PredictedTaxids_linking_table_top5_tmp AccessionNumbers_PredictedTaxids_linking_table_top5

データの様式を調整する。それぞれのアクセッション番号にヒットした5つのfamilyが並ぶレコード形式にする。

sort -n -k 2 AccessionNumbers_PredictedTaxids_linking_table_top5 | awk 'BEGIN {FS=OFS="\t"} {print $3,$4}' > AccessionNumbers_PredictedTaxids_linking_table_top5_tmp && mv AccessionNumbers_PredictedTaxids_linking_table_top5_tmp AccessionNumbers_PredictedTaxids_linking_table_top5

awk 'BEGIN {FS=OFS="\t"} $1 != prev { printf "%s%s", ors, $1; prev=$1; ors=ORS } { printf " %s", $2 } END { print "" }' AccessionNumbers_PredictedTaxids_linking_table_top5 | sed "s/ /\t/g" > AccessionNumbers_PredictedTaxids_linking_table_top5_tmp && mv AccessionNumbers_PredictedTaxids_linking_table_top5_tmp AccessionNumbers_PredictedTaxids_linking_table_top5

さらにBlast検索の結果ではない、Global_tableから得られたfamilyの分類情報を追加する。結果的に、1つのアクセッション番号にBlast検索の結果である5つのfamilyと元々分類されていたfamilyの6つのfamilyが追加されたファイルになる。

join -t $'\t' -1 1 -2 1 -a 1 \
  <(sort -t $'\t' -k 1 AccessionNumbers_PredictedTaxids_linking_table_top5) \
  <(sort -t $'\t' -k 1 AccessionNumbers_taxonomic_lineages_linking_table) -o 1.1,2.2,1.2,1.3,1.4,1.5,1.6 > AccessionNumbers_PredictedTaxids_linking_table_top5_tmp && mv AccessionNumbers_PredictedTaxids_linking_table_top5_tmp AccessionNumbers_PredictedTaxids_linking_table_top5

次に、familyの数をそれぞれのレコードでカウントする。アクセッション番号とカウント数がセットになったファイルが生成される。

awk 'BEGIN {FS=OFS="\t"} { i=$1; $1=""; print i, gsub($2,"")-1 }' AccessionNumbers_PredictedTaxids_linking_table_top5 > Predicted_taxonomy_count

自分自身しかヒットせず1度だけのみ表示された配列を削除する。

awk 'BEGIN {FS=OFS="\t"} $2==1 {print $1}' Predicted_taxonomy_count > Sequences_to_remove

wc -l Sequences_to_remove
#1201

grep -n -A 1 -f Sequences_to_remove Fasta_file_without_fungi | \
sed -n 's/^\([0-9]\{1,\}\).*/\1d/p' | \
sed -f - Fasta_file_without_fungi > NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta

grep -c '>' NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta
#181227

grep -v -f Sequences_to_remove Taxonomic_lineages_without_fungi > NCBI_ITS2_Viridiplantae_taxonomic_lineages_2024_03_06.tsv

不要なファイルを削除する。最終的に必要になるファイルは以下の2つのファイルである。

NCBI_ITS2_Viridiplantae_taxonomic_lineages_2024_03_06.tsv, NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta

加えて任意であるが、元々のデータソースとして

①NCBIから取得した植物ITS2配列 sequence.fasta 、②タクソノミー情報 nucl_gb.accession2taxid、③分類情報が得られなかった際に取得したxmlファイル Taxids_not_found.xml、④菌類データベース(連結後)fungi_refseqs.fna、⑤菌類データベース(連結後)UNITE_fungi_seqs.fasta

重要な中間ファイルとして Global_table、また9のセクションで行ったblast検索のファイル blastn_outfile_leakedCV

これらを保存しておき、他のファイルを削除するコマンドは以下である。

find . -maxdepth 1 ! -name 'NCBI_ITS2_Viridiplantae_taxonomic_lineages_2024_03_06.tsv' \
                 ! -name 'NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta' \
                 ! -name 'sequence.fasta' \
                 ! -name 'nucl_gb.accession2taxid' \
                 ! -name 'Taxids_not_found.xml' \
                 ! -name 'fungi_refseqs.fna' \
                 ! -name 'UNITE_fungi_seqs.fasta' \
                 ! -name 'Global_table' \
                 ! -name 'blastn_outfile_leakedCV' \
                 ! -name '.' \
                 -exec rm -rf {} +

Qiime2にデータを格納し、qzaファイルとして出力する。

qiime tools import \
  --type 'FeatureData[Sequence]' \
  --input-path NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta \
  --output-path NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.qza

qiime tools import \
  --type 'FeatureData[Taxonomy]' \
  --input-format HeaderlessTSVTaxonomyFormat \
  --input-path NCBI_ITS2_Viridiplantae_taxonomic_lineages_2024_03_06.tsv \
  --output-path NCBI_ITS2_Viridiplantae_taxonomic_lineages_2024_03_06.qza

10. 分類器の作成

Qiime2で利用するskilearnベースのナイーブベイズ分類器を作成する。

qiime feature-classifier fit-classifier-naive-bayes \
  --i-reference-reads NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.qza \
  --i-reference-taxonomy NCBI_ITS2_Viridiplantae_taxonomic_lineages_2024_03_06.qza \
  --o-classifier NCBI_ITS2_Viridiplantae_classifier_2024_03_06.qza

11.今回作成した植物ITS2データベースを用いてBlast用DBを作成(オプション)

先ほど、ファイルを一括 削除したのでAccessionNumbers_taxids_linking_tableを復活させる。

grep ">" NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta | cut -d ">" -f 2 > AccessionNumbers

fgrep -w -f AccessionNumbers nucl_gb.accession2taxid > AccessionNumbers_taxids_linking_table

awk 'BEGIN {FS=OFS="\t"} {print $2,$3}' AccessionNumbers_taxids_linking_table > AccessionNumbers_taxids_linking_table_final

Blast検索の結果に、生物種を表示させるデータベースをダウンロードしておく

mkdir taxdump
wget ftp://ftp.ncbi.nlm.nih.gov/blast/db/taxdb.tar.gz
#指定したフォルダに解凍する。(こちらは弊社のパス例)
tar -xzf taxdb.tar.gz -C /home/bioinsight/DB_new/blast/taxdump

データベース生成時に、taxdumpフォルダを参照するように環境設定しておく。

export BLASTDB=/home/bioinsight/DB_new/blast/taxdump

この設定をシェルセッションが終了しても維持するために、~/.bashrcに追加。

echo 'export BLASTDB=/home/bioinsight/DB_new/blast/taxdump' >> ~/.bashrc
source ~/.bashrc

blastデータベースを生成する

makeblastdb \
  -in NCBI_ITS2_Viridiplantae_fasta_file_2024_03_06.fasta \
  -parse_seqids \
  -blastdb_version 5 \
  -taxid_map AccessionNumbers_taxids_linking_table_final \
  -title "NCBI_ITS2_Viridiplantae_blastdb_2024_03_06" \
  -dbtype nucl