-
Notifications
You must be signed in to change notification settings - Fork 120
/
1Pipeline.sh
2251 lines (1767 loc) · 92.5 KB
/
1Pipeline.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[TOC]
# 易宏基因组流程 EasyMetagenome Pipeline
# 版本Version: 1.21, 2024/5/17
# 操作系统Operation System: Linux Ubuntu 22.04+ / CentOS 7.7+
# 一、数据预处理 Data preprocessing
## 1.1 准备工作 Preparing
1. 首次使用请参照`0Install.sh`脚本,安装软件和数据库(大约1-3天,仅一次)
2. 易宏基因组(EasyMetagenome)流程`1Pipeline.sh`复制到项目文件夹,如本次为meta
3. 项目文件夹准备测序数据(seq/*.fq.gz)和样本元数据(result/metadata.txt)
**环境变量设置 Environment variable settings**
**分析前必须运行,设置数据库、软件和工作目录**
# Conda软件安装目录,`conda env list`查看,如/anaconda3
soft=~/miniconda3
# 数据库database(db)位置,如管理员/db,个人~/db
db=~/db
# 设置工作目录work directory(wd),如meta
wd=~/meta
# 创建并进入工作目录
mkdir -p $wd && cd $wd
# 创建3个常用子目录:序列,临时文件和结果
mkdir -p seq temp result
# 添加分析所需的软件、脚本至环境变量,添加至~/.bashrc中自动加载
PATH=$soft/bin:$soft/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$db/EasyMicrobiome/linux:$db/EasyMicrobiome/script
echo $PATH
**元数据和序列文件 Metadata and Sequence Files**
元数据
# 上传元数据metadata.txt至result目录,此处下载并重命名
wget http://www.imeta.science/github/EasyMetagenome/result/metadata.txt
mv metadata.txt result/metadata.txt
# 检查文件格式,^I为制表符,$为Linux换行,^M$为Windows回车,^M为Mac换行符
cat -A result/metadata.txt
# 根据样本文件生成元数据,可筛选子集,如EB开头
ls seq/EB*|grep '_1'|cut -f1 -d '_'|cut -f 2 -d '/'|sed'1 i SampleID'>result/metadataEB.txt
cp result/metadataEB.txt result/metadata.txt
# 元数据细节优化
# 转换Windows回车为Linux换行,去除空格
sed -i 's/\r//;s/ //g' result/metadata.txt
cat -A result/metadata.txt
序列文件
# 用户使用filezilla上传测序文件至seq目录,本次从网络下载
# seq 目录下已经有测试文件,下载跳过
cd seq/
awk '{system("wget -c http://www.imeta.science/github/EasyMetagenome/seq/"$1"_1.fq.gz")}' <(tail -n+2 ../result/metadata.txt)
awk '{system("wget -c http://www.imeta.science/github/EasyMetagenome/seq/"$1"_2.fq.gz")}' <(tail -n+2 ../result/metadata.txt)
cd ..
# ls查看文件大小,-l 列出详细信息 (l: list),-sh 显示人类可读方式文件大小 (s: size; h: human readable)
ls -lsh seq/*.fq.gz
# 统计
time seqkit stat seq/*.fq.gz > result/seqkit.txt
序列文件格式检查
zless/zcat查看可压缩文件,检查序列质量格式(质量值大写字母为标准Phred33格式,小写字母为Phred64,需参考附录:质量值转换);检查双端序列ID是否重名,如重名需要改名。参考**附录 —— 质控kneaddata,去宿主后双端不匹配;序列改名**。
# 设置某个样本名为变量i,以后再无需修改
i=C1
# zless查看压缩文件,空格翻页,q退出; head指定显示行数
zless seq/${i}_1.fq.gz | head -n4
**工作目录和文件结构总结**
# ├── pipeline.sh
# ├── result
# │ └── metadata.txt
# ├── seq
# │ ├── C1_1.fq.gz
# │ ├── ...
# │ └── N1_2.fq.gz
# └── temp
* 1pipeline.sh是分析流程代码;
* seq目录中有2个样本Illumina双端测序,4个序列文件;
* temp是临时文件夹,存储分析中间文件,结束可全部删除节约空间
* result是重要节点文件和整理化的分析结果图表,
* 实验设计metadata.txt也在此
## 1.2 Fastp质量控制 Quality Control
# 创建目录,记录软件版本和引文
mkdir -p temp/qc result/qc
fastp
# 单样本质控
i=C1
fastp -i seq/${i}_1.fq.gz -I seq/${i}_2.fq.gz \
-o temp/qc/${i}_1.fastq -O temp/qc/${i}_2.fastq
# 多样本并行,此步占用原始数据5x空间
# -j 2: 表示同时处理2个样本;j3,18s,8m
time tail -n+2 result/metadata.txt|cut -f1|rush -j 2 \
"fastp -i seq/{1}_1.fq.gz -I seq/{1}_2.fq.gz \
-j temp/qc/{1}_fastp.json -h temp/qc/{1}_fastp.html \
-o temp/qc/{1}_1.fastq -O temp/qc/{1}_2.fastq \
> temp/qc/{1}.log 2>&1"
# 质控后结果汇总
echo -e "SampleID\tRaw\tClean" > temp/fastp
for i in `tail -n+2 result/metadata.txt|cut -f1`;do
echo -e -n "$i\t" >> temp/fastp
grep 'total reads' temp/qc/${i}.log|uniq|cut -f2 -d ':'|tr '\n' '\t' >> temp/fastp
echo "" >> temp/fastp
done
sed -i 's/ //g;s/\t$//' temp/fastp
# 按metadata排序
awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$1]=$0}NR>FNR{print a[$1]}' temp/fastp result/metadata.txt \
> result/qc/fastp.txt
cat result/qc/fastp.txt
## 1.3 KneadData去宿主 Host removal
kneaddata是流程主要依赖bowtie2比对宿主,然后筛选非宿主序列用于下游分析。
# 创建目录、启动环境、记录版本
mkdir -p temp/hr
mkdir -p tmp
conda activate kneaddata
kneaddata --version # 0.12.0
多样品并行去宿主,此步占用原始数据5x空间,j5p3,18s3h;j3p16,18s1h
time tail -n+2 result/metadata.txt|cut -f1|rush -j 2 \
"sed '1~4 s/ 1:/.1:/;1~4 s/$/\/1/' temp/qc/{1}_1.fastq > tmp/{1}_1.fastq; \
sed '1~4 s/ 2:/.1:/;1~4 s/$/\/2/' temp/qc/{1}_2.fastq > tmp/{1}_2.fastq; \
kneaddata -i1 tmp/{1}_1.fastq -i2 tmp/{1}_2.fastq \
-o temp/hr --output-prefix {1} \
--bypass-trim --bypass-trf --reorder \
--bowtie2-options '--very-sensitive --dovetail' \
-db ${db}/kneaddata/human/hg37dec_v0.1 \
--remove-intermediate-output -v -t 3; \
rm tmp/{1}_1.fastq tmp/{1}_2.fastq"
# 查看大小,*匹配任意多个字符,?匹配任意一个字符
ls -shtr temp/hr/*_paired_?.fastq
简化改名
# Ubuntu系统改名
rename 's/paired_//' temp/hr/*.fastq
# CentOS系统改名
rename 'paired_' '' temp/hr/*.fastq
质控结果汇总
kneaddata_read_count_table --input temp/hr \
--output temp/kneaddata.txt
# 筛选重点结果列
cut -f 1,2,5,6 temp/kneaddata.txt | sed 's/_1_kneaddata//' > result/qc/sum.txt
# 对齐方式查看表格
csvtk -t pretty result/qc/sum.txt
校验ID是否配对
paste <(head -n40 temp/hr/`tail -n+2 result/metadata.txt|cut -f1|head -n1`_1.fastq|grep @) <(head -n40 temp/hr/`tail -n+2 result/metadata.txt|cut -f1|head -n1`_2.fastq|grep @)
大文件清理,高宿主含量样本可节约>90%空间
# 使用命令的绝对路径确保使用无参数的命令,管理员用alias自定义命令含参数,影响操作结果
/bin/rm -rf temp/hr/*contam* temp/hr/*unmatched* temp/hr/reformatted* temp/hr/_temp*
ls -l temp/hr/
# 确认去宿主结果后,可以删除质控后中间文件
rm temp/qc/*.fastq
# 二、基于读长分析 Read-based (HUMAnN3+MetaPhlAn4+Kraken2)
## 2.1 准备HUMAnN输入文件
HUMAnN要求双端序列合并的文件作为输入,for循环根据实验设计样本名批量双端序列合并。注意星号(\*)和问号(?),分别代表多个和单个字符。当然大家更不能溜号,行分割的代码行末有一个\\
mkdir -p temp/concat
# 双端合并为单个文件
for i in `tail -n+2 result/metadata.txt|cut -f1`;do
cat temp/hr/${i}_?.fastq \
> temp/concat/${i}.fq; done
# 查看样品数量和大小
ls -shl temp/concat/*.fq
# 数据太大,计算时间长,可用head对单端分析截取20M序列,即3G,行数为80M行,详见附录:HUMAnN2减少输入文件加速
## 2.2 HUMAnN计算物种和功能组成
* 物种组成调用MetaPhlAn4
* 输入文件:temp/concat/*.fq 每个样品质控后双端合并后的fastq序列
* 输出文件:temp/humann3/ 目录下
* C1_pathabundance.tsv
* C1_pathcoverage.tsv
* C1_genefamilies.tsv
* 整合后的输出:
* result/metaphlan4/taxonomy.tsv 物种丰度表
* result/metaphlan4/taxonomy.spf 物种丰度表(用于stamp分析)
* result/humann3/pathabundance_relab_unstratified.tsv 通路丰度表
* result/humann3/pathabundance_relab_stratified.tsv 通路物种组成丰度表
* stratified(每个菌对此功能通路组成的贡献)和unstratified(功能组成)
启动humann3环境,检查数据库配置
conda activate humann3
# 备选source加载指定环境
# source ~/miniconda3/envs/humann3/bin/activate
mkdir -p temp/humann3
humann --version # v3.7
humann_config
单样本1.25M PE150运行测试,8p,2.5M,1\~2h;0.2M, 34m;0.1M,30m;0.01M,25m;16p,18m
i=C1
# 3p,26m; 数据库使用ssd缩短到19m;16p,8m
time humann --input temp/concat/${i}.fq --output temp/humann3 --threads 3 --metaphlan-options '--bowtie2db /db/metaphlan4 --index mpa_vOct22_CHOCOPhlAnSGB_202212 --offline'
多样本并行计算,测试数据约30m,推荐16p,3h/6G;
# 如果服务器性能好,请设置--threads值为8/16/32
tail -n+2 result/metadata.txt | cut -f1 | rush -j 2 \
"humann --input temp/concat/{1}.fq \
--output temp/humann3/ --threads 3 --metaphlan-options '--bowtie2db /db/metaphlan4 --index mpa_vOct22_CHOCOPhlAnSGB_202212 --offline'"
# 移动重要文件至humann3目录
# $(cmd) 与 `cmd` 通常是等价的;`cmd`写法更简单,但要注意反引号是键盘左上角ESC下面的按键,$(cmd)更通用,适合嵌套使用
for i in $(tail -n+2 result/metadata.txt | cut -f1); do
mv temp/humann3/${i}_humann_temp/${i}_metaphlan_bugs_list.tsv temp/humann3/
done
# 删除临时文件,极占用空间
/bin/rm -rf temp/concat/* temp/humann3/*_humann_temp
(可选)单独运行MetaPhlAn4
mkdir -p temp/humann3
i=C1
# 仅物种注释极快4p, 2m, 1m读取数据库
time metaphlan --input_type fastq temp/qc/${i}_1.fastq \
temp/humann3/${i}.txt --bowtie2db /db/metaphlan4 --index mpa_vOct22_CHOCOPhlAnSGB_202212 --offline \
--nproc 4
## 2.3 物种组成表
**样品结果合并**
mkdir -p result/metaphlan4
# 合并、修正样本名、预览
merge_metaphlan_tables.py temp/humann3/*_metaphlan_bugs_list.tsv | \
sed 's/_metaphlan_bugs_list//g' | tail -n+2 | sed '1 s/clade_name/ID/' | sed '2i #metaphlan4'> result/metaphlan4/taxonomy.tsv
csvtk -t stat result/metaphlan4/taxonomy.tsv
head -n5 result/metaphlan4/taxonomy.tsv
**转换为stamp的spf格式**
# metaphlan4较2增加更多unclassified和重复结果,用sort和uniq去除
metaphlan_to_stamp.pl result/metaphlan4/taxonomy.tsv \
|sort -r | uniq > result/metaphlan4/taxonomy.spf
head result/metaphlan4/taxonomy.spf
# STAMP不支持unclassified,需要过滤掉再使用
grep -v 'unclassified' result/metaphlan4/taxonomy.spf > result/metaphlan4/taxonomy2.spf
head result/metaphlan4/taxonomy2.spf
# 下载metadata.txt和taxonomy2.spf使用stamp分析
## 2.4 功能组成分析
功能组成样本合并合并
mkdir -p result/humann3
humann_join_tables --input temp/humann3 \
--file_name pathabundance \
--output result/humann3/pathabundance.tsv
# 样本名调整:删除列名多余信息
sed -i 's/_Abundance//g' result/humann3/pathabundance.tsv
# 统计和预览
csvtk -t stat result/humann3/pathabundance.tsv
head -n5 result/humann3/pathabundance.tsv
标准化为相对丰度relab(1)或百万比cpm(1,000,000)
humann_renorm_table \
--input result/humann3/pathabundance.tsv \
--units relab \
--output result/humann3/pathabundance_relab.tsv
head -n5 result/humann3/pathabundance_relab.tsv
分层结果:功能和对应物种表(stratified)和功能组成表(unstratified)
humann_split_stratified_table \
--input result/humann3/pathabundance_relab.tsv \
--output result/humann3/
### 差异比较和柱状图
两样本无法组间比较,在pcl层面替换为HMP数据进行统计和可视化。
* 输入数据:通路丰度表格 result/humann3/pathabundance.tsv和实验设计 result/metadata.txt
* 中间数据:包含分组信息的通路丰度表格文件 result/humann3/pathabundance.pcl
* 输出结果:result/humann3/associate.txt
在通路丰度中添加分组
## 提取样品列表
head -n1 result/humann3/pathabundance.tsv | sed 's/# Pathway/SampleID/' | tr '\t' '\n' > temp/header
## 对应分组,本示例分组为第2列($2),根据实际情况修改
awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$1]=$2}NR>FNR{print a[$1]}' result/metadata.txt temp/header | tr '\n' '\t'|sed 's/\t$/\n/' > temp/group
# 合成样本、分组+数据
cat <(head -n1 result/humann3/pathabundance.tsv) temp/group <(tail -n+2 result/humann3/pathabundance.tsv) \
> result/humann3/pathabundance.pcl
head -n5 result/humann3/pathabundance.pcl
tail -n5 result/humann3/pathabundance.pcl
组间比较,样本量少无差异,结果为4列的文件:通路名字,通路在各个分组的丰度,差异P-value,校正后的Q-value。
演示数据2样本无法统计,此处替换为HMP的结果演示统计和绘图(上传hmp\_pathabund.pcl,替换pathabundance.pcl为hmp\_pathabund.pcl)。
wget -c http://www.imeta.science/github/EasyMetagenome/result/humann2/hmp_pathabund.pcl
/bin/cp -f hmp_pathabund.pcl result/humann3/
# 设置输入文件名
pcl=result/humann3/hmp_pathabund.pcl
# 统计表格行、列数量
csvtk -t stat ${pcl}
head -n3 ${pcl} | cut -f 1-5
# 按分组KW检验,注意第二列的分组列名
humann_associate --input ${pcl} \
--focal-metadatum Group --focal-type categorical \
--last-metadatum Group --fdr 0.05 \
--output result/humann3/associate.txt
wc -l result/humann3/associate.txt
head -n5 result/humann3/associate.txt
barplot展示通路的物种组成,如:腺苷核苷酸合成
# 指定差异通路,如 P163-PWY / 1CMET2-PWY,--sort sum metadata 按丰度和分组排序
path=P163-PWY
humann_barplot \
--input ${pcl} --focal-feature ${path} \
--focal-metadata Group --last-metadata Group \
--output result/humann3/barplot_${path}.pdf --sort sum metadata
### KEGG注释
支持GO、PFAM、eggNOG、level4ec、KEGG的D级KO等注释,详见`humann_regroup_table -h`。
# 转换基因家族为KO(uniref90_ko),可选eggNOG(uniref90_eggnog)或酶(uniref90_level4ec)
for i in `tail -n+2 result/metadata.txt|cut -f1`;do
humann_regroup_table \
-i temp/humann3/${i}_genefamilies.tsv \
-g uniref90_ko \
-o temp/humann3/${i}_ko.tsv
done
# 合并,并修正样本名
humann_join_tables \
--input temp/humann3/ \
--file_name ko \
--output result/humann3/ko.tsv
sed -i '1s/_Abundance-RPKs//g' result/humann3/ko.tsv
tail result/humann3/ko.tsv
# 与pathabundance类似,可进行标准化renorm、分层stratified、柱状图barplot等操作
# 分层结果:功能和对应物种表(stratified)和功能组成表(unstratified)
humann_split_stratified_table \
--input result/humann3/ko.tsv \
--output result/humann3/
wc -l result/humann3/ko*
# KO合并为高层次L2, L1通路代码KO to level 1/2/3
summarizeAbundance.py \
-i result/humann3/ko_unstratified.tsv \
-m ${db}/EasyMicrobiome/kegg/KO1-4.txt \
-c 2,3,4 -s ',+,+,' -n raw \
-o result/humann3/KEGG
wc -l result/humann3/KEGG*
## 2.5 GraPhlAn图
# metaphlan2 to graphlan
conda activate humann2
export2graphlan.py --skip_rows 1,2 -i result/metaphlan4/taxonomy.tsv \
--tree temp/merged_abundance.tree.txt \
--annotation temp/merged_abundance.annot.txt \
--most_abundant 1000 --abundance_threshold 20 --least_biomarkers 10 \
--annotations 3,4 --external_annotations 7
# 参数说明见PPT,或运行 export2graphlan.py --help
# graphlan annotation
graphlan_annotate.py --annot temp/merged_abundance.annot.txt \
temp/merged_abundance.tree.txt temp/merged_abundance.xml
# output PDF figure, annoat and legend
graphlan.py temp/merged_abundance.xml result/metaphlan4/graphlan.pdf \
--external_legends
# GraPhlAn Plot(测试中) duplicate 'row.names' are not allowed
graphlan_plot.r --input result/metaphlan4/taxonomy.spf \
--design result/metadata.txt --number 100 \
--group all --type heatmap \
--output result/metaphlan4/heatmap
## 2.6 LEfSe差异分析物种
* 输入文件:物种丰度表result/metaphlan2/taxonomy.tsv
* 输入文件:样品分组信息 result/metadata.txt
* 中间文件:整合后用于LefSe分析的文件 result/metaphlan2/lefse.txt,这个文件可以提供给www\.ehbio.com/ImageGP 用于在线LefSE分析
* LefSe结果输出:result/metaphlan2/目录下lefse开头和feature开头的文件
前面演示数据仅有2个样本,无法进行差异比较。下面使用result12目录中由12个样本生成的结果表进行演示
# 设置结果目录,自己的数据使用result,演示用result12
result=result12
# 如果没有,请下载演示数据
wget -c http://www.imeta.science/db/EasyMetagenome/result12.zip
unzip result12.zip
准备输入文件,修改样本品为组名(可手动修改)
# 提取样本行替换为每个样本一行,修改ID为SampleID
head -n1 $result/metaphlan2/taxonomy.tsv|tr '\t' '\n'|sed '1 s/ID/SampleID/' >temp/sampleid
head -n3 temp/sampleid
# 提取SampleID对应的分组Group(假设为metadata.txt中第二列$2),替换换行\n为制表符\t,再把行末制表符\t替换回换行
awk 'BEGIN{OFS=FS="\t"}NR==FNR{a[$1]=$2}NR>FNR{print a[$1]}' $result/metadata.txt temp/sampleid|tr '\n' '\t'|sed 's/\t$/\n/' >groupid
cat groupid
# 合并分组和数据(替换表头)
cat groupid <(tail -n+2 $result/metaphlan2/taxonomy.tsv) > $result/metaphlan2/lefse.txt
head -n3 $result/metaphlan2/lefse.txt
方法1. 推荐在线 <https://www.bic.ac.cn/ImageGP/> 中LEfSe一键分析
方法2. LEfSe命令行分析
conda activate lefse
result=result12
# 格式转换为lefse内部格式
lefse-format_input.py $result/metaphlan2/lefse.txt \
temp/input.in -c 1 -o 1000000
# 运行lefse(样本必须有重复和分组)
run_lefse.py temp/input.in temp/input.res
# 绘制物种树注释差异
lefse-plot_cladogram.py temp/input.res \
$result/metaphlan2/lefse_cladogram.pdf --format pdf
# 绘制所有差异features柱状图
lefse-plot_res.py temp/input.res \
$result/metaphlan2/lefse_res.pdf --format pdf
# 绘制单个features柱状图
# 查看显著差异features,按丰度排序
grep -v '-' temp/input.res | sort -k3,3n
# 手动选择指定feature绘图,如Firmicutes
lefse-plot_features.py -f one --format pdf \
--feature_name "k__Bacteria.p__Firmicutes" \
temp/input.in temp/input.res \
$result/metaphlan2/lefse_Firmicutes.pdf
# 批量绘制所有差异features柱状图
lefse-plot_features.py -f diff \
--archive none --format pdf \
temp/input.in temp/input.res \
$result/metaphlan2/lefse_
## 2.7 Kraken2+Bracken物种注释和丰度估计
Kraken2可以快速完成读长(read)层面的物种注释和定量,还可以进行重叠群(contig)、基因(gene)、宏基因组组装基因组(MAG/bin)层面的序列物种注释。
# 启动kraken2工作环境
conda activate kraken2.1.3
# 记录软件版本
kraken2 --version # 2.1.2
mkdir -p temp/kraken2
### Kraken2物种注释
输入:temp/qc/{1}_?.fastq 质控后的数据,{1}代表样本名;
参考数据库:-db ${db}/kraken2/pluspf16g/
输出结果:每个样本单独输出,temp/kraken2/中的{1}_report和{1}_output
整合物种丰度表输出结果:result/kraken2/taxonomy_count.txt
(可选) 单样本注释,5m,50G大数据库较5G库注释比例提高10~20%。以C1为例,在2023/3/14版中,8g: 31.75%; 16g: 52.35%; 150g: 71.98%;同为16g,2023/10/9版本为63.88%
# 根据电脑内存由小到大选择下面3个数据库
# pluspf16g/pluspf(55G)/pluspfp(120G)
type=pluspf16g
# demon sample
i=C1
time kraken2 --db ${db}/kraken2/${type}/ \
--paired temp/hr/${i}_?.fastq \
--threads 2 --use-names --report-zero-counts \
--report temp/kraken2/${i}.report \
--output temp/kraken2/${i}.output
多样本并行生成report,1样本8线程逐个运行,内存大但速度快,不建议用多任务并行
for i in `tail -n+2 result/metadata.txt | cut -f1`;do
kraken2 --db ${db}/kraken2/${type} \
--paired temp/hr/${i}_?.fastq \
--threads 2 --use-names --report-zero-counts \
--report temp/kraken2/${i}.report \
--output temp/kraken2/${i}.output; done
使用krakentools转换report为mpa格式
for i in `tail -n+2 result/metadata.txt | cut -f1`;do
kreport2mpa.py -r temp/kraken2/${i}.report \
--display-header -o temp/kraken2/${i}.mpa; done
合并样本为表格
mkdir -p result/kraken2
# 输出结果行数相同,但不一定顺序一致,要重新排序
tail -n+2 result/metadata.txt | cut -f1 | rush -j 1 \
'tail -n+2 temp/kraken2/{1}.mpa | LC_ALL=C sort | cut -f 2 | sed "1 s/^/{1}\n/" > temp/kraken2/{1}_count '
# 提取第一样本品行名为表行名
header=`tail -n 1 result/metadata.txt | cut -f 1`
echo $header
tail -n+2 temp/kraken2/${header}.mpa | LC_ALL=C sort | cut -f 1 | \
sed "1 s/^/Taxonomy\n/" > temp/kraken2/0header_count
head -n3 temp/kraken2/0header_count
# paste合并样本为表格
ls temp/kraken2/*count
paste temp/kraken2/*count > result/kraken2/tax_count.mpa
# 检查表格及统计
csvtk -t stat result/kraken2/tax_count.mpa
head -n 5 result/kraken2/tax_count.mpa
### Bracken丰度估计
参数简介:
* -d为数据库,-i为输入kraken2报告文件
* r是读长,此处为100,通常为150,o输出重新估计的值
* l为分类级,可选域D、门P、纲C、目O、科F、属G、种S级别丰度估计
* t是阈值,默认为0,越大越可靠,但可用数据越少
循环重新估计每个样品的丰度,请修改tax分别重新计算P和S各1次
mkdir -p temp/bracken
# 测序数据长度,通常为150,早期有100/75/50/25
readLen=150
# 20%样本中存在才保留
prop=0.2
# 设置分类级D,P,C,O,F,G,S,常用界D门P和属G种S
for tax in D P G S;do
# tax=S
for i in `tail -n+2 result/metadata.txt | cut -f1`;do
# i=C1
bracken -d ${db}/kraken2/${type}/ \
-i temp/kraken2/${i}.report \
-r ${readLen} -l ${tax} -t 0 \
-o temp/bracken/${i}.brk \
-w temp/bracken/${i}.report; done
# 需要确认行数一致才能按以下方法合并
wc -l temp/bracken/*.report
# bracken结果合并成表: 需按表头排序,提取第6列reads count,并添加样本名
tail -n+2 result/metadata.txt | cut -f1 | rush -j 1 \
'tail -n+2 temp/bracken/{1}.brk | LC_ALL=C sort | cut -f6 | sed "1 s/^/{1}\n/" \
> temp/bracken/{1}.count'
# 提取第一样本品行名为表行名
h=`tail -n1 result/metadata.txt|cut -f1`
tail -n+2 temp/bracken/${h}.brk | LC_ALL=C sort | cut -f1 | \
sed "1 s/^/Taxonomy\n/" > temp/bracken/0header.count
# 检查文件数,为n+1
ls temp/bracken/*count | wc
# paste合并样本为表格,并删除非零行
paste temp/bracken/*count > result/kraken2/bracken.${tax}.txt
# 统计行列,默认去除表头
csvtk -t stat result/kraken2/bracken.${tax}.txt
# 按频率过滤,-r可标准化,-e过滤(microbiome_helper)
Rscript ${db}/EasyMicrobiome/script/filter_feature_table.R \
-i result/kraken2/bracken.${tax}.txt \
-p ${prop} \
-o result/kraken2/bracken.${tax}.${prop}
# head result/kraken2/bracken.${tax}.${prop}
done
csvtk -t stat result/kraken2/bracken.?.txt
csvtk -t stat result/kraken2/bracken.?.$prop
个性化结果筛选
# 门水平去除脊索动物(人)
grep 'Chordata' result/kraken2/bracken.P.${prop}
grep -v 'Chordata' result/kraken2/bracken.P.${prop} > result/kraken2/bracken.P.${prop}-H
# 按物种名手动去除宿主污染,以人为例(需按种水平计算相关结果)
# 种水平去除人类P:Chordata,S:Homo sapiens
grep 'Homo sapiens' result/kraken2/bracken.S.${prop}
grep -v 'Homo sapiens' result/kraken2/bracken.S.${prop} \
> result/kraken2/bracken.S.${prop}-H
分析后清理每条序列的注释大文件
/bin/rm -rf temp/kraken2/*.output
#### 多样性和可视化
alpha多样性计算:Berger Parker’s (BP), Simpson’s (Si), inverse Simpson’s (ISi), Shannon’s (Sh) # Fisher’s (F)依赖scipy.optimize包,默认未安装
echo -e "SampleID\tBerger Parker\tSimpson\tinverse Simpson\tShannon" > result/kraken2/alpha.txt
for i in `tail -n+2 result/metadata.txt|cut -f1`;do
echo -e -n "$i\t" >> result/kraken2/alpha.txt
for a in BP Si ISi Sh;do
alpha_diversity.py -f temp/bracken/${i}.brk -a $a | cut -f 2 -d ':' | tr '\n' '\t' >> result/kraken2/alpha.txt
done
echo "" >> result/kraken2/alpha.txt
done
cat result/kraken2/alpha.txt
beta多样性计算
beta_diversity.py -i temp/bracken/*.brk --type bracken \
> result/kraken2/beta.txt
cat result/kraken2/beta.txt
Krona图
for i in `tail -n+2 result/metadata.txt|cut -f1`;do
kreport2krona.py -r temp/bracken/${i}.report -o temp/bracken/${i}.krona --no-intermediate-ranks
ktImportText temp/bracken/${i}.krona -o result/kraken2/krona.${i}.html
done
Pavian桑基图:https://fbreitwieser.shinyapps.io/pavian/ 在线可视化:,左侧菜单,Upload sample set (temp/bracken/*.report),支持多样本同时上传;Sample查看结果,Configure Sankey配置图样式,Save Network下载图网页
多样性分析/物种组成,详见3StatPlot.sh,Kraken2结果筛选序列见附录
# 三、组装分析流程 Assemble-based
## 组装
# 启动工作环境
conda activate megahit
### MEGAHIT组装Assembly
# 删除旧文件夹,否则megahit无法运行
# /bin/rm -rf temp/megahit
# 组装,10~30m,32p18s8h, TB级数据需几天至几周,MEGAHIT v1.2.9
time megahit -t 3 \
-1 `tail -n+2 result/metadata.txt|cut -f1|sed 's/^/temp\/hr\//;s/$/_1.fastq/'|tr '\n' ','|sed 's/,$//'` \
-2 `tail -n+2 result/metadata.txt|cut -f1|sed 's/^/temp\/hr\//;s/$/_2.fastq/'|tr '\n' ','|sed 's/,$//'` \
-o temp/megahit
# 统计大小通常300M~5G,如18s100G10h1.8G
# 如果contigs太多,可以按长度筛选,降低数据量,提高基因完整度,详见附录megahit
seqkit stat temp/megahit/final.contigs.fa
# 预览重叠群最前6行,前60列字符
head -n6 temp/megahit/final.contigs.fa | cut -c1-60
# 备份重要结果
mkdir -p result/megahit/
ln -f temp/megahit/final.contigs.fa result/megahit/
# 删除临时文件
/bin/rm -rf temp/megahit/intermediate_contigs
### (可选)metaSPAdes精细组装
# 精细但使用内存和时间更多,15~65m
mkdir -p temp/metaspades
/usr/bin/time -v -o metaspades.py.log metaspades.py -t 3 -m 100 \
`tail -n+2 result/metadata.txt|cut -f1|sed 's/^/temp\/qc\//;s/$/_1.fastq/'|sed 's/^/-1 /'| tr '\n' ' '` \
`tail -n+2 result/metadata.txt|cut -f1|sed 's/^/temp\/qc\//;s/$/_2.fastq/'|sed 's/^/-2 /'| tr '\n' ' '` \
-o temp/metaspades
# 查看软件时间User time和内存Maximum resident set size
cat metaspades.py.log
# 2.3M,contigs体积更大
ls -sh temp/metaspades/contigs.fasta
seqkit stat temp/metaspades/contigs.fasta
# 备份重要结果
mkdir -p result/metaspades/
ln -f temp/metaspades/contigs.fasta result/metaspades/
# 删除临时文件
/bin/rm -rf temp/metaspades
注:metaSPAdes支持二、三代混合组装,见附录,此外还有OPERA-MS组装二、三代方案
---
### QUAST评估
# QUAST评估,生成report文本tsv/txt、网页html、PDF等格式报告
quast.py result/megahit/final.contigs.fa \
-o result/megahit/quast -t 2
# (可选) megahit和metaspades比较
quast.py --label "megahit,metapasdes" \
result/megahit/final.contigs.fa \
result/metaspades/contigs.fasta \
-o result/quast
# (可选)metaquast评估,更全面,但需下载相关数据库,受网速影响可能时间很长(经常失败)
# metaquast based on silva, and top 50 species genome, 18min
time metaquast.py result/megahit/final.contigs.fa \
-o result/megahit/metaquast
## 3.2 基因预测、去冗余和定量Gene prediction, cluster & quantitfy
### metaProdigal基因预测Gene prediction
# 输入文件:组装的序列 result/megahit/final.contigs.fa
# 输出文件:prodigal预测的基因序列 temp/prodigal/gene.fa
# 基因大,可参考附录prodigal拆分基因文件,并行计算
mkdir -p temp/prodigal
# prodigal的meta模式预测基因,>和2>&1记录分析过程至gene.log。1.8G1.5h
time prodigal -i result/megahit/final.contigs.fa \
-d temp/prodigal/gene.fa \
-o temp/prodigal/gene.gff \
-p meta -f gff > temp/prodigal/gene.log 2>&1
# 查看日志是否运行完成,有无错误
tail temp/prodigal/gene.log
# 统计基因数量,6G18s3M
seqkit stat temp/prodigal/gene.fa
# 统计完整基因数量,数据量大可只用完整基因部分
grep -c 'partial=00' temp/prodigal/gene.fa
# 提取完整基因(完整片段获得的基因全为完整,如成环的细菌基因组)
grep 'partial=00' temp/prodigal/gene.fa | cut -f1 -d ' '| sed 's/>//' > temp/prodigal/full_length.id
seqkit grep -f temp/prodigal/full_length.id temp/prodigal/gene.fa > temp/prodigal/full_length.fa
seqkit stat temp/prodigal/full_length.fa
### cd-hit基因聚类/去冗余cluster & redundancy
# 输入文件:prodigal预测的基因序列 temp/prodigal/gene.fa
# 输出文件:去冗余后的基因和蛋白序列:result/NR/nucleotide.fa, result/NR/protein.fa
mkdir -p result/NR
# aS覆盖度,c相似度,G局部比对,g最优解,T多线程,M内存0不限制
# 2万基因2m,3M384p15m,2千万需要2000h,多线程可加速
cd-hit-est -i temp/prodigal/gene.fa \
-o result/NR/nucleotide.fa \
-aS 0.9 -c 0.95 -G 0 -g 0 -T 0 -M 0
# 统计非冗余基因数量,单次拼接结果数量下降不大,如3M-2M,多批拼接冗余度高
grep -c '>' result/NR/nucleotide.fa
# 翻译核酸为对应蛋白序列, --trim去除结尾的*
seqkit translate --trim result/NR/nucleotide.fa \
> result/NR/protein.fa
# 两批数据去冗余使用cd-hit-est-2d加速,见附录
### salmon基因定量quantitfy
# 输入文件:去冗余后的基因序列:result/NR/nucleotide.fa
# 输出文件:Salmon定量:result/salmon/gene.count, gene.TPM
mkdir -p temp/salmon
salmon -v # 1.8.0
# 建索引, -t序列, -i 索引,10s
salmon index -t result/NR/nucleotide.fa \
-p 3 -i temp/salmon/index
# 定量,l文库类型自动选择,p线程,--meta宏基因组
i=C1
salmon quant -i temp/salmon/index -l A -p 8 --meta \
-1 temp/hr/${i}_1.fastq -2 temp/hr/${i}_2.fastq \
-o temp/salmon/${i}.quant
# 2个任务并行, 18s30m
time tail -n+2 result/metadata.txt | cut -f1 | rush -j 2 \
"salmon quant -i temp/salmon/index -l A -p 3 --meta \
-1 temp/hr/{1}_1.fastq -2 temp/hr/{1}_2.fastq \
-o temp/salmon/{1}.quant"
# 合并
mkdir -p result/salmon
salmon quantmerge --quants temp/salmon/*.quant \
-o result/salmon/gene.TPM
salmon quantmerge --quants temp/salmon/*.quant \
--column NumReads -o result/salmon/gene.count
sed -i '1 s/.quant//g' result/salmon/gene.*
# 预览结果表格
head -n3 result/salmon/gene.*
## 3.3 功能基因注释Functional gene annotation
# 输入数据:上一步预测的蛋白序列 result/NR/protein.fa
# 中间结果:temp/eggnog/protein.emapper.seed_orthologs
# temp/eggnog/output.emapper.annotations
# temp/eggnog/output
# COG定量表:result/eggnog/cogtab.count
# result/eggnog/cogtab.count.spf (用于STAMP)
# KO定量表:result/eggnog/kotab.count
# result/eggnog/kotab.count.spf (用于STAMP)
# CAZy碳水化合物注释和定量:result/dbcan3/cazytab.count
# result/dbcan3/cazytab.count.spf (用于STAMP)
# 抗生素抗性:result/resfam/resfam.count
# result/resfam/resfam.count.spf (用于STAMP)
# 这部分可以拓展到其它数据库
### eggNOG基因注释gene annotation(COG/KEGG/CAZy)
软件主页:https://github.com/eggnogdb/eggnog-mapper
# 运行并记录软件版本
conda activate eggnog
emapper.py --version
# emapper-2.1.7 / Expected eggNOG DB version: 5.0.2
# Diamond version found: diamond version 2.0.15
# 运行emapper,18m,默认diamond 1e-3; 2M,32p,1.5h
mkdir -p temp/eggnog
time emapper.py --data_dir ${db}/eggnog \
-i result/NR/protein.fa --cpu 3 -m diamond --override \
-o temp/eggnog/output
# 格式化结果并显示表头
grep -v '^##' temp/eggnog/output.emapper.annotations | sed '1 s/^#//' \
> temp/eggnog/output
csvtk -t headers -v temp/eggnog/output
# 生成COG/KO/CAZy丰度汇总表
mkdir -p result/eggnog
# 显示帮助
summarizeAbundance.py -h
# 汇总,7列COG_category按字母分隔,12列KEGG_ko和19列CAZy按逗号分隔,原始值累加
summarizeAbundance.py \
-i result/salmon/gene.TPM \
-m temp/eggnog/output --dropkeycolumn \
-c '7,12,19' -s '*+,+,' -n raw \
-o result/eggnog/eggnog
sed -i 's#^ko:##' result/eggnog/eggnog.KEGG_ko.raw.txt
sed -i '/^-/d' result/eggnog/eggnog*
head -n3 result/eggnog/eggnog*
# eggnog.CAZy.raw.txt eggnog.COG_category.raw.txt eggnog.KEGG_ko.raw.txt
# 添加注释生成STAMP的spf格式
awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]=$2} NR>FNR{print a[$1],$0}' \
${db}/EasyMicrobiome/kegg/KO_description.txt \
result/eggnog/eggnog.KEGG_ko.raw.txt | \
sed 's/^\t/Unannotated\t/' \
> result/eggnog/eggnog.KEGG_ko.TPM.spf
head -n 5 result/eggnog/eggnog.KEGG_ko.TPM.spf
# KO to level 1/2/3
summarizeAbundance.py \
-i result/eggnog/eggnog.KEGG_ko.raw.txt \
-m ${db}/EasyMicrobiome/kegg/KO1-4.txt \
-c 2,3,4 -s ',+,+,' -n raw --dropkeycolumn \
-o result/eggnog/KEGG
head -n3 result/eggnog/KEGG*
# CAZy
awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]=$2} NR>FNR{print a[$1],$0}' \
${db}/EasyMicrobiome/dbcan2/CAZy_description.txt result/eggnog/eggnog.CAZy.raw.txt | \
sed 's/^\t/Unannotated\t/' > result/eggnog/eggnog.CAZy.TPM.spf
head -n 3 result/eggnog/eggnog.CAZy.TPM.spf
# COG
awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]=$2"\t"$3} NR>FNR{print a[$1],$0}' \
${db}/EasyMicrobiome/eggnog/COG.anno result/eggnog/eggnog.COG_category.raw.txt > \
result/eggnog/eggnog.COG_category.TPM.spf
head -n 3 result/eggnog/eggnog.COG_category.TPM.spf
### CAZy碳水化合物酶
# 比对CAZy数据库, 用时2~18m
mkdir -p temp/dbcan3 result/dbcan3
# --sensitive慢10倍,dbcan3e值为1e-102,此处以1e-3演示
time diamond blastp \
--db ${db}/dbcan3/CAZyDB \
--query result/NR/protein.fa \
--threads 2 -e 1e-3 --outfmt 6 --max-target-seqs 1 --quiet \
--out temp/dbcan3/gene_diamond.f6
wc -l temp/dbcan3/gene_diamond.f6
# 提取基因与dbcan分类对应表,按Evalue值过滤,推荐1e-102,此处演示1e-3为了有足够结果
format_dbcan2list.pl \
-i temp/dbcan3/gene_diamond.f6 \
-e 1e-3 \
-o temp/dbcan3/gene.list
# 按对应表累计丰度,依赖
summarizeAbundance.py \
-i result/salmon/gene.TPM \
-m temp/dbcan3/gene.list \
-c 2 -s ',' -n raw --dropkeycolumn \
-o result/dbcan3/TPM
# 添加注释生成STAMP的spf格式,结合metadata.txt进行差异比较
awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]=$2} NR>FNR{print a[$1],$0}' \
${db}/EasyMicrobiome/dbcan2/CAZy_description.txt result/dbcan3/TPM.CAZy.raw.txt | \
sed 's/^\t/Unannotated\t/' \
> result/dbcan3/TPM.CAZy.raw.spf
head result/dbcan3/TPM.CAZy.raw.spf
# 检查未注释数量,有则需要检查原因
grep 'Unannotated' result/dbcan3/TPM.CAZy.raw.spf|wc -l
### CARD耐药基因
CARD在线分析平台:https://card.mcmaster.ca/
本地软件使用教程: https://github.com/arpcard/rgi
参考文献:http://doi.org/10.1093/nar/gkz935
结果说明:protein.json,在线可视化;protein.txt,注释基因列表
mkdir -p result/card
# 启动rgi环境和记录版本
conda activate rgi6
rgi main -v # 6.0.3
# 简化蛋白ID
cut -f 1 -d ' ' result/NR/protein.fa > temp/protein.fa
# 这个错误忽略即可,不是报错,没有任何影响 grep: 写错误: 断开的管道
grep '>' result/NR/protein.fa | head -n 3
grep '>' temp/protein.fa | head -n 3
# 蛋白层面注释ARG
# rgi load -i $db/card/card.json --card_annotation $db/card/card.fasta
time rgi main -i temp/protein.fa -t protein \
-n 9 -a DIAMOND --include_loose --clean \
-o result/card/protein
head -n3 result/card/protein.txt
# WARNING baeR ---> hsp.bits: 140.6 <class 'float'> ? <class 'str'> Exception : <class 'KeyError'> -> '2885' -> Model(2885) missing in database. Please generate new database.
# 新版软件与数据库bug,不影响主体结果
# (可选)基因层面注释ARG
cut -f 1 -d ' ' result/NR/nucleotide.fa > temp/nucleotide.fa
grep '>' temp/nucleotide.fa | head -n3
rgi main -i temp/nucleotide.fa -t contig \
-n 9 -a DIAMOND --include_loose --clean \
-o result/card/nucleotide
head -n3 result/card/nucleotide.txt
# (可选)重叠群层面注释ARG
cut -f 1 -d ' ' result/megahit/final.contigs.fa > temp/contigs.fa
grep '>' temp/contigs.fa | head -n3
rgi main -i temp/contigs.fa -t contig \
-n 9 -a DIAMOND --include_loose --clean \
-o result/card/contigs
head result/card/contigs.txt
## 3.4 Kraken2基因物种注释
# Generate report in default taxid output
conda activate kraken2
# 16g 48.5%, pf 60.4%, pfp 62.6%
kraken2 --db ${db}/kraken2/pluspf16g \
result/NR/nucleotide.fa \
--threads 3 \
--report temp/NRgene.report \
--output temp/NRgene.output
# Genes & taxid list
grep '^C' temp/NRgene.output | cut -f 2,3 | sed '1 i Name\ttaxid' \
> temp/NRgene.taxid
# Add taxonomy
awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$1]=$0} NR>FNR{print $1,a[$2]}' \
$db/EasyMicrobiome/kraken2/taxonomy.txt \
temp/NRgene.taxid > result/NR/nucleotide.tax
conda activate eggnog
summarizeAbundance.py \
-i result/salmon/gene.TPM \
-m result/NR/nucleotide.tax --dropkeycolumn \
-c '2,3,4,5,6,7,8,9' -s ',+,+,+,+,+,+,+,' -n raw \
-o result/NR/tax
wc -l result/NR/tax*|sort -n
# 四、分箱挖掘单菌基因组Binning
## 4.1 MetaWRAP混合样本分箱 Samples binning
主页:https://github.com/bxlab/metaWRAP
教程: https://github.com/bxlab/metaWRAP/blob/master/Usage_tutorial.md
挖掘单菌基因组,需要研究对象复杂度越低、测序深度越大,结果质量越好。要求单样本6GB+,复杂样本如土壤推荐数据量30GB+,至少3个样本
演示数据12个样仅140MB,无法获得单菌基因组,这里使用官方测序数据演示讲解
软件和数据库布置需1-3天,演示数据分析过程超10h,30G样也需1-30天,由服务器性能决定。
# 设置并进入工作目录
wd=~/meta/binning
mkdir -p ${wd} && cd ${wd}
# 初始化项目
mkdir -p temp/hr seq result
# 启动metawrap环境
conda activate metawrap
### 数据和环境变量 Data and enviroment
这里基于质控clean数据和拼接好的重叠群contigs,基于上游结果继续分析。由于上游测试数据过小,分箱无结果。 本次采用软件推荐的7G数据,我们进入一个新文件夹开展分析。
输入输出文件介绍:
# 输入:质控后序列,文件名格式为*_1.fastq和*_2.fastq,temp/qc 目录下,如C1_1.fastq、C1_2.fastq
# 组装的重叠群文件:result/megahit/final.contigs.fa
# 输出:
# Binning结果:temp/binning
# 提纯后的Bin统计结果:temp/bin_refinement/metawrap_50_10_bins.stats
# Bin定量结果文件和图:binning/temp/bin_quant/bin_abundance_table.tab 和 bin_abundance_heatmap.png
# Bin物种注释:binning/temp/bin_classify/bin_taxonomy.tab
# Prokka基因预测:binning/temp/bin_annotate/prokka_out/bin.*.ffn 核酸序列
# Bin可视化图表:binning/temp/bloblogy/final.contigs.binned.blobplot (数据表) 和 blobplot_figures (可视化图)
准备输入文件:原始数据+组装结果
# 质控后数据位于temp/qc中,此处需下载并解压
# 方法1. 直接拷贝
/bin/cp -rf /db/metawrap/*.fastq ~/meta/binning/temp/hr/