复习linux基础指令及python处理基因组数据

原本应该是学习的时候记录的,但是各种原因耽误了,只能想起来了就记一点

比对

可以使⽤用bowtie2软件⾃自带的测试数据⽣生成sam/bam⽂文件,代码如下:

mkdir -p ~/biosoft
cd ~/biosoft
# 针对不不同系统下载不不同的版本
# 优先下载最新版
wget https://sourceforge.net/projects/bowtie- bio/files/bowtie2/2.3.4.3/bowtie2-2.3.4.3-linux-x86_64.zip
unzip bowtie2-2.3.4.3-linux-x86_64.zip
cd ~/biosoft/bowtie2-2.3.4.3-linux-x86_64/example/reads
../../bowtie2 -x ../index/lambda_virus -1 reads_1.fq -2 reads_2.fq > tmp.sam # samtools view -bS tmp.sam >tmp.bam

也可以用conda 直接安装bowtie2和samtools软件。

(base) ChengLiangPing@VM-0-8-ubuntu:~$ ls
11-17  Miniconda2-latest-Linux-x86_64.sh  biosoft  miniconda2  readme.txt
(base) ChengLiangPing@VM-0-8-ubuntu:~$ cd ~/biosoft/
(base) ChengLiangPing@VM-0-8-ubuntu:~/biosoft$ ls
Miniconda2-latest-Linux-x86_64.sh
(base) ChengLiangPing@VM-0-8-ubuntu:~/biosoft$ conda install -y bowtie2 samtoolsCollecting package metadata (current_repodata.json): done
Solving environment: done

找变异位点

mkdir -p ~/biosoft
cd ~/biosoft
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-
latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
source ~/.bashrc
conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda
conda config --set show_channel_urls yes
conda  create -y -n test
conda activate test
conda install -y samtools bcftools
wget https://sourceforge.net/projects/bowtie-
bio/files/bowtie2/2.3.4.3/bowtie2-2.3.4.3-linux-x86_64.zip
unzip bowtie2-2.3.4.3-linux-x86_64.zip
cd ~/biosoft/bowtie2-2.3.4.3-linux-x86_64/example/reads
../../bowtie2 -x ../index/lambda_virus -1 reads_1.fq -2 reads_2.fq | samtools
sort -@ 5 -o tmp.bam -
bcftools mpileup -f ../reference/lambda_virus.fa tmp.bam |bcftools call -vm >
tmp.vcf

然后把这些⽂文件,全部载⼊入IGV 进⾏行行可视化。

作业:完成⼀一个SNP-calling模拟项⽬

首先下载X,Y染⾊色体的fasta序列列,在UCSC上⾯面下载即可。
然后把X染⾊色体构建bwa的索引 接着模拟⼀一个Y染⾊色体的测序数据,模拟的程序很简单,模拟Y染⾊色体的测序⽚片段(PE100, insert400)
然后把模拟测序数据⽐比对到X染⾊色体的参考,统计⼀一下比对结果。 最后对比对成功的bam⽂件进行找变异位点。
代码如下:

## 源代码⽅方式安装 bwa-0.7.15
## conda安装samtools
cd tmp/chrX_Y/hg19/
wget http://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes/chrX.fa.gz
wget http://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes/chrY.fa.gz
gunzip chrX.fa.gz
gunzip chrY.fa.gz
 
~/biosoft/bwa/bwa-0.7.15/bwa index chrX.fa
wget https://raw.githubusercontent.com/jmzeng1314/my-perl/master/2.chrX- chrY/simulate.pl
perl simulate.pl chrY.fa ## 这个perl脚本并不不需要大家理解。
~/biosoft/bwa/bwa-0.7.15/bwa mem -t 5 -M chrX.fa read*.fa >read.sam
samtools view -bS read.sam >read.bam
samtools flagstat read.bam
samtools sort -@ 5 -o read.sorted.bam read.bam
samtools view -h -F4 -q 5 read.sorted.bam |samtools view -bS|samtools rmdup - read.filter.rmdup.bam
samtools index read.filter.rmdup.bam
# 后面bam-->vcf代码⾃己尝试。
# samtools mpileup -ugf ~/tmp/chrX_Y/hg19/chrX.fa read.filter.rmdup.bam |bcftools call -vmO z -o read.bcftools.vcf.gz
## 把fa/bam/vcf 载⼊入到 IGV 进⾏行行可视化,截图其中⼀一个变异位点
## 参考 http://www.biotrainee.com/thread-696-1-1.html

一个RNA项⽬分析流程

通常,RNA项⽬指的是转录组测序,其研究对象为特定细胞群体在某一功能状态下所能转录出来的所有 RNA 的总和,包括 mRNA 和非编码 RNA 。通过转录组测序,能够全⾯面获得物种特定组织或器官的转录本信息,从⽽进行转录本结构研究、变异研究、基因表达⽔平研究以及全新转录本发现等研究。

其中,基因表达⽔平的探究是转录组领域最热⻔的方向,利用转录组数据来识别转录本和表达定量,是转录组数据的核⼼作⽤。由于这个作用,他可以不不依赖其他组学信息,单独成为一个产品项⽬:RNA-seq 测序。所以很多时候转录组测序会与RNA-seq混为一谈。
现在RNA-seq数据使⽤广泛,但是没有一套流程可以解决所有的问题。

RNA-seq分析中的重要的步骤包括:实验设计,质控,read比对,表达定量,可视化,差异表达,识别可变剪切,功能注释,融合基因检测,eQTL定位等。

来自于 R处理 mRNA-seq数据教程:
http://biocluster.ucr.edu/~rkaundal/workshops/R_mar2016/RNAseq.html

关于数据格式的信息,可以参考生信技能树的数据格式专题,也可以参考UCSC的介绍:http://genome.ucsc.edu/FAQ/FAQformat.html

建议:请放弃GTF文件格式,改用GenePred格式处理转录组注释! http://www.biotrainee.com/thread-928-1-1.html

理解bw,bigwig文件是简化的bam文件,http://www.biotrainee.com/thread-797-1-1.html 参考这个【直播】我的基因组 35:bam格式转化为bw格式看测序深度分布。

bedtools用法大全,它可以替代比较差的生信工程师:
http://www.biotrainee.com/thread-153-1-1.html

  • shell中的扩展(Expansions) https://opengers.github.io/linux/linux-shell-brace-parameter-command-pathname-expansion/
  • bash脚本的参数扩展 (parameter expansion) :https://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html
  • shell通配符(wildcard): https://cloud.tencent.com/developer/article/1114732
  • type命令:https://man.linuxde.net/type
  • 字符串操作:https://my.oschina.net/aiguozhe/blog/41557

shell扩展有以下几种,并按以下顺序处理,当然如果没找到匹配的扩展格式,那就不处理

brace expansion 花括号({})扩展
tilde expansion ~字符扩展
parameter and variable expansion 参数和变量扩展
arithmetic expansion 算术扩展
command substitution 命令替换
process substitution 过程替换
word splitting
Filename Expansion 通配符扩展

解读长指令:

less -S example.gtf  | awk -v FS="\t" '$3 == "gene"{print $9}' |head -n 5
less -S example.gtf  | awk -v FS="\t" '$3 == "gene"{split($9, x,";");print x[1]}' |head -n 5
less -S example.gtf  | awk -v FS="\t" '$3 == "gene"{split($9, x,";");split(x[1],y," ");print y[2]}' |head -n 5
less -S example.gtf  | awk -v FS="\t" '$3 == "gene"{split($9, x,";");split(x[1],y," ");gsub("\"","",name);print name}' |head -n 5
less -S example.gtf  | awk -v FS="\t" '$3 == "gene"{split($9, x,";");split(x[1],y," ");name=y[2];gsub("\"","",name);print name}' |head -n 5

使用hisat2来⽐对RNA-seq数据

hisat2和bowtie2都是约翰霍普金斯医学院的科研⼈员开发的,所以用法类似。
⽐如公众号推的: 玩转RNA-seq数据也可以不不需要linux ?https://mp.weixin.qq.com/s/HzLbrBuEwR0cKwPZj-1Fkw 就介绍过一个数据集:
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE109480

下载配套参考基因组的gtf⽂文件

⼈或者小鼠,推荐使用gencode数据库 https://www.gencodegenes.org/ ,其它常见物种,推荐使用 ENSEMBL :https://asia.ensembl.org/info/data/ftp/index.html

使用featurecounts定量

根据正确的gtf⽂件对我们前面步骤的比对得到的bam文件进行计数!
常⽤的基于⽐对的基因定量软件:Htseq-count,bedtools mutilcov,featureCount,因为个人习惯, 讲师这⾥着重讲解 featureCount的用法。
featureCount是subread套件的⼀个模块,最⼤的优点就是速度⾮常快,使用全部overlap的reads计 数,灵活考虑多比对的reads的计数。 subread 软件官⽹网:http://subread.sourceforge.net/ http://bioi nf.wehi.edu.au/subread-package/SubreadUsersGuide.pdf

featurecounts软件的主要参数:

-a 输⼊入GTF/GFF基因组注释⽂文件
-p 这个参数是针对paired-end数据
-F 指定-a注释⽂文件的格式,默认是GTF
-g 从注释⽂文件中提取Meta-features信息⽤用于read count,默认是gene_id -t 跟-g⼀一样的意思, 其是默认将exon作为⼀一个feature
-o 输出⽂文件
-T 多线程数

featurecounts软件运行通常设置: -T 5 -p -t exon -g gene_id -a hg19.gtf -o out.txt input.bam

GTF的产生和流行有其历史的原因。但是从技术角度来讲,这个文件格式是个非常差劲的格式。

GTF格式非常冗余。以人类转录组为例,Gencode V22的GTF文件为1.2G,压缩之后只有40M。大家知道压缩软件的压缩比是和软件的冗余程度。很少有文件能够压缩到1/30的大小。可见GTF格式多么冗余。GTF格式(及其早期版本GFF等)有很好的替代格式。从信息量上来讲:GTF 等价于 GenePred (Bed12) + Gene_Anno_table。GenePred是Jimmy Kent创建UCSC genome browser的时候建立的文件格式。UCSC的文件格式定义是非常smart的,包括之后我可能会讲到的2bit,bigwig格式。

GTF vs GenePred:
从文件大小上来看,压缩前:GTF(1.2G) >> Genepred(23M) + Gene_Anno_table (2.8M)。压缩后:GTF(40M) >> GenePred(7.8M) +Gene_Anno_table (580K)
从可读性来讲,GTF是以gene interval 为单位(行),每行可以是gene,transcript,exon,intron,utr等各种信息,看起来什么都在里面,很全面,其实可读性非常差,而且容易产生各种错误。GenePred格式是以transcript为单位,每行就是一个transcript,简洁直观。
从程序处理的角度来讲:以GTF文件作为输入的程序,如果换成以GenePred格式为输入,编程的难度会降低一个数量级,运算时间会快很多,代码的可读性强很多。

GTF 转换成GenePred:

gtfToGenePred -genePredExt -ignoreGroupsWithoutExons -geneNameAsName2 test.gtf test.gpd

Gene_Anno_table: 其实就是把GTF的所有transcript行的第9列转换变成一个表格。

应用实例:
生信编程直播第一题:人类基因组的外显子区域到底有多长?
1. 取出所有gene的exon。
2. 对exon进行排序。
3. 对有overlap的exon进行merge。
4. 计算merge后的exon长度。
代码如下:

def cmpBed(x,y):
    return cmp(x[0],y[0]) or cmp(x[1],y[1])
def isOverlap(bed1,bed2):
    return not (bed1[2]!=bed2[2] or bed1[0] > bed2[1] or bed1[1]

生信编程直播第三题:hg38每条染色体基因,转录本的分布
1. 读取genepred格式文件为DataFrame。
2. 按照chrom进行group,然后count,最后barplot。
3. 按照gene symbol去重复,然后按照chrom进行group,然后count,最后barplot。

import pandas
 
df = pandas.read_table("/scratch/bcb/ywang52/TData/genomes/hg38/gencode.v22.annotation_GeneSymbol.gpd.gz",header=None)
# transcript count
df.ix[:,:1].groupby(1).count().plot.bar(legend=False)
ylabel('Transcript count')
title('Gencode V22')
 
# gene count
sdf = df.ix[:,[1,11]].drop_duplicates().groupby(1).count().plot.bar(legend=False)
ylabel('Gene count')
title('Gencode V22')

生信编程直播第四题:多个同样的行列式文件合并起来

虽然这个题目与genepred无关,但是还是做了吧
1. 把每个文件读成dataframe,用第一列做行名, 文件名做列名。
2. 按照行名merge dataframe

import os
import pandas
dfs = []
for f in os.listdir("."):
    if f.endswith(".readcount"):
        df = pandas.read_table(f,index_col=0,header=None)
        df.columns = [os.path.splitext(f)[0]] # file name as column name
        dfs.append(df)
data = pandas.concat(dfs,axis=1) # merge dataframe by row names

生信编程直播第五题:根据GTF画基因的多个转录本结构
以ANXA1基因为例:
1. 按行读取genepred文件,第3,4列为转录本的区间,第4,5列为ORF的区间,第9和10列为exon起始和终止位置。
2. 先画Intron,即基因全长:第3,4列。
3. 再画ORF 和UTR。把第9,10列分割成exon 的starts,stops。遍历每个exon:
如果exon和ORF没有overlap:画成UTR。
反之: 先画成UTR,再把overlap的部分画成ORF。
NOTE: 这里有个trick,后画的部分会覆盖先画的部分。

import matplotlib.pyplot as pltcolors = ['red','blue','purple']  # color loops
gids = []
for cnt,line in enumerate(open("ANXA1.genepred")):
    gene = line.rstrip().split("\t")
    gids.append(gene[0])
    plt.plot([int(gene[3]),int(gene[4])],[cnt,cnt],linewidth=1,color='black') # draw intron
    txstart, txstop = int(gene[5]),int(gene[6])
    for start,stop in zip([int(s) for s in gene[8].rstrip(',').split(',')],[int(s) for s in gene[9].rstrip(',').split(',')]):
        if start > txstop or stop < txstart: # UTR: no overlap with ORF
            plt.plot([start,stop],[cnt,cnt],linewidth=3,color='grey')
        else: # draw ORF
            plt.plot([start,stop],[cnt,cnt],linewidth=3,color='grey')
            plt.plot([max(txstart,start),min(txstop,stop)],[cnt,cnt],linewidth=5,color=colors[cnt%len(colors)])                
plt.yticks(range(cnt+1),gids)
plt.ylim(-0.5,cnt+0.5)
plt.tight_layout()
plt.savefig("test.pdf")

以GenePred格式为输入的程序,所有代码都不到20行,而且程序清晰简洁,可读性强(当然Python语言的支持也是功不可没),对我等新手非常友好 。
附:
UCSC 格式汇总: https://genome.ucsc.edu/FAQ/FAQformat
gtfToGenePred 二进制文件: http://hgdownload.cse.ucsc.edu/a ... 86_64/gtfToGenePred
以上内容整理自生信技能树。

你可能感兴趣的:(复习linux基础指令及python处理基因组数据)