cellranger使用的初步探索(2)理解cellranger count輸出文件

在上一篇筆記的結尾處,提到了cellranger count這一步,之前幾天我一直是用的服務器裏128G和200G的內存試着運行這一步,並且限制了cores的數量(64),但是在24小時之內都沒有處理完SRR7722937這一個樣品的fastq文件(在服務器裏跑程序需要設置運行時間)。這次我取消了內存以及cores的數量限制(這時cellranger會耗盡幾乎所有的可用內存,大概將近300個G),並且把運行時間的限制從24小時改成了5天:

$ cellranger count \
          --id=Tumor937 
          --transcriptome=/gpfs/home/practice/10_genomics_genome/GRCh38 \ 
          --fastqs=/gpfs/home/practice \ 
          --sample=SRR7722937
          --expect-cells=10000 

這次的嘗試成功的跑完了一個樣品,總共運行時間爲2天8個小時。打開log文件可以看到程序運行過程中記錄了很多條記錄,大概有上百行記錄,在記錄的最後幾行,會出現運行的總結,說明你的cellranger count運行成功:

Outputs:
- Run summary HTML:                      /gpfs/home/practice/Tumor937/outs/web_summary.html
- Run summary CSV:                       /gpfs/home/practice/Tumor937/outs/metrics_summary.csv
- BAM:                                   /gpfs/home/practice/Tumor937/outs/possorted_genome_bam.bam
- BAM index:                             /gpfs/home/practice/Tumor937/outs/possorted_genome_bam.bam.bai
- Filtered gene-barcode matrices MEX:    /gpfs/home/practice/Tumor937/outs/filtered_gene_bc_matrices
- Filtered gene-barcode matrices HDF5:   /gpfs/home/practice/Tumor937/outs/filtered_gene_bc_matrices_h5.h5
- Unfiltered gene-barcode matrices MEX:  /gpfs/home/practice/Tumor937/outs/raw_gene_bc_matrices
- Unfiltered gene-barcode matrices HDF5: /gpfs/home/practice/Tumor937/outs/raw_gene_bc_matrices_h5.h5
- Secondary analysis output CSV:         /gpfs/home/practice/Tumor937/outs/analysis
- Per-molecule read information:         /gpfs/home/practice/Tumor937/outs/molecule_info.h5
- Loupe Cell Browser file:               /gpfs/home/practice/Tumor937/outs/cloupe.cloupe

Waiting 6 seconds for UI to do final refresh.
Pipestance completed successfully!

Saving pipestance info to Tumor937/Tumor937.mri.tgz

打開我們在cellranger count代碼裏設置的文件夾Tumor937,裏面有以下文件:

$ ll
total 4820
-rw------- 1 fy04 fy04     267 Aug  4 20:35 _cmdline
-rw------- 1 fy04 fy04   48206 Aug  4 20:35 _filelist
-rw------- 1 fy04 fy04  725168 Aug  4 20:35 _finalstate
-rw------- 1 fy04 fy04     655 Aug  2 12:01 _invocation
-rw------- 1 fy04 fy04       5 Aug  2 12:01 _jobmode
-rw------- 1 fy04 fy04  246834 Aug  4 20:35 _log
-rw------- 1 fy04 fy04   46606 Aug  2 12:01 _mrosource
drwx------ 5 fy04 fy04    8192 Aug  4 20:35 outs #重點關注這個文件夾
-rw------- 1 fy04 fy04  324837 Aug  4 20:35 _perf
drwx------ 5 fy04 fy04    8192 Aug  4 20:34 SC_RNA_COUNTER_CS
-rw------- 1 fy04 fy04   12160 Aug  4 20:35 _sitecheck
-rw------- 1 fy04 fy04       2 Aug  2 12:01 _tags
-rw------- 1 fy04 fy04      51 Aug  4 20:35 _timestamp
-rw------- 1 fy04 fy04 3164754 Aug  4 20:35 Tumor937.mri.tgz
-rw------- 1 fy04 fy04      36 Aug  2 12:01 _uuid
-rw------- 1 fy04 fy04  102558 Aug  4 20:35 _vdrkill
-rw------- 1 fy04 fy04      61 Aug  2 12:01 _versions

再打開“outs”文件夾:

$ ll
total 3264857
drwx------ 6 fy04 fy04       8192 Aug  4 20:35 analysis
-rw------- 1 fy04 fy04   27898707 Aug  4 20:35 cloupe.cloupe #這個文件可以使用Loupe Cell Browser軟件打開
drwx------ 3 fy04 fy04       8192 Aug  4 20:35 filtered_gene_bc_matrices
-rw------- 1 fy04 fy04    7247168 Aug  4 16:04 filtered_gene_bc_matrices_h5.h5 #過濾後的基因-barcode矩陣,HDF5格式
-rw------- 1 fy04 fy04        684 Aug  4 20:34 metrics_summary.csv #csv格式的結果總結
-rw------- 1 fy04 fy04  105930133 Aug  4 17:47 molecule_info.h5 #之後如果需要aggr整合幾個單細胞測序的樣品,這個文件是aggr步驟的輸入文件
-rw------- 1 fy04 fy04 3182359671 Aug  4 15:59 possorted_genome_bam.bam #比對到基因組和轉錄本上的reads,並且帶有barcode註釋信息
-rw------- 1 fy04 fy04    3949040 Aug  4 16:00 possorted_genome_bam.bam.bai #possorted_genome_bam.bam的索引文件
drwx------ 3 fy04 fy04       8192 Aug  4 20:35 raw_gene_bc_matrices #沒有過濾的基因-barcode矩陣,包括所有的barcode
-rw------- 1 fy04 fy04   12085113 Aug  4 16:02 raw_gene_bc_matrices_h5.h5
-rw------- 1 fy04 fy04    3530757 Aug  4 20:34 web_summary.html #網頁版的運行結果總結,可以使用任何一個瀏覽器查看

解讀cellranger count的輸出文件

(1)web_summary.html文件

一旦cellranger count運行完畢,你可以通過這個文件在瀏覽器裏查看你的結果總結。你也可以使用Loupe Cell Browser軟件查看“outs”文件夾裏的.cloupe文件。下面這個截屏就是總結,裏面記錄了測序質量和檢測到的細胞的一些特徵值。包括檢測到的細胞數量,每個細胞的平均reads數,每個細胞檢測到的平均基因數(上方的綠色的三個數字)。右面的曲線圖顯示的是barcode的計數分佈,以及哪些barcode對應的相關細胞。Y軸是map到每一個barcode的UMI的計數數值,X軸是對應到這個數值的barcode的數量。這條曲線要有一個急劇下降的趨勢纔是好的結果,說明細胞barcode在細胞和“空樣品”間的差異非常明顯。這個曲線圖下面的“Fraction reads in cells”這一項比例需要大於70%,說明數據纔是質量好的。

上面這個網頁的左上角,有一個“ANALYSIS”的選項,點開看,會出現下面這個頁面:

這個頁面裏包括以下幾個部分:
(1)t-SNE降維分析
(2)自動生成的聚類分析(根據表達譜裏相似表達的基因)
(3)一個差異基因列表,是根據自動生成的聚類來生成的差異基因
(4)一個測序飽和度的曲線
(5)每個細胞裏測得的基因數量的曲線

上面圖裏左邊的圖是一個二維的t-SNE,每一個點就是一個細胞,根據細胞裏含有的UMI數量來區分顏色。這張圖也說明了細胞內RNA含量,也通常與細胞大小有關。紅色的點代表這個細胞有着更多的RNA含量。在這個座標系裏,兩個離得很近的點有着更爲相似的基因表達模式(相比於兩個離得較遠的點)。

而上面的右邊的是一個聚類的圖,你可以通過改變右上角的clustering type,來改變聚類的參數:

這個頁面的中部的表就是差異基因列表:

再往下兩張圖就是測序飽和度(通常也指示文庫的複雜度),以及平均每個細胞裏測得的基因,這兩張圖都可以說明測序深度:

(2)bam文件

在“outs”文件夾裏,有一個bam文件,是根據我們的fastq文件生成的:

$ samtools view possorted_genome_bam.bam | head -5
SRR7722937.377377       16      1       10232   255     4S94M   *       0       0       TTTTCCCTATCCCTAACCCTAACCCTATCCCCTTACCCCTAACCCTAACCCTAACCCTAACCCCAACCCCAACCCCAACCCCAACCCCTACCCCAACC    .<.<..<<...<.<...G<...A.<....AGG<.GGGGA<.<GGGG<<GGGGGGGIGGG<GGA<.<AAA.<<GA<A<<AGAAA<GA<<..<.<..<AG    NH:i:1  HI:i:1  AS:i:72 nM:i:10 RE:A:I  BC:Z:TTTCATGA   QT:Z:GGGGGIII CR:Z:CTTACCGAGTGTACCT   CY:Z:GGGGGIIIIIIIIIII   CB:Z:CTTACCGAGTGTACCT-1 UR:Z:TTTCCATCGT UY:Z:IIIIIIIIIG UB:Z:TTTCCATCGT       RG:Z:Tumor937:MissingLibrary:1:HKMNCBCXY:1
SRR7722937.10911097     256     1       11201   0       1S97M   *       0       0       GGCTTGCTCACGGTGCTGTGCCAGGGCGCCCCCTGCTGGCGACTAGGGCAACTGCAGGGCTCTCTTGCTTAGACTGGTGGCCAGCGCCCCCTGCTGGC    .AG...GAGGIIGGGGGGGGIGGGGIIIIGGGGGIIIIIIIIGGGIGGIGGGIIIIIGIAGAAGAAGGGGGGGGIGGGGGGG<<.AAAGGIGAGAAA<    NH:i:5  HI:i:2  AS:i:93 nM:i:1  RE:A:I  BC:Z:ACGTCCCT   QT:Z:GGGGGIII CR:Z:CACCACTGTCCATGAT   CY:Z:GGGGGIIIIGIIIIII   CB:Z:CACCACTGTCCATGAT-1 UR:Z:GAGCGCGGGC UY:Z:IIIIIIIIII UB:Z:GAGCGCGGGC       RG:Z:Tumor937:MissingLibrary:1:HKMNCBCXY:1
SRR7722937.27657393     256     1       11208   0       98M     *       0       0       CACGGTGCTGTGCCAGGGCGCCCCCTGCTGGCGACTAGGGCAACTGCAGGGCTCTCTTGCTTAGAGTGGTGGCCAGCGCCCCCTGCTGGCGCCGGGGC    <.A...7A..<<.<GGG.G<AAAGGGIIIGGIIIGIGAA<GG.GGAGGGGGGGGIGGIIIGGAGG.<GGGGAGAAGAGGI<AAAGGAGGGAAA.<A..    NH:i:5  HI:i:3  AS:i:96 nM:i:0  RE:A:I  BC:Z:GAAGGAAC   QT:Z:GGGGGIII CR:Z:AGTGAGGGTCAGGACA   CY:Z:GGGGGIIIIIIIIIII   CB:Z:AGTGAGGGTCAGGACA-1 UR:Z:CAGAACACCA UY:Z:IIIIIIIIII UB:Z:CAGAACACCA       RG:Z:Tumor937:MissingLibrary:1:HKMNCBCXY:1
SRR7722937.33049902     256     1       11285   0       98M     *       0       0       GCCCCCTGCTGGCGCCGGGGCACTGCAGGGCCCTCTTGCTTACTGTATAGTGGTGGCACGCCGCCTGCTGGCAGCTAGGGACATTGCAGGGTCCTCTT    AGAGAA<AG.<AA.AGGGGGIGGGGGGGGGGGGGIGGIIGIIGGG<<AGGGAGGGGGAGGGAG<AGGGGGGIGG.GAGAAAA.GGGG.AGGGGGAA.G    NH:i:5  HI:i:2  AS:i:96 nM:i:0  RE:A:I  BC:Z:GAAGGAAC   QT:Z:GGGGGIII CR:Z:ATTACTCTCCCTTGTG   CY:Z:GGGGAIIIIIIIIIII   CB:Z:ATTACTCTCCCTTGTG-1 UR:Z:CAATATCCCC UY:Z:IGGGIIIIII UB:Z:CAATATCCCC       RG:Z:Tumor937:MissingLibrary:1:HKMNCBCXY:1
SRR7722937.33235779     256     1       11292   0       97M1S   *       0       0       GCTGGCGCCGGGGCACTGCAGGGCCCTCTTGCTTACTGTATAGTGGTGGCACGCCGCCTGCTGGCAGCTAGGGACATTGCAGGGTCCTCTTGCTCAAA    GGGA...<A<<AGGGGGGAGAGGAGGIIIGIIIIGGGIGGIIIIIIIIGIGGIGGGGAGGGGGGIGGAGGA<GGGGGGGGGGI<GGGGGIIIAAGGG.    NH:i:6  HI:i:3  AS:i:95 nM:i:0  RE:A:I  BC:Z:GAAGGAAC   QT:Z:GGGGGIII CR:Z:TGCCCTAGTAGTAGTA   CY:Z:GGGGAIIIIIGGGIII   CB:Z:TGCCCTAGTAGTAGTA-1 UR:Z:GTCAGAAGTG UY:Z:IIIIIIIIII UB:Z:GTCAGAAGTG       RG:Z:Tumor937:MissingLibrary:1:HKMNCBCXY:1

這個bam文件有25列,前11列是標準的bam文件的內容,後面的14列是cellranger count生成的bam文件特有的,這25列分別是:

(3)矩陣文件

運行cellranger count後會自動生成的二級分析結果,但是一般來說,我們通常是拿到基因表達矩陣後,自己在R裏進行後續的分析。
參考文章:https://davetang.org/muse/2018/08/09/getting-started-with-cell-ranger/

在“outs”文件夾裏,有一個名爲raw_gene_bc_matrices的文件夾:

#包含3個文件:
$ tree
.
└── GRCh38
    ├── barcodes.tsv
    ├── genes.tsv
    └── matrix.mtx

這3個文件你可以在R裏用DropletUtils包直接加載,生成一個SingleCellExperiment對象:

> BiocManager::install("DropletUtils")
> library("DropletUtils")
> sce <- read10xCounts('raw_gene_bc_matrices/GRCh38/')
> sce
class: SingleCellExperiment 
dim: 33694 737280 
metadata(1): Samples
assays(1): counts
rownames(33694): ENSG00000243485 ENSG00000237613 ...
  ENSG00000277475 ENSG00000268674
rowData names(2): ID Symbol
colnames: NULL
colData names(2): Sample Barcode
reducedDimNames(0):
spikeNames(0):
altExpNames(0):

barcodeRanks函數可以把barcode按照總UMI計數來排序:

> br.out <- barcodeRanks(counts(sce))
> library("dplyr")
> br.out.df <- as.data.frame(br.out)
> br.out.df$barcode <- colData(sce)$Barcode
> br.out.df$knee <- br.out@metadata[["knee"]]
> br.out.df$inflection <- br.out@metadata[["inflection"]]
> br.out.df %>%
  filter(rank <= 10) %>%
  arrange(rank)

    rank total   fitted            barcode knee inflection
1     1 40819       NA CAGGTGCAGCGCTTAT-1 2843       1282
2     2 39401       NA AACTCAGGTTACGGAG-1 2843       1282
3     3 38740       NA CTGATAGTCACCAGGC-1 2843       1282
4     4 36129       NA TTAACTCAGACACTAA-1 2843       1282
5     5 34162       NA GTATCTTCATGCTAGT-1 2843       1282
6     6 33527       NA TTCTCAATCGTACGGC-1 2843       1282
7     7 32814       NA CTCGTACAGCACGCCT-1 2843       1282
8     8 31075       NA ATGTGTGGTCTGGTCG-1 2843       1282
9     9 30447 30753.25 CTCGAGGTCGCGATCG-1 2843       1282
10   10 30439 29994.15 AACCGCGCAGACGCCT-1 2843       1282

我們可以自己畫一個barcode vs UMI的點圖,就像網頁版結果總結裏的曲線圖那樣:

> library(ggplot2)
> x_knee <- br.out.df %>% filter(br.out.df$total > br.out.df$knee) %>% arrange(total) %>% select(rank) %>% head(1)
> x_inflection <- br.out.df %>% filter(br.out.df$total > br.out.df$inflection) %>% > arrange(total) %>% select(rank) %>% head(1)
> padding <- length(br.out$rank) / 10

> p1 <- ggplot(br.out.df, aes(x = rank, y = total)) +
  geom_point() +
  scale_x_log10() +
  scale_y_log10() +
  theme_bw() +
  theme(axis.text = element_text(size = 10),
        axis.title = element_text(size = 14),
        title = element_text(size = 16)) +
  geom_hline(yintercept = br.out$knee, linetype = 2, colour = "dodgerblue") +
  geom_hline(yintercept = br.out$inflection, linetype = 2, colour = "forestgreen") +
  labs(x = "Rank", y = "Total", title = "Barcode Rank vs Total UMI") +
  annotate("text", label = paste0("Knee (", x_knee, ")"), x = x_knee$rank + padding, y = br.out.df$knee, size = 5) +
  annotate("text", label = paste0("Inflection (", x_inflection, ")"), x = x_inflection$rank + padding, y = br.out.df$inflection, size = 5)
> p1

NOTE:我運行的cellranger版本是2.2的,現在最新版已經是cellranger3了,所以結果部分可能會有些出入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章