因为小编对于这一块一直比较迷惑,所以就简单记一下自己的下载经历,一方面方便自己日后查看,当然如果也能帮到你是最好的啦!
首先先说一下,小编在Windows笔记本上下载了Ubuntu的Linux运行环境,所以这里涉及的所有命令行都是在Ubuntu进行的哦~
再多说一嘴,最开始初学生信的时候小编就只建立了一个conda环境,但是在使用prefetch的时候怎么CA也没有办法通过,所以想着干脆新建立一个conda环境专门用来下载sra文件,然后再在bioinfo环境分析处理文件(问了AI,似乎是可行的)
然后这里先记录一下新的环境的配置(命名有点长,sradownload)
conda create -n sradownload python=3.0 -y
conda activate sradownload
conda install -c bioconda sra-tools -y
本来想要继续配置aspera的,结果真的让人崩溃,排查了很多问题还是没有解决,所以没哭何必硬吃?干脆放弃选择使用aspera了(虽然知道可以加速,但是奈何我用不了)
那我们从最简单的开始
首先呢,比如我们在science上看到一篇文章,然后呢发现它的bioproject的编号是PRJNA257197
那么我们就可以去使用esearch来搜索这个项目的信息和数据
sudo apt install ncbi-entrez-direct
#使用esearch的包
esearch -db sra -query PRJNA257197
#表示在SRA的database里面查找项目PRJNA257197
SRA数据库的数据组织层级
基本层级关系如下
Bioproject>Study>Experiment>Sample>Run
Bioproject
首先是bioproject是整个研究的顶层结构,比方说我们在某篇文章中看到的PRJNA******等等就是该项目标号
一般以PRJNA开头的指的是NCBI项目,PRJEB开头的是欧洲ENA协作项目,PRJDB开头的是日本DDBJ协作项目
比如用下面一段代码查找PRJNA信息,我们会得到一段XML格式信息(纯文本格式)
esearch -db sra -query PRJNA257197
#表示在SRA的database里面查找项目PRJNA257197
我们来逐层解释以下信息:
<ENTREZ_DIRECT>这说明我们是在NCBI的ENTREZ的检索系统当中查找相关信息(ENTREZ可以认为是一个综合资源检索平台,整合了各种数据(基因序列,SRA,protein等等))
<Db>sra</Db> 说明我们是在SRA数据库当中进行查找的(这也与我们的命令相对应)
<WebEnv>MCID_688c172fe523eef22709ee84</WebEnv>其实提供给我们一个ID:MCID_688c172fe523eef22709ee84,我们可以理解为这是对本次查询会话的关联码,以后我们想要获得这891条数据,我们不需要再esearch查询,直接使用ID查询即可
<QueryKey>1</Querykey>是查询键,和WebEnv联合使用
<Count>891</Count>表示当前查询在SRA数据库中匹配到的记录总数,因为SRA的底层数据就是run(比如 SRR123456
)
Study:表示的是在这个大的bioproject的层级下包含的其他各个分的实验板块,可以认为是子项目,一般使用前缀SRP(SRA研究)、ERP(欧洲协作研究)、DRP(日本协作研究)来标识
Experiment:代表的是技术参数的细节,记录了测序平台策略,文库制备方法和实验条件等,一般使用前缀SRX(SRA实验),ERX(欧洲协作研究),DRX(日本协作研究)标识
Sample:是被测序的生物材料实体,是实验的原材料,此层级记录了样本的来源、属性和处理信息等等,一般使用前缀SRS(SRA样本)、ERS(欧洲协作样本)、DRS(日本协作样本)标识
Run:是测试数据的最终载体,表示一次测试的原始数据,一般使用前缀SRR(SRA 运行)、ERR(欧洲协作运行)、DRR(日本协作运行)标识
这里需要注意的一点是,并不是代表每一个上层级包含了下层级的数据,这些层级关系是帮助我们可以溯源这个原始数据是用什么样本,经历什么实验条件,为了验证什么假设,隶属于什么项目,每一个层级都有其自己的数据,但是最基本的数据单位还是Run
esearch -db sra -query PRJNA257197
#表示在SRA的database里面查找项目PRJNA257197
Bioproject内容初探
我们通过上面的程序获得到了基本有多少个Run项目以及我们再次查找的方式,其实上面的程序同时输出了一个文件runinfo我们可以用efetch获取,里面记录了相关的run的信息
esearch -db sra -query PRJNA257197 | efetch -format runinfo > runinfo.csv
(runinfo是以','分隔的文件,整合了每个run的信息)
得到了runinfo.csv之后我们可以用cat来显示,但是为了更加直观地看到各个信息,我们可以把这个csv文件转变为xlxs文件,这里我没有下载什么包,就是利用pandas的转换方式,具体实现如下
pip3 install pandas
pip install openpyxl #因为这里pandas实现需要openpyxl的依赖
(需要的配置如上)
然后我们需要在文本编辑器当中编辑Python文件
#csv_to_xlsx.py
import pandas as pd
data=pd.read_csv('runinfo.csv')
data.to_excel('runinfo.xlsx',index=False)
然后在终端运行,注意要把runinfo.csv移到这个Python程序目录之下,然后再运行
mkdir ~/Python_code
#这里我通过Windows系统把csv_to_xlsx.py已经移到了unix系统这个目录之下
cp ~/runinfo.csv Python_code
python csv_to_xlsx.py
然后我们在Python_code文件夹里面可以得到转换的runinfo.xlsx,但是在unix系统当中不好直接查看xlsx文件,所以选择在Windows系统中查看,这是我截的一部分
可以看到每个Run对应的信息,读者可以自己操作然后再Excel当中查看,如果嫌麻烦的话可以直接利用unix文本操作简单看一看
(这里提一嘴,因为我设立Python_code的初衷是存储Python的脚本,所以在执行完之后可以把runinfo.csv删除(因为有备份),然后把runinfo.xlsx存在Windows界面上之后删除)
这里提供另外一种做法,直接用cut切割简单查看一下信息
cat runinfo.csv | cut -f 1 -d ',' | tail +2 | head -100
上面一个命令行是首先切割第一列(注意这是csv文件所以用','分隔),然后tail +2表示从第二行开始显示(因为第一行是column名),head -100 表示仅仅显示前100条数据
cat runinfo.csv | head -1
上面可以显示第一行的所有项目,比如run等等
我们还可以初步看一下,到底有多少条run数据(结果是891行,说明有891个run)
cat runinfo.csv | cut -f 1 -d ',' | tail +2 | wc -l
下载Run数据
因为这里的run数据太多了,所以我们就下载run数据的前50条(由于前面所说,小编的下载速度太慢了)
cat runinfo.csv | cut -f 1 -d ',' | grep SRR | head -50 > SRR.txt
# grep SRR 操作和 tail +2 的结果是一样的,推荐前面一种做法,如果没有先查看Bioproject的内容
我们我们先下载第一个run试试水
fastq-dump -X 10000 --split-files SRR1972917
fastq-dump是sratoolkit的下载fastq类型文件的指令,-X 10000表示仅仅下载前10000reads,--split-files表示对于pair-end测序的会分开两个文件下载(这里面涉及的是Illumina测序技术,可以先了解一下)
那么如果我们想要同时下载SRR.txt的50条数据,我们需要使用parallel来加快下载速度
parallel可以认为是高效分配计算机的GPU资源,使得多个任务同时进行以降低耗时
cat SRR.txt | parallel fastq-dump -X 10000 --split-files {}
({}是占位符,对应的是SRR.txt的内容)
注意一点,我们在下载的时候提前创建一个目录,在此目录进行下载,防止家目录文件堆积
直接在NCBI网站上下载
这是简单流程
其实这是更简单的过程,可以直接在NCBI当中搜索PRJNA257197,然后我们就可以得到
进入之后,滑到后面
如果我们想要得到SRA的数据,点击891,即可进入
点击此处链接,然后就可以得到类似于我们用pandas生成的SRR相关信息了
我们可以选择哪些Run下载哪些Run不下载
然后在select栏目里面选择download选项
(其实我觉得直接下载甚至更简单美观一些,只是如果想要在终端分析可能需要链接下载)
上面是对于SRA数据库下载方法,后面会更新对于NCBI其他数据库下载的方法滴~
小编水平有限,如果不足请多指教友善交流哦~