一份接触列表换了去重参数,保留数量从四条变成七条,哪个结果才正确?如果没有先定义什么算作重复,这个问题没有唯一答案。两端坐标允许偏移多少、使用最大偏移还是偏移之和、邻近关系是否传递,以及是否要求单倍型标签一致,都会改变重复分组。它们是分析规则的一部分,不只是运行速度选项。
本文安装并运行 pairtools 1.1.3,用十二对手工编写的比对记录完成解析、排序、筛选和五种去重对照。输入不是测序仪产生的数据,也没有经过比对器,因此本文讨论的是输入输出语义与参数影响,不是文库重复率、真实生物学接触或软件性能测评。

一、先把输入和可回答的问题限定清楚
十二对输入包括三条连续偏移的接触、一条精确复制、一条交换测序端顺序的等价接触、一条改变方向的接触、两条用于比较距离规则的接触、两条带不同单倍型标签的接触、一条低比对质量接触和一条完全未比对记录。每种情况都有明确设计目的,能够沿着程序输出追溯到对应输入。
读段按照名称成组放置,使同一对的两个端相邻。本次只有简单连续比对,没有补充比对和多重连接路径,因此不能借这个例子评价复杂嵌合读段的恢复效果。真实数据进入解析阶段时,需要确保同一分子的相关比对记录按工具要求组织,否则后面的分类和连接识别都失去基础。
固定环境与完整生成脚本保存在实跑复现包。运行器会建立输入并依次执行对照,不需要读者手工录入长表格。下面的镜像摘要固定了本次运行环境,使用可移动标签的其他环境应重新核对版本。
IMAGE=quay.io/biocontainers/pairtools@sha256:29e06e1791a809300c29abd8dea482eca573f2b9d0f8b8e2dddc0c749f561ba4
docker pull "$IMAGE"
python3 run.py ./pairtools_practice
pairtools 的优势是把接触处理拆成可组合步骤,方便保留中间结果和审计记录。相应的使用成本是,解析、排序、筛选与去重不能被混为一次“清洗”,每一步都需要知道其输入状态和实际改变了什么。
二、接触位置要结合方向读,交换测序端也不应增加分子数
在本例中,一条反向五十碱基比对的左侧起点为九百五十一,五端位置在第一千个碱基。输出接触位置采用后者。若直接把比对文件的起点复制进接触表,正向记录可能看起来正确,反向记录却发生系统性偏移,随后基于几个碱基容差的去重就会受到影响。
这里的接触位置是一基坐标,后续转换成分箱时要遵守相应接口约定。不要看到某个矩阵格式使用零基区间,就在所有中间文件里统一减一。转换应该发生在明确的接口上,并通过边界位置的小例子核验。
我们还编写了一对测序端顺序交换的记录。解析时规范化两端顺序后,它和原始接触具有相同坐标与方向组合,能够进入同一个重复分组。关闭翻转的对照则保留原测序端顺序。这说明排序和翻转解决的是不同问题,排序安排记录之间的次序,翻转规范化单条记录两端的表示。
对于染色体间接触,规范化还依赖染色体排序规则。不同输入文件如果采用了不同参考命名或顺序,合并前应该检查头部信息,而不是删掉所有注释行后直接拼接。文件头里既有列定义,也有处理历史,保留它们有助于解释数据从哪里来。官方格式文档说明了坐标、两端表示和接触类型的约定。
三、提高比对质量门槛,先改变的是类别
本次默认解析得到十一条两端唯一定位类别,以及一条全未比对类别。把最小比对质量改为三十之后,得到十条两端唯一定位、一条多重或不满足唯一定位门槛的单端与唯一端组合,以及一条全未比对记录。总记录数仍然是十二。
这里的“唯一”是工具结合当前质量门槛作出的分类,不应把它当作未经条件限定的事实。那条对照记录的一端质量是二十五,改变门槛后被重新分类,不能说它从文件中自动消失了。
pairtools parse -c chrom.sizes \
--min-mapq 30 --drop-sam --add-columns mapq,HP \
-o q30.pairs toy.sam
pairtools sort --nproc 1 --memory 100M \
-o sorted.pairs q30.pairs
pairtools select 'pair_type == "UU"' \
-o uu.pairs sorted.pairs
我们随后显式筛选两端唯一定位类别,去重输入才变成十条。这个筛选适用于本文只有简单比对的人工例子,并不是所有真实 Hi-C 数据都必须只保留这一类。复杂连接恢复可能产生其他可用类型,正式流程应根据解析策略、实验方案和研究问题确定接受集合。
这一步最实用的核验方法是同时保存解析前后的类别计数,以及筛选后的实际行数。若一份报告只给出“过滤掉百分之多少”,没有说明分母是读段、读段对还是已解析接触,就难以比较不同流程。
四、最大偏移与偏移之和,是两种不同重复定义
先看我们编写的两条接触,两端坐标分别是五千和七千,以及五千零二和七千零二。每个端都偏移两个碱基。若使用最大端偏移,距离是二,三碱基门槛下会合并。若使用两端偏移之和,距离是四,同一门槛下就不会合并。
pairtools dedup --backend scipy \
--method max --max-mismatch 3 \
--output dedup.pairs \
--output-dups duplicates.pairs \
--output-stats dedup.stats uu.pairs
| 本次去重设置 | 保留接触 | 重复接触 | 主要区别 |
|---|---|---|---|
| 最大端偏移三碱基,scipy | 4 | 6 | 邻近关系可传递 |
| 最大端偏移三碱基,cython | 5 | 5 | 本例的连续偏移链分组不同 |
| 两端偏移之和三碱基,scipy | 7 | 3 | 同时偏移两端更难合并 |
| 坐标完全一致,scipy | 7 | 3 | 不允许坐标偏移 |
| 最大偏移三碱基并要求标签一致 | 5 | 5 | 不同单倍型标签分别保留 |
这张表只能比较本次设计的数据,不能据此判断保留越多越好,也不能把删除越多称为去重越彻底。容差放宽可能合并技术性偏移,也可能把真实的邻近独立分子合在一起。决定规则时,应结合数据产生方式和已有流程定义,并把选择写进分析记录。
两种规则在本例恰好都留下七条,也不表示它们在任何数据上等价。遇到同样的总数,仍然要比较保留的记录身份及重复分组。统计数字相同而具体分子不同,会给下游局部接触分布带来不同影响。
五、计算后端会改变连续偏移链的处理
我们还设置三条接触,两端坐标依次为一百与一千、一百零三与一千零三、一百零六与一千零六。第一条与第二条相差三,第二条与第三条也相差三,但第一条与第三条相差六。
在本次 scipy 后端的最大偏移三碱基设置中,这三条通过邻近关系连成一个重复分组。使用 cython 后端时,分组不要求这种关系传递,因此该链最终保留两条,而不是一条。精确复制和交换测序端的等价记录仍按照相应坐标归入重复。
这意味着后端不能一概视为只改变运行时间的实现细节。在需要对照旧项目时,除了软件版本和容差,还应记录所用后端。若升级后发现重复率变化,先用这种三条接触的小例子检查定义差异,再讨论是否是原始数据质量改变。
工具的命令说明明确区分了这些后端语义及距离方法,见官方命令接口。本文的结果进一步给出一组可以核对的输入,而不是仅把文档中的选项名称抄成参数推荐。
重复分组还有一个容易忽视的解释边界,留下的代表记录不自动等于“测序质量最高的一条”。如果下游要使用代表记录携带的附加属性,应核实当前处理规则如何选择代表,并检查这些属性是否需要在分组内单独汇总,不能凭直觉赋予代表行额外含义。
六、单倍型标签是否参与分组,需要显式决定
我们设计两条坐标和方向完全一致的接触,两端标签都为一的一条,以及两端标签都为二的一条。普通坐标去重会把它们合在一起。要求各端标签分别一致后,两条都保留,最终总保留数由四变成五。
pairtools dedup --backend scipy \
--method max --max-mismatch 3 \
--extra-col-pair HP1 HP1 \
--extra-col-pair HP2 HP2 \
--output phased.pairs uu.pairs
这个例子演示的是附加列如何参与重复定义,不表示加上标签约束总是更合理。真实单倍型标签可能缺失或判断不稳定,如果同一个技术重复的标签发生分歧,强制按标签分组也可能把本应合并的记录保留下来。选择前应先检查标签质量、未定相比例和技术重复之间的一致性。
我们把标签随解析结果保留,是为了让这个判断可以审计。若前一步已经删除了标签列,后面再写标签约束命令也无法恢复信息。真实流程设计应从最终分析需要反推中间文件必须保留哪些字段,同时明确每个字段的缺失值表示。
方向信息也不能忽略。本次另外编写了一条坐标相同但两端方向组合不同的接触,它在对照中单独保留。自行用两个坐标列做简单去重,可能丢掉工具原本用于区分接触的字段,因此不宜把这样的简化脚本当作等价替代。
七、统计过滤不等于输出过滤,警告也要结合数据规模解释
为了检验一个容易误用的选项,我们在完全一致坐标去重时,给统计过滤条件设为两端距离大于五千碱基。本例没有任何接触满足这个条件,但输出文件仍然保留七条,与未加该条件的输出数量一致。受到筛选的是统计内容,不是输出接触集合。
如果研究目的确实是删除短距离接触,应使用对数据本身生效的筛选步骤,并直接检查输出记录。不能因为统计文件只显示了某一部分,就推断生成矩阵时只使用了这部分。这个区别在汇报质量指标与实际分析输入时尤其重要。
本次小数据还触发了距离分布统计中的除零相关警告。某些区间没有接触,部分汇总量无法稳定估计,这是十二对人工数据的信息量限制。复现记录保留了这些警告,没有把它们掩盖成“全部指标正常”,也没有把程序继续运行解读成所有质量统计都可用。
另一方面,警告并不自动否定已经逐条核对的解析和去重输出。我们分别确认了保留与重复数量相加等于十条输入,并检查重复输出被标为重复类别。质量分布估计不足与基本接触处理是否符合规则,是需要分开验证的两件事。
八、怎样把这次练习变成可复用的分析习惯
实际使用时,先从输入里抽取一小批代表接触,包括反向比对、跨染色体、相近坐标、附加标签缺失和复杂连接等情形。对这些记录逐条确认解析结果,再运行全量处理。抽样不是替代完整质量控制,而是帮助发现坐标体系和参数语义上的错误。
然后建立一张数量记录表,依次保存进入解析的分子数量、各类接触数量、筛选后数量、去重保留数量与重复数量。复杂连接策略可能让分子与接触数量不再一一对应,因此不同阶段要明确统计单位。后续矩阵的非零像素数又是另一种单位,不能直接和接触行数比较。
最后为重复定义保留完整参数,包括容差、距离方法、后端和附加标签约束。处理多个测序块或技术重复时,还要明确去重作用于哪些合并范围。同一文库跨块产生的重复,如果各块独立删除后就直接汇总,未必已经完成全样本范围的去重。
pairtools 适合需要控制中间步骤、保留接触级证据的分析。它的灵活性也要求使用者把处理规则说明白。本次实跑最重要的收获是,保留数量的变化本身不是质量结论,只有把数量与具体重复定义、输入记录和输出类别连接起来,才知道变化意味着什么。
当接触处理规则已通过小数据核验、需要扩展到多个文库和完整数据量时,可了解云生信生物信息学分析环境与算力服务,在保留参数与日志的基础上开展批量处理。
