案例 · 科研软件
GMMGenomics Metadata Multiplexing
一个小小的 R Shiny 应用,把实验室的孔板布局、细胞分选仪文件和引物清单合成一张样本表,不用再手工拼接。
WEHI 研究软件工程师,2024 年 2 月至 7 月
要解决的问题
WEHI 的部分单细胞 RNA 测序使用 CEL-Seq2 方法,细胞会被逐个分选进孔板的各个孔里。分选由 FACS(荧光激活细胞分选)仪器完成,它生成的 FCS 文件会记录每个细胞进了哪个孔。每个孔还会加入带有独特短条形码的引物,测序之后才能把读段追溯回对应的细胞。
孔板送去测序之前,得有人把这些信息整理进一张样本表。过去这一步要手工合并按颜色标注的孔板布局、FCS 文件、实验室的模板表和引物索引表。手工做的表出错时往往悄无声息。条形码被粘贴了两次,某个孔被漏掉,或者同一个样本名写成了两种拼法,这些错误都会跟着数据一路进入测序。
GMM 做了什么
GMM 把整个合并过程放进了一个页面。用户选择一个文件夹,应用会按文件名识别其中的文件,包括孔板布局表、FCS 文件、模板表,以及可选的引物索引表。接着它依次完成四个步骤,最后输出一个文件,可以下载为 CSV、TSV 或 Excel。
1
读取孔板布局
实验室在孔板图上用单元格颜色标出样本。GMM 读取这些颜色,为每个孔写出板号、孔位和样本名。
2
合并 FCS 文件
把多个索引分选 FCS 文件纵向合并成一张表,每个被分选的细胞都带有板号、样本和孔位。
3
按板号和孔位合并
按板号、孔位和样本名,把样本表、实验室模板和 FCS 表合并在一起。
4
加入引物索引
如果文件夹里有引物索引表,就为每个孔加上对应的条形码。这一步是可选的。
怎么做出来的
- 地点
- WEHI,帕克维尔
- 时间
- 2024 年 2 月至 7 月
- 前端
- R Shiny
- 合并逻辑
- Python(经 reticulate)
- R
- Shiny
- DT
- reticulate
- renv
- Python
- pandas
- openpyxl
- fcsparser
- Bash
- Git
GMM 由 WEHI 研究计算平台(Research Computing Platform)的学生团队一期接一期地推进,始于 2022 年。在我们之前,已有几期同学做过这个问题。2023 年底,WEHI 高级研究员 Marek Cmero 在他的 celseq-sample-sheet-generator 仓库里用 Python 写好了 FACS 合并逻辑,项目决定在此基础上继续开发。现在这一版应用,是由我所在的 2024 年第一学期这一期开始做的。
应用前端是 R Shiny,底层是 Python。Shiny 负责文件夹上传、进度条、结果表格和下载。Marek 的合并函数通过 reticulate 在 Python 中运行,所需的虚拟环境会在应用启动时自动创建。整个应用是为 WEHI 的 HPC 集群 Milton 设计的,通过内部的 R Shiny 服务运行,研究人员用浏览器打开就能用,不用安装任何东西。
2024 年 3 月到 5 月,我写了应用的 Shiny 部分,包括界面,处理上传、数据处理、展示和下载的服务端逻辑,安装脚本,以及一个把 Marek 的函数串成一次调用的 Python 小封装。我还加入了带预期输出的测试输入,用已知结果来核对合并后的表格。5 月 Jude 把 Shiny 代码迁到 Marek 的仓库之后,我在那里加了一个清理多余列的步骤,已经合并进他的主分支。
同一期的 Jude Thaddeau Data 写了大部分文档,包括 README、wiki、架构图和流程图,以及对 Marek 的致谢说明。Shiny 代码迁到 Marek 的仓库,也是 Jude 做的。
试一试:从孔板到样本表
这是我为本页用 JavaScript 从零写的独立概念演示。样本和条形码都是合成的,数据不会离开你的浏览器,也没有使用 GMM 的任何代码。
选择孔板规格和样本,然后点击孔位,或者用方向键移动、按 Enter 放置。每个孔都预先带有一个虚构的六位条形码,可以修改。检查会找出两类常见错误:条形码重复使用,以及孔位空着没填。
合成数据,并非 GMM,也不是真实孔板。
方向键在孔位间移动,Enter 或空格放置所选样本,Delete 清空孔位。
- 已填
- 88/96
- 空孔
- 8
- 问题
- 1
96 孔板。96 个孔中已填 88 个,空 8 个。条形码问题 1 个。
当前孔位
A1样本 1
六位,只能用 A、C、G、T。
检查
- 条形码 TAAGTC 同时用在 A1和D9。
- 有 8 个空孔,不会写入样本表。
样本表预览
请先修正上面的条形码问题,再下载。
| plate | well | row | column | sample | barcode |
|---|---|---|---|---|---|
| DEMO-PLATE-01 | A1 | A | 1 | sample_1 | TAAGTC |
| DEMO-PLATE-01 | A2 | A | 2 | sample_1 | AACGTC |
| DEMO-PLATE-01 | A3 | A | 3 | sample_1 | GCTGGA |
| DEMO-PLATE-01 | A4 | A | 4 | sample_2 | GAGTTG |
| DEMO-PLATE-01 | A5 | A | 5 | sample_2 | GCTTTA |
| DEMO-PLATE-01 | A6 | A | 6 | sample_2 | TTATGA |
| DEMO-PLATE-01 | A7 | A | 7 | sample_3 | GCCGTC |
| DEMO-PLATE-01 | A8 | A | 8 | sample_3 | CTTCAG |
显示前 8 行,共 88 行。
致谢
GMM 是几期团队成员共同完成的。以下各位都出现在项目的 git 记录或 wiki 贡献者页面上。
- Marek CmeroWEHI 高级研究员、项目导师。GMM 使用的 FACS 合并逻辑由他开发,来自他的 celseq-sample-sheet-generator 仓库。
- Rowland MosbergenWEHI 项目导师。
- Jude Thaddeau Data2024 年第一学期同期队友,负责文档、wiki 和图示,并把 Shiny 代码迁到了 Marek 的仓库。
- Andy Le Nguyen2023 年第二学期一期,早期负责解析 FCS 文件、合并引物索引文件。
- Nandi Ruan2023 至 2024 年暑期一期,参与了早期的 Shiny 原型。
- Gloria Zilan Huang2023 至 2024 年暑期一期,参与了早期的 Shiny 原型。
我的收获
大部分工作其实在边角情况上。实验室文件的命名会有细微差别,可选的表格有时缺失,孔板图还把信息藏在单元格颜色里。让应用能接受空的引物索引文件、一次处理多个 FCS 文件,是我学到最多的地方。
我也学会了怎样认真地在别人的逻辑上继续开发。最难的部分由 Marek 的函数完成,我的工作是把它们封装好,用已知结果测试,并清楚地注明他的贡献。