Skip to content

Commit

Permalink
Merge pull request #115 from nf-core/support-donor-sample
Browse files Browse the repository at this point in the history
  • Loading branch information
scwatts authored Dec 5, 2024
2 parents d00a14b + 2c20a1e commit 45bf362
Show file tree
Hide file tree
Showing 12 changed files with 210 additions and 27 deletions.
19 changes: 19 additions & 0 deletions lib/Constants.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ class Constants {
TUMOR,
NORMAL,
TUMOR_NORMAL,
DONOR,
}

static enum SequenceType {
Expand Down Expand Up @@ -136,6 +137,18 @@ class Constants {
SequenceType.DNA,
],

BAM_DNA_DONOR: [
FileType.BAM,
SampleType.DONOR,
SequenceType.DNA,
],

BAM_MARKDUPS_DNA_DONOR: [
FileType.BAM_MARKDUPS,
SampleType.DONOR,
SequenceType.DNA,
],

BAM_RNA_TUMOR: [
FileType.BAM,
SampleType.TUMOR,
Expand All @@ -154,6 +167,12 @@ class Constants {
SequenceType.DNA,
],

BAI_DNA_DONOR: [
FileType.BAI,
SampleType.DONOR,
SequenceType.DNA,
],

BAI_RNA_TUMOR: [
FileType.BAI,
SampleType.TUMOR,
Expand Down
54 changes: 52 additions & 2 deletions lib/Utils.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,13 @@ class Utils {

}

// Do not allow donor sample without normal sample
if (Utils.hasDonorDna(meta) && ! Utils.hasNormalDna(meta)) {
log.error "a donor sample but not normal sample was found for ${meta.group_id}\n\n" +
"Analysis with a donor sample requires a normal sample."
Nextflow.exit(1)
}

// Apply some required restrictions to targeted mode
if (run_config.mode === Constants.RunMode.TARGETED) {

Expand Down Expand Up @@ -401,6 +408,9 @@ class Utils {
return meta.getOrDefault([Constants.SampleType.NORMAL, Constants.SequenceType.DNA], [:])
}

static public getDonorDnaSample(meta) {
return meta.getOrDefault([Constants.SampleType.DONOR, Constants.SequenceType.DNA], [:])
}

// Sample names
static public getTumorDnaSampleName(meta) {
Expand All @@ -415,8 +425,12 @@ class Utils {
return getNormalDnaSample(meta)['sample_id']
}

static public getDonorDnaSampleName(meta) {
return getDonorDnaSample(meta)['sample_id']
}


// Files
// Files - Tumor DNA
static public getTumorDnaFastq(meta) {
return getTumorDnaSample(meta).getOrDefault(Constants.FileType.FASTQ, null)
}
Expand Down Expand Up @@ -447,6 +461,7 @@ class Utils {
}


// Files - Normal DNA
static public getNormalDnaFastq(meta) {
return getNormalDnaSample(meta).getOrDefault(Constants.FileType.FASTQ, null)
}
Expand Down Expand Up @@ -475,7 +490,6 @@ class Utils {
return getNormalDnaMarkdupsBam(meta) !== null
}


static public hasDnaFastq(meta) {
return hasNormalDnaFastq(meta) || hasTumorDnaFastq(meta)
}
Expand All @@ -485,6 +499,38 @@ class Utils {
}


// Files - Donor DNA
static public getDonorDnaFastq(meta) {
return getDonorDnaSample(meta).getOrDefault(Constants.FileType.FASTQ, null)
}

static public getDonorDnaBam(meta) {
return getDonorDnaSample(meta).getOrDefault(Constants.FileType.BAM, null)
}

static public getDonorDnaMarkdupsBam(meta) {
return getDonorDnaSample(meta).getOrDefault(Constants.FileType.BAM_MARKDUPS, null)
}

static public getDonorDnaBai(meta) {
return getDonorDnaSample(meta).getOrDefault(Constants.FileType.BAI, null)
}


static public hasDonorDnaFastq(meta) {
return getDonorDnaFastq(meta) !== null
}

static public hasDonorDnaBam(meta) {
return getDonorDnaBam(meta) !== null
}

static public hasDonorDnaMarkdupsBam(meta) {
return getDonorDnaMarkdupsBam(meta) !== null
}


// Files - Tumor RNA
static public getTumorRnaFastq(meta) {
return getTumorRnaSample(meta).getOrDefault(Constants.FileType.FASTQ, null)
}
Expand Down Expand Up @@ -516,6 +562,10 @@ class Utils {
return hasNormalDnaBam(meta) || hasNormalDnaMarkdupsBam(meta) || hasNormalDnaFastq(meta)
}

static public hasDonorDna(meta) {
return hasDonorDnaBam(meta) || hasDonorDnaMarkdupsBam(meta) || hasDonorDnaFastq(meta)
}

static public hasTumorRna(meta) {
return hasTumorRnaBam(meta) || hasTumorRnaFastq(meta)
}
Expand Down
15 changes: 11 additions & 4 deletions modules/local/amber/main.nf
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ process AMBER {
'biocontainers/hmftools-amber:4.0.1--hdfd78af_0' }"

input:
tuple val(meta), path(tumor_bam), path(normal_bam), path(tumor_bai), path(normal_bai)
tuple val(meta), path(tumor_bam), path(normal_bam), path(donor_bam), path(tumor_bai), path(normal_bai), path(donor_bai)
val genome_ver
path heterozygous_sites
path target_region_bed
Expand All @@ -25,10 +25,17 @@ process AMBER {

def xmx_mod = task.ext.xmx_mod ?: 0.75

def reference_arg = meta.containsKey('normal_id') ? "-reference ${meta.normal_id}" : ''
def reference_bam_arg = normal_bam ? "-reference_bam ${normal_bam}" : ''
def reference_ids = []
if (meta.normal_id != null) reference_ids.add(meta.normal_id)
if (meta.donor_id != null) reference_ids.add(meta.donor_id)
def reference_arg = reference_ids.size() > 0 ? "-reference ${String.join(",", reference_ids)}" : ""

def target_regions_bed_arg = target_region_bed ? "-target_regions_bed ${target_region_bed}" : ''
def reference_bams = []
if (normal_bam) reference_bams.add(normal_bam.toString())
if (donor_bam) reference_bams.add(donor_bam.toString())
def reference_bam_arg = reference_bams.size() > 0 ? "-reference_bam ${String.join(",", reference_bams)}" : ""

def target_regions_bed_arg = target_region_bed ? "-target_regions_bed ${target_region_bed}" : ""

"""
amber \\
Expand Down
8 changes: 8 additions & 0 deletions modules/local/amber/meta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ input:
type: file
description: Normal BAM file
pattern: "*.{bam}"
- donor_bam:
type: file
description: Donor BAM file
pattern: "*.{bam}"
- tumor_bai:
type: file
description: Tumor BAI file
Expand All @@ -31,6 +35,10 @@ input:
type: file
description: Normal BAI file
pattern: "*.{bai}"
- donor_bai:
type: file
description: Donor BAI file
pattern: "*.{bai}"
- genome_ver:
type: string
description: Reference genome version
Expand Down
16 changes: 13 additions & 3 deletions modules/local/sage/somatic/main.nf
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ process SAGE_SOMATIC {
'biocontainers/hmftools-sage:3.4.4--hdfd78af_0' }"

input:
tuple val(meta), path(tumor_bam), path(normal_bam), path(tumor_bai), path(normal_bai)
tuple val(meta), path(tumor_bam), path(normal_bam), path(donor_bam), path(tumor_bai), path(normal_bai), path(donor_bai)
path genome_fasta
val genome_ver
path genome_fai
Expand All @@ -34,8 +34,17 @@ process SAGE_SOMATIC {

def xmx_mod = task.ext.xmx_mod ?: 0.95

def reference_arg = meta.containsKey('normal_id') ? "-reference ${meta.normal_id}" : ''
def reference_bam_arg = normal_bam ? "-reference_bam ${normal_bam}" : ''
def reference_ids = []
if (meta.normal_id != null) reference_ids.add(meta.normal_id)
if (meta.donor_id != null) reference_ids.add(meta.donor_id)
def reference_arg = reference_ids.size() > 0 ? "-reference ${String.join(",", reference_ids)}" : ""

def reference_bams = []
if (normal_bam) reference_bams.add(normal_bam.toString())
if (donor_bam) reference_bams.add(donor_bam.toString())
def reference_bam_arg = reference_bams.size() > 0 ? "-reference_bam ${String.join(",", reference_bams)}" : ""

def ref_sample_count_arg = "-ref_sample_count ${reference_ids.size()}"

"""
mkdir -p somatic/
Expand All @@ -45,6 +54,7 @@ process SAGE_SOMATIC {
${args} \\
${reference_arg} \\
${reference_bam_arg} \\
${ref_sample_count_arg} \\
-tumor ${meta.tumor_id} \\
-tumor_bam ${tumor_bam} \\
-ref_genome ${genome_fasta} \\
Expand Down
8 changes: 8 additions & 0 deletions modules/local/sage/somatic/meta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ input:
type: file
description: Normal BAM file
pattern: "*.{bam}"
- donor_bam:
type: file
description: Donor BAM file
pattern: "*.{bam}"
- tumor_bai:
type: file
description: Tumor BAI file
Expand All @@ -33,6 +37,10 @@ input:
type: file
description: Normal BAI file
pattern: "*.{bai}"
- donor_bai:
type: file
description: Donor BAI file
pattern: "*.{bai}"
- genome_fasta:
type: file
description: Reference genome assembly FASTA file
Expand Down
20 changes: 15 additions & 5 deletions subworkflows/local/amber_profiling/main.nf
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ workflow AMBER_PROFILING {
ch_inputs // channel: [mandatory] [ meta ]
ch_tumor_bam // channel: [mandatory] [ meta, bam, bai ]
ch_normal_bam // channel: [mandatory] [ meta, bam, bai ]
ch_donor_bam // channel: [mandatory] [ meta, bam, bai ]

// Reference data
genome_version // channel: [mandatory] genome version
Expand All @@ -30,27 +31,32 @@ workflow AMBER_PROFILING {
ch_inputs_sorted = WorkflowOncoanalyser.groupByMeta(
ch_tumor_bam,
ch_normal_bam,
ch_donor_bam,
)
.map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai ->
.map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, donor_bam, donor_bai ->
return [
meta,
Utils.selectCurrentOrExisting(tumor_bam, meta, Constants.INPUT.BAM_MARKDUPS_DNA_TUMOR),
tumor_bai ?: Utils.getInput(meta, Constants.INPUT.BAI_DNA_TUMOR),

Utils.selectCurrentOrExisting(normal_bam, meta, Constants.INPUT.BAM_MARKDUPS_DNA_NORMAL),
normal_bai ?: Utils.getInput(meta, Constants.INPUT.BAI_DNA_NORMAL),

Utils.selectCurrentOrExisting(donor_bam, meta, Constants.INPUT.BAM_MARKDUPS_DNA_DONOR),
donor_bai ?: Utils.getInput(meta, Constants.INPUT.BAI_DNA_DONOR),
]
}
.branch { meta, tumor_bam, tumor_bai, normal_bam, normal_bai ->
.branch { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, donor_bam, donor_bai ->
def has_existing = Utils.hasExistingInput(meta, Constants.INPUT.AMBER_DIR)
runnable: tumor_bam && !has_existing
skip: true
return meta
}

// Create process input channel
// channel: [ meta_amber, tumor_bam, normal_bam, tumor_bai, normal_bai ]
// channel: [ meta_amber, tumor_bam, normal_bam, donor_bam, tumor_bai, normal_bai, donor_bai ]
ch_amber_inputs = ch_inputs_sorted.runnable
.map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai ->
.map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, donor_bam, donor_bai ->

def meta_amber = [
key: meta.group_id,
Expand All @@ -62,7 +68,11 @@ workflow AMBER_PROFILING {
meta_amber.normal_id = Utils.getNormalDnaSampleName(meta)
}

[meta_amber, tumor_bam, normal_bam, tumor_bai, normal_bai]
if (donor_bam) {
meta_amber.donor_id = Utils.getDonorDnaSampleName(meta)
}

[meta_amber, tumor_bam, normal_bam, donor_bam, tumor_bai, normal_bai, donor_bai]
}

// Run process
Expand Down
18 changes: 17 additions & 1 deletion subworkflows/local/read_alignment_dna/main.nf
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,20 @@ workflow READ_ALIGNMENT_DNA {
skip: true
}

ch_inputs_donor_sorted = ch_inputs
.branch { meta ->
def has_existing = Utils.hasExistingInput(meta, Constants.INPUT.BAM_DNA_DONOR)
runnable: Utils.hasDonorDnaFastq(meta) && !has_existing
skip: true
}

// Create FASTQ input channel
// channel: [ meta_fastq, fastq_fwd, fastq_rev ]
ch_fastq_inputs = Channel.empty()
.mix(
ch_inputs_tumor_sorted.runnable.map { meta -> [meta, Utils.getTumorDnaSample(meta), 'tumor'] },
ch_inputs_normal_sorted.runnable.map { meta -> [meta, Utils.getNormalDnaSample(meta), 'normal'] },
ch_inputs_donor_sorted.runnable.map { meta -> [meta, Utils.getDonorDnaSample(meta), 'donor'] },
)
.flatMap { meta, meta_sample, sample_type ->
meta_sample
Expand Down Expand Up @@ -185,9 +193,10 @@ workflow READ_ALIGNMENT_DNA {
}
.groupTuple()
.branch { meta_group, bams, bais ->
assert ['tumor', 'normal'].contains(meta_group.sample_type)
assert ['tumor', 'normal', 'donor'].contains(meta_group.sample_type)
tumor: meta_group.sample_type == 'tumor'
normal: meta_group.sample_type == 'normal'
donor: meta_group.sample_type == 'donor'
placeholder: true
}

Expand All @@ -205,9 +214,16 @@ workflow READ_ALIGNMENT_DNA {
ch_inputs_normal_sorted.skip.map { meta -> [meta, [], []] },
)

ch_bam_donor_out = Channel.empty()
.mix(
WorkflowOncoanalyser.restoreMeta(ch_bams_united.donor, ch_inputs),
ch_inputs_donor_sorted.skip.map { meta -> [meta, [], []] },
)

emit:
dna_tumor = ch_bam_tumor_out // channel: [ meta, [bam, ...], [bai, ...] ]
dna_normal = ch_bam_normal_out // channel: [ meta, [bam, ...], [bai, ...] ]
dna_donor = ch_bam_donor_out // channel: [ meta, [bam, ...], [bai, ...] ]

versions = ch_versions // channel: [ versions.yml ]
}
Loading

0 comments on commit 45bf362

Please sign in to comment.