基因組發生重排而導致的,一般指長度1 kb 以上的基因組片段的拷貝數增加或者減少, 主要表現為亞顯微水平的重復或者缺失。因此稱為“微”缺失/重復變異。
在基因組水平上,CNV 不像單核苷酸多態性(SNPs)那樣高頻發生,但是它們對生物的表型、功能、適應性等有重要作用,且其產生的影響比 SNP 要更加強烈。CNVs 是驅動基因和基因組進化的重要機制。越來越多的研究表明,CNVs 通過各種分子機制(如基因劑量、基因融合)對家畜的孟德爾性狀和數量性狀的表型變異具有重要影響。如果CNV 存在于蛋白編碼區,則改變蛋白功能,如果在調控區,則改變基因表達水平。
基因組上非等位的兩個高度同源的DNA序列在減數分裂或者有絲分裂的過程中發生錯誤的配對,并發生序列交換,從而導致缺失、重復、倒位的出現。——就產生了拷貝數變異。
原文請看這兒https://zhuanlan.zhihu.com/p/166445484
CNV為基因組序列中長度為 50 bp - 5 Mb 的重復和缺失變異,在群體中,不同個體間重疊區域 CNV 的整合結果稱作 CNV 區域(CNV Region, CNVR)。當這些 CNVs 被發現在蛋白質編碼基因(CNV 基因)或 miRNA(CNV-miRNA)的基因組區域時,該遺傳變異就可能作用于分子調控機制,并影響著生物的表型多樣性和對疾病的易感性。
非等位同源重組(Non-allelic homologous recombination, NAHR)、非同源末端連接(Non-homologous end joining, NHEJ)、復制叉停滯與模板交換(Fork stalling and template switching, FoSTeS)、L1 介導的反轉錄轉座(L1-mediated retrotranspositio, LINE1)是基因組中形成重排的主要機制,同時也是大部分 CNV 產生的原因。
由于非同源染色體之間的兩個相似序列區域容易發生重組,所以 NAHR常發生在減數分裂和有絲分裂過程。姐妹染色單體之間發生交叉的過程可能增加 DNA片段或丟失另一個 DNA 片段,從而導致染色體片段的重復、缺失和倒位。
NHEJ 機制是細胞用來修復由電離輻射或活性氧物質引起的 DNA 雙鏈斷裂(Double-strand breaks, DSBs)的生理形式。
FoSTeS 是一種基于 DNA 復制的機制,可以解釋復雜的基因組重排和 CNV。
L1 轉座通過逆轉錄和整合方式引發 CNV 的產生。基因組中倒位和易位等組合事件的鑒別在技術上仍然具有挑戰性,要完全鑒別其變異類型和成因的成本也很高,相對而言,CNV 更容易被鑒別,且可以為分析復雜變異提供強有力的遺傳學證據。
檢測手段:
芯片法和測序法
芯片法主要包括比較基因組雜交芯片(Array comparative genomic hybridization, a CGH)和 SNP 芯片(Singlenucleotide polymorphism arrays)。
DNA 測序法主要包括全基因組測序(Whole genome sequnecing, WGS)和單分子測序。
Paired-end mapping(PEM)方法、Split read(SR)方法、Read depth(RD)方法和 De novo 組裝是檢測基因組拷貝數變異的主要策略。
RD 方法通過利用短讀取序列數據與參考基因組進行比對,標準化每個區域的讀取深度,其中低或零深度的區域被解釋為缺失,深度增加的區域被解釋為拷貝數的重復或擴增。RD 方法相較于 PEM 和 SR 方法有著較高的檢出率和準確性。
>現在基于二代測序數據分析 CNV的研究還存在著樣本少、測序深度較低、選用參考基因組質量差異大等不足之處,這些因素均會對 CNV 檢測結果產生不利影響
本文介紹的方法分別有:CNVCaller、Matchclips2、Delly以及CNVnator、LUMPY
1、CNVCaller
CNVCaller軟件是由西北農林科技大學姜雨老師團隊開發的一款專門用于分析拷貝數變異的軟件(CNVcaller: highly efficient and widely applicable software for detecting copy number variations in large populations),該軟件的假陽性率相較于其他軟件更低、運算速度更高,是一款本人強烈推薦的軟件。
詳情可以參考姜雨老師團隊主導開發的數據庫omicsDB (nwsuaf.edu.cn)
安裝參考:JiangYuLab/CNVcaller (github.com)
使用前準備:
在Individual.Process.sh和CNV.Discovery.sh腳本文件中修改CNVcaller 的安裝路徑(該軟件的安裝路徑),默認是當前工作目錄
image.png
即:export CNVcaller=/home/sll/miniconda3/CNVcaller‘
注意:該軟件在使用時每一步的輸入以及輸出文件都用絕對路徑
1)在當前目錄創建referenceDB.windowsize文件,構建參考基因組數據庫
perl /home/sll/miniconda3/CNVcaller/bin/CNVReferenceDB.pl /home/sll/genome-cattle/ARS-UCD1.2/GCF_002263795.1_ARS-UCD1.2_genomic.fna -w 800
-w the window size (bp) for all samples [default=800] 滑動窗口大小, >10x使用400-1000,<10x使用1000-2000
-l the lower limit of GC content [default=0.2] 窗口可能含有的最低GC比例,低于該比例的窗口不會進入后續計算。
-u the upper limit of GC content [default=0.7] 窗口可能含有的最高GC比例
-g the upper limit of gap content [default=0.5] 窗口可能含有的最高gap比例
作用:將參考基因組按用戶指定大小(-w)的滑動窗口及一定的步長(內置是滑動窗口大小的一半)分別統計基因組上每個窗口的 GC、repeat 及 gap 含量。
生成一個“referenceDB.800”的文件。
第一列,染色體名稱
第二列,窗口在對應染色體上的序號
第三列,窗口實際起始位置
第四列,GC 含量
第五列,重復序列含量
第六列,gap 比例
2)計算每個窗口的絕對拷貝數
在這里有個問題,我們只能使用他們提供的800bp窗口的dup文件來做,而他們提供的生成這個文件的腳本中,blasr軟件中的sawriter安裝不了,問了軟件開發作者,也說這個軟件的安裝困難。因此,目前對我來說自己生成不了(已解決,看后面的Dup文件的生成)。
bash Individual.Process.sh -b /home/sll/2022-DNA-cattle/CNV/YLHN1.sorted.addhead.markdup.bam -h YLHN1 -d Btau5.0.1_800_link -s none
-h BAM 文件的標頭信息,需要與 BAM 文件中 SM 標簽保持一致(用戶可以通過 samtools view -H BAM 查看)。
-d 校正所需要的dup文件。查看物種dup文件[JiangYuLab/CNVcaller (github.com)](https://github.com/JiangYuLab/CNVcaller/tree/master#generate-your-own-duplicated-window-record-file)。
-s 性染色體名稱。CNVcaller 會根據給定的性染色體所有窗口讀段數的中位數與所有常染色體窗口讀段數的中位數比例來確定該個體的性別。
運行結束后,三個默認文件夾(RD_raw、RD_absolute、RD_normalized)將會在當前目錄下被創建,分別包含了每個樣本的全基因組所有窗口原始讀段數、通過 link 文件合并后的讀段數,以及每個樣本經 GC 測序偏斜校正和標準化后的絕對拷貝數。標準化的文件名顯示了該個體基因組所有窗口的讀段數平均值、標準差與性別(1 為 XX 或 ZZ,2 為 XY 或ZW),其中平均值和標準差可用于樣本的質控。絕對拷貝數為 1 時,表示為正常的拷貝數,即正常二倍體;0.5 表示雜合缺失;0 表示純合缺失;1.5 表示雜合重復;2 表示純合重復;絕對拷貝數超過 2 表示復雜的多次重復。
3)拷貝數變異區域的確定(多樣本合并,單個樣本會報錯)
通過綜合考慮絕對拷貝數的分布、變異的頻率及相鄰窗口的顯著相關性來初步確定 CNVR 的邊界(primaryCNVR)。最后,將相鄰且拷貝數在群體中分布顯著相關的 CNVR進一步合并得到最終的拷貝數變異檢測結果(mergedCNVR)。
cd RD_normalized
記得把第一步生成的referenceDB.800放進去,輸入文件用絕對路徑!!!
list 上一步輸出的RD_normalized文件夾中的文件,一行一個,多個樣本,需包含絕對路徑。
touch exclude_list
exclude_list 為空文件,提前創建
perl版本高于5.10.1時,修改
CNVcaller/bin/2.2.CNVRRedundancy.pl文件中的第48行
die "unexpected sample number!\n" unless length(@tmp_start_array) == length(@tmp);
為die "unexpected sample number!\n" unless length(scalar(@tmp_start_array)) == length(scalar(@tmp));
bash /home/sll/miniconda3/CNVcaller/CNV.Discovery.sh -l /home/sll/2022-DNA-cattle/CNV/RD_normalized/list.txt -e /home/sll/2022-DNA-cattle/CNV/RD_normalized/exclude_list -f 0.1 -h 1 -r 0.1 -p primaryCNVR -m mergeCNVR
-l 個體經絕對拷貝數校正后的結果文件列表
-e 該列表中的樣本不被用于 CNVR 的檢測,但結果文件會記錄這些樣本的絕對拷貝數。exclude_list 為空文件代表所有個體將被用于CNVR檢測。
-f 當一個窗口有超過該頻率的個體絕對拷貝數與正常拷貝(“1”)顯著差異(雜合刪除或者
雜合復制)時,就定義該窗口為候選拷貝數變異窗口。
-h 當一個窗口有超過該頻數的個體絕對拷貝數與正常拷貝(“1”)顯著差異(純合刪除或者
純合復制)時,就定義該窗口為候選拷貝數變異窗口。
##只需要滿足-f 與-h 中的任意一個即可
-r 在定義 CNVR 時,如果相鄰(沒有 overlap)候選拷貝數變異窗口的絕對拷貝數的相關系數高于該值將被合并。
4)基因型判定
利用混合高斯模型將每個樣本的拷貝數歸入不同的基因型分類,并以 VCF 格式輸出,以方便后續通過全基因組關聯分析挖掘與重要經濟性狀有關的拷貝數變異。
python /home/sll/miniconda3/CNVcaller/Genotype.py --cnvfile mergeCNVR --outprefix genotypeCNVR --nproc 24
--cnvfile CNVR 結果文件,包含全部樣本的拷貝數信息,上一步的輸出結 果(mergeCNVR)。
--outprefix 輸出結果文件的前綴,默認會輸出兩個文件,其中,后綴為 tsv 的文件記錄了分類結果的基本統計信息,方便后續過濾低質量的 CNVR;后綴為 vcf 的文件為常規 VCF 格式。
--nproc 程序使用的進程數,默認為單進程,使用此參數可顯著減少程序運行時間,但會增加內存消耗。
可能會報錯
image.png
修改Genotype.py腳本中的harabaz成harabasz即可。
sed -i "s/harabaz/harabasz/g" /home/sll/miniconda3/CNVcaller/Genotype.py
結果文件
genotypeCNVR.vcf文件內容
CHROM: 所在染色體
POS:CNVR的起始坐標位置
ID:CNVR的編號,格式為:序列坐標:起始位置-終止位置
ALT: 變異類型,包括CN0、CN1、CN2和CNH,分別代表0個拷貝、1個拷貝、2個拷貝和超過2個的拷貝
INFO:包含CNVR的終止位置(END),CNVR的變異類型(SVTYPE),基因分型的對數自然值(LOGLIKELIHOOD)和輪廓系數(SILHOUETTESCORE)
FORMAT:每個個體基因分型結果的輸出格式,GT和GP分別代表個體的基因分型結果和絕對拷貝數。
image.png
Dup文件的創建
blasr
軟件安裝建議從github
下載壓縮文件上傳
sawriter
是目錄alignment/bin/
下的sawritermc
創建自己所需要的dup文件:
- Split genome into short kmer sequences
python 0.1.Kmer_Generate.py [OPTIONS] FAFILE WINSIZE OUTFILE
<FAFILE> Reference sequence in FASTA format
<WINSIZE> The size of the window to use for CNV calling
<OUTFILE> Output kmer file in FASTA format
python /home/sll/miniconda3/CNVcaller/bin/0.1.Kmer_Generate.py /home/sll/genome-cattle/ARS-UCD1.2/GCF_002263795.1_ARS-UCD1.2_genomic.fna 400 kmer.fa
- Align the kmer FASTA (from step 1) to reference genome using blasr.
sawriter 創建sa索引文件
/home/sll/software/blasr-master/alignment/bin/sawritermc GCF_002263795.1_ARS-UCD1.2_genomic.fna.sa GCF_002263795.1_ARS-UCD1.2_genomic.fna
blasr 生成比對后的kmer.aln文件
blasr kmer.fa GCF_002263795.1_ARS-UCD1.2_genomic.fna --sa GCF_002263795.1_ARS-UCD1.2_genomic.fna.sa \
--out kmer.aln -m 5 \
--noSplitSubreads --minMatch 15 --maxMatch 20 \
--advanceHalf --advanceExactMatches 10 --fastMaxInterval \
--fastSDP --aggressiveIntervalCut --bestn 10
- Generate duplicated window record file.
python 0.2.Kmer_Link.py [OPTIONS] BLASR WINSIZE OUTFILE
<BLASR> blasr results (-m 5 format)
<WINSIZE> The size of the window to use for CNV calling
<OUTFILE> Output genome duplicated window record file
python /home/sll/miniconda3/CNVcaller/bin/0.2.Kmer_Link.py kmer.aln 1000 Bos_ARS1.2_window.link
shell循環(敬請膜拜大佬,也就是我,哈哈哈):
touch CNVCaller.sh
# 對基因組創建窗口文件(以后直接復制到操作目錄下用即可)
perl /home/sll/miniconda3/CNVcaller/bin/CNVReferenceDB.pl /home/sll/genome-cattle/ARS-UCD1.2/GCF_002263795.1_ARS-UCD1.2_genomic.fna -w 800
# 計算每個窗口的絕對拷貝數
ls *bam|cut -d"." -f 1 | sort -u | while read id; do bash /home/sll/miniconda3/CNVcaller/Individual.Process.sh -b `pwd`/${id}.sorted.addhead.markdup.bam -h ${id} -d /home/sll/miniconda3/CNVcaller/Btau5.0.1_800_link -s none; done
# 將referenceDB.800文件復制到RD_normalized目錄下
cp referenceDB.800 RD_normalized
# 進入RD_normalized目錄
cd RD_normalized
# 將RD_normalized目錄下新生成的sex_1結尾的文件名,以絕對路徑的形式寫入list.txt中
ls -R `pwd`/*sex_1 > list.txt
# 新建exclude_list文件
touch exclude_list
# 拷貝數變異區域的確定
bash /home/sll/miniconda3/CNVcaller/CNV.Discovery.sh -l `pwd`/list.txt -e `pwd`/exclude_list -f 0.1 -h 1 -r 0.1 -p primaryCNVR -m mergeCNVR
# 基因型判定
python /home/sll/miniconda3/CNVcaller/Genotype.py --cnvfile mergeCNVR --outprefix genotypeCNVR --nproc 8
nohup bash CNVCaller.sh &
2、Matchclips2(劉正喜師姐的腳本,還得是師姐)
基于long soft clips的CNV斷點計算方法
1)每個樣品分別進行matchclips2計算:
/home/software/matchclips2/matchclips -t 4 -f /home/sll/genome-cattle/ARS-UCD1.2/GCF_002263795.1_ARS-UCD1.2_genomic.fna -b BC-448.sorted.addhead.markdup.bam -o CNV.BC-448.txt
結果文件:
1、CHROM
2、起始位置
3、中止位置
4、DEL或DUP
For DEL, the 5' break point is BEGIN and 3' is END,
For DUP, the 5' break point is END and 3' is BEGIN.、
5、區域長度:3' break point - 5' break point
6、UN,堿基數量This number tells how many bases are repeated at the two break points
7、RD:n1;n2;n3:s
2)合并結果:
/home/software/matchclips2/cnvtable -L 10000 -cnvf cnvf.txt -O 0.5 -o overlap.txt
cnvf.txt為含有上一步結果文件名稱的txt文件,一列一個
-cnv STR file names separated by white spaces
-i STR IDs for the files separated by white spaces
-cnvf STR a file with list of file names and(or) ids
-l INT minimum length to include, INT=3
-L INT maximum length to include, INT=10000000
-t STR only process STR type of CNVs
-R STR subset cnvs in region STR
-chr 1-22XY are treated as chr[1-22XY]
-O FLOAT minimum reciprocal overlap ratio [0.0, 1.0], FLOAT=0.5
-o STR outputfile, STR=STDOUT
shell循環
touch matchclips2.sh
##運行
ls *bam|cut -d"." -f 1 | sort -u | while read id; do /home/software/matchclips2/matchclips -t 4 -f /home/sll/genome-cattle/ARS-UCD1.2/GCF_002263795.1_ARS-UCD1.2_genomic.fna -b ${id}.sorted.addhead.markdup.bam -o ${id}.cnv; done
#將生成文件名列到一個文件中
find -name '*cnv' -exec basename {} \; > cnvf.txt
#進行合并
/home/software/matchclips2/cnvtable -L 10000 -cnvf cnvf.txt -O 0.5 -o overlap.txt
nohup bash matchclips2.sh &
3、Delly
Delly v0.7.8 可以一次性call 所有類型的SVs;低版本的需要通過-t指定SV類型
輸入文件
1、bam文件:Bam files need to be sorted, indexed and ideally duplicate marked. If multiple libraries are present for a single sample these need to be merged in a single bam file with unique ReadGroup tags.
2、.excl: a file include information of telomere and centromere regions and also all unplaced contigs, those regions will be removed from calling.
有群體時,建議將所有個體的.bcf文件合并后,再進行genotyping。
運行:詳情參考https://github.com/yhwu/matchclips2
1)call sv
delly call -g /home/sll/genome-cattle/ARS-UCD1.2/GCF_002263795.1_ARS-UCD1.2_genomic.fna BC-448.sorted.addhead.markdup.bam > BC-448.cnv.vcf
2)bcf轉vcf格式
bcftools view $i.target.bcf >$i.target.vcf
3)Merge SV sites into a unified site list(合并)
delly merge -o sites.bcf s1.bcf s2.bcf ... sN.bcf
4)Genotype this merged SV site list across all samples. This can be run in parallel for each sample(基因分型,每個樣本都做)
delly call -g $DB/target-ref.fa -v sites.bcf -o s1.geno.bcf s1.bam
5)Merge all genotyped samples to get a single VCF/BCF using bcftools merge
bcftools merge -m id -O b -o merged.bcf s1.geno.bcf s2.geno.bcf ... sN.geno.bcf
插入(Insertion, INS)
缺失(Deletion, DEL)
反轉(Inversion, INV)
染色體內部易位(Intra-chromosomal Translocation, ITX)
染色體間易位(Inter-chromosomal Translocation, CTX)
4、CNVnator(拉跨)
檢測出的片段長度很長,假陽性結果率較低,還算比較準確的一個軟件
1)提取mapping信息
home/software/CNVnator_v0.4.1/src/cnvnator -root BC-448.root -tree BC-448.sorted.addhead.markdup.bam -unique
提取比對后的reads,構建樹,如果程序之前運行失敗,已經生成了一個root文件,在下次重新運行時一定要刪除該root文件,如果不刪除,新的分析結果會追加到錯誤的root文件中,影響后續分析。另外,可以添加 -chrom 函數指定染色體 如 -chrom 1 2 代表選擇1,2號染色體。
2)生成質量分布圖HISTOGRAM
/home/software/CNVnator_v0.4.1/src/cnvnator -root BC-448.root -d -his 100
# 100指的是bin size,可以通過-eval參數進行篩選,也可以根據經驗值進行確定,一般測序深度20-30x選取bin size大小100,2-3x選取500,100x選取30。
# -d指定目錄,內部存放給染色體的fasta文件,該參數指針對報錯信息顯示不能解析基因組文件,此時需要指定參考基因組的位置,且各染色體需要拆分成單獨的fasta文件(目錄下有其文件也可以,只要有所有染色體的序列就好,軟件會自動識別)
3)生成統計結果
/home/software/CNVnator_v0.4.1/src/cnvnator -root BC-448.root -stat 100
4)RD(reads depth)信息分割partipition
/home/software/CNVnator_v0.4.1/src/cnvnator -root BC-448.root -partition 100
##cnvnator在進行變異檢測時,以提供的bin size對整個基因組進行切割,之后按照RD(read-depth)為基準進行cnv的檢測。
注意:從第二步開始設置的bin size就不能變了
5)變異檢出
/home/software/CNVnator_v0.4.1/src/cnvnator -root BC-448.root -call 100 > BC-448-cnvout.txt
運行之后輸出結果如下:
#第一列變異類型
#第二列位點信息
#第三列CNV大小
#第四列為標準化參數normalized_RD
#第5-8列為e-value值,其中第五列越小,說明結果越準確
#第九列q0質量值
6)轉為vcf格式
/home/software/CNVnator_v0.4.1/src/cnvnator2VCF.pl cnv.call.txt > cnv.vcf
5、LUMPY(挺牛的一個軟件)
每種算法都要其優勢和不足之處,綜合運用多種策略有助于提高檢測的靈敏度,lumpy就是這樣一款軟件,集合了read-pair,split-read,read-depth, 等多種策略來預測CNV
lumpy, svtools, svtyper安裝包在/home/sll/miniconda3/envs/python2.7/bin下
LUMPY的安裝使用python2.7的環境
同理,svtools和svtyper也使用python2.7的環境
安裝:conda install -c bioconda lumpy-sv
1. mapping
推薦采用bwa-mem算法將雙端序列比對到參考基因組上,為了加快運行速度,這里用samblaster軟件進行markduplicate, 用法如下
samblaster --excludeDups \
--addMateTags \
--maxSplitCount 2 \
--minNonOverlap 20 \
samtools view -Sb - > sample.bam
2. extract discordant paired-end alignments
鏈接:http://www.lxweimin.com/p/1844870f3b25
discordant reads指的是R1和R2端比對之間的距離超過了期望的插入片段長度或者比對到了不同鏈的reads,
samtools view -b -F 1294 \
sample.bam \
> sample.discordants.unsorted.bam
-F 1294用來提取不一致的聯配,用samtools flags 1294可以發現1294表示"PROPER_PAIR,UNMAP,MUNMAP,SECONDARY,DUP",帶上-F意味著以上這些標記在我們篩選的聯配記錄中都不會出現,也就意味著篩選的記錄要符合下面要求
不能是PROPER_PAIR: 就是比對工具認為都正確比對到基因組上,在同一條染色體,在同一條鏈的情況,常見的就是83,147和99,163
不能是UNMAP和MUNMAP,也就是配對的短讀至少有一個能夠比對到參考基因組上
也不能是SECONDARY, 也就是他必須是主要聯配
光學重復,DUP, 就更加不能要了
3. extract split-reads alignments
split-reads指的是覆蓋了斷裂點的單端reads,這些reads根據斷裂點拆分成subreads后可以正確的比多到參考基因組上。在軟件的安裝目錄,自帶了一個名為extractSplitReads_BwaMem的腳本,用于提取split-reads, 用法如下
samtools view -h sample.bam \
| scripts/extractSplitReads_BwaMem -i stdin \
| samtools view -Sb - \
> sample.splitters.unsorted.bam
4. sort bams
軟件要求輸入的bam文件必須是排序之后的文件,所以對提取的兩個子bam進行排序,用法如下
samtools sort \
sample.discordants.unsorted.bam \
sample.discordants
samtools sort \
sample.splitters.unsorted.bam \
sample.splitters
5. run lumpy
lumpyexpress是lumpy的一個封裝腳本,使用起來更加方便,基本用法如下
lumpyexpress \
-B sample.bam \
-S sample.splitters.bam \
-D sample.discordants.bam \
-o sample.vcf
6. genotype
檢測到的CNV, 可以用svtyper這個軟件預測在樣本中的分型結果,用法如下
svtyper軟件需要另外安裝
conda install -c bioconda svtyper
svtyper \
-B sample.bam \
-S sample.splitters.bam \
-i sample.vcf
> sample.gt.vcf
選擇清除與環境適應性位點挖掘--Vst分析
Vst分析是類似于Fst的一個指標,用來衡量群體間每個CNVR差異大小的統計量,計算方法為Vst=(Vt-Vs)/Vt,Vt表示所有樣本該區域拷貝數大小的方差,Vs表示兩個群體各自的方差根據各自群體大小加權之后的值。Vst的值介于0-1之間,值越大表示群體間該區域拷貝數變異差異越大,反之則越小。
EXCEL計算.png