10X Genomics用于处理条形码(barcode)的功能模块

10X Genomics 的 Cell Ranger 软件相关的,用于处理条形码(barcode)的功能模块。

目录结构概述

3M-february-2018.txt.gz          9K-LT-march-2021.txt.gz  visium-v1_coordinates.txt  visium-v2.txt              visium-v5.gal
737K-april-2014_rc.txt           __init__.py              visium-v1.gal              visium-v3_coordinates.txt  visium-v5.txt
737K-arc-v1.txt.gz               __pycache__              visium-v1.txt              visium-v3.gal
737K-august-2016.txt             translation              visium-v2_coordinates.txt  visium-v3.txt
737K-fixed-rna-profiling.txt.gz  utils.py                 visium-v2.gal              visium-v5_coordinates.txt

主要文件和目录说明

  1. 条形码白名单文件 (*.txt.gz, *.txt):

    • 示例:
      • 3M-february-2018.txt.gz
      • 9K-LT-march-2021.txt.gz
      • arc-v1.txt.gz
      • august-2016.txt
      • fixed-rna-profiling.txt.gz
    • 说明:
      • 这些文件通常包含用于过滤和识别有效条形码的列表。Cell Ranger 使用这些白名单文件来确定哪些条形码是有效的,以便在单细胞测序数据中准确地分配细胞。
      • 文件格式通常为纯文本,可能经过 gzip 压缩以节省存储空间。
  2. Visium 相关文件 (visium-*.txt, visium-*.gal, visium-*_coordinates.txt):

    • 示例:
      • visium-v1_coordinates.txt
      • visium-v1.gal
      • visium-v1.txt
      • visium-v2_coordinates.txt
      • visium-v2.gal
      • visium-v2.txt
      • visium-v3_coordinates.txt
      • visium-v3.gal
      • visium-v3.txt
      • visium-v5.gal
      • visium-v5_coordinates.txt
      • visium-v5.txt
    • 说明:
      • Visium 是 10X Genomics 的空间转录组测序平台。这些文件可能包含与不同版本的 Visium 数据相关的条形码、坐标信息和其他元数据。
      • .gal 文件可能包含基因表达相关的信息,.txt 文件则可能包含纯文本的条形码或其他元数据,*_coordinates.txt 文件则包含空间坐标信息。
  3. Python 模块和辅助文件:

    • __init__.py:
      • 此文件表明该目录应被视为一个 Python 包。它可以包含初始化代码或导入模块。
    • __pycache__:
      • 这是 Python 自动生成的目录,用于存储编译后的字节码(.pyc 文件),以加快模块的加载速度。
    • translation:
      • 这可能是一个目录或文件,用于存储条形码翻译映射,例如将一套条形码映射到另一套条形码。
    • utils.py:
      • 这是一个实用工具模块,包含处理条形码的各种函数。以下将详细介绍该文件的内容。

utils.py 文件详细介绍

utils.py 文件主要包含用于处理条形码白名单、翻译映射和内存需求估算的函数。以下是对其内容的详细解析:

模块头部

from __future__ import annotations

import os
from typing import List, Literal, Optional, Set, Union, overload

import numpy as np

import cellranger.constants as cr_constants
import cellranger.h5_constants as h5_constants
import cellranger.io as cr_io
  • 导入模块:
    • 使用 from __future__ import annotations 提高类型注解的灵活性。
    • 导入标准库模块 os 和类型提示模块 typing
    • 导入第三方库 numpy
    • 导入 10X Cell Ranger 软件的内部模块,如 constants, h5_constants, 和 io,它们包含常量定义、HDF5 文件相关的常量和 I/O 操作函数。

常量定义

SPATIAL_WHITELIST = [
    "odin-5K-v2",
    "visium-v1",
    "visium-v2",
    "visium-v3",
    "visium-v4",
    "visium-v5",
    "omni-v1",
    "omni-hires-v1",
    "omni-pat7-v1",
    "pseudo-xl-v1",
    "thor-v1",
    "thor-v2",
    "thor-v3",
    "thor-XL-v1",
]
NUM_BARCODES_PER_MEM_GB = 500000
  • SPATIAL_WHITELIST:
    • 一个包含空间条形码白名单名称的列表。用于识别哪些条形码白名单与空间测序(如 Visium)相关。
  • NUM_BARCODES_PER_MEM_GB:
    • 定义每 GB 内存可以处理的条形码数量,用于内存需求估算。

函数定义

  1. is_whitelist_spatial(whitelist_name):

    def is_whitelist_spatial(whitelist_name):
        return whitelist_name in SPATIAL_WHITELIST
    
    • 功能: 判断给定的条形码白名单名称是否属于空间条形码白名单。
    • 参数:
      • whitelist_name (字符串): 白名单名称。
    • 返回值: 布尔值,若在 SPATIAL_WHITELIST 中则返回 True,否则 False
  2. load_barcode_tsv(filename, as_set=False):

    def load_barcode_tsv(filename: Union[str, bytes], as_set=False) -> Union[Set[bytes], List[bytes]]:
        with cr_io.open_maybe_gzip(filename, "rb") as bc_file:
            barcodes = [x.strip() for x in bc_file if b"#" not in x]
        barcode_set = set(barcodes)
        if len(barcodes) != len(barcode_set):
            raise Exception(f"Duplicates found in barcode whitelist: {filename}")
        return barcode_set if as_set else barcodes
    
    • 功能: 加载条形码白名单文件,返回条形码列表或集合。
    • 参数:
      • filename (字符串或字节串): 白名单文件路径,可以是 .txt.txt.gz 格式。
      • as_set (布尔值, 默认为 False): 若为 True,返回集合;否则返回列表。
    • 返回值: 条形码的集合或列表。
    • 备注: 如果文件中存在重复条形码,将抛出异常。
  3. get_barcode_whitelist_path(filename):

    def get_barcode_whitelist_path(filename: Optional[str]) -> Optional[str]:
        if filename is None:
            return None
        elif os.path.exists(filename):
            return filename
        else:
            gz = os.path.join(cr_constants.BARCODE_WHITELIST_PATH, filename + ".txt.gz")
            if os.path.exists(gz):
                return gz
    
            txt = os.path.join(cr_constants.BARCODE_WHITELIST_PATH, filename + ".txt")
            return txt
    
    • 功能: 获取条形码白名单文件的完整路径。
    • 参数:
      • filename (可选字符串): 白名单文件名。
    • 返回值: 完整的文件路径(字符串)或 None
    • 逻辑:
      • 如果 filenameNone,返回 None
      • filename 路径存在,直接返回。
      • 否则,尝试在预定义的白名单目录中查找 .txt.gz.txt 后缀的文件。
  4. get_all_whitelist_filenames():

    def get_all_whitelist_filenames() -> List[str]:
        basenames = os.listdir(cr_constants.BARCODE_WHITELIST_PATH)
        allowed_suffixes = (".txt", ".txt.gz")
        all_files = []
        for name in basenames:
            full_name = os.path.join(cr_constants.BARCODE_WHITELIST_PATH, name)
            if (
                name.endswith(allowed_suffixes)
                and name.count("coordinates") == 0
                and os.path.isfile(full_name)
            ):
                all_files.append(full_name)
        return all_files
    
    • 功能: 获取所有有效的条形码白名单文件名。
    • 返回值: 字符串列表,每个字符串为一个白名单文件的完整路径。
    • 逻辑:
      • 列出白名单目录中的所有文件。
      • 过滤出以 .txt.txt.gz 结尾且不包含 "coordinates" 的文件。
  5. get_barcode_whitelist_paths(filenames):

    def get_barcode_whitelist_paths(filenames: str):
        paths = filenames.split(",")
        return ",".join([get_barcode_whitelist_path(p) for p in paths])
    
    • 功能: 获取多个白名单文件的完整路径,输入为逗号分隔的文件名字符串。
    • 参数:
      • filenames (字符串): 逗号分隔的文件名列表。
    • 返回值: 逗号分隔的完整路径字符串。
  6. load_barcode_whitelist(filename, as_set=False):

    def load_barcode_whitelist(filename: Optional[str], as_set: bool = False):
        path = get_barcode_whitelist_path(filename)
    
        if path is None:
            return None
        if not os.path.isfile(path):
            raise NameError("Unable to find barcode whitelist: %s" % path)
    
        return load_barcode_tsv(path, as_set)
    
    • 功能: 加载指定的条形码白名单文件。
    • 参数:
      • filename (可选字符串): 白名单文件名。
      • as_set (布尔值, 默认为 False): 决定返回集合还是列表。
    • 返回值: 条形码的集合或列表,或 None(若 filenameNone)。
    • 逻辑:
      • 获取文件路径。
      • 如果路径不存在,抛出异常。
      • 使用 load_barcode_tsv 加载文件内容。
  7. load_barcode_translate_map(bc_whitelist):

    def load_barcode_translate_map(bc_whitelist):
        if bc_whitelist is None:
            return None
    
        file_path = None
        for extension in [".txt", ".txt.gz"]:
            file_ext = os.path.join(
                cr_constants.BARCODE_WHITELIST_TRANSLATE_PATH, bc_whitelist + extension
            )
            if os.path.exists(file_ext):
                file_path = file_ext
                break
    
        if file_path is None:
            return None
        else:
            translate_map = {}
            for line in cr_io.open_maybe_gzip(file_path, "r"):
                if line.startswith("#"):
                    continue
                bcs = line.strip().split()
                translate_map[bcs[0]] = bcs[1]
            return translate_map
    
    • 功能: 加载条形码白名单的翻译映射,将一种条形码映射到另一种条形码。
    • 参数:
      • bc_whitelist (字符串): 条形码白名单名称。
    • 返回值: 字典,键为原始条形码,值为翻译后的条形码,或 None(若无翻译文件)。
    • 逻辑:
      • 在预定义的翻译目录中查找对应的 .txt.txt.gz 文件。
      • 读取文件,跳过注释行(以 # 开头)。
      • 构建翻译字典。
  8. load_probe_barcode_map(bc_whitelist):

    def load_probe_barcode_map(bc_whitelist):
        if bc_whitelist is None:
            return None
    
        file_path = None
        for extension in [".txt", ".txt.gz"]:
            file_ext = os.path.join(
                cr_constants.BARCODE_WHITELIST_TRANSLATE_PATH, bc_whitelist + extension
            )
            if os.path.exists(file_ext):
                file_path = file_ext
                break
    
        if file_path is None:
            return None
        else:
            translate_map = {}
            for line in cr_io.open_maybe_gzip(file_path, "r"):
                if line.startswith("#"):
                    continue
                bcs = line.strip().split()
                translate_map[bcs[2]] = bcs[1]
            return translate_map
    
    • 功能: 加载探针条形码的映射,将探针条形码 ID 映射到其折叠序列。
    • 参数:
      • bc_whitelist (字符串): 条形码白名单名称。
    • 返回值: 字典,键为探针条形码 ID,值为折叠序列,或 None(若无映射文件)。
    • 逻辑:
      • 类似于 load_barcode_translate_map,但映射关系取决于文件内容的特定列。
  9. get_mem_gb_request_from_barcode_whitelist(barcode_whitelist_fn, gem_groups=None, use_min=True, double=False):

    def get_mem_gb_request_from_barcode_whitelist(
        barcode_whitelist_fn, gem_groups=None, use_min=True, double=False
    ):
        barcode_whitelist = load_barcode_whitelist(barcode_whitelist_fn)
    
        if use_min:
            if barcode_whitelist is None:
                min_mem_gb = h5_constants.MIN_MEM_GB_NOWHITELIST
            else:
                min_mem_gb = h5_constants.MIN_MEM_GB
        else:
            min_mem_gb = 0
    
        if barcode_whitelist is None:
            return min_mem_gb
    
        if gem_groups is not None:
            num_bcs = len(barcode_whitelist) * max(gem_groups)
        else:
            num_bcs = len(barcode_whitelist)
    
        if double:
            return np.ceil(max(min_mem_gb, 2 * num_bcs // NUM_BARCODES_PER_MEM_GB))
        else:
            return np.ceil(max(min_mem_gb, num_bcs // NUM_BARCODES_PER_MEM_GB))
    
    • 功能: 根据条形码白名单估算所需的内存(以 GB 为单位)。
    • 参数:
      • barcode_whitelist_fn (字符串): 条形码白名单文件名。
      • gem_groups (可选列表): GEM(Gel Bead-In Emulsion)组数,用于估算条形码数量。
      • use_min (布尔值, 默认为 True): 是否使用最小内存限制。
      • double (布尔值, 默认为 False): 是否将估算的内存需求加倍。
    • 返回值: 所需内存的估算值(浮点数),以 GB 为单位。
    • 逻辑:
      • 加载条形码白名单。
      • 根据是否使用最小内存限制,确定基础内存需求。
      • 根据条形码数量和 GEM 组数,计算总条形码数。
      • 根据 double 参数调整最终的内存需求。

总结

utils.py 文件在整个模块中扮演了关键角色,负责加载和处理条形码白名单文件,管理条形码的翻译映射,以及根据条形码数量估算所需的内存。这些功能对于确保单细胞或空间转录组数据的准确处理和高效分析至关重要。

此外,目录中的其他文件如 __init__.py__pycache__、以及各种条形码和 Visium 相关的文件,都是支持 utils.py 功能运行所需的资源和模块。通过这些文件的协同工作,Cell Ranger 能够高效地处理和分析复杂的单细胞和空间转录组数据。

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

推荐阅读更多精彩内容