多物种无参Trinity组装 | awk样本列表

组装策略

适用于设计多样本多物种的组装。例如100个样本,10个物种。这里如果想直接完成10个de nove组装,需要将所有样本数据放到一起后,通过样本信息表声明每个样本的物种名,再分别组装。因此涉及通过awk操作样本信息表。另外,多物种的分析中涉及到直系同源基因。此时通过unigene进行连接是最佳的。但在transdecoder预测ORF时,有时同一个转录本预测得到两个不同的ORF。所以最终是以预测得到的ORF为单元进行定量和分析。响应的CDS和PEP用以计算直系同源基因以及后续进化分析等。因此,这个过程中,从Trinity.fasta得到unigene,再以unigene为参考基因组,预测ORF得到gff3和gtf文件,进行有参组装。这种方式用来规避用Trinity.fasta为参考时,涉及到同一个基因得到不同注释,以及后续提取最长转录本时遇到的麻烦等。

awk操作样本信息表

样本信息表:

$ cat sample_list.txt

2023NJFGX01-SZ  GX
2023NJZGX02-SZ  HF
2023NJCYX05-SZ  CY
2023NJZGX01-SZ  HF
2023NJCYX303-SZ SP
2023NJCYX04-SZ  CY
2023NJFGX04-SZ  GX
2023NJBSX02-SZ  HF
2023NJCYX205-SZ CY
2023NJZGX03-SZ  CY
2023NJCYX302-SZ SP

按照第二列进行分配

aaa="SP"
cat sample_list.txt |
awk -v bbb=$aaa '{if($2 ==bbb) {print $1,$2}}'

2023NJCYX303-SZ SP
2023NJCYX302-SZ SP

事实上,我们想要将第一列的样本按文件夹分配

mkdir ${aaa}_dir;
 cat sample_list.txt | 
awk -v bbb=$aaa '{if($2 ==bbb) {print $1}}' | 
while read line; 
do 
mv ${line}* ./${aaa}_dir; 
done

将上述的aaa按照第二列的名称进行循环

cat sample_list.txt | awk '{print $2}' | sort | uniq |
while read line;
do
mkdir ${line}_dir;
 cat sample_list.txt | 
awk -v spname=$line '{if($2 ==spname) {print $1}}' | 
while read line2; 
do 
mv ${line2}* ./${line}_dir; 
done;
done

这样所有的样本被归到响应的文件夹里

Trinity组装(单个)

基本代码如下:

left_all=`echo *_1.clean.fq.gz`
right_all=`echo *_2.clean.fq.gz`
Trinity \
        --seqType fq \
        --max_memory 30G \
        --left $left_all \
        --right $right_all \
        --CPU 12

会报错,反正经常这样报错:

Thread 2 terminated abnormally: Error, cmd: gunzip -c /mnt/d/Link_CQH/px22/CY_dir/2023NJCYX04-SZ_2.clean.fq.gz | fastool --illumina-trinity --to-fasta >> right.fa 2> /mnt/d/Link_CQH/px22/CY_dir/2023NJCYX04-SZ_2.clean.fq.gz.readcount  died with ret 256 at /home/cqh/miniconda3/bin/Trinity line 2183.

类似的报错一般是先手动执行报错的这一步,获得left.fa和right.fa,后面再运行就对了。有时候会顺手直接cat到一起。

for fn in *1.clean.fq.gz
do
        gunzip -c ./${fn} | fastool --illumina-trinity --to-fasta >> left.fa 2> ./${fn}.readcount
done

for fn in *2.clean.fq.gz
do
        gunzip -c ./${fn} | fastool --illumina-trinity --to-fasta >> right.fa 2> ./${fn}.readcount
done

cat left.fa right.fa > both.fa
left_all=`echo *_1.clean.fq.gz`
right_all=`echo *_2.clean.fq.gz`
Trinity \
        --seqType fq \
        --max_memory 30G \
        --left $left_all \
        --right $right_all \
        --CPU 12

获得unigene集

 /home/cqh/miniconda3/opt/trinity-2.1.1/util/misc/get_longest_isoform_seq_per_trinity_gene.pl ./Trinity.fasta > unigene.fasta

修改名称
由于前面根据物种信息表,将物种名信息放在文件夹里。现提取文件夹的物种名信息,加入unigene的文件名文件内的序列中。
注意,“物种名|Trinity名”这种格式虽然很不错,但“|”在建立索引时会报错,所以舍弃了。

dirname=`pwd | awk 'BEGIN{FS="/"}{print $NF}' | awk 'BEGIN{FS="_"}{print $1}'`
cat unigene.fasta | awk '{print $1}' | sed "s/>/>${dirname}_/g" > ${dirname}_unigene.fasta

预测unigene集的开放阅读框,并获得gff3注释文件,通过gffread获得gtf文件。

TransDecoder.LongOrfs -t ${dirname}_unigene.fasta
cp ./${dirname}_unigene.fasta.transdecoder_dir/longest_orfs.gff3 ./${dirname}_unigene.gff3
gffread ${dirname}_unigene.gff3 -T -o ${dirname}_unigene.gtf

将unigene集以及gtf文件放到ref文件夹,以备有参组装。

mkdir ref
seqkit seq ${dirname}_unigene.fasta -w 1000 > ./ref/genome.fasta
cp ./${dirname}_unigene.gtf ./ref/genome.gtf

集合脚本

run_DIY_trinity.sh
我们首先有一个自动组装trinity的脚本,这个脚本仅完成到ORF注释,因为不确定每个流程中需要哪些步骤(未必每次都需要定量或者功能注释)

for fn in *1.clean.fq.gz
do
        gunzip -c ./${fn} | fastool --illumina-trinity --to-fasta >> left.fa 2> ./${fn}.readcount
done

for fn in *2.clean.fq.gz
do
        gunzip -c ./${fn} | fastool --illumina-trinity --to-fasta >> right.fa 2> ./${fn}.readcount
done

cat left.fa right.fa > both.fa

left_all=`echo *_1.clean.fq.gz`
right_all=`echo *_2.clean.fq.gz`

Trinity --seqType fq \
        --max_memory 30G \
        --left $left_all \
        --right $right_all \
        --CPU 12
# 并非重复,第一遍经常运行失败
Trinity --seqType fq \
        --max_memory 30G \
        --left $left_all \
        --right $right_all \
        --CPU 12
#unigene
/home/cqh/miniconda3/opt/trinity-2.1.1/util/misc/get_longest_isoform_seq_per_trinity_gene.pl ./trinity_out_dir/Trinity.fasta > ./trinity_out_dir/unigene.fasta
dirname=`pwd | awk 'BEGIN{FS="/"}{print $NF}' | awk 'BEGIN{FS="_"}{print $1}'`
cat ./trinity_out_dir/unigene.fasta | awk '{print $1}' | sed "s/>/>${dirname}_/g" > ${dirname}_unigene.fasta
#ORF注释
TransDecoder.LongOrfs -t ${dirname}_unigene.fasta
cp ./${dirname}_unigene.fasta.transdecoder_dir/longest_orfs.gff3 ./${dirname}_unigene.gff3
cp ./${dirname}_unigene.fasta.transdecoder_dir/longest_orfs.pep ./${dirname}_unigene.pep.fa
cp ./${dirname}_unigene.fasta.transdecoder_dir/longest_orfs.cds ./${dirname}_unigene.cds.fa
gffread ${dirname}_unigene.gff3 -T -o ${dirname}_unigene.gtf

run_DIY_subread.sh
有参组装脚本,实际上就是定量

#
mkdir ref
seqkit seq ${dirname}_unigene.fasta -w 1000 > ./ref/genome.fasta
cp ./${dirname}_unigene.gtf ./ref/genome.gtf

# index
path=`pwd`
subread-buildindex -o $path/ref/genome_index $path/ref/genome.fasta

# subjunc
index="$path/ref/genome_index"
for fn in *_1.clean.fq.gz
do
                sample=${fn%_*}
                subjunc -i $index \
                        -r ${sample}_1.clean.fq.gz \
                        -R ${sample}_2.clean.fq.gz \
                        -T 12 \
                        -o ${sample}.bam \
                        1>${sample}.subjunc.log 2>&1
done
#
mkdir clean_data
mv *.fq.gz clean_data
#
featureCounts -T 12 -p -t exon -g gene_id -a ./ref/genome.gtf -o raw_data.txt *.bam
#
rm *.bam
mkdir quick_results
mkdir ./quick_results/hisat2_log
cp *.log ./quick_results/hisat2_log
rm *.log
#
grep -v "#" raw_data.txt | awk '{for(i=1;i<=NF;i++) if ((i==1)||(6<=i)) printf("%s ",$i);print ""}'| cat | tr -s ' ' '\t' > read_counts.txt
grep -v "#" raw_data.txt | awk '{for(i=1;i<=NF;i++) if ((i==1)||(7<=i)) printf("%s ",$i);print ""}'| cat | tr -s ' ' '\t' > genes.matrix.txt
#
mv raw_data.txt.summary ./quick_results
mv raw_data.txt ./quick_results
mv read_counts.txt ./quick_results
mv  genes.matrix.txt ./quick_results
rm *.bam.indel.vcf
rm *.bam.junction.bed
#end

运行脚本

run_DIY_NoRef.sh
第一步还是根据样本信息分配文件夹,随后逐个文件夹执行脚本即可

#
cat sample_list.txt | awk '{print $2}' | sort | uniq > name_list.txt
cat name_list.txt | while read line
do
        mkdir ${line}_dir
        cat sample_list.txt | awk -v spname=$line '{if($2 ==spname) {print $1}}' | while read line2
do
        mv ${line2}* ./${line}_dir
done
done
#
cat name_list.txt | while read line
do
        cp  run_DIY_trinity.sh ./${line}_dir
        cp  run_DIY_subread.sh ./${line}_dir
        cd ${line}_dir
        bash run_DIY_trinity.sh
        bash run_DIY_subread.sh
        cd ../
done
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容