STAR居然有bug??全流程详细复盘
STAR居然有bug??全流程详细复盘
大家爱用的比对工具STAR目前已经发布到2.7.11b版本了。然而前几天我更新后发现运行的时候的时候会报错:
Transcriptome.cpp:18:Transcriptome: exiting because of INPUT FILE error: could not open input file /geneInfo.tab
看内容是跟索引相关,难道是旧版本的索引跟新版不兼容了?复盘开始,先从头构建参考基因组吧:
下载参考基因组
首先是下载参考基因组。人和小鼠的基因组最权威的是GENCODE 。当然大家常用的的ENSEMBL,NCBI RefSeq,UCSC版本当然也大差不差,选自己喜欢的就行。

注释文件,一般推荐下第四个/第六个,“Basic Gene Annotation”:
wget https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_47/gencode.v47.primary_assembly.basic.annotation.gtf.gz
# unzip
gunzip https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_47/gencode.v47.primary_assembly.basic.annotation.gtf.gz

Fasta取决于你的需要了,一般情况下是下载最后一个 "Genome sequence, primary assembly",也就是基因组。STAR默认是比对到基因组的,因为可以同时检测可变剪接。如果不关心这个,只想比对到转录组,就下载第一个Transcript Sequences。用转录组跑STAR的时候需要加上--genomeType Transcriptome
wget https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_47/GRCh38.primary_assembly.genome.fa.gz
# unzip
gunzip https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_47/GRCh38.primary_assembly.genome.fa.gz
构建索引
特意检查了一下官方文档,这一步代码跟之前是一样的。
STAR --runMode genomeGenerate \
--genomeDir GRCh38_genome \
--genomeFastaFiles GRCh38.primary_assembly.genome.fa \
--sjdbGTFfile gencode.v47.primary_assembly.basic.annotation.gtf \
--runThreadN 12 \
--sjdbOverhang 149 # 读长-1
完成后又检查了一下索引目录:
/Users/miana/Desktop/GRCh38_gemone
├── Genome
├── Log.out
├── SA
├── SAindex
├── chrLength.txt
├── chrName.txt
├── chrNameLength.txt
├── chrStart.txt
├── exonGeTrInfo.tab
├── exonInfo.tab
├── geneInfo.tab
├── genomeParameters.txt
├── sjdbInfo.txt
├── sjdbList.fromGTF.out.tab
├── sjdbList.out.tab
└── transcriptInfo.tab
1 directory, 16 files
确实是该有的都有了,也没有报错。那重跑一遍吧!
比对
STAR --runThreadN 12 \
--readFilesIn sample1_R1_001.fastq.gz sample1_R2_001.fastq.gz \
--genomeDir GRCh38_genome \
--outSAMtype BAM SortedByCoordinate \
--outSAMunmapped Within \
--quantMode GeneCounts \
--sjdbGTFfile gencode.v47.primary_assembly.basic.annotation.gtf \
--sjdbOverhang 149 \
--outFileNamePrefix outs \
--readFilesCommand "gunzip -c"
然后华丽丽的又报错了。
Transcriptome.cpp:18:Transcriptome: exiting because of INPUT FILE error: could not open input file /geneInfo.tab
Solution: check that the file exists and you have read permission for this file
SOLUTION: utilize --sjdbGTFfile /path/to/annotations.gtf option at the genome generation step or mapping step
Jan 24 20:14:23 ...... FATAL ERROR, exiting
好吧,看来不是我的问题。去翻github,我发现这个问题远在2023年9月就有了:

2024年底还有人在讨论解决方案:

总结一下,问题的原因在于M芯片的不兼容 (我们mac用户招惹谁了😭),然而到现在为止还没有正式的解决方案。在网友们的集思广益以及我的尝试下,最终我还是成功了!给大家分享一下具体步骤:
debug详细过程
⚠️ 更改源代码可能导致其他未知问题,只是一个暂时的解决方案,操作请谨慎
从github下载2.5.11b测试版:
git clone https://github.com/dobinlab/STAR_pre_releases.git
下载好之后不要急着安装,先找到 ParametersGenome.cpp 这个文件,找到第27行:
transform.outYes = transform.outSAM = transform.outSJ = false;
修改为
transform.outYes = transform.outSAM = transform.outSJ = transform.outQuant = false;
再找到SharedMemory.cpp这个文件,把第109和254行的SHM_NORESERVE改成MAP_NORESERVE (不改的话在编译的时候就会出现以下报错,贴心的网友已经帮你踩过坑了,真的我哭死)
SharedMemory. cpp: In member function 'void SharedMemory::CreateAndInitSharedObject(size_t)':
SharedMemory.cpp:109:59: error: 'SHM_NORESERVE' was not declared in this scope; did you mean 'MAP_NORESERVE'?
109 | _shmID=shmget(_key, toReserve, IPC_CREAT | IPC_EXCL | SHM_NORESERVE | 0666); // _shmID = shmget(shmKey, shmSize, IPC_CREAT | SHM_NORESERVE | SHM_HUGETLB | 0666);
| ^~~~~~~~~~~~~
| MAP_NORESERVE
SharedMemory.cpp: In member function 'void SharedMemory::EnsureCounter()':
SharedMemory.cpp:254:72: error: 'SHM_NORESERVE' was not declared in this scope; did you mean 'MAP_NORESERVE'?
254 | _sharedCounterID=shmget(_counterKey, 1, IPC_CREAT | IPC_EXCL | SHM_NORESERVE | 0666);
| ^~~~~~~~~~~~~
| MAP_NORESERVE
make: *** [SharedMemory.o] Error 1
接下来就可以编译了。注意不要按照官方文档里mac的方法,那是给英特尔芯片的。
cd STAR/source
make STAR
# 加到PATH
export PATH=/path/to/STAR/:$PATH
# 或者 cp STAR /usr/local/bin
此时再运行比对定量,就不会报错了。
小提示:运行之前,还要在命令行中设置
ulimit -n 2048以允许STAR同时处理多个chunk
后记
M芯片因为架构的原因,有许多软件都有兼容性的问题。但是在可以运行的情况下,我发现速度一般是远超linux服务器的。比如这次我对27个bulk RNA-seq样本用STAR比对定量(双端150bp),平均一个样本就5分钟,为了对比我还用salmon也定量了一下,感觉甚至是STAR更快,虽然salmon在内存占用方面仍然有很大的优势。以后有时间详细对比一下STAR和salmon的输出结果吧~