⚙️ 环境设置
安装 conda:
在创建环境之前,请确保 conda 已安装在你的系统中。
保存 yml 内容:
将 yml 选项卡中的内容保存为文件
environment.yml。
创建环境:
打开终端或命令提示符。
运行以下命令:
conda env create -f environment.yml
激活环境:
创建好环境后,使用以下命令激活它:
conda activate <environment_name>请将
<environment_name>替换为environment.yml文件中指定的环境名称。该名称在 yml 文件中如下所示:name: <environment_name>
验证安装:
通过运行以下命令,检查环境是否创建成功:
conda env list
name: surface-protein
channels:
- conda-forge
dependencies:
- python=3.13
- scanpy=1.12
- muon=0.1.9
- python-igraph=1.0.0
- ipykernel=7.2.0
- pip==26.0.1
- pip:
- lamindb==2.3.1
- harmonypy==0.0.9
- ipywidgets==8.1.8
🗄️ 获取数据和笔记本
本书使用 lamindb 存储、共享和加载数据集与笔记本,托管实例为 theislab
安装 lamindb
安装 lamindb Python 软件包:
pip install lamindb可选择创建 Lamin 账户
按照 说明注册并登录
验证你的设置
下面用 Python API 检查连接;命令行方式可使用
lamin connect:
import lamindb as ln ln.Artifact.connect("theislab/sc-best-practices").df()运行后应显示最多 100 条已保存的数据集记录。
访问数据集(Artifact)
加载一个 Artifact 及其对应的对象:
import lamindb as ln af = ln.Artifact.connect("theislab/sc-best-practices").get(key="key_of_dataset", is_latest=True) obj = af.load()加载后的对象可直接在内存中分析。如需指定数据版本,可调整
lamindb.Artifact.connect("theislab/sc-best-practices").get("SOMEIDXXXX")中的 ID。访问笔记本(Transform)
加载笔记本:
lamin load <notebook url>该命令将笔记本下载到当前工作目录。与
Artifacts类似,可通过指定 ID 获取旧版本。
研究动机¶
抗体衍生标签(Antibody-Derived Tags, ADTs)提供表面蛋白信息,可补充单细胞 RNA 测序(Single-Cell RNA Sequencing, scRNA-seq)的细胞类型注释(cell type annotation),尤其适合具有成熟表面标记体系的免疫细胞。RNA 测量可能出现漏检(dropout),即存在的转录本因采样或检测限制而未被记录;部分蛋白标记在 ADT 中信号更稳定,但 ADT 也有背景与检测局限。例如,多种免疫细胞表达 CD45 蛋白,而编码它的 PTPRC 转录本在个别细胞中可能较低或未检出,蛋白信息可帮助判断。
本章的手动注释(manual annotation)流程(workflow)沿用 Scanpy 的聚类(clustering)与可视化函数;不过,统计结果仍需按 ADT 的归一化(normalization)尺度解释,不能直接照搬 RNA 的全部假设。
环境设置¶
import warnings
import scanpy as sc
warnings.filterwarnings("ignore")
sc.settings.verbosity = 0
sc.set_figure_params(
dpi=80,
facecolor="white",
frameon=False,
)
import lamindb as ln
ln.track()→ connected lamindb: theislab/sc-best-practices
→ loaded Transform('BnpvfJLWjHuE0009', key='annotation.ipynb'), re-started Run('4qV0TQMofb5Skmfz') at 2026-07-29 14:38:23 UTC
→ notebook imports: lamindb-core==2.3.1 muon==0.1.9 scanpy==1.12.3
• recommendation: to identify the notebook across renames, pass the uid: ln.track("BnpvfJLWjHuE")
加载数据¶
加载前一章保存的 MuData 对象,参见 批次校正:
af = ln.Artifact.connect("theislab/sc-best-practices").get(
key="surface-protein/cite_batch_correction.h5mu", is_latest=True
)
mdata = af.load()
mdata手动注释¶
先查看白细胞常用标记 CD45。
CD45 通过调节 Lck 的磷酸化状态参与 T 细胞受体(T-Cell Receptor, TCR)信号调控 Courtney et al., 2019。本例预期多种免疫细胞均具有 CD45 信号,红系细胞通常较低;不同白细胞群的相对水平仍应结合数据观察,不能仅由这条信号通路推断。
sc.pl.umap(mdata["prot"], frameon=False, color="CD45", vmax=20)
数据中部分 ADT 名称可能因去重而带有后缀。var_names_make_unique 用于使变量名唯一,并不负责判断变量属于基因还是蛋白。蛋白名称可能出现 -1 等后缀;下面以 CD38 为例,在蛋白元数据中查找实际名称。
mdata["prot"].var[mdata["prot"].var.gene_ids.str.contains("CD38")]先以较低分辨率进行 Leiden 聚类,识别主要群体。若有足够的标记和证据,再提高分辨率探索更细的亚群。
sc.tl.leiden(
mdata["prot"],
resolution=0.08,
flavor="igraph",
n_iterations=2,
directed=False,
random_state=0,
)使用 Scanpy 的 rank_genes_groups 对簇间蛋白差异排序,并在 dotplot 中展示每簇排名靠前的三个标记。这里函数名沿用 genes,但输入是蛋白。下方代码请求 logfoldchanges;该统计量的近似计算面向对数归一化 RNA,而本例使用可为负的 背景去噪与缩放(denoised and scaled by background, dsb) 数值,因此不能将其直接解释为可靠的蛋白 log 倍数变化。注释还需检查实际标记信号。
sc.tl.rank_genes_groups(mdata["prot"], groupby="leiden")
sc.tl.dendrogram(mdata["prot"], groupby="leiden")
sc.pl.rank_genes_groups_dotplot(
mdata["prot"], n_genes=3, values_to_plot="logfoldchanges"
)
CD3 支持将簇 0 和 1 初步识别为 T 细胞,CD19-1 支持将簇 6 识别为 B 细胞。接着在前面计算的 统一流形近似与投影(uniform manifold approximation and projection, UMAP) 上按簇着色。
sc.pl.umap(mdata["prot"], color="leiden")
结合多个已知免疫标记,核对各簇的候选细胞类型。
# B cells
sc.pl.umap(mdata["prot"], frameon=False, color=["CD19-1"])
簇 6 的 CD19 信号支持 B 细胞注释。
进一步结合 CD3、CD4 与 CD8,区分 CD4 和 CD8 T 细胞。
# T cells
sc.pl.umap(mdata["prot"], color=["CD3", "CD4-1", "CD8"])
随后检查自然杀伤细胞(Natural Killer Cells, NK cells)、CD14 单核细胞、树突状细胞(Dendritic Cells, DCs)和 CD16 单核细胞的候选标记。应组合解读:CD56 也可出现在部分 T 细胞中,CD3 与 CD56 双阳性本身不足以确证 NKT;CD11c 也并非 DC 专属标记。
# NK cells are CD3- and CD56+
# NKT cells are CD3+ and CD56+
sc.pl.umap(mdata["prot"], color=["CD56"], frameon=False)
# CD14 Monocytes
sc.pl.umap(mdata["prot"], color=["CD11b", "CD14-1"], frameon=False, vmax=40)
# Dendritic cells. CD123 and CD303 are expressed mostly in dendritic cells, while CD11c is expressed in myeloid cells, including dendritic cells.
sc.pl.umap(mdata["prot"], color=["CD123", "CD303", "CD11c"], frameon=False, vmax=30)
# CD16 is expressed in NK cells and in CD16 monocytes, which are CD14-, CD16+ and CD11c+
sc.pl.umap(mdata["prot"], color="CD16", frameon=False)
根据标记组合,将簇编号替换为候选细胞类型名称。下方代码映射的是 0–8 共九个簇;其中两个簇都标为 DC。包括红系在内的各标签仍应由相应标记支持,不能仅凭单一阴性标记判断。
sc.pl.umap(mdata["prot"], color="leiden")
mdata["prot"].obs["celltype"] = mdata["prot"].obs.leiden.copy()
mdata["prot"].obs.celltype.replace(
{
"0": "CD4 T",
"1": "CD8 T",
"2": "Erythroid",
"3": "CD14 Mono",
"4": "NK",
"5": "DC",
"6": "B",
"7": "DC",
"8": "CD16 Mono",
},
inplace=True,
)sc.pl.umap(
mdata["prot"],
color="celltype",
legend_loc="on data",
legend_fontsize=11,
legend_fontoutline=2,
)
至此获得主要细胞群的初步注释。若需更细的分类,可提高聚类分辨率,再结合相应标记核对;分辨率提高并不自动意味着注释更准确。
本章基于 通过测序进行转录组与表位索引(cellular indexing of transcriptomes and epitopes by sequencing, CITE-seq) 的 ADT 数据进行注释。联合利用 RNA 与蛋白信息的方法见 配对整合 章节。
af_annotation = ln.Artifact.from_mudata(
mdata,
key="surface-protein/cite_annotation.h5mu",
description="CITE-seq data after annotation",
)
af_annotation.save()输出
→ creating new artifact version for key 'surface-protein/cite_annotation.h5mu' in storage 's3://lamin-eu-central-1/VPwcjx3CDAa2'
... uploading OyfKOZw9TXUQXeOp0006.h5mu: 100.0%
• replacing the existing cache path /var/cache/user/marchena/.cache/lamindb/lamin-eu-central-1/VPwcjx3CDAa2/surface-protein/cite_annotation.h5mu
Artifact(uid='OyfKOZw9TXUQXeOp0006', key='surface-protein/cite_annotation.h5mu', description='CITE-seq data after annotation', suffix='.h5mu', kind='dataset', otype='MuData', size=1450115558, hash='piMa8ZMc78O_eJtyyPlHCU', n_files=None, n_observations=105907, branch_id=1, created_on_id=1, space_id=1, storage_id=1, run_id=110, schema_id=None, created_by_id=7, created_at=2026-07-29 14:38:44 UTC, is_locked=False, version_tag=None, is_latest=True)ln.finish()输出
• please hit CTRL + s to save the notebook in your editor ... ✓
→ finished Run('4qV0TQMofb5Skmfz') after 40s at 2026-07-29 14:39:03 UTC
→ go to: https://lamin.ai/theislab/sc-best-practices/transform/BnpvfJLWjHuE0009
→ to update your notebook from the CLI, run: lamin save /groups/nils/members/javier/single-cell-best-practices/jupyter-book/surface_protein/annotation.ipynb
自动注释¶
还可训练 ADT 分类器或映射到蛋白参考数据,但适用性取决于抗体面板、归一化方式、参考覆盖和跨批次可比性。本章不演示具体 ADT 自动注释模型;一般方法可参考 RNA 注释章节。
贡献者¶
我们衷心感谢以下人员的贡献:
作者¶
Javier Marchena-Hurtado
Daniel Strobl
Ciro Ramírez-Suástegui
审阅者¶
Lukas Heumos
Anna Schaar
- Courtney, A. H., Shvets, A. A., Lu, W., Griffante, G., Mollenauer, M., Horkova, V., Lo, W.-L., Yu, S., Stepanek, O., Chakraborty, A. K., & Weiss, A. (2019). CD45 functions as a signaling gatekeeper in T cells. Sci. Signal., 12(604), eaaw8151.