aboutsummaryrefslogtreecommitdiff
path: root/examples/ex-tnpair
diff options
context:
space:
mode:
Diffstat (limited to 'examples/ex-tnpair')
-rw-r--r--examples/ex-tnpair/README.md22
-rw-r--r--examples/ex-tnpair/cluster.nix25
-rw-r--r--examples/ex-tnpair/default.nix50
-rwxr-xr-xexamples/ex-tnpair/tnpair58
-rw-r--r--examples/ex-tnpair/tnpair.nix56
5 files changed, 136 insertions, 75 deletions
diff --git a/examples/ex-tnpair/README.md b/examples/ex-tnpair/README.md
new file mode 100644
index 0000000..0eef691
--- /dev/null
+++ b/examples/ex-tnpair/README.md
@@ -0,0 +1,22 @@
+This example is a tumour-normal processing workflow applied to a
+publically available whole-genome sequencing (WGS) dataset. As this
+example uses WGS data, a large amount of data will be downloaded.
+Furthermore, a large amount of space will be required to build the final
+products.
+
+# Building on local machine
+
+Run `nix build -I bionix=../..` in this directory.
+
+# Building via HPC (slurm or torque)
+
+Run `nix build -f cluster.nix` to build on slurm. Note that Nix must be
+configured such that the temporary build directories are created on
+shared storage.
+
+For Torque, run `nix build -f cluster.nix -I bionix=../.. --argstr
+tmpDir /scratch/`. Unlike the slurm handler, a shared tmpdir location
+must be specified.
+
+In both cases, you may need to adjust the resource limits specified in
+cluster.nix to suit your particular cluster hardware.
diff --git a/examples/ex-tnpair/cluster.nix b/examples/ex-tnpair/cluster.nix
new file mode 100644
index 0000000..d7537b2
--- /dev/null
+++ b/examples/ex-tnpair/cluster.nix
@@ -0,0 +1,25 @@
+{ bionix ? import <bionix> { }, tmpDir ? null }:
+
+let
+ bionix' = (bionix."${if tmpDir == null then "slurm" else "qsub"}" {
+ ppn = 24;
+ mem = 7;
+ walltime = "3:00:00";
+ } // bionix.lib.optionalAttrs (tmpDir != null) { inherit tmpDir; }).extend
+ (self: super:
+ with self; {
+ minimap2.align = def super.minimap2.align {
+ mem = 15;
+ walltime = "16:00:00";
+ };
+ samtools = super.samtools // (with super.samtools; {
+ markdup = def markdup { walltime = "12:00:00"; };
+ fixmate = def fixmate { walltime = "10:00:00"; };
+ sort = def sort {
+ mem = 27;
+ flags = "-m 1G";
+ };
+ });
+ });
+
+in import ./. { bionix = bionix'; }
diff --git a/examples/ex-tnpair/default.nix b/examples/ex-tnpair/default.nix
new file mode 100644
index 0000000..f9581f8
--- /dev/null
+++ b/examples/ex-tnpair/default.nix
@@ -0,0 +1,50 @@
+{ bionix ? import <bionix> { } }:
+
+with bionix;
+with pkgs;
+with lib;
+
+let
+ pair = {
+ normal = {
+ type = "reference";
+ inputs = {
+ input1 = {
+ url =
+ "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR275/009/ERR2752449/ERR2752449_1.fastq.gz";
+ sha256 =
+ "52f8b1b1a58b60c66ce566371dfe7a1301a787e8521a4ee41019bbf4f4d18dfe";
+ };
+ input2 = {
+ url =
+ "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR275/009/ERR2752449/ERR2752449_2.fastq.gz";
+ sha256 =
+ "9d1e2ea772bbdf5ff3ee6a44d2d4244155b7d195a37745a2028628e2543cd8f0";
+ };
+ };
+ };
+
+ tumour = {
+ type = "melanoma";
+ inputs = {
+ input1 = {
+ url =
+ "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR275/000/ERR2752450/ERR2752450_1.fastq.gz";
+ sha256 =
+ "2b3c98c36c2b2b6bc4682401a592a900f8eb2a143f93494ee448d6b075c12ec7";
+ };
+ input2 = {
+ url =
+ "ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR275/000/ERR2752450/ERR2752450_2.fastq.gz";
+ sha256 =
+ "0569beded708ef520dadca45ab8a70bd890caf441a0ad3749397f315dc1d2e8c";
+ };
+ };
+ };
+ };
+
+ fetch = s: mapAttrs (_: fetchFastQGZ) s.inputs;
+
+in import ./tnpair.nix {
+ inherit pair fetch bionix;
+}
diff --git a/examples/ex-tnpair/tnpair b/examples/ex-tnpair/tnpair
deleted file mode 100755
index d90374b..0000000
--- a/examples/ex-tnpair/tnpair
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-
-set -e
-
-if [[ $# -ne 5 ]] ; then
- echo "Usage: $0 ref normal1 normal2 tumour1 tumour2"
- exit 1
-fi
-
-function cleanup {
- if [[ -e tnpair-$$ ]]; then
- rm tnpair-$$
- fi
-}
-trap cleanup INT TERM EXIT
-
-ref=`readlink -f $1`
-norm1=`readlink -f $2`
-norm2=`readlink -f $3`
-tumour1=`readlink -f $4`
-tumour2=`readlink -f $5`
-
-refhash=`nix-hash --base32 --type sha256 --flat $ref`
-norm1hash=`nix-hash --base32 --type sha256 --flat $norm1`
-norm2hash=`nix-hash --base32 --type sha256 --flat $norm2`
-tumour1hash=`nix-hash --base32 --type sha256 --flat $tumour1`
-tumour2hash=`nix-hash --base32 --type sha256 --flat $tumour2`
-
-cat > tnpair-$$ <<EOF
-import ./tnpair.nix {
- normal = {
- input1={
- url="file://$norm1";
- sha256="$norm1hash";
- };
- input2={
- url="file://$norm2";
- sha256="$norm2hash";
- };
- };
- tumour = {
- input1={
- url = "file://$tumour1";
- sha256 = "$tumour1hash";
- };
- input2={
- url = "file://$tumour2";
- sha256 = "$tumour2hash";
- };
- };
- ref = {
- url = "file://$ref";
- sha256 = "$refhash";
- };
-}
-EOF
-
-nix build --keep-going "(import ./tnpair-$$)" --no-sandbox
diff --git a/examples/ex-tnpair/tnpair.nix b/examples/ex-tnpair/tnpair.nix
index 51cd703..70f5514 100644
--- a/examples/ex-tnpair/tnpair.nix
+++ b/examples/ex-tnpair/tnpair.nix
@@ -1,26 +1,48 @@
-# This is an example tumour-normal calling pipeline using strelka
-{ bionix ? import ./../.. {}
-, normal
-, tumour
-, ref
-}:
+{bionix ? import <bionix> {}, pair, fetch}:
with bionix;
with lib;
+with types;
+
+with minimap2;
+with samtools;
+with snpeff;
let
- input = mapAttrs (_: fetchFastQGZ);
-
- preprocess = flip pipe [
- input
- (bwa.align { ref = fetchFastA ref; })
- (samtools.fixmate {})
- (samtools.sort {})
- (samtools.markdup {})
+ preprocess = s: pipe s [
+ fetch
+ (align { preset = "sr"; ref = ref.grch38.seq; flags = "-R'@RG\\tID:${s.type}\\tSM:${s.type}'"; })
+ (fixmate {})
+ (sort { })
+ (markdup { })
];
+ dropErrors = input: stage {
+ name = "drop-errors";
+ buildCommand = ''
+ grep -v "ERROR_" ${input} > $out
+ '';
+ passthru.filetype = input.filetype;
+ };
+
+ bams = mapAttrs (_: preprocess) pair;
+
+ variants = let
+ somatic = strelka.callSomatic { } bams; in mapAttrs (_: flip pipe [
+ (compression.uncompress { })
+ (snpeff.annotate { db = ref.grch38.snpeff.db; })
+ dropErrors
+ (snpeff.dbnsfp { dbnsfp = ref.grch38.snpeff.dbnsfp; })
+ ]) {
+ "snvs.vcf" = somatic.snvs;
+ "indels.vcf" = somatic.snvs;
+ "germline.vcf" = strelka.call { } [bams.normal];
+ };
+
+ cnvs = cnvkit.callCNV { } { normals = [ bams.normal ]; tumours = [ bams.tumour ]; };
+
in linkOutputs {
- strelka = strelka.callSomatic {} {normal = preprocess normal; tumour = preprocess tumour;};
- "normal.bam" = preprocess normal;
- "tumour.bam" = preprocess tumour;
+ inherit variants;
+ alignments = linkOutputs (mapAttrs' (n: nameValuePair (n + ".bam")) bams);
+ cnvkit = cnvs;
}