简介:本资源是一份面向生物信息学初学者与高校教学场景的优质公开课课件,聚焦生物数据库体系与常用数据格式两大核心基础内容,助力科研人员快速掌握组学数据检索与解析能力。课件系统梳理NCBI、EBI、DDBJ等国际主流序列数据库,Gene Ontology、KEGG、InterPro等基因功能数据库,以及UCSC、Ensembl等基因组注释平台;同时详解FASTA、FASTQ、GenBank、GFF等关键数据格式的结构规范、字段含义与实际应用示例,含GenBank原始记录片段解析与格式对比说明。资源为单文件PPTX课件,共1个9.49MB演示文稿,内容逻辑清晰、图文并茂,适合作为课堂讲授素材或自学入门指南。目前已有88人学习下载,涵盖高校生物信息课程教学、实验室新人培训及跨学科研究者知识补强场景。
1. 这不是PPT课件,而是一份生物信息学数据流转的实操地图
你下载了一个名为“常用生物数据库和数据格式公开课获奖课件.pptx”的文件,打开后发现满屏是NCBI、Ensembl、UCSC的LOGO,几行FASTA序列截图,GFF3结构示意图,还有标着“SRA→FASTQ→BAM→VCF”箭头的流程图——但没一行可运行的命令,没一个能加载的真实文件路径,更没有告诉你:为什么同一段基因组,在GenBank里是LOCUS开头,在GFF3里却要拆成exon+CDS+gene三行?为什么用less看FASTQ会乱码,而zcat sample.fastq.gz | head -n 4却刚好显示四行一组?这不是教学幻灯片失效了,而是它本就该是生物数据工程师日常工作的索引页:每一页背后对应一个真实终端、一个可验证的curl请求、一个能用pandas解析的DataFrame结构。本文不讲PPT动画怎么配色,只讲如何把课件里提到的每一个数据库入口、每一种格式定义,变成你本地/data/genome/目录下可ls、可grep、可awk -F'\t' '{print $1,$4,$5}'的实体文件。适合刚接手RNA-seq分析任务的生信新人,也适合需要给湿实验室同事写数据交付说明书的项目负责人。
2. 从NCBI SRA下载FASTQ:绕过网页点击,用命令行直取原始测序数据
2.1 为什么必须跳过浏览器下载?
课件里常把“访问SRA数据库→搜索SRX编号→点击Download”作为标准流程,但实际中你会遇到:下载按钮灰显(需登录)、文件名含乱码(如SRR1234567_1.fastq.gz)、解压后发现是.sra格式无法直接用fastqc——这并非平台故障,而是SRA采用专有压缩协议(基于libmagic的二进制封装),必须用sratools套件转换。直接下载原始FASTQ虽慢,但省去转换步骤,且保证read1/read2配对完整性。关键在于:SRA页面展示的“FASTQ Files”链接,本质是HTTP重定向到AWS S3桶的预签名URL,curl可直接捕获。
2.2 三步获取真实FASTQ下载地址
以课件中高频出现的示例SRA编号SRR1553607为例(人类肝癌RNA-seq):
# 步骤1:用efetch获取SRA元数据XML,提取FTP路径 curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=sra&id=SRR1553607&retmode=xml" \ | grep -o 'ftp://[^\"]*' | head -n 1 # 输出:ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR155/007/SRR1553607/SRR1553607_1.fastq.gz # 步骤2:验证该路径是否可公开访问(避免403) curl -I "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR155/007/SRR1553607/SRR1553607_1.fastq.gz" 2>/dev/null | head -n 1 # 应返回:HTTP/1.1 200 OK # 步骤3:用wget并发下载(比浏览器快3倍以上) wget -c -P ./raw_fastq/ \ "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR155/007/SRR1553607/SRR1553607_1.fastq.gz" \ "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR155/007/SRR1553607/SRR1553607_2.fastq.gz"提示:
-c参数启用断点续传,SRA文件常超2GB;-P指定本地保存路径,避免文件散落在~/Downloads。若遇ftp://协议被拦截,将URL改为https://前缀(EBI镜像支持HTTPS)。
2.3 FASTQ格式校验:四行一组的硬性约束
下载完成后,必须验证是否为标准FASTQ(课件强调的“每4行代表一条reads”)。执行以下检查:
# 统计总行数,应为4的整数倍 wc -l ./raw_fastq/SRR1553607_1.fastq.gz | awk '{print $1 % 4}' # 输出0表示合规 # 抽查前8行,确认结构: zcat ./raw_fastq/SRR1553607_1.fastq.gz | head -n 8 # 第1行:@SRR1553607.1 HWI-ST1196:152:C0D4DACXX:1:1101:1225:2145/1 # 第2行:NACCTGTCAGTCCAGCTGCAGGGTGGTGAAATGCCATCTGTCA... # 第3行:+ # 第4行:#1=DDFFFHHHHHJJJJIJJJJJJIIIIIIGIIIIIIIIIIII...2.3.1 常见损坏场景与修复
- 现象:
head -n 4显示第2行含^@控制符 → 文件被截断或gzip损坏
修复:重新下载,添加--tries=3参数 - 现象:第1行无
@符号或第3行非+→ 测序仪输出异常,需联系数据提供方
临时处理:用seqtk过滤(但会丢失质量值)seqtk seq -a ./raw_fastq/SRR1553607_1.fastq.gz > clean.fa
3. 解析GFF3文件:从课件里的“基因结构图”到可查询的基因坐标表
3.1 GFF3不是纯文本,而是带层级关系的注释协议
课件中GFF3示意图常画成“一行gene + 多行exon”的树状结构,但实际文件中所有要素平铺为独立行,靠Parent=transcript_id字段建立父子关系。例如人类chr1上BRCA1基因的GFF3片段:
chr1 ensembl gene 43044294 43125482 . + . ID=gene:ENSG00000012048;Name=BRCA1 chr1 ensembl transcript 43044294 43125482 . + . ID=transcript:ENST00000357654;Parent=gene:ENSG00000012048 chr1 ensembl exon 43044294 43044443 . + . ID=exon:ENSE00001887420;Parent=transcript:ENST00000357654关键点:Parent字段指向ID值,而非行号。这意味着不能用sed -n '10,20p'直接提取外显子,必须按ID关联。
3.2 用awk构建基因-外显子映射表
以下脚本将GFF3转为三列表格(gene_id, exon_start, exon_end),适配下游bedtools操作:
# 提取所有exon行,并关联其gene_id awk -F'\t' ' BEGIN { OFS="\t" } $3 == "exon" { # 从第9列attributes中提取Parent=transcript_id match($9, /Parent=([^;]+)/, parent_arr) transcript_id = parent_arr[1] # 构建transcript_id→gene_id映射(需先扫描gene行) if (gene_map[transcript_id] == "") { # 此处需预加载gene_map,故分两遍处理 } } ' Homo_sapiens.GRCh38.109.gff3 > exon_coords.tmp # 实际生产环境推荐用gffread(来自 cufflinks 工具集) gffread -E -o brca1_exons.bed Homo_sapiens.GRCh38.109.gff3 \ | awk '$3=="exon" {print $1,$4,$5,".",0,$7}' | sort -k1,1V -k2,2n > brca1_exons.bed注意:
gffread -E参数导出BED格式时自动解析Parent关系,比手写awk可靠。课件中“GFF3转BED”步骤常被简化为“用在线工具”,但真实项目需自动化——gffread已预编译在Bioconda的cufflinks包中,conda install -c bioconda cufflinks即可。
3.3 验证GFF3完整性:检查必需字段缺失率
课件强调GFF3第9列必须含ID和Parent,但实际下载的文件常有遗漏。用以下命令统计问题行:
# 统计无ID字段的行数 awk -F'\t' '$3=="gene" && !/ID=/ {print NR}' Homo_sapiens.GRCh38.109.gff3 | wc -l # 统计exon行中Parent为空的行数 awk -F'\t' '$3=="exon" && !/Parent=/ {print NR}' Homo_sapiens.GRCh38.109.gff3 | wc -l3.3.1 修复缺失Parent的exon行(应急方案)
若发现少量exon缺失Parent,可按位置就近匹配transcript:
# 先提取所有transcript坐标 awk -F'\t' '$3=="transcript" {print $1,$4,$5,$9}' Homo_sapiens.GRCh38.109.gff3 > transcripts.bed # 对每个exon,查找覆盖它的transcript(bedtools closest) bedtools closest -a <(awk -F'\t' '$3=="exon"{print $1,$4,$5,"exon"}' Homo_sapiens.GRCh38.109.gff3) \ -b transcripts.bed -D ref | \ awk '$7>0 {print $1,$2,$3,$4,$5,$6,"Parent="substr($5,1,length($5)-1)}'4. FASTA与FASTQ互转:当课件说“序列格式可相互转换”时的真实代价
4.1 FASTA丢弃质量值是不可逆操作
课件常将FASTA列为“最简序列格式”,但未强调:从FASTQ转FASTA必然丢失第4行质量编码。这对QC(如FastQC报告)和比对(如STAR的碱基质量校准)产生实质影响。验证方法:
# 比较FASTQ与FASTA的序列一致性(仅序列部分) zcat sample.fastq.gz | paste - - - - | cut -f2 | tr -d '\n' > seq_from_fastq.fa sed -n '2~2p' sample.fa | tr -d '\n' > seq_from_fasta.fa diff seq_from_fastq.fa seq_from_fasta.fa # 应输出空(序列相同) # 但FASTQ有质量值,FASTA没有 zcat sample.fastq.gz | head -n 4 | tail -n 1 # 显示质量字符串如"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII......"4.2 用seqtk实现无损FASTQ→FASTA转换
seqtk是生物信息领域事实标准工具,比Python脚本快10倍:
# 安装(Ubuntu) sudo apt-get install seqtk # 转换命令(保留序列名,丢弃质量值) zcat sample.fastq.gz | seqtk seq -A > sample.fa # 验证:FASTA头与FASTQ头一致 head -n 1 sample.fa # @SRR1553607.1 ... → >SRR1553607.1 ...4.2.1 反向转换:FASTA→FASTQ需人工补质量值
课件未说明:FASTA无法还原原始质量值。若必须生成FASTQ(如测试pipeline),需用统一质量字符填充:
# 为每条reads生成长度匹配的'F'质量字符串(Phred+33编码) awk '/^>/ {print $0; next} {print; print "+"; for(i=1;i<=length($0);i++) printf "F"; print ""}' sample.fa \ | sed 's/$/\x0a/' > sample_fake.fastq警告:此文件仅用于流程调试,绝不可用于真实测序数据分析。课件中“格式互转”示意图易误导初学者认为质量信息可恢复。
5. 统一返回数据格式:用pandas DataFrame封装多源生物数据
5.1 为什么课件里的“统一格式”必须落地为DataFrame?
课件常提“将不同数据库结果统一为表格”,但未定义结构。实际项目中,“统一”意味着:所有基因组坐标数据(GFF3、BED、VCF)必须能被同一段Python代码加载、过滤、合并。pandas DataFrame天然支持:
- 按列名(
chrom,start,end)快速切片 - 用
bedtools类操作(df1.intersect(df2)) - 导出为JSON/CSV供前端渲染
5.2 构建标准化基因组坐标DataFrame
以下函数将GFF3、BED、FASTA header统一为GenomicRegion对象:
import pandas as pd import re def gff3_to_df(gff_path): """解析GFF3为DataFrame,自动提取ID/Parent关系""" df = pd.read_csv(gff_path, sep='\t', comment='#', names=['chrom','source','feature','start','end','score','strand','phase','attributes']) # 提取ID和Parent到独立列 df['ID'] = df['attributes'].str.extract(r'ID=([^;]+)') df['Parent'] = df['attributes'].str.extract(r'Parent=([^;]+)') return df[df['feature'].isin(['gene', 'exon', 'transcript'])] def fasta_header_to_df(fasta_path): """从FASTA header提取染色体名和坐标(如>chr1:100-200)""" headers = [] with open(fasta_path) as f: for line in f: if line.startswith('>'): # 匹配>chr1:100-200或>gi|123456|ref|NC_000001.11| match = re.search(r'>(\w+)[:\|](\d+)-(\d+)', line) if match: headers.append([match.group(1), int(match.group(2)), int(match.group(3))]) return pd.DataFrame(headers, columns=['chrom','start','end']) # 合并多源数据 gff_df = gff3_to_df('Homo_sapiens.GRCh38.109.gff3') bed_df = pd.read_csv('brca1_exons.bed', sep='\t', header=None, names=['chrom','start','end','name','score','strand']) merged_df = pd.concat([gff_df[['chrom','start','end','feature','ID']], bed_df[['chrom','start','end','name']]], ignore_index=True)5.2.1 关键字段标准化表
为确保下游工具兼容,必须强制字段命名(课件未强调的细节):
| 原始格式 | 必须映射为 | 说明 |
|---|---|---|
| GFF3第1列 | chrom | 不允许含chr前缀(UCSC vs Ensembl差异) |
| GFF3第4列 | start | GFF3坐标从1开始,BED从0开始,转换时start-1 |
| FASTQ第1行 | read_id | 提取@SRR1553607.1中的SRR1553607作为样本ID |
# 自动处理chr前缀(Ensembl GFF3常带chr,UCSC BED不带) merged_df['chrom'] = merged_df['chrom'].str.replace('^chr', '', regex=True) # GFF3转BED坐标(start-1) merged_df.loc[merged_df['source']=='ensembl', 'start'] -= 15.3 输出为课件要求的“统一返回格式”
最终交付给合作方的不是PPT,而是可执行的data_schema.json:
{ "format_version": "1.0", "required_fields": ["chrom", "start", "end", "feature_type", "source_db"], "examples": [ { "chrom": "1", "start": 43044293, "end": 43044442, "feature_type": "exon", "source_db": "ENSEMBL_GRCh38" } ] }提示:该JSON应随数据包一同交付,而非写在PPT备注页。课件中“统一格式”概念只有绑定具体schema才具备工程价值。
6. 验证FASTQ是否损坏:三行命令定位90%的读取失败问题
6.1 用head + wc定位截断文件
课件未教:FASTQ损坏最常见原因是网络中断导致gzip不完整。症状是zcat file.fastq.gz | head -n 4卡住或报错gzip: stdin: unexpected end of file。快速验证:
# 检查gzip完整性(无需解压) gzip -t ./raw_fastq/SRR1553607_1.fastq.gz && echo "OK" || echo "CORRUPT" # 若损坏,检查末尾是否含gzip魔数(1f 8b) tail -c 4 ./raw_fastq/SRR1553607_1.fastq.gz | hexdump -C # 正常输出应含"1f 8b",否则文件不完整6.2 用seqtk统计reads数量并校验配对
单端测序只需检查行数,双端必须验证read1与read2数量一致:
# 获取read1数量(FASTQ每4行1条reads) read1_count=$(zcat ./raw_fastq/SRR1553607_1.fastq.gz | wc -l) read2_count=$(zcat ./raw_fastq/SRR1553607_2.fastq.gz | wc -l) echo "Read1: $((read1_count/4)), Read2: $((read2_count/4))" # 两数必须相等,否则比对软件会报错"mate not found" # 进阶:检查read ID是否严格配对(前缀相同) zcat ./raw_fastq/SRR1553607_1.fastq.gz | head -n 4 | head -n 1 | cut -d' ' -f1 zcat ./raw_fastq/SRR1553607_2.fastq.gz | head -n 4 | head -n 1 | cut -d' ' -f1 # 应输出相同ID(如@SRR1553607.1)6.2.1 修复配对不一致的FASTQ
若发现read1有100万条而read2仅999999条,用repair.sh(来自BBTools)自动补齐:
repair.sh in1=./raw_fastq/SRR1553607_1.fastq.gz \ in2=./raw_fastq/SRR1553607_2.fastq.gz \ out1=./raw_fastq/SRR1553607_1_fixed.fastq.gz \ out2=./raw_fastq/SRR1553607_2_fixed.fastq.gz \ repair该命令会丢弃未配对的reads,并重命名剩余reads保证严格一一对应——这是课件里“数据质控”章节缺失的关键操作。
本文还有配套的精品资源,点击获取