用于宫颈小细胞癌(SCCC)配对 tumor-normal WGS数据的学术型、模块化分析流程。核心分析为:ASCAT(CNV)+ Manta/GRIDSS(SV)+ HPV integration 联动,适配 SLURM 集群,支持 array 并行与依赖驱动 DAG。
- 1. 项目背景与目标
- 2. 项目特点 / 核心功能
- 3. 目录结构说明
- 4. 输入文件格式
- 5. 参考资源文件
- 6. 流程总体架构(Phase + Stage)
- 7. 各模块详细说明
- 8. SLURM 运行方式
- 9. 配置文件说明
- 10. 输出结果说明
- 11. 可选输入缺失时的行为
- 12. 重跑与断点续跑机制
- 13. 常见问题 / Troubleshooting
- 14. 开发状态与后续扩展
- 15. 示例命令(可直接改路径运行)
本项目面向 SCCC 配对 tumor-normal WGS 数据,目标是提供一套可发表级扩展的分析框架:
- 以
markdup后 BAM 为起点(不从 FASTQ 重比对)。 - 使用 ASCAT 输出 purity / ploidy / allele-specific CN / LOH 等 CNV 结果。
- 使用 Manta + GRIDSS 双工具进行 SV 检测,并进行后处理、合并与注释。
- 支持导入 HPV integration 断点并与宿主 CN/SV 做联动统计。
- 在 SLURM 环境实现模块化、可重跑、可 array 并行、可阶段化控制。
- WGS 原生设计(默认不提供
wes模式)。 - 配对 tumor-normal 输入(
pairbam.tsv)。 - 样本级 array 并行(soft_qc、ASCAT、SV calling、SV 注释、HPV 联动)。
- 依赖驱动 DAG(非严格串行)。
- Phase + Stage 双层控制(粗粒度 + 细粒度)。
- 自动跳过可选模块(无
group.tsv/ 无hpv_breakpoints.tsv时自动跳过对应步骤)。 - 可重跑与断点续跑(
.done+ 结果目录快照)。
.
├── 01_submit_slurm_array.sh # 主提交入口(phase + stage + DAG)
├── config/
│ └── config.yaml.example # 配置模板(参考、资源、模块参数)
├── env/
│ └── environment.yaml # 环境依赖示例
├── examples/
│ ├── pairbam.example.tsv
│ ├── group.example.tsv
│ └── hpv_breakpoints.example.tsv
├── logs/ # Slurm 日志根目录
├── results/ # 输出根目录
├── scripts/
│ ├── lib/common.sh # 公共函数(目录初始化、done、快照)
│ ├── modules/*.sh # 各模块 wrapper
│ ├── python/*.py # 占位/接口脚本
│ ├── r/ascat_run.R # ASCAT R 占位
│ ├── run_all.sh # 快速全流程提交包装
│ └── submit_module.sh # 预留模块提交脚本
├── slurm/*.sbatch # 每模块 sbatch 模板
├── slurm/templates/ # array/single 通用模板
└── workflow/Snakefile # 迁移 Snakemake 的入口占位
TAB 分隔,前三列必须固定:
| 列名 | 含义 | 约束 |
|---|---|---|
| sample_id | 样本 ID | 必须唯一 |
| tumor_bam | 肿瘤 BAM 绝对路径 | 文件必须存在 |
| normal_bam | 对照 BAM 绝对路径 | 文件必须存在且不同于 tumor_bam |
示例:
sample_id tumor_bam normal_bam
TSDX001 /data/.../TSDX001.markdup.bam /data/.../DSDX001.markdup.bam要求 BAM 对应
.bai可用;input_check 会检查可读性与兼容性。
第一列 sample_id,后续为任意分组变量(subtype/hpv_state/response 等)。
sample_id subtype hpv_state response
TSDX001 SCCC-A HPV+ PR支持无表头 raw 行(兼容外部断点导出文本),脚本会尝试解析 host chr:pos。
示例:
ID=0 chr15:-46006922 HPV39REF|lcl|Human:-6786 SUPPORTING_PAIRS=10 SPLIT_READS=0
默认 hg38 资源:
- fasta:
/data/person/wup/public/liusy_files/reference_genomes/hg38/reference/Homo_sapiens_assembly38.fasta - ASCAT loci/alleles/GC 资源:统一放置在
ascat_resources.root_dir(正式环境建议:/data/person/wup/public/liusy_files/reference_genomes/hg38/resources)。 - accessible BED:
/data/person/wup/public/liusy_files/reference_genomes/hg38/resources/access.hg38.bed
用途:
- fasta:SV/CNV 坐标体系、染色体命名检查。
- ASCAT loci/alleles/GC:用于固定位点计数、normal 杂合筛选、tumor BAF 计算、GC 矫正 logR。
- accessible BED:可访问区域过滤,避免低可比区域引入噪音。
prechecksamplecohortall
支持 --start-stage / --end-stage 在 phase 内截取窗口。
input_check(必须最先;默认不跳过)
1A 可并行分叉:
soft_qcascat_preparesv_call_mantasv_call_gridss
1B 依赖上游:
ascat_run(依赖ascat_prepare)sv_postfilter(依赖sv_call_manta + sv_call_gridss)
1C 样本级整合:
sv_merge(依赖sv_postfilter)
1D 样本级注释:
sv_annotation(依赖sv_merge + ascat_run)
1E HPV 联动(可选):
hpv_link(依赖ascat_run + sv_annotation;无hpv_breakpoints.tsv自动跳过)
cohort_summary(依赖ascat_run + sv_annotation)group_compare(依赖cohort_summary;若比较 HPV linked 指标可附加hpv_link;无 group 文件自动跳过)final_report(依赖cohort_summary + soft_qc;若存在 group/hpv 结果则纳入)
说明:本流程不再提供
--enable-annotation。sv_annotation是主流程必需阶段。
下表为“当前版本”的接口契约与输出约定,便于后续替换为真实算法实现。
- 输入:
pairbam.tsv、config.yaml - 输出:
results/input_check/input_check.report.tsv - 依赖:无
- 功能:表头/唯一性/绝对路径/BAM+BAI/可读性检查 + ASCAT 正式资源检查
- 自动探测或读取
ascat_resources.{loci_path,alleles_path,gc_path} - 检查 loci/alleles/GC 文件存在性
- 检查 BAM 染色体命名与 ASCAT 资源 chr 风格一致性
- 在报告中写入资源识别结果(INFO 行)
- 自动探测或读取
- array:否
- 输入:每样本 tumor/normal BAM
- 输出:
results/soft_qc/<sample>/soft_qc.summary.tsv - 依赖:
input_check - 功能:基础 QC 汇总(不硬停)
- reads/mapping/duplicate 指标来自
samtools flagstat - 覆盖度使用抽样窗口估计(
samtools bedcov),默认主染色体随机窗口;避免samtools depth -a全基因组逐位点扫描 summary.tsv额外记录coverage_method / n_windows / window_size便于追踪估计策略
- reads/mapping/duplicate 指标来自
- array:是
- 输入:BAM + 固定 ASCAT 资源(loci/alleles/GC)
- 输出:
baf.tsv、logr.tsv、ascat_prepare.run_info.tsv - 依赖:
input_check - 功能:按 nf-core/sarek 的 ASCAT/HTS 思路组织 ASCAT 预处理
- 不再从
reference.snp_vcf抽样位点;直接使用固定 loci + alleles + GC 资源 - BAF:normal 先筛选高质量杂合位点,再用 tumor 在同位点的等位计数计算 BAF
- 计数优先
alleleCounter;若缺失或失败,自动 fallback 到samtools mpileup - logR:基于 tumor/normal depth ratio,并结合固定 GC 资源做线性 GC 矫正(不足时 fallback 到 raw ratio)
run_info明确记录 loci_path / alleles_path / gc_path / BAF 方法 / logR 方法 / 是否 fallback
- 不再从
- array:是
- 输入:ascat_prepare 结果
- 输出:
purity_ploidy.tsv、segments.tsv、allele_specific_cn.tsv、loh.tsv、arm_level_cn.tsv、gene_level_cn.tsv、run_info.tsv - 依赖:
ascat_prepare - 功能:ASCAT 拟合与结果导出
- array:是
- 输入:配对 BAM
- 输出:
somaticSV.vcf.gz、manta.summary.tsv - 依赖:
input_check - 功能:Manta 体细胞 SV calling
- array:是
- 输入:配对 BAM(normal 在前 tumor 在后)
- 输出:
gridss.somatic.vcf.gz、gridss.summary.tsv - 依赖:
input_check - 功能:GRIDSS SV calling
- array:是
- 输入:Manta + GRIDSS VCF
- 输出:
manta.postfilter.tsv、gridss.postfilter.tsv - 依赖:
sv_call_manta + sv_call_gridss - 功能:支持证据抽取、标准化
- array:是
- 输入:postfilter TSV
- 输出:
merged.sv.tsv - 依赖:
sv_postfilter - 功能:样本级 union merge + source 标记(MANTA/GRIDSS/BOTH)
- array:是
- 输入:
merged.sv.tsv+ ascat 结果(+可选 HPV 位点) - 输出:
annotated.sv.tsv - 依赖:
sv_merge + ascat_run - 功能:当前为占位实现,仅输出固定表头 +
NA结果,用于验证流程接口与依赖,不用于真实生物学注释结论 - array:是
- 输入:
hpv_breakpoints.tsv+ ascat + annotated SV - 输出:
hpv_cn_link.tsv、hpv_sv_link.tsv、hpv_link.summary.tsv - 依赖:
ascat_run + sv_annotation - 功能:按窗口(10kb/100kb/1Mb)联动统计
- array:是
- 输入:全样本 ASCAT + SV annotation
- 输出:
cohort.purity_ploidy.tsv、cohort.arm_level_cn.matrix.tsv、cohort.gene_level_cn.matrix.tsv、cohort.loh.matrix.tsv、cohort.sv_burden.tsv、cohort.sv_event_table.tsv - 依赖:
ascat_run + sv_annotation - 功能:队列级汇总与矩阵化
- array:否
- 输入:
group.tsv+ cohort summary - 输出:按分组列导出的 summary / plot 占位结果
- 依赖:
cohort_summary(可选附加hpv_link) - 功能:分组汇总比较
- array:否
- 输入:cohort/group/hpv/soft_qc 结果
- 输出:
results/final_report/final_report.md - 依赖:
cohort_summary + soft_qc(可纳入 group/hpv) - 功能:项目级总览报告
- array:否
group.tsv存在:允许cohort_summary,若存在有效分组列(除sample_id外)则运行group_compare,final_report可生成完整 cohort 报告。group.tsv不存在:--phase cohort:直接报错退出。--phase all:自动跳过cohort_summary/group_compare/final_report,仅运行 precheck + sample,并给 warning。--phase sample:不要求group.tsv。
- 若
group.tsv仅有sample_id而无有效分组列:跳过group_compare,但cohort_summary与final_report仍执行。
bash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--group input/group.tsv \
--hpv-breakpoints input/hpv_breakpoints.tsv \
--results-dir results_run_20260421 \
--phase all \
--max-parallel 2 \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--results-dir results_run_20260421 \
--phase sample \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--results-dir results_run_20260421 \
--phase all \
--start-stage sv_postfilter \
--end-stage final_report \
--config config/config.yaml.example# 全局并发
--max-parallel 2
# 单 stage 覆盖(可重复)
--max-parallel-stage sv_call_gridss=1 \
--max-parallel-stage ascat_run=1--skip-input-check 1默认 --skip-input-check 0。
- 某样本:删除对应样本目录
.done后,重投该阶段 array(可用--start-stage/--end-stage限定)。 - 某阶段:删除阶段输出
.done或阶段目录中的目标结果后重投。
config/config.yaml.example 关键内容:
reference:hg38 fasta / access BED(snp_vcf可保留给其他模块,不再作为 ASCAT 正式主输入)。ascat_resources:ASCAT 正式资源根目录与 loci/alleles/gc 路径、chr 风格、alleleCounter 可执行文件。parallel.max_parallel_default:默认并发。modules.<stage>.slurm.*:分模块资源策略(partition/cpu/mem/time/log)。qc.*:soft_qc覆盖度估计策略参数(coverage_method、n_windows、window_size、include_chroms),用于平衡速度与稳健性。ascat_prepare.*:ASCAT 预处理参数(max_sites、min_normal_depth、min_tumor_depth、include_chroms、normal het BAF 区间)。hpv_link.windows_bp:联动窗口。
cpu1:常规模块(soft_qc、ascat_prepare/run、manta、postfilter、summary)。cpu2:重计算模块(gridss)。
input_check:cpu1, 1 CPU, 4Gsoft_qc:cpu1, 4 CPU, 16Gascat_prepare:cpu1, 8 CPU, 32Gascat_run:cpu1, 4 CPU, 16Gsv_call_manta:cpu1, 8 CPU, 32Gsv_call_gridss:cpu2, 16 CPU, 64Gsv_postfilter:cpu1, 2 CPU, 8Gsv_merge:cpu1, 2 CPU, 8Gsv_annotation:cpu1, 2 CPU, 8Ghpv_link:cpu1, 2 CPU, 8Gcohort_summary:cpu1, 4 CPU, 16Ggroup_compare:cpu1, 2 CPU, 8Gfinal_report:cpu1, 1 CPU, 4G,02:00:00
purity_ploidy.tsv:样本纯度和倍性segments.tsv:CN 分段allele_specific_cn.tsv:等位基因 CNloh.tsv:LOH 区域arm_level_cn.tsv/gene_level_cn.tsvrun_info.tsv:收敛/运行状态
somaticSV.vcf.gz(Manta 原始)gridss.somatic.vcf.gz(GRIDSS 原始)*.postfilter.tsv(标准化后)merged.sv.tsv(样本级并集)annotated.sv.tsv(样本级注释)
cohort.purity_ploidy.tsvcohort.arm_level_cn.matrix.tsvcohort.gene_level_cn.matrix.tsvcohort.loh.matrix.tsvcohort.sv_burden.tsvcohort.sv_event_table.tsv
hpv_cn_link.tsvhpv_sv_link.tsvhpv_link.summary.tsv
- 缺少
group.tsv:--phase all:自动跳过整个 cohort 阶段(cohort_summary/group_compare/final_report)。--phase cohort:报错退出。--phase sample:不受影响。
- 缺少
hpv_breakpoints.tsv:hpv_link自动跳过(不影响主 CNV/SV)。
- 每个模块输出目录写入
.done。 .done记录status/timestamp/stage/sample_id。- 每次提交会将当前
config与pairbam快照至results_dir/00.config/。 - 若用
--start-stage/--end-stage从中间重跑,提交脚本会检查被截断上游的.done是否存在(样本级检查到每个 sample);缺失时直接报错,避免“误跳过上游导致下游失败”。 - 若担心旧结果复用:
- 推荐新建
results_dir;或 - 删除目标模块
.done强制重跑。
- 推荐新建
-
chr 命名不一致(chr1 vs 1)
优先在input_check阶段修正参考与 BAM/VCF 一致性。 -
BAM/BAI 缺失或不可读
input_check会失败并阻断后续;先修复路径与索引。 -
input_check 失败后流程不启动
这是预期行为;后续均依赖其afterok。 -
Slurm Pending 很久
调低--max-parallel或对重模块使用--max-parallel-stage限流。 -
array 日志怎么看
查看logs/<module>/%A_%a.out和%A_%a.err。
- 已完成 phase+stage 控制、DAG 提交、array 框架、I/O 契约、可选模块自动跳过、断点续跑机制。
sv_annotation仍为占位模块,因此当前 pipeline 可用于提交框架与可运行性测试,但不能用于验证真实注释生物学结果。
- 将占位实现替换为真实生产命令(ASCAT/Manta/GRIDSS 参数细化)。
- 增强统计与可视化。
- 接入
snv_indel_hook(SNV/Indel + driver 注释)并与 CN/SV 联合解释。
bash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--group input/group.tsv \
--hpv-breakpoints input/hpv_breakpoints.tsv \
--results-dir results/run_all \
--phase all \
--max-parallel 2 \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--results-dir results/precheck \
--phase precheck \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--results-dir results/sample_only \
--phase sample \
--max-parallel 2 \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--group input/group.tsv \
--results-dir results/rerun_tail \
--phase all \
--start-stage sv_postfilter \
--end-stage final_report \
--max-parallel 2 \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--results-dir results/gridss_limited \
--phase all \
--max-parallel 3 \
--max-parallel-stage sv_call_gridss=1 \
--config config/config.yaml.examplebash 01_submit_slurm_array.sh \
--pairs input/sample_pairs.tsv \
--results-dir results/skip_precheck \
--phase sample \
--skip-input-check 1 \
--config config/config.yaml.example