RNA-seqデータからDNAウイルスのゲノムをアセンブルしてみる

:::note info
2024-02-28 追記:
この記事で紹介した手法を利用して、エビに感染するウイルスのゲノム配列を公共NGSデータから収集、解析した論文が出版されました。ぜひご覧ください。
[Kawato et al. (2023) "Evolutionary genomics of white spot syndrome virus"](https://doi.org/10.1007/s12562-023-01715-4)
:::
多くのDNAウイルスゲノムはイントロンを持たない。遺伝子が密に配置するため、転写産物は互いにオーバーラップすることがある。また、ウイルス感染したサンプルからのRNA抽出時に (細胞由来DNAに比べて大過剰に存在する) ウイルスDNAを除去しきれず、ウイルスDNAに由来するリードが一定量発生する可能性がある。転写産物のオーバーラップとゲノムDNAの持ち越しのどちらの貢献度が大きいのかは不明だが、RNA-seqデータからDNAウイルスのドラフトゲノム配列を取得できることがあることに気づいた。

今回使うのは、ブタに感染する大型DNAウイルスである[アフリカ豚熱ウイルス (ASFV)](https://ictv.global/report/chapter/asfarviridae/asfarviridae)に感染した培養細胞の[RNA-seqデータ](https://www.ebi.ac.uk/ena/browser/view/SRR11185052)。
# 目次
- [リードの下処理](#リードの下処理)
- [参照ゲノムへの貼り付け](#参照ゲノムへの貼り付け)
- [正規化](#正規化)
- [配列の再構築](#配列の再構築)
    - [de novoアセンブリ](#de-novoアセンブリ)
    - [スキャフォールディング](#スキャフォールディング)
    - [配列修正](#配列修正) 
- [考察と注意点](#考察と注意点)
# リードの下処理
シーケンサーから出力された元データ (生リード raw reads) はアダプター配列や低品質の領域を含んでいる可能性があるため、それらの除去 (クオリティトリム quality trimming) を行う。今回は[Fastp](https://github.com/OpenGene/fastp)を使う。この作業を行わなくても解析結果に問題は生じないかもしれないが、習慣づけておいて損はない。

```sh
# Download raw reads
nohup wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR111/052/SRR11185052/SRR11185052_1.fastq.gz &
nohup wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR111/052/SRR11185052/SRR11185052_2.fastq.gz &
wait

fastp -i SRR11185052_1.fastq.gz -I SRR11185052_2.fastq.gz -o SRR11185052_1_trim.fq.gz -O SRR11185052_2_trim.fq.gz --html SRR11185052_fastp.html --thread 8 --trim_poly_x
```
# 参照ゲノムへの貼り付け
トランスクリプトームデータの大部分は宿主由来であるため、それらを取り除くことで以後の計算量を節約できる。すでにウイルスの参照ゲノムが利用可能な場合、参照ゲノムに貼りついた (マップされた mapped) リードのみを利用するとよい。

ここで注意しなければならないのは、ウイルス由来でありながら参照ゲノム上に存在しない配列が除去されてしまう可能性があること。ウイルスの遺伝子組成に多様性が存在すると予想され、かつ宿主ゲノムのゲノム配列が利用可能な場合、宿主ゲノムにリードをマップして、マップされなかったリードを抽出するとよいだろう。ただ、宿主ゲノムはウイルスゲノムより格段に大きいため、より計算に時間がかかってしまう。

[ASFVの参照ゲノム配列](https://www.ncbi.nlm.nih.gov/nuccore/NC_001659.2)にリードを[Minimap2](https://github.com/lh3/minimap2)でマッピングし、貼りついたリードを[SAMtools fastq](http://www.htslib.org/doc/samtools-fasta.html)で抽出する。

```sh
(minimap2 --MD -ax sr -t 8 ASFV.fa SRR11185052_1_trim.fq.gz SRR11185052_2_trim.fq.gz | samtools view -@ 8 -G 12 -bS - |samtools sort -@ $NUMTH -O BAM -o SRR11185052.bam )2>SRR11185052.minimap2.log
samtools index SRR11185052.bam
samtools collate -u -O SRR11185052.bam |samtools fastq -@ 8 -1 SRR11185052_mapped_1.fq.gz -2 SRR11185052_mapped_2.fq.gz -0 /dev/null -s /dev/null -
```
# 正規化
遺伝子間でその発現量は数十～数万倍異なることがある。これはRNA-seqの読み取り深度 (sequencing depth) が遺伝子間で劇的に異なることを意味する。

これは元のゲノム配列を再構築するうえで少々問題である。たとえば、ゲノム上に読み取り深度数十× (かけ) と数万×の領域が混在している場合、大深度の領域のデータ量が膨れ上がるだけでなく、アセンブリに支障をきたす可能性がある。

シーケンス深度の差異を均す (正規化 normalize する) ことで、データを圧縮するとともに、 願わくばミスアセンブリを減らす。今回は[BBTools](https://kazumaxneo.hatenablog.com/entry/2017/08/29/162219)内の[BBNorm](https://jgi.doe.gov/data-and-tools/software-tools/bbtools/bb-tools-user-guide/bbnorm-guide/)を用いる。

```sh
# bbnorm coverage normalization with increasing MINDEPTH cutoffs 
for MINDEPTH in 1 5 10 20 ;do 
bbnorm.sh \
in=SRR11185052_mapped_1.fq.gz in2=SRR11185052_mapped_2.fq.gz \
out=SRR11185052_mapped_bbnorm_mindepth${MINDEPTH}_1.fq.gz \
out2=SRR11185052_mapped_bbnorm_mindepth${MINDEPTH}_2.fq.gz \
target=200 mindepth=${MINDEPTH} &>SRR11185052_mapped_bbnorm_mindepth${MINDEPTH}.log
done
```
最小深度 (minimum depth) の閾値を複数振るとよい。筆者は1, 5, 10, 20と振っている。
最小深度に閾値を設けることで、シーケンシングのエラーに起因する雑多な配列を捨てられる。しかし、あまりに閾値を厳しくすると、低発現のウイルス遺伝子由来のリードまで捨ててしまうため注意が必要だ。

正規化によってデータ量を大幅に圧縮できた。
```sh
$ seqkit stats *.gz
file                                          format  type    num_seqs        sum_len  min_len  avg_len  max_len
SRR11185052_mapped_1.fq.gz                    FASTQ   DNA   11,898,694  1,783,533,508       15    149.9      150
SRR11185052_mapped_2.fq.gz                    FASTQ   DNA   11,898,694  1,783,210,694       15    149.9      150
SRR11185052_mapped_bbnorm_mindepth10_1.fq.gz  FASTQ   DNA      200,897     30,110,803       34    149.9      150
SRR11185052_mapped_bbnorm_mindepth10_2.fq.gz  FASTQ   DNA      200,897     30,082,732       27    149.7      150
SRR11185052_mapped_bbnorm_mindepth1_1.fq.gz   FASTQ   DNA      318,255     47,697,754       28    149.9      150
SRR11185052_mapped_bbnorm_mindepth1_2.fq.gz   FASTQ   DNA      318,255     47,637,806       22    149.7      150
SRR11185052_mapped_bbnorm_mindepth20_1.fq.gz  FASTQ   DNA      191,322     28,676,086       34    149.9      150
SRR11185052_mapped_bbnorm_mindepth20_2.fq.gz  FASTQ   DNA      191,322     28,651,519       27    149.8      150
SRR11185052_mapped_bbnorm_mindepth5_1.fq.gz   FASTQ   DNA      218,618     32,766,810       34    149.9      150
SRR11185052_mapped_bbnorm_mindepth5_2.fq.gz   FASTQ   DNA      218,618     32,733,379       27    149.7      150
```

# 配列の再構築
読み取られた断片 (リード) からもとのウイルスゲノム配列を再構築する (アセンブリ assembly)。
参照ゲノムに貼りつけたリードをアセンブルせずそのまま変異検出 (variant calling) すればよい、という考えもある。しかし、大規模な欠失や転位といった構造変異を検出するには、やはり<i>de novo</i> アセンブリが有効だ。
## de novoアセンブリ
リードをもとの配列に再構築する作業を<i>de novo</i>アセンブリという。今回は代表的なショートリードアセンブラの[SPAdes](https://github.com/ablab/spades)を用いる。
```sh
   for MINDEPTH in 1 5 10 20 ;do 
    R1=SRR11185052_mapped_bbnorm_mindepth${MINDEPTH}_1.fq.gz
    R2=SRR11185052_mapped_bbnorm_mindepth${MINDEPTH}_2.fq.gz
    # SPAdes assembly
    conda activate spades-3.15.5
    spades.py --isolate \
    -o SRR11185052_spades_k127_bbnorm_mindepth${MINDEPTH} \
    -1 $R1 \
    -2 $R2 \
    -t 20 \
    -m 50 \
    -k 23,35,57,79,91,103,115,127
    conda deactivate
  done
```

## スキャフォールディング
アセンブルして得られた配列 (コンティグ contigs) はいまだ断片的である。そこでコンティグを正しい順番につなぎ合わせる (スキャフォールディング scaffolding) ことで、もとのウイルス配列を復元する。今回はBLASTNで参照ゲノムに対して相同性検索を行い、[Chromosomer](https://github.com/gtamazian/chromosomer)を使ってコンティグを参照ゲノム配列に照合し、正しい順番に並び替える。
```sh
for MINDEPTH in 1 5 10 20 ;do 
cd SRR11185052_spades_k127_bbnorm_mindepth${MINDEPTH}
blastn -subject ASFV.fasta -query scaffolds.fasta -outfmt 6 > scaffolds.blastn.out
awk '{if($4 >= 500 && $11 <= 1e-20 ){print $0}}' scaffolds.blastn.out >scaffolds.blastn.mod
chromosomer fastalength scaffolds.fasta scaffolds.length
chromosomer fragmentmap --ratio_threshold 0.8 scaffolds.blastn.mod 100 scaffolds.length scaffolds.map &>chromosomer.fragmentmap.log
chromosomer assemble scaffolds.map scaffolds.fasta scaffolds.chromosomer.fa
cd ../
done
```
特に深い意味はないが以後```mindepth=1```の結果を使う。
```sh
cd SRR11185052_spades_k127_bbnorm_mindepth1
seqkit stats scaffolds.chromosomer.fa
file                      format  type  num_seqs  sum_len  min_len  avg_len  max_len
scaffolds.chromosomer.fa  FASTA   DNA          1  176,679  176,679  176,679  176,679
cd ../
```

参照ゲノム上に存在しない配列が独立したコンティグになってしまった場合、参照ゲノムを用いたスキャフォールディングでは、そのコンティグを取りこぼしてしまう可能性がある。スキャフォールドに組み込まれなかったコンティグにウイルス遺伝子らしき配列が含まれていないか注意したい。

## 配列修正
スキャフォールディングして得られた配列 (スキャフォールド scaffold) は配列不明の領域 (ギャップ gap) を含んでいる。この領域を可能な限りなくすため、スキャフォールドにリードを貼り付け、その情報をもとに当該領域のギャップを埋める (ギャップフィル gap filling)。

今回はギャップフィルだけでなく、挿入・欠失 (インデル indels) や塩基置換など他の配列エラーの修正も同時に行う。アセンブリ上のエラーを修正する作業を一般にポリッシング (polishing) という。ポリッシングを行うソフト (ポリッシャー polisher) には[MaSuRCAパッケージのPOLCA](https://github.com/alekseyzimin/masurca)や[Pilon](https://github.com/broadinstitute/pilon) などいろいろある。今回はギャップフィルに適したPilonを選択する。

変化がなくなるまでポリッシングを繰り返す。
```sh
cp SRR11185052_spades_k127_bbnorm_mindepth1/scaffolds.chromosomer.fa pilon0.fa
for NUM in 0 1 2 3 4 5 6 7 8 9;do 
  (minimap2 --MD -ax sr -t 8 pilon${NUM}.fa SRR11185052_mapped_bbnorm_mindepth1_1.fq.gz SRR11185052_mapped_bbnorm_mindepth1_1.fq.gz | samtools view -@ $NUMTH -F 4 -bS - |samtools sort -@ $NUMTH -O BAM -o pilon${NUM}.bam )2>pilon${NUM}.minimap2.log
  samtools index pilon${NUM}.bam
  conda activate pilon-1.24
  java -jar /home/kawato/apps/pilon/pilon-1.24.jar --output pilon$((NUM + 1 )) --changes --vcf \
  --genome pilon${NUM}.fa \
  --frags pilon${NUM}.bam \
  --mindepth 5  --minmq 20 --mingap 1 \
  >pilon$((NUM + 1 )).out 2>pilon$((NUM + 1 )).err 
  conda deactivate
  cat pilon$((NUM + 1 )).fasta >pilon$((NUM + 1 )).fa
done
```
```sh
file        format  type  num_seqs  sum_len  min_len  avg_len  max_len
pilon10.fa  FASTA   DNA          1  176,897  176,897  176,897  176,897
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689564/450831d4-b975-c3de-2e1b-6e02770b958d.png)

参照ゲノム配列 (NC_001659.2)とのペアワイズBLASTNの結果は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689564/706e2f2e-fa7b-72ea-c98d-fb43109893cc.png)
BLASTN検索したところ、[MN393476.1](https://www.ncbi.nlm.nih.gov/nucleotide/MN393476.1)という配列と100％一致することが分かった。MN393476.1の長さは190576 bpで、今回アセンブルした配列より１割弱長い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689564/35a22404-49f5-9124-f168-63decee27e06.png)
参照ゲノム配列とMN393476.1のペアワイズBLASTNの結果は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2689564/504d6e54-0d94-9b42-d5ff-8c8c61cf0e90.png)
どうやらMN393476.1に存在し、参照ゲノム配列から欠落している配列があるらしい。今回アセンブルした配列からは、その部分がごっそり抜けて落ちているのだろう。マッピングに使う参照ゲノム配列をMN393476.1に変えると、また違った結果が得られると考えられる。

ともあれ、RNA-seqデータからまずますなASFVゲノム配列を得られたといってよいだろう。
データセットの質に依存するが、とある別の大型DNAウイルスでも良好な結果を得ている。

# 考察と注意点
今回紹介した手法は、重度に感染したサンプルにのみ適用可能と考えられる。RNA-seqから構築したドラフトゲノムは、全く発現していない遺伝子や長大な遺伝子間領域、そしてウイルス由来でありながら参照ゲノム上に存在しない配列が欠けてしまう可能性があることに注意が必要だ。

同じウイルス株から得たRNA-seqデータが複数利用可能な場合、それらを合わせて一つのデータとして解析すると、ドラフトゲノムの完全性、連続性を改善できる。

単一サンプル中に複数株が混合感染している場合、得られるドラフトゲノム配列はそれらのコンセンサスになると予想される。どれか一つの株がドミナントな場合、その株のゲノム配列を得られると期待される。しかし、半々の場合はキメラ状になってしまうかもしれない。IGVでマップ結果のBAMファイルを可視化し、配列組成が雑多な領域がほとんどないことを確認する必要がある。

正規化後のカバレッジが十分 (100×以上) あるにも関わらず、アセンブリして得られたコンティグがギャップだらけということが時折ある。原因はおそらくサンプルごとに異なり、よくわからない。最小深度の閾値を変更することで改善する場合がある。

[ヘルペスウイルス](https://journals.asm.org/doi/10.1128/JVI.01335-20)など一部ウイルスの遺伝子はイントロンを有しているため、今回の方法で全ゲノムをアセンブルすることはできないと予想される。また、遺伝子配列と異なる塩基配列を生み出す[RNA editing](https://www.sciencedirect.com/science/article/pii/S0171933522000425?via%3Dihub)の影響を受けている可能性も考慮が必要と考えられる。

[以前の記事](https://qiita.com/satoshi_kawato/items/896771fa6fae5452940a)で、NCBI SRA上のデータからウイルス配列を含むデータセットを検索する方法を紹介した。本記事では、いわばその応用として、RNA-seqデータからDNAウイルスのゲノム配列を取得する方法を示した。ウイルスの比較ゲノム解析を行う際、ゲノム情報が必ずしもふんだんに整備されていないことがある。利用可能なゲノム配列の数を少しでも増やすために、RNA-seqデータから再構築したドラフトゲノムが役立つかもしれない。