Computational pipeline for the paper:
This repository contains the full analysis pipeline used to identify and characterize POLE/POLD1 deficiency (PPD) driver variants across 235,161 sequenced tumors from three large cancer genomic databases: AACR GENIE v16.1, TCGA, and China Pan-Cancer (CPC).
The pipeline:
- Preprocesses and merges mutation data across cohorts
- Classifies tumors as MMR-deficient (MMRd) or MMR-proficient (MMRp)
- Identifies PPD tumors using an iterative Support Vector Machine (SVM) algorithm
- Classifies POLE/POLD1 variants as driver or passenger
- Performs structural clustering, amino acid substitution analysis, and survival analysis
PPD-driver-variants-pipeline/
│
├── preprocessing/
│ ├── clean_data.py # Merge and preprocess GENIE, TCGA, CPC MAF files
│ └── prepare_poled1_samples.py # Filter POLE/POLD1 samples, compute signatures & ratios
│
├── mmr_classification/
│ ├── mmr_classification.py # Classify all samples as MMRd/MMRp using MS-indels + signatures
│ └── mmr_sanity_check.py # Validate MMR classification against MSKCC CHORD 2024 cohort
│
├── svm_classification/
│ ├── svm_ppd_classifier.py # Iterative linear SVM to classify PPD tumors (MMRp & MMRd)
│ └── classify_no_poled1_samples.py # Apply trained SVM to tumors without POLE/POLD1 variants
│
├── driver_classification/
│ ├── classify_driver_variants.py # Classify variants as driver/passenger (binomial + z-test)
│ └── compare_sequencing_centers.py # Test for center-specific bias in PPD classification
│
├── visualization/
│ ├── plot_ppd_classification.py # Scatter plots of SVM-classified PPD tumors
│ ├── plot_cancer_types.py # PPD frequency by cancer type
│ └── saturation_analysis.R # Saturation curve: driver discovery vs. sample size
│
├── structural_analysis/
│ └── hierarchical_clustering_pole.py # 3D clustering of POLE ExoD variants using AlphaFold structure
│
├── aa_analysis/
│ └── AA_substitution_analysis.R # Amino acid substitution profiles & cosine similarity analysis
│
├── survival_analysis/
│ └── genie_tcga_survival.py # Vital status and Kaplan-Meier analysis (GENIE + TCGA)
│
├── environment.yml # Conda environment for Python dependencies
├── requirements.txt # pip requirements for Python dependencies
├── r_requirements.R # R package installation script
└── README.md
Run scripts in the following order:
python preprocessing/clean_data.py
python preprocessing/prepare_poled1_samples.pyInput: Raw MAF files from GENIE, TCGA, CPC + clinical sample tables
Output: combined_maf_mod.csv, poled1_samples.csv, main.csv
python mmr_classification/mmr_classification.py
python mmr_classification/mmr_sanity_check.py # optional validationInput: main.csv, MS-indel counts (from Phobos), MSKCC CHORD 2024 cohort
Output: main_selected_ttypes.csv with MMRd column; validation metrics
python svm_classification/svm_ppd_classifier.py
python svm_classification/classify_no_poled1_samples.pyInput: main_selected_ttypes.csv
Output: main_classified_svm.csv, Table 3.xlsx (PPD tumors without POLE/POLD1 variants)
python driver_classification/classify_driver_variants.py
python driver_classification/compare_sequencing_centers.py # optional center bias checkInput: main_classified_svm.csv, known_driver_list.csv
Output: drivers_list.csv, drivers_list.xlsx, main_classified_all.csv
# Python
python visualization/plot_ppd_classification.py
python visualization/plot_cancer_types.py
python survival_analysis/genie_tcga_survival.py
python structural_analysis/hierarchical_clustering_pole.py
# R
Rscript visualization/saturation_analysis.R
Rscript aa_analysis/AA_substitution_analysis.RAll datasets used are publicly available:
| Dataset | Version | Access |
|---|---|---|
| AACR GENIE | v16.1 | Synapse syn51355584 |
| TCGA | PanCancer | cBioPortal |
| China Pan-Cancer (CPC) | — | cBioPortal |
| MSKCC CHORD 2024 | — | cBioPortal |
| AlphaFold POLE structure | AF-Q07864-F1-model_v6 | AlphaFold DB |
Note: The MS-indel counting step referenced in several scripts was performed in R using the
data.tablepackage for performance, overlapping indels against a microsatellite locus file generated by Phobos.
conda env create -f environment.yml
conda activate ppd-pipelinepip install -r requirements.txtsource("r_requirements.R")| File | Description |
|---|---|
combined_maf_mod.csv |
Merged & cleaned MAF across all three cohorts |
poled1_samples.csv |
Samples with POLE/POLD1 missense SNVs |
main.csv |
Signature ratios and metadata for POLE/POLD1 samples |
main_selected_ttypes.csv |
Filtered to relevant tumor types with MMRd classification |
main_classified_svm.csv |
After iterative SVM PPD classification |
main_classified_all.csv |
Final file with driver/passenger/unsolved labels |
drivers_list.csv / .xlsx |
Final curated list of 65 PPD driver variants |
known_driver_list.csv |
Previously reported driver variants used as training labels |
For questions, please contact Yosef E. Maruvka (Technion, Israel) or open a GitHub issue.