【バイオインフォマティクス】ヒトT2TゲノムのResequence~Annotation
この記事の要約
- 生命科学と情報学のハイブリット学問のことを「バイオインフォマティクス」という。
- 最もメジャーな解析にResequence(≒ゲノム変異解析)がある。
- Resequenceは間違い探しのようなもので、基準となるゲノムAと比較するゲノムBの違いを明らかにする。
- 変異が検出できたら、その変異はどんな遺伝子に影響を及ぼしているのかAnnotationをつける。
- 最近人間の基準ゲノムが完璧なものに進化した。
- 従来通り、OSSベースの解析ツールを用いて一般的なResequence解析をすると変異解析自体は問題なくできる。
- AnnotationはAnnotation用のデータのフォーマットが従来と少し変わっており、少し工夫が必要だった。
- 当社の解析技術共有プラットフォーム「ANCAT」で無料で解析できます。
https://www.ancatbeta.anplat.co.jp - Annotationデータをよしなに整形し直してくれるpythonスクリプトを公開します。
https://github.com/ANPLAT-Co-Ltd/modify_gff_for_human_T2T
はじめに
皆さんこんにちは。
株式会社アンプラットです。
割と最近、ヒトゲノムが完全解読されました。
ざっくり説明すると、いままでは解読がどうしても難しい領域があり、人間の完璧なゲノムはわかっておらず、研究者たちは、基準ゲノムに若干の曖昧さを残したまま、ゲノム間違い探し(遺伝子多型・変異解析)を行っていました。しかし、最近染色体の端から端まで完全解読されるという教科書にのるレベルの革新がおきました。
このあたりの解説については神がかったクオリティのレビュー論文(日本語)があるので、是非読んでみてください。
この記事では、当社のインターン生「Mさん」が、既存解析手法でヒト完全ゲノム(T2T)の解析が行えるのか調べてみた結果を記します。
※ 記事は当社社員、役員でもテストランを含む入念な確認をしており、ある程度の信頼性は担保できていますが、完全ではないので、そこはご認識の上、ご覧くださいませ。
ヒトT2TゲノムのResequence~Annotation
実際にT2Tのreference配列を用いてreseq~annotationまで行った際の流れを記述する。
目次
用意したファイル
次のような形でファイルを用意する。
/data
├── raw_fastq
│ ├── SRR5204297_1.fastq.gz
│ └── SRR5204297_2.fastq.gz
├── T2T-CHM13v2.0
│ └── genes.gff.gz
└── genomes
└── T2T-CHM13v2.0.fa.gz
-
fastqファイル(
SRR5204297_1.fastq.gz
,SRR5204297_2.fastq.gz
)$cd /home/data/raw_fastq #SRA Toolkitのfastq-dumpが使えるようになっている必要あり $fastq-dump SRR5204297 --split-files $gzip SRR5204297*
-
fastaファイル(reference):
ncbi_dataset/data/GCF_009914755.1_T2T-CHM13v2.0_genomic.fna
NCBIから入手可能(https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_009914755.1/)。#ダウンロード後 #ファイル圧縮 $bgzip ncbi_dataset/data/GCF_009914755.1_T2T-CHM13v2.0_genomic.fna #ファイル移動 $mv ncbi_dataset/data/GCF_009914755.1_T2T-CHM13v2.0_genomic.fna.gz /home/data/genomes/T2T-CHM13v2.0.fa.gz
このディレクトリ名やファイル名はあとでsnpEffを使うときにデフォルトで指定されているものなのでここで変えておくと楽。
-
gffファイル(annotationのデータベースビルド用, 既存のデーターベースを使う場合には不要):
ncbi_dataset/data/GCF_009914755.1/genomic.gff
こちらもfastaと同様NCBIから入手可能だが、ダウンロード後少し修正が必要。#ダウンロード後 #ファイル圧縮 $gzip ncbi_dataset/data/GCF_009914755.1/genomic.gff.gz #ファイル移動 $mv ncbi_dataset/data/GCF_009914755.1/genomic.gff.gz /home/data/T2T-CHM13v2.0/
ここまではfastaと一緒。今回使ったgffファイルにおいて必要な修正は、Githubで公開してるpyファイル(modify_chrname.py, modify_gff.py)を実行することで一気に行える。具体的な修正内容についてはgffファイルの修正についての補足説明で述べる。
#修正実行 #python3 modify_gff.py -i input_file -o output_file $python3 /home/apps/modify_gff.py -i /home/data/T2T-CHM13v2.0/genomic.gff.gz -o /home/data/T2T-CHM13v2.0/genes.gff && gzip /home/data/T2T-CHM13v2.0/genes.gff
*gffをbgzipで圧縮してしまうとビルドの時にデータの一部しか読まれずうまくいかないので注意
同じくディレクトリ名やファイル名はあとでsnpEffを使うときにデフォルトで指定されているものなのでここで変えておくと楽。さらに、NCBIからダウンロードしたfastaファイルやgffファイルは染色体名が
NC_060925.1
のようにAccession番号で表示されていて見にくいのでchr1
のような表記に変える。
fastaファイル、gffファイルそれぞれmodify_chrname.py
を使って以下のコマンドで変えられる、$python modify_chrname.py -f "変更前fastaファイルパス" -t "染色体名の対応表(tsv/csv)" -of "変更後fastaファイルパス" -bgzip "bgzipのパス"
*bgzipを使うのでbgzipのパス名を
-bgzip
で指定(default: `/home/tools/bgzipでコンテナ中では指定する必要なし)$python modify_chrname.py -g "変更前gffファイルパス" -t "染色体名の対応表(tsv/csv)" -og "変更後fastaファイルパス"
"染色体番号の対応表(tsv/csv)"
というのは変更前と変更後の染色体名を記載したtsvまたはcsvファイルのこと。1列目に変更前の染色体名、2列目に変更後の染色体名を記入する。NC_060925.1 Homo sapiens isolate CHM13 chromosome 1, alternate assembly T2T-CHM13v2.0 chr1 NC_060926.1 Homo sapiens isolate CHM13 chromosome 2, alternate assembly T2T-CHM13v2.0 chr2 NC_060927.1 Homo sapiens isolate CHM13 chromosome 3, alternate assembly T2T-CHM13v2.0 chr3 ︙
変更前の染色体名をfasta/gffファイルから抜き出すモードを
modify_chrname.py
に入れたのでそれを使えば変更前の染色体名が1列に並んだファイルがつくれるので、2列目にそれぞれ変更後の染色体名を追加すれば対応表ができる。$python "modify_chrname.pyのpath" -f "fastaファイルパス" -m txt_fasta -ot "染色体名のtxtファイルパス"
$python "modify_chrname.pyのpath" -g "gffファイルパス" -m txt_gff -ot "染色体名のtxtファイルパス"
コマンドを組み合わせればfastaとgff両方一気に修正することもできるが必ずしもfastaとgff中の染色体名表記が一致しているわけではないので注意。その場合、対応表を別々に作る必要があるので同時にはできない。
-
>NC_060925.1 Homo sapiens isolate CHM13 chromosome 1, alternate assembly T2T-CHM13v2.0 CACCCtaaaccctaacccctaaccctaaccctaaccctaaccctaaccctaacccctaaaccctaaccctaaccctaaccct…
>…
の行に書いてあるのが染色体(配列)の説明。これを染色体番号の名前に変えたい。自分で一から染色体名の対応表を作っても良いが、下のコマンドを使えば変更前の染色体名をファイルから抜き出すことができる。#染色体名抽出 $python /home/apps/modify_chrname.py -f /home/data/genomes/T2T-CHM13v2.0.fa.gz -m txt_fasta -ot /home/data/chrom_modify/fasta.txt $vim /home/data/chrom_modify/fasta.txt
そうすると下のようにfastaファイル中の`>`の行が抜き出され、`fasta.txt`として下のように出力されるので
これの2列目に染色体名を入れていく。NC_060925.1 Homo sapiens isolate CHM13 chromosome 1, alternate assembly T2T-CHM13v2.0 NC_060926.1 Homo sapiens isolate CHM13 chromosome 2, alternate assembly T2T-CHM13v2.0 NC_060927.1 Homo sapiens isolate CHM13 chromosome 3, alternate assembly T2T-CHM13v2.0 ︙
下の染色体名にNC_060925.1 Homo sapiens isolate CHM13 chromosome 1, alternate assembly T2T-CHM13v2.0 chr1 NC_060926.1 Homo sapiens isolate CHM13 chromosome 2, alternate assembly T2T-CHM13v2.0 chr2 NC_060927.1 Homo sapiens isolate CHM13 chromosome 3, alternate assembly T2T-CHM13v2.0 chr3 ︙
,
が入っているのでタブ区切りにしているが、csvでも可。その場合拡張子を.txt
から.csv
に変えること(GFFファイルの変更はcsvでやっているので具体例はそちらを参照)。 tsv/csvファイルができたら、次のコマンドでfastaファイルを修正。すると、fastaファイルの染色体情報の部分が次のように変更される。python /home/apps/modify_chrname.py -f /home/data/genomes/T2T-CHM13v2.0.fa.gz -t /home/data/chrom_modify/fasta.txt -of /home/data/genomes/modified_T2T-CHM13v2.0.fa.gz
>chr1 CACCCtaaaccctaacccctaaccctaaccctaaccctaaccctaaccctaacccctaaaccctaaccctaaccctaaccct…
zgrep -i '>' modified_T2T-CHM13v2.0.fa.gz
(fastaを圧縮していない場合にはgrep -i '>' modified_T2T-CHM13v2.0.fa
)を打つと、各染色体の情報が見られて染色体名が変更されたか確認できる。$zgrep -i '>' modified_T2T-CHM13v2.0.fa.gz >chr1 >chr2 >chr3 >chr4 ︙
変更が確認できたらオリジナルのファイルと入れ替えておく(どちらも取っときたい場合はやらなくてOK. その場合、以降の解析でのインプットファイルの名前を修正版のものに変更する)こんな感じで変更後の染色体名が出力されればOK。
$mv modified_T2T-CHM13v2.0.fa.gz T2T-CHM13v2.0.fa.gz
-
基本動作はfastaと同様。インプットファイルのオプションが少し違うので注意。
##gff-version 3 #!gff-spec-version 1.21 #!processor NCBI annotwriter #!genome-build T2T-CHM13v2.0 #!genome-build-accession NCBI_Assembly:GCF_009914755.1 #!annotation-date 10/02/2023 #!annotation-source NCBI RefSeq GCF_009914755.1-RS_2023_10 ##sequence-region NC_060925.1 1 248387328 ##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=9606 NC_060925.1 RefSeq region 1 248387328 . + . ID=NC_060925.1:1..248387328;Dbxref=taxon:9606;Name=1;cell-line=CHM13htert;chromosome=1;gbkey=Src;genome=chromosome;isolate=CHM13;mol_type=genomic DNA;note=haploid cell line;sex=female;tissue-type=hydatidiform mole NC_060925.1 BestRefSeq gene 7506 138480 . - . ID=gene-LOC127239154;Dbxref=GeneID:127239154;Name=LOC127239154;description=uncharacterized LOC127239154;gbkey=Gene;gene=LOC127239154;gene_biotype=lncRNA;partial=true NC_060925.1 BestRefSeq ncrna 7506 138480 . - . ID=rna-NR_182074.1;Parent=gene-LOC127239154;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Name=NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1 NC_060925.1 BestRefSeq exon 138321 138480 . - . ID=exon-NR_182074.1-1;Parent=rna-NR_18207 ︙
#染色体名抽出 $python /home/apps/modify_chrname.py -g /home/data/T2T-CHM13v2.0/genes.gff.gz -m txt_gff -ot ./chrom_modify/gff.txt #染色体名抽出書き換え $vim /home/data/chrom_modify/gff.txt
同様に2列目に対応するクロモソーム名を追加。今回はカンマ区切り。NC_060927.1 NC_060934.1 NC_060933.1 ︙
カンマ区切りの場合は拡張子をNC_060927.1,chr3 NC_060934.1,chr10 NC_060933.1,chr9 ︙
.csv
に変更つくったcsvファイルを用いてGFFファイルを修正する。$mv gff.txt gff.csv
python /home/apps/modify_chrname.py -g /home/data/T2T-CHM13v2.0/genes.gff.gz -t /home/data/chrom_modify/gff.csv -og /home/data/T2T-CHM13v2.0/modified_genes.gff.gz
一番左のクロモソームのIDの列がクロモソーム番号に変わっている。##gff-version 3 #!gff-spec-version 1.21 #!processor NCBI annotwriter #!genome-build T2T-CHM13v2.0 #!genome-build-accession NCBI_Assembly:GCF_009914755.1 #!annotation-date 10/02/2023 #!annotation-source NCBI RefSeq GCF_009914755.1-RS_2023_10 ##sequence-region NC_060925.1 1 248387328 ##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=9606 chr1 RefSeq region 1 248387328 . + . ID=NC_060925.1:1..248387328;Dbxref=taxon:9606;Name=1;cell-line=CHM13htert;chromosome=1;gbkey=Src;genome=chromosome;isolate=CHM13;mol_type=genomic DNA;note=haploid cell line;sex=female;tissue-type=hydatidiform mole chr1 BestRefSeq gene 7506 138480 . - . ID=gene-LOC127239154;Dbxref=GeneID:127239154;Name=LOC127239154;description=uncharacterized LOC127239154;gbkey=Gene;gene=LOC127239154;gene_biotype=lncRNA;partial=true chr1 BestRefSeq ncrna 7506 138480 . - . ID=rna-NR_182074.1;Parent=gene-LOC127239154;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Name=NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1 chr1 BestRefSeq exon 138321 138480 . - . ID=exon-NR_182074.1-1;Parent=rna-NR_182074.1;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels com
同様にオリジナルのファイルと入れ替えておく。$cd /home/data/Tw $mv /home/data/T2T-CHM13v2.0/modified_genes.gff.gz /home/data/T2T-CHM13v2.0/genes.gff.gz
-
用意したツール
-
cutadapt (fastqファイルのトリミング、クオリティコントロール(QC)用
公式ドキュメント: https://cutadapt.readthedocs.io/en/stable/installation.html#install $pip install cutadapt
-
bwa (リードのreferenceへのマッピング)
Github: https://github.com/lh3/bwa#install $cd tools $git clone https://github.com/lh3/bwa.git $cd bwa $make
最初はbwa-mem2を用いてマッピングを行おうとしたが、こちらはbwaよりも無駄にメモリを使うらしく、indexを付ける際にメモリ不足が発生したのでbwaに変更した。
-
samtools (SAM→BAMファイルへの変換)
Github: https://github.com/samtools/samtools$wget https://github.com/samtools/samtools/releases/download/1.15.1/samtools-1.15.1.tar.bz2 $tar -xvf samtools-1.15.1.tar.bz2 $cd samtools-1.15.1/ $./configure #インストールが必要なライブラリがあれば、ここでエラーメッセージとしてでてくるので apt install "ライブラリ名"でインストールする。 $make -j12 $make install
*一番最新のsamtools-1.19.2でやろうとしたらsortのところでエラーが出てマッピングができなかったのでver.1.15.1で実行している。
#エラーメッセージ例 checking for gawk... no checking for mawk... mawk checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether the compiler supports GNU C... yes checking whether gcc accepts -g... yes checking for gcc option to enable C11 features... none needed checking for grep that handles long lines and -e... /usr/bin/grep checking for C compiler warning flags... -Wall checking for gcc option to enable large file support... none needed checking location of HTSlib source tree... htslib-1.19.1 checking for NcursesW wide-character library... no checking for Ncurses library... no checking for Curses library... no configure: error: curses development files not found The 'samtools tview' command uses the curses text user interface library. Building samtools with tview requires curses/ncurses/etc development files to be installed on the build machine; you may need to ensure a package such as libncurses5-dev (on Debian or Ubuntu Linux) or ncurses-devel (on RPM-based Linux distributions) is installed. FAILED. Either configure --without-curses or resolve this error to build samtools successfully.
こういうのが出てくるので下から2番目のブロックに書いてあるライブラリ的なのをインストールする。
# コマンド例 $apt install libncurses5-dev
再び
./configure
を実行するとまた足りないライブラリがあれば同様に教えてくれるので、成功するまでapt install 〇〇
→./configure
をくりかえす。さらに、fastaファイルの修正にbgzipも使いたいのでsamtoolsの中に入っているhtslibもビルドし、さらにbgzipのシンボリックリンクを使いやすいところに置いておく。
$cd /home/tools/samtools-1.15.1/htslib-1.15.1/ $./configure $make $ln -s /home/tools/samtools-1.15.1/htslib-1.15.1/bgzip /home/tools/bgzip
-
gatk (変異解析)
Github: https://github.com/broadinstitute/gatk?tab=readme-ov-file#downloading
インストールにjavaが必要なので入っていない場合はインストールする。#java install $apt install openjdk-17-jdk #gatk install $wget https://github.com/broadinstitute/gatk/releases/download/4.5.0.0/gatk-4.5.0.0.zip $unzip /home/tools/gatk-4.5.0.0.zip $rm /home/tools/gatk-4.5.0.0.zip
-
snpEff (アノテーション)
公式ドキュメント: https://pcingola.github.io/SnpEff/snpeff/introduction/$wget https://sourceforge.net/projects/snpeff/files/snpEff_v4_1k_core.zip $unzip snpEff_v4_1k_core.zip $rm snpEff_v4_1k_core.zip
最新版だとなぜかgff修正用のpyファイルを実行しても一部うまく読み込めないのかDBビルドがあまり上手く行かなかったので代わりにv4.1を使った。
これらのツールが全て組み込まれたDockerfileをつくったので、それを使ってコンテナを作ればその中で全ての処理ができる。
#まず、"reseq_docker"というファイルにDockerfileを入れる。 $mkdir reseq_docker $cd reseq_docker $mv /path/to/Dockerfile ./ #イメージビルド $docker image build -t reseq . #コンテナ作成+データディレクトリのマウント $docker run -v /home/murakosom/reseq_T2T/Docker/mount_data:/home/data/ -itd --name reseq reseq bash #コンテナにアクセス $docker exec -it reseq bash
解析手順
実際にDockerコンテナの中でreseqを実行してみた手順を示す。
-
-
#コマンド $mkdir trimmed_fastq $cutadapt -e 0.1 -o ./trimmed_fastq/SRR5204297_trimmed_1.fastq.gz -p ./trimmed_fastq/SRR5204297_trimmed_2.fastq.gz ./raw_fastq/SRR5204297_1.fastq.gz ./raw_fastq/SRR5204297_2.fastq.gz
-e
: 許容するエラーの割合の最大値(~1)
-o
: トリミング後のリード1の出力ファイル
-p
: トリミング後のリード2の出力ファイル
最後にinputファイル2つをリード1、リード2の順に並べる本当は
-a
とか-g
とかでアダプター配列を指定する必要があるが、今回はしていないのでなにもトリミングされずに終了した。#出力 === Summary === Total read pairs processed: 7,243,729 Pairs written (passing filters): 7,243,729 (100.0%) Total basepairs processed: 1,448,745,800 bp Read 1: 724,372,900 bp Read 2: 724,372,900 bp Total written (filtered): 1,448,745,800 bp (100.0%) Read 1: 724,372,900 bp Read 2: 724,372,900 bp
-
#コマンド $mkdir QCed_fastq $cutadapt -q 30 -o ./QCed_fastq/SRR5204297_qc_1.fastq.gz -p ./QCed_fastq/SRR5204297_qc_2.fastq.gz ./trimmed_fastq/SRR5204297_trimmed_1.fastq.gz ./trimmed_fastq/SRR5204297_trimmed_2.fastq.gz
-q
: この数値以下のクオリティ(default: phred quality + 33)の3末端をトリミングする。
-o
: トリミング後のリード1の出力ファイル
-p
: トリミング後のリード2の出力ファイル
最後にinputファイル2つをリード1、リード2の順に並べる#出力 === Summary === Total read pairs processed: 7,243,729 Pairs written (passing filters): 7,243,729 (100.0%) Total basepairs processed: 1,448,745,800 bp Read 1: 724,372,900 bp Read 2: 724,372,900 bp Quality-trimmed: 160,946,979 bp (11.1%) Read 1: 40,464,114 bp Read 2: 120,482,865 bp Total written (filtered): 1,287,798,821 bp (88.9%) Read 1: 683,908,786 bp Read 2: 603,890,035 bp
-
-
-
→出力:
#コマンド /home/tools/bwa/bwa index /home/data/genomes/T2T-CHM13v2.0.fa.gz
-
GCF_009914755.1_T2T-CHM13v2.0_genomic.fna.gz.amb
-
GCF_009914755.1_T2T-CHM13v2.0_genomic.fna.gz.ann
-
GCF_009914755.1_T2T-CHM13v2.0_genomic.fna.gz.bwt
-
GCF_009914755.1_T2T-CHM13v2.0_genomic.fna.gz.pac
-
GCF_009914755.1_T2T-CHM13v2.0_genomic.fna.gz.sa
-
#コマンド $mkdir mapping $mkdir SRR5204297 $/home/tools/bwa/bwa mem -t 2 /home/data/genomes/T2T-CHM13v2.0.fa.gz /home/data/QCed_fastq/SRR5204297_qc_1.fastq.gz /home/data/QCed_fastq/SRR5204297_qc_2.fastq.gz | /home/tools/samtools-1.15.1/samtools sort -@ 2 -T /home/data/mapping/SRR5204297 > /home/data/mapping/SRR5204297_sorted.bam
→出力:
- SRR5204297_sorted.bam
-
#コマンド $/home/tools/samtools-1.15.1/samtools index /home/data/mapping/SRR5204297_sorted.bam
→出力:
- SRR5204297_sorted.bam.bai
-
-
-
-
単一のDNA断片に由来していると考えられる重複リードをタグづけする。
#作業用ディレクトリ作成 $ mkdir call_variant #実行 $/home/tools/gatk-4.5.0.0/gatk MarkDuplicates -I /home/data/mapping/SRR5204297_sorted.bam -O /home/data/call_variant/SRR5204297_markdup.bam -M /home/data/call_variant/SRR5204297_metrics.txt
→出力:
- SRR5204297_markdup.bam
- SRR5204297_metrics.txt
-
解析に必要なReadGroup tagをつける。
$/home/tools/gatk-4.5.0.0/gatk AddOrReplaceReadGroups -I /home/data/call_variant/SRR5204297_markdup.bam -O /home/data/call_variant/SRR5204297_plus_RG.bam --RGLB 1 --RGPL ILLUMINA --RGPU flowcell-barcode-lane --RGSM SRR5204297
-I
: インプットファイル
-O
: アウトプットファイル
--RGLB
: Read-Group library
--RGPL
: Read-Group platform (e.g. CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT, ONT, PACBIO)
--RGPU
: Read-Group platform unit (eg. Illuminaの場合はflowcell-barcode-lane, Soildの場合はslide)
--RGSM
: Read-Group sample name [参照]→ 出力: SRR5204297_plus_RG.bam
#index化 $samtools index /home/data/call_variant/SRR5204297_plus_RG.bam
→出力:
- SRR5204297_plus_RG.bam.bai
-
変異の抽出とマッピング
#index化 $/home/tools/gatk-4.5.0.0/gatk CreateSequenceDictionary -R /home/data/genomes/T2T-CHM13v2.0.fa.gz -O /home/data/genomes/T2T-CHM13v2.0.dict $samtools faidx /home/data/genomes/T2T-CHM13v2.0.fa.gz
→ 出力:
- T2T-CHM13v2.0.dict
- T2T-CHM13v2.0.fa.gz.fai
- T2T-CHM13v2.0.fa.gz.gzi
*fastaファイルはgzipじゃなくてbgzipで圧縮されていないとエラーがでるので注意
$/home/tools/gatk-4.5.0.0/gatk HaplotypeCaller -R /home/data/genomes/T2T-CHM13v2.0.fa.gz -I /home/data/call_variant/SRR5204297_plus_RG.bam -O /home/data/call_variant/SRR5204297.vcf.gz
→ 出力: SRR5204297.vcf.gz
-
-
-
あまり有名じゃないゲノム配列をreferenceに用いると、アノテーション用のデータベースが公開されていない場合があるので、そういったときは自分でデータベースをビルドする必要がある。
公開されているデータベースがあるかどうかは以下のコマンドで確認できる。
$snpEff databases | grep -i '使用したいゲノム名/種名'
例えば、
$snpEff databases | grep -i human
を実行すると、
GRCh38.p2.RefSeq Human genome GRCh38 using RefSeq transcripts http://downloads.sourceforge.net/project/snpeff/databases/v4_1/snpEff_v4_1_GRCh38.p2.RefSeq.zip PhumU1.22 Pediculus_humanus ENSEMBL_BFMPP_22_87 http://downloads.sourceforge.net/project/snpeff/databases/v4_1/snpEff_v4_1_ENSEMBL_BFMPP_22_87.zip PhumU2.27 Pediculus_humanus http://downloads.sourceforge.net/project/snpeff/databases/v4_1/snpEff_v4_1_PhumU2.27.zip
が出てきてT2Tは無さそうだなとわかる。逆にある場合は
snpEff download -v GRCh38.p2.RefSeq
でデータベースがダウンロードできるらしい。まず、referenceファイルたちが以下のような構造で存在していることを確認。
このときおそらく設定ファイルを書き換えない限りディレクトリ名やファイル名は固定されているので注意。(gffファイルは必ずgenes.gff
/genes.gff.gz
という名前でデータベース名(今回だとT2T-CHM13v2.0
)のディレクトリの中に存在。fastaファイルはデータベース名のディレクトリの外に別にgenomes
というディレクトリをつくり、その中に"データベース名".fa.gz
という名前で保存。)次に、configファイルの書き換えを行う。
$vim /home/tools/snpEff/snpEff.config
書き換える場所は以下の2点
(1) データディレクトリの変更(L17)data.dir = ./data/
から
data.dir = /home/data/
に変更(または、自分がfastaやgff, bamファイルを入れた先の名前)。
(2) ビルドするデータベース情報の追加(L315あたり)
# Homo sapiens (hg38) (UCSC) using knownGenes instead of RefSeq hg38kg.genome : Homo_sapiens (UCSC KnownGenes) hg38kg.reference : http://hgdownload.cse.ucsc.edu \ # Gene information from 'table/GTF' download , http://hgdownload.cse.ucsc.edu/goldenPath/hg38/bigZips/chromFa.tar.gz \ # Genome sequence , http://hgdownload.cse.ucsc.edu/goldenPath/hg38/bigZips/refMrna.fa.gz # mRna
こんな感じでデータベースの情報がたくさん載っているので、そこに新しく以下のような行を追加してビルドしたいゲノムの情報を書く。
#Genome assembly T2T-CHM13v2.0 T2T-CHM13v2.0.genome : Homo_sapiens T2T-CHM13v2.0.reference : https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_009914755.1/
ゲノムの種類によって他にも書き換えなければいけない部分があったりする(コドン表が違うなど)。(参照: http://pcingola.github.io/SnpEff/snpeff/build_db/)
ここまで終われば、あとは以下のコマンドでビルドできる。$cd /home/data/ $java -jar /home/tools/snpEff/snpEff.jar build -gff3 -v T2T-CHM13v2.0
-gff3
:ビルドに用いるファイルの種類。他にも-gff2
や-gtf22
などがあり指定しなくても自動的に検出してくれるらしい。
-v
: データベース名の指定
-
ビルドが成功するとデーターベース名
のディレクトリにsnpEffectPredictor.bin
というファイルが追加される。
-
解析に当てるメモリを
$cd /home/data $mkdir annotation $java -Xmx16g -jar /home/tools/snpEff/snpEff.jar -v T2T-CHM13v2.0 /home/data/call_variant/SRR5204297.vcf.gz > /home/data/annotation/SRR5204297_ann_.vcf.gz
-Xmx16g
で増やす。
-v
: データベース名の指定
input_sample_file > output_sample_file
gffファイルの修正についての補足説明
GFF/GTFからのDBのビルドにあたってSnpEFFが想定しているGFFのデータ表記と実際のGFFファイル中の表記が違うため、ダウンロードしたGFFファイルをそのまま使うと、以下のようにうまく遺伝子名が表記されていない部分が多く見られる。
<修正前のGFFを用いたアノテーションの結果>
SnpEffによるアノテーション結果はVCFのINFOの列に|Allele|Effect|Putative_impact|Gene Name|Gene ID|Feature type|Feature ID|Transcript biotype|Rank/total|HGVS.c|HGVS.p|cDNA_position|CDS_position|Protein_position|Distance to feature|Errors, warnings|
の順番で記載されるようになっている。 (参照:SnpEff-Input & output files)
つまり、|MODIFIER|
などと書いてある部分の隣が遺伝子名に当たるが、ところどころGene-gene-"〇〇"
のように、所々表記が不自然になっている。
また、この時DBビルドのログを確認すると、
WARNING_GENE_NOT_FOUND: Gene 'rna-NR_029639.1' (NC_060925.1:595721-595742) does not include 'rna-MIR200B-2' (NC_060925.1:595757-595778). Created new gene 'rna-NR_029639.1.2' (NC_060925.1:595757-595778). File '/home/data/T2T-CHM13v2.0/genes.gff' line 1738 'NC_060925.1 BestRefSeq miRNA 595757 595778 . + . ID=rna-MIR200B-2;Parent=rna-NR_029639.1;Dbxref=GeneID:406984,miRBase:MIMAT0000318,HGNC:HGNC:31579,MIM:612091,miRBase:MI0000342;gbkey=ncRNA;gene=MIR200B;product=hsa-miR-200b-3p'
WARNING: Cannot find gene 'Gene_gene-LOC100129381'. Created gene 'Gene_gene-LOC100129381' for transcript 'gene-LOC100129381'. File '/data/T2T-CHM13v2.0/genes.gff' line 7449 'NC_060925.1 Curated Genomic pseudogene 1170200 1171667ID=gene-LOC100129381;Dbxref=GeneID:100129381;Name=LOC100129381;description=ribosomal protein S7 pseudogene;gbkey=Gene;gene_name=LOC100129381;gene_biotype=pseudogene;pseudo=true'
のような警告文がたくさん出てきており、ファイル中にtranscriptは存在するのにそれに該当する遺伝子の情報がないために架空の遺伝子としてGene-gene-"〇〇"
が作られてしまっていることがわかる。
さらに、実際のGFFファイルとsnpEffで想定するGFFファイルのフォーマットを比較すると、ちょこちょこ表記に乖離があることがわかる。
<snpEffが想定するGFF/GTFファイルのフォーマット>
(Building databases: GTF / GFF details)
<実際のgffファイル(修正前、一部抜粋)>
︙
NC_060925.1 BestRefSeq gene 7506 138480 . - . ID=gene-LOC127239154;Dbxref=GeneID:127239154;Name=LOC127239154;description=uncharacterized LOC127239154;gbkey=Gene;gene=LOC127239154;gene_biotype=lncRNA;partial=true
NC_060925.1 BestRefSeq lnc_RNA 7506 138480 . - . ID=rna-NR_182074.1;Parent=gene-LOC127239154;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Name=NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1
NC_060925.1 BestRefSeq exon 138321 138480 . - . ID=exon-NR_182074.1-1;Parent=rna-NR_182074.1;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1
NC_060925.1 BestRefSeq exon 129906 130010 . - . ID=exon-NR_182074.1-2;Parent=rna-NR_182074.1;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1
NC_060925.1 BestRefSeq exon 109651 109660 . - . ID=exon-NR_182074.1-3;Parent=rna-NR_182074.1;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1
NC_060925.1 BestRefSeq exon 13445 13584 . - . ID=exon-NR_182074.1-4;Parent=rna-NR_182074.1;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1
NC_060925.1 BestRefSeq exon 7506 12982 . - . ID=exon-NR_182074.1-5;Parent=rna-NR_182074.1;Dbxref=GeneID:127239154,GenBank:NR_182074.1;Note=The RefSeq transcript has 72 substitutions%2C 9 non-frameshifting indels compared to this genomic sequence;exception=annotated by transcript or proteomic data;gbkey=ncRNA;gene=LOC127239154;inference=similar to RNA sequence (same species):RefSeq:NR_182074.1;product=uncharacterized LOC127239154%2C transcript variant 1;transcript_id=NR_182074.1
︙
NC_060925.1 Curated Genomic pseudogene 144134 146717 . - . ID=gene-SEPTIN14P14;Dbxref=GeneID:107105354,HGNC:HGNC:51701;Name=SEPTIN14P14;description=septin 14 pseudogene 14;gbkey=Gene;gene=SEPTIN14P14;gene_biotype=pseudogene;gene_synonym=SEPT14P14;pseudo=true
NC_060925.1 Curated Genomic exon 144134 146717 . - . ID=id-SEPTIN14P14;Parent=gene-SEPTIN14P14;Dbxref=GeneID:107105354,HGNC:HGNC:51701;gbkey=exon;gene=SEPTIN14P14;pseudo=true
NC_060925.1 Curated Genomic pseudogene 148562 152332 . + . ID=gene-CICP3;Dbxref=GeneID:100132630,HGNC:HGNC:37742;Name=CICP3;description=capicua transcriptional repressor pseudogene 3;gbkey=Gene;gene=CICP3;gene_biotype=pseudogene;pseudo=true
︙
NC_060925.1 RefSeqFE silencer 266278 266457 . . . ID=id-GeneID:129660039;Dbxref=GeneID:129660039;Note=fragment chr1:772694-772873 (GRCh37/hg19 assembly coordinates);experiment=EXISTENCE:reporter gene assay evidence [ECO:0000049][PMID:32094911];function=represses an EF-1alpha promoter that drives an FKBP-Casp9 reporter gene in an ReSE screen in K562 erythroleukemia cells {active_cell/tissue: K562};gbkey=regulatory;regulatory_class=silencer
NC_060925.1 RefSeqFE biological_region 266278 266457 . + . ID=id-GeneID:129660039-2;Dbxref=GeneID:129660039;Name=biological region;gbkey=Region;standard_name=ReSE screen-validated silencer GRCh37_chr1:772694-772873
︙
NC_060925.1 BestRefSeq gene 771235 771293 . - . ID=gene-MIR6808;Dbxref=GeneID:102466740,HGNC:HGNC:50046,miRBase:MI0022653;Name=MIR6808;description=microRNA 6808;gbkey=Gene;gene=MIR6808;gene_biotype=miRNA;gene_synonym=hsa-mir-6808
NC_060925.1 BestRefSeq primary_transcript 771235 771293 . - . ID=rna-NR_106866.1;Parent=gene-MIR6808;Dbxref=GeneID:102466740,GenBank:NR_106866.1,HGNC:HGNC:50046,miRBase:MI0022653;Name=NR_106866.1;gbkey=precursor_RNA;gene=MIR6808;product=microRNA 6808;transcript_id=NR_106866.1
NC_060925.1 BestRefSeq exon 771235 771293 . - . ID=exon-NR_106866.1-1;Parent=rna-NR_106866.1;Dbxref=GeneID:102466740,GenBank:NR_106866.1,HGNC:HGNC:50046,miRBase:MI0022653;gbkey=precursor_RNA;gene=MIR6808;product=microRNA 6808;transcript_id=NR_106866.1
NC_060925.1 BestRefSeq miRNA 771235 771255 . - . ID=rna-MIR6808;Parent=rna-NR_106866.1;Dbxref=GeneID:102466740,miRBase:MIMAT0027517,HGNC:HGNC:50046,miRBase:MI0022653;gbkey=ncRNA;gene=MIR6808;product=hsa-miR-6808-3p
NC_060925.1 BestRefSeq exon 771235 771255 . - . ID=exon-MIR6808-1;Parent=rna-MIR6808;Dbxref=GeneID:102466740,miRBase:MIMAT0027517,HGNC:HGNC:50046,miRBase:MI0022653;gbkey=ncRNA;gene=MIR6808;product=hsa-miR-6808-3p
NC_060925.1 BestRefSeq miRNA 771267 771288 . - . ID=rna-MIR6808-2;Parent=rna-NR_106866.1;Dbxref=GeneID:102466740,miRBase:MIMAT0027516,HGNC:HGNC:50046,miRBase:MI0022653;gbkey=ncRNA;gene=MIR6808;product=hsa-miR-6808-5p
NC_060925.1 BestRefSeq exon 771267 771288 . - . ID=exon-MIR6808-2-1;Parent=rna-MIR6808-2;Dbxref=GeneID:102466740,miRBase:MIMAT0027516,HGNC:HGNC:50046,miRBase:MI0022653;gbkey=ncRNA;gene=MIR6808;product=hsa-miR-6808-5p
︙
具体的な問題としては以下の通り。
例1: NCBIからダウンロードしたgffにはsnpEffでは想定されていない
lnc_RNA
という分類が存在する。これがtranscriptとして認識されないため、該当するexonとlncRNA,そして遺伝子(正確にはlncRNAに遺伝子風の名前をつけたもの)がうまくマッチせず、Gene-exon-"exon-id"
という遺伝子が勝手に作り出される。
→解決策: 分類名をlnc_RNA
からsnpEffのドキュメントに記載のあるncrna
(transcriptとして認識される)に変更
修正後: 遺伝子名が"lncRNA名(LOC〇〇)"
となる。
例2:
Pseudogene
がsnpEffではtranscript
として扱われるにも関わらず、gffファイルではgene
として扱っているため、対応するgene
が存在しない。これによってDBビルドでGene-gene-"Pseudogene_name"
という名前の遺伝子が勝手に作り出され、遺伝子名として表記される。
→解決策:gene-"Pseudogene_name"
というidを持つ遺伝子を新たにgffに追加する
修正後: 遺伝子名が"Pseudogene_name"
となる。
例3:
RefSeqFE
(NCBI RefSeq Functional Elements, DNAの非遺伝子部分の機能領域の分類.) によって分類されるbiological_region
、enhancer
などもsnpEffでは対応していなさそう。ただ、これらの領域はすごく短いこともあってそもそも変異がほぼ無いためどのように扱われるかは確認できなかった。
→解決策: 全てまとめてinter_cns
に分類する。
例4: snpEffでは存在していない
primary_transcript
という分類名が存在する。これはtranscript
として認識されないため、対応する遺伝子のtranscript名としてTranscript-gene-"transcript(RNA)"
が勝手に作られFeatureID
(transcriptのIDが載るカラム)として記載される。
→解決策:primary_transcript
をtranscript
に変更。
修正後:FeatureID
がrna-"rna-id"
となる。
例5:
miRNA
(transcript
として認識される)のParentとして遺伝子情報が記載されていない(transcript
の情報が記載されている)ことがあり、その場合対応する遺伝子が見つからずにGene-rna-"rna-id"
という遺伝子が勝手に作り出される。
→解決策: attributeにParent=gene-"直前にある遺伝子名"
を追加。
修正後: 遺伝子名が"miRNA名(MIR〇〇)"
となる。
これらはDBビルド前にそれぞれ解決策に書いてあるような形でgffファイルを修正しておく必要がある。
今回使用したファイルに関してはmodify_gff.py
を実行すれば問題なくアノテーションを行えるが、他のファイルの場合にはまた別の問題が発生する可能性もあるので、その場合DBビルドのログを見て必要な修正が何か確認する必要がある。
<修正したGFFを用いたアノテーションの結果>
謎表記が消えている。
さいごに
いかがでしたか。
Zennを見ている方々にバイオインフォマティクスをメインに活動されてる方はとても少ないかとは思いますが、Mさんが検証してくれた内容が誰かしらの役に立てばと思います。
※ T2TのAnnotationデータベースがSnpEff公式に見当たらなかったため、データベースビルドを行っていますが、SnpEff公式としては基本的に非推奨な手法です。Annotationデータベースが整備されている生物種の場合は、用意されたものを使いましょう。
Discussion