diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00dd3edfb91c82df4ecb952541abd0853d2d05f9..bd07e113ad5698f29ad0dd5f8a0af7a79d98fbb0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,9 +13,10 @@ test: # add unit tests here # add script tests here - bash tests/test_scripts_prepare_inputs_table/test.sh - #- bash tests/test_scripts_prepare_inputs_labkey/test.sh + # - bash tests/test_scripts_prepare_inputs_labkey/test.sh #- bash tests/test_alfa/test.sh # add integration tests here + - bash tests/test_integration_workflow_with_conda/test.local.sh - bash tests/test_create_dag_image/test.sh - bash tests/test_create_rule_graph/test.sh - bash tests/test_integration_workflow/test.local.sh diff --git a/README.md b/README.md index 628833d3d860c6bd9341d94278770446c7631cb0..68a667e95924547abe048f850a158c8118777cfc 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Below is a schematic representation of the individual steps of the workflow > ![rule_graph][rule-graph] For a more detailed description of each step, please refer to the [workflow -documentation][workflow-documentation]. +documentation][pipeline-documentation]. ## Requirements @@ -48,12 +48,8 @@ Other versions are not guaranteed to work as expected. ### Installing dependencies For improved reproducibility and reusability of the workflow, -each individual step of the workflow runs in its own [Singularity][singularity] -container. As a consequence, running this workflow has very few -individual dependencies. However, it requires Singularity to be installed -on the system where the workflow is executed. As the functional installation of -Singularity requires root privileges, and Conda currently only provides -Singularity for Linux architectures, the installation instructions are +each individual step of the workflow runs either in its own [Singularity][singularity] +container or in its own [Conda][conda] virtual environemnt. As a consequence, running this workflow has very few individual dependencies. However, for the **container execution** it requires Singularity to be installed on the system where the workflow is executed. As the functional installation of Singularity requires root privileges, and Conda currently only provides Singularity for Linux architectures, the installation instructions are slightly different depending on your system/setup: #### For most users @@ -115,12 +111,17 @@ need to be installed. ### Test workflow on local machine -Execute the following command to run the test workflow on your local machine: +Execute the following command to run the test workflow on your local machine (with singularity): ```bash bash tests/test_integration_workflow/test.local.sh ``` +Alternatively execute the following command to run the test workflow on your local machine (with conda): +```bash +bash tests/test_integration_workflow_with_conda/test.local.sh +``` + ### Test workflow via Slurm Execute the following command to run the test workflow on a @@ -130,6 +131,12 @@ Execute the following command to run the test workflow on a bash tests/test_integration_workflow/test.slurm.sh ``` +or + +```bash +bash tests/test_integration_workflow_with_conda/test.slurm.sh +``` + > **NOTE:** Depending on the configuration of your Slurm installation or if > using a different workload manager, you may need to adapt file `cluster.json` > and the arguments to options `--config` and `--cores` in the file @@ -177,7 +184,7 @@ your run. cat << "EOF" > run.sh #!/bin/bash snakemake \ - --snakefile="../../snakemake/Snakefile" \ + --snakefile="/path/to/Snakefile" \ --configfile="config.yaml" \ --cores=4 \ --printshellcmds \ @@ -198,7 +205,7 @@ your run. #!/bin/bash mkdir -p logs/cluster_log snakemake \ - --snakefile="../../snakemake/Snakefile" \ + --snakefile="/path/to/Snakefile" \ --configfile="config.yaml" \ --cluster-config="cluster.json" \ --cluster="sbatch --cpus-per-task={cluster.threads} --mem={cluster.mem} --qos={cluster.queue} --time={cluster.time} --job-name={cluster.name} -o {cluster.out} -p scicore" \ @@ -210,6 +217,8 @@ your run. EOF ``` + When running the pipeline with conda you should use the `--use-conda` flag instead of `--use-singularity` and `--singularity-args`. + 5. Start your workflow run: ```bash diff --git a/tests/test_create_dag_image/test.sh b/tests/test_create_dag_image/test.sh index 1c954dd3f80399aec892d7ab90b9ac75fd104063..87b5dad5c96199efcd5a40b0a9c03c03dde5b632 100755 --- a/tests/test_create_dag_image/test.sh +++ b/tests/test_create_dag_image/test.sh @@ -20,7 +20,7 @@ cd $script_dir # Run tests snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="../input_files/config.yaml" \ --dag \ --printshellcmds \ diff --git a/tests/test_create_rule_graph/test.sh b/tests/test_create_rule_graph/test.sh index 287e08d9d4831c79c0bff172f36653dd2012ca66..4e53450f53c781124ca7f617b23324f69623bce2 100755 --- a/tests/test_create_rule_graph/test.sh +++ b/tests/test_create_rule_graph/test.sh @@ -20,7 +20,7 @@ cd $script_dir # Run tests snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="../input_files/config.yaml" \ --rulegraph \ --printshellcmds \ diff --git a/tests/test_integration_workflow/test.local.sh b/tests/test_integration_workflow/test.local.sh index 69b179dfa7d3d05c49b615261db891c93a416ad6..201c4cabafdca42fc4ff55ddf6d72419f6bd03ef 100755 --- a/tests/test_integration_workflow/test.local.sh +++ b/tests/test_integration_workflow/test.local.sh @@ -26,7 +26,7 @@ cd $script_dir # Run tests snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="../input_files/config.yaml" \ --cores=4 \ --printshellcmds \ @@ -39,7 +39,7 @@ snakemake \ # Create a Snakemake report after the workflow execution snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="../input_files/config.yaml" \ --report="snakemake_report.html" diff --git a/tests/test_integration_workflow_multiple_lanes/test.local.sh b/tests/test_integration_workflow_multiple_lanes/test.local.sh index fd45fa49fe29f11f480e19ca38860a54f1ef5edc..48b95e8150b6e3da3b373627d60d6396091672ce 100755 --- a/tests/test_integration_workflow_multiple_lanes/test.local.sh +++ b/tests/test_integration_workflow_multiple_lanes/test.local.sh @@ -26,7 +26,7 @@ cd $script_dir # Run tests snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="../input_files/config.mutliple_lanes.yml" \ --cores=4 \ --printshellcmds \ @@ -39,7 +39,7 @@ snakemake \ # Create a Snakemake report after the workflow execution snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="../input_files/config.mutliple_lanes.yml" \ --report="snakemake_report.html" diff --git a/tests/test_integration_workflow_with_conda/expected_output.files b/tests/test_integration_workflow_with_conda/expected_output.files new file mode 100644 index 0000000000000000000000000000000000000000..a9026e6abe1da853ccee4e74f395d5a441de8cbf --- /dev/null +++ b/tests/test_integration_workflow_with_conda/expected_output.files @@ -0,0 +1,114 @@ +results/kallisto_indexes/homo_sapiens/kallisto.idx +results/salmon_indexes/homo_sapiens/31/salmon.idx/versionInfo.json +results/salmon_indexes/homo_sapiens/31/salmon.idx/duplicate_clusters.tsv +results/salmon_indexes/homo_sapiens/31/salmon.idx/info.json +results/star_indexes/homo_sapiens/75/STAR_index/chrLength.txt +results/star_indexes/homo_sapiens/75/STAR_index/chrNameLength.txt +results/star_indexes/homo_sapiens/75/STAR_index/chrName.txt +results/star_indexes/homo_sapiens/75/STAR_index/chrStart.txt +results/star_indexes/homo_sapiens/75/STAR_index/exonGeTrInfo.tab +results/star_indexes/homo_sapiens/75/STAR_index/exonInfo.tab +results/star_indexes/homo_sapiens/75/STAR_index/geneInfo.tab +results/star_indexes/homo_sapiens/75/STAR_index/Genome +results/star_indexes/homo_sapiens/75/STAR_index/SA +results/star_indexes/homo_sapiens/75/STAR_index/SAindex +results/star_indexes/homo_sapiens/75/STAR_index/sjdbInfo.txt +results/star_indexes/homo_sapiens/75/STAR_index/sjdbList.fromGTF.out.tab +results/star_indexes/homo_sapiens/75/STAR_index/sjdbList.out.tab +results/star_indexes/homo_sapiens/75/STAR_index/transcriptInfo.tab +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_adapters_mate1.fastq +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_polya_mate1.fastq +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_adapters_mate2.fastq +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_polya_mate2.fastq +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/map_genome/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.SJ.out.tab +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/fastqc_data.txt +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/fastqc.fo +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/summary.txt +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/fastqc_data.txt +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/fastqc.fo +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/summary.txt +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/adapter_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/duplication_levels.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_base_n_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_base_quality.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_base_sequence_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_sequence_gc_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_sequence_quality.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_tile_quality.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/sequence_length_distribution.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/adapter_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/duplication_levels.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_base_n_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_base_quality.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_base_sequence_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_sequence_gc_content.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_sequence_quality.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_tile_quality.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/sequence_length_distribution.png +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/quant_kallisto/abundance.tsv +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/quant_kallisto/pseudoalignments.bam +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/quant_kallisto/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.kallisto.pseudo.sam +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/lib_format_counts.json +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/aux_info/ambig_info.tsv +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/aux_info/expected_bias +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/aux_info/observed_bias +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/aux_info/observed_bias_3p +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/aux_info/unmapped_names.txt +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.remove_adapters_mate1.fastq +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.remove_polya_mate1.fastq +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/map_genome/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.SJ.out.tab +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/fastqc_data.txt +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/fastqc.fo +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/summary.txt +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/adapter_content.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/duplication_levels.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_base_n_content.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_base_quality.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_base_sequence_content.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_sequence_gc_content.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_sequence_quality.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_tile_quality.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/sequence_length_distribution.png +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/quant_kallisto/abundance.tsv +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/quant_kallisto/pseudoalignments.bam +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/quant_kallisto/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.kallisto.pseudo.sam +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/lib_format_counts.json +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/aux_info/ambig_info.tsv +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/aux_info/expected_bias +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/aux_info/observed_bias +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/aux_info/observed_bias_3p +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/aux_info/unmapped_names.txt +results/transcriptome/homo_sapiens/transcriptome.fa +results/alfa_indexes/homo_sapiens/75/ALFA/sorted_genes.stranded.ALFA_index +results/alfa_indexes/homo_sapiens/75/ALFA/sorted_genes.unstranded.ALFA_index +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.UniqueMultiple.minus.bg +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.UniqueMultiple.plus.bg +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.Unique.minus.bg +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.Unique.plus.bg +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired.UniqueMultiple.minus.bg +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired.UniqueMultiple.plus.bg +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired.Unique.minus.bg +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired.Unique.plus.bg +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.ALFA_feature_counts.tsv +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.ALFA_feature_counts.tsv +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired.ALFA_feature_counts.tsv +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired.ALFA_feature_counts.tsv +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_UniqueMultiple_minus.bw +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_UniqueMultiple_plus.bw +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_Unique_minus.bw +results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_Unique_plus.bw +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired_UniqueMultiple_minus.bw +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired_UniqueMultiple_plus.bw +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired_Unique_minus.bw +results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired_Unique_plus.bw +results/multiqc_summary/multiqc_data/multiqc_fastqc.txt +results/multiqc_summary/multiqc_data/multiqc_cutadapt.txt +results/multiqc_summary/multiqc_data/multiqc_cutadapt_1.txt +results/multiqc_summary/multiqc_data/multiqc_star.txt +results/multiqc_summary/multiqc_data/multiqc_kallisto.txt +results/multiqc_summary/multiqc_data/multiqc_general_stats.txt +results/summary_kallisto/tx2geneID.tsv +results/summary_kallisto/genes_counts.tsv +results/summary_kallisto/transcripts_counts.tsv +results/summary_kallisto/transcripts_tpm.tsv +results/summary_kallisto/genes_tpm.tsv \ No newline at end of file diff --git a/tests/test_integration_workflow_with_conda/expected_output.md5 b/tests/test_integration_workflow_with_conda/expected_output.md5 new file mode 100644 index 0000000000000000000000000000000000000000..266f992944fb3e19dd0b0941d852c0e18f7a99f0 --- /dev/null +++ b/tests/test_integration_workflow_with_conda/expected_output.md5 @@ -0,0 +1,96 @@ +cbaebdb67aee4784b64aff7fec9fda42 results/kallisto_indexes/homo_sapiens/kallisto.idx +204865f645102587c4953fccb256797c results/salmon_indexes/homo_sapiens/31/salmon.idx/versionInfo.json +51b5292e3a874119c0e1aa566e95d70c results/salmon_indexes/homo_sapiens/31/salmon.idx/duplicate_clusters.tsv +4e10114bb8f9096d594776181424a302 results/salmon_indexes/homo_sapiens/31/salmon.idx/info.json +dee7cdc194d5d0617552b7a3b5ad8dfb results/star_indexes/homo_sapiens/75/STAR_index/chrLength.txt +8e2e96e2d6b7f29940ad5de40662b7cb results/star_indexes/homo_sapiens/75/STAR_index/chrNameLength.txt +d0826904b8afa45352906ad9591f2bfb results/star_indexes/homo_sapiens/75/STAR_index/chrName.txt +8d3291e6bcdbe9902fbd7c887494173f results/star_indexes/homo_sapiens/75/STAR_index/chrStart.txt +83ea3c15ab782b5c55bfaefda8e7aad8 results/star_indexes/homo_sapiens/75/STAR_index/exonGeTrInfo.tab +bad9d837f9a988694cc7080ee6d2997a results/star_indexes/homo_sapiens/75/STAR_index/exonInfo.tab +0c0b013fb8cbb8f3cb7a7bf92f3b1544 results/star_indexes/homo_sapiens/75/STAR_index/geneInfo.tab +00dda17b3c3983873d1474e9a758d6e6 results/star_indexes/homo_sapiens/75/STAR_index/Genome +c0d91c3af633d9439bfd0160d11efe4d results/star_indexes/homo_sapiens/75/STAR_index/SA +a8dfc49713c053a8a1a2cc2527f15186 results/star_indexes/homo_sapiens/75/STAR_index/SAindex +bae93882f9148a6c55816b733c32a3a2 results/star_indexes/homo_sapiens/75/STAR_index/sjdbInfo.txt +875030141343fca11f0b5aa1a37e1b66 results/star_indexes/homo_sapiens/75/STAR_index/sjdbList.fromGTF.out.tab +ea36f062eedc7f54ceffea2b635a25a8 results/star_indexes/homo_sapiens/75/STAR_index/sjdbList.out.tab +65e794aa5096551254af18a678d02264 results/star_indexes/homo_sapiens/75/STAR_index/transcriptInfo.tab +500dd49da40b16799aba62aa5cf239ba results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_adapters_mate1.fastq +500dd49da40b16799aba62aa5cf239ba results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_polya_mate1.fastq +e90e31db1ce51d930645eb74ff70d21b results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_adapters_mate2.fastq +1c0796d7e0bdab0e99780b2e11d80c19 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.remove_polya_mate2.fastq +9896744dd90ff3eef00c91fa1f721366 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/fastqc_data.txt +6946ba80af318b9c1052b264dc674a51 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/fastqc.fo +2603f3031242e97411a71571f6ad9e53 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/summary.txt +c39fc9108e6f6c0df45acc9391daad9c results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/fastqc_data.txt +82c37e4cb9c1e167383d589ccb5c80b4 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/fastqc.fo +2029b1ecea0c5fb3c54238813cf02a26 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/summary.txt +caf24c834f9f8aa31473c3d5826227ac results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/adapter_content.png +909c316306050c8f7dfb9ad72dfe0334 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/duplication_levels.png +3f7d7acd0b42a4e3642f3cc8f81e7b8d results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_base_n_content.png +5475f0266800b9febf00979b8dc561e6 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_base_quality.png +42462f1beeecb7820682284f7d5518cf results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_base_sequence_content.png +dc6b69c56474f492bbc9824631ac84d3 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_sequence_gc_content.png +b5a5a126e3f85478abdac1074aaf2fe1 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_sequence_quality.png +f399fa5792cdfb72fac7ae2226723122 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/per_tile_quality.png +e342ab7fae5112b9ebca5a04cc6230a2 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq1/synthetic_10_reads_paired_synthetic_10_reads_paired.fq1_fastqc/Images/sequence_length_distribution.png +caf24c834f9f8aa31473c3d5826227ac results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/adapter_content.png +909c316306050c8f7dfb9ad72dfe0334 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/duplication_levels.png +3f7d7acd0b42a4e3642f3cc8f81e7b8d results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_base_n_content.png +5475f0266800b9febf00979b8dc561e6 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_base_quality.png +1c5ddee8a651c196e1b0ecdd8b406e71 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_base_sequence_content.png +eedd2f45539f47e163c2b390ba6fbcfc results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_sequence_gc_content.png +b5a5a126e3f85478abdac1074aaf2fe1 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_sequence_quality.png +f399fa5792cdfb72fac7ae2226723122 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/per_tile_quality.png +e342ab7fae5112b9ebca5a04cc6230a2 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/fastqc/fq2/synthetic_10_reads_paired_synthetic_10_reads_paired.fq2_fastqc/Images/sequence_length_distribution.png +d41d8cd98f00b204e9800998ecf8427e results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/quant_kallisto/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.kallisto.pseudo.sam +500dd49da40b16799aba62aa5cf239ba results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.remove_adapters_mate1.fastq +500dd49da40b16799aba62aa5cf239ba results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.remove_polya_mate1.fastq +fdb8c6ddd39b606414b2785d6ec2da8a results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/fastqc_data.txt +3cb70940acdcca512207bd8613085538 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/fastqc.fo +fc276a1711cc35f7a9d5328bdbbab810 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/summary.txt +caf24c834f9f8aa31473c3d5826227ac results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/adapter_content.png +909c316306050c8f7dfb9ad72dfe0334 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/duplication_levels.png +3f7d7acd0b42a4e3642f3cc8f81e7b8d results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_base_n_content.png +5475f0266800b9febf00979b8dc561e6 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_base_quality.png +42462f1beeecb7820682284f7d5518cf results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_base_sequence_content.png +dc6b69c56474f492bbc9824631ac84d3 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_sequence_gc_content.png +b5a5a126e3f85478abdac1074aaf2fe1 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_sequence_quality.png +f399fa5792cdfb72fac7ae2226723122 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/per_tile_quality.png +e342ab7fae5112b9ebca5a04cc6230a2 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/fastqc/fq1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.fq1_fastqc/Images/sequence_length_distribution.png +d41d8cd98f00b204e9800998ecf8427e results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/quant_kallisto/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.kallisto.pseudo.sam +3ce47cb1d62482c5d62337751d7e8552 results/transcriptome/homo_sapiens/transcriptome.fa +6b44c507f0a1c9f7369db0bb1deef0fd results/alfa_indexes/homo_sapiens/75/ALFA/sorted_genes.stranded.ALFA_index +2caebc23faf78fdbbbdbb118d28bd6b5 results/alfa_indexes/homo_sapiens/75/ALFA/sorted_genes.unstranded.ALFA_index +bcccf679a8c083d01527514c9f5680a0 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.UniqueMultiple.minus.bg +ea91b4f85622561158bff2f7c9c312b3 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.UniqueMultiple.plus.bg +bcccf679a8c083d01527514c9f5680a0 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.Unique.minus.bg +ea91b4f85622561158bff2f7c9c312b3 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.Unique.plus.bg +90ae442ebf35015eab2dd4e804c2bafb results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired.UniqueMultiple.minus.bg +16652c037090f3eed1123618a2e75107 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired.UniqueMultiple.plus.bg +90ae442ebf35015eab2dd4e804c2bafb results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired.Unique.minus.bg +16652c037090f3eed1123618a2e75107 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired.Unique.plus.bg +c1254a0bae19ac3ffc39f73099ffcf2b results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.ALFA_feature_counts.tsv +c1254a0bae19ac3ffc39f73099ffcf2b results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/ALFA/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.ALFA_feature_counts.tsv +53fd53f884352d0493b2ca99cef5d76d results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired.ALFA_feature_counts.tsv +53fd53f884352d0493b2ca99cef5d76d results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/ALFA/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired.ALFA_feature_counts.tsv +ed3428feeb7257b0a69ead76a417e339 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_UniqueMultiple_minus.bw +2767ca6a648f3e37b7e3b05ce7845460 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/UniqueMultiple/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_UniqueMultiple_plus.bw +ed3428feeb7257b0a69ead76a417e339 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_Unique_minus.bw +2767ca6a648f3e37b7e3b05ce7845460 results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/bigWig/Unique/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1_Unique_plus.bw +69e2bf688165e9fb7c9c49a8763f5632 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired_UniqueMultiple_minus.bw +ec5aab1b79e7880dfa590e5bc7db5232 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/UniqueMultiple/synthetic_10_reads_paired_synthetic_10_reads_paired_UniqueMultiple_plus.bw +69e2bf688165e9fb7c9c49a8763f5632 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired_Unique_minus.bw +ec5aab1b79e7880dfa590e5bc7db5232 results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/bigWig/Unique/synthetic_10_reads_paired_synthetic_10_reads_paired_Unique_plus.bw +ba090b1b4a2473891de97493d3244956 results/multiqc_summary/multiqc_data/multiqc_fastqc.txt +d8118d944149eecc691d182448696e7f results/multiqc_summary/multiqc_data/multiqc_cutadapt.txt +a127fabda5c3aad9d95414dc4fbc11c3 results/multiqc_summary/multiqc_data/multiqc_cutadapt_1.txt +0c6363588cf6ff74d49f27c164185918 results/multiqc_summary/multiqc_data/multiqc_star.txt +dd81441ca97912a62292d317af2c107c results/multiqc_summary/multiqc_data/multiqc_kallisto.txt +0703b4cb7ec2abfab13ccd5f58c2d536 results/multiqc_summary/multiqc_data/multiqc_general_stats.txt +9f22fcd1b38d9dd692e77cb27f2e52f2 results/summary_kallisto/tx2geneID.tsv +a9514da3fe2c94b9dca71d9e0160be69 results/summary_kallisto/genes_counts.tsv +0d288e71d017a090152384fd915dc2a1 results/summary_kallisto/transcripts_counts.tsv +58a075e4e938d690748b556141912d1c results/summary_kallisto/transcripts_tpm.tsv +8f29696ede8e5d290513f56d3a0b4bff results/summary_kallisto/genes_tpm.tsv diff --git a/tests/test_integration_workflow_with_conda/test.local.sh b/tests/test_integration_workflow_with_conda/test.local.sh new file mode 100755 index 0000000000000000000000000000000000000000..8a291088dff3cea7190bef09d05f74b12a3eb1bd --- /dev/null +++ b/tests/test_integration_workflow_with_conda/test.local.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# Tear down test environment +cleanup () { + rc=$? + rm -rf .cache/ + rm -rf .config/ + rm -rf .fontconfig/ + rm -rf .java/ + rm -rf .snakemake/ + rm -rf logs/ + rm -rf results/ + rm -rf snakemake_report.html + cd $user_dir + echo "Exit status: $rc" +} +trap cleanup EXIT + +# Set up test environment +set -eo pipefail # ensures that script exits at first command that exits with non-zero status +set -u # ensures that script exits when unset variables are used +set -x # facilitates debugging by printing out executed commands +user_dir=$PWD +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $script_dir + +# Run tests +snakemake \ + --snakefile="../../workflow/Snakefile" \ + --configfile="../input_files/config.yaml" \ + --cores=4 \ + --printshellcmds \ + --rerun-incomplete \ + --use-conda \ + --notemp \ + --no-hooks \ + --verbose + +# Create a Snakemake report after the workflow execution +snakemake \ + --snakefile="../../workflow/Snakefile" \ + --configfile="../input_files/config.yaml" \ + --report="snakemake_report.html" + +# Check md5 sum of some output files +find results/ -type f -name \*\.gz -exec gunzip '{}' \; +find results/ -type f -name \*\.zip -exec sh -c 'unzip -o {} -d $(dirname {})' \; +md5sum --check "expected_output.md5" + +# Checksum file generated with +#find results/ \ +# -type f \ +# -name \*\.gz \ +# -exec gunzip '{}' \; +#find results/ \ +# -type f \ +# -name \*\.zip \ +# -exec sh -c 'unzip -o {} -d $(dirname {})' \; +#md5sum $(cat expected_output.files) > expected_output.md5 + +# Check whether STAR produces expected alignments +# STAR alignments need to be fully within ground truth alignments for tests to pass; not checking +# vice versa because processing might cut off parts of reads (if testing STAR directly, add '-f 1' +# as additional option) +echo "Verifying STAR output" +result=$(bedtools intersect -F 1 -v -bed \ + -a ../input_files/synthetic.mate_1.bed \ + -b results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/map_genome/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.Aligned.sortedByCoord.out.bam \ + | wc -l) +if [ $result != "0" ]; then + echo "Alignments for mate 1 reads are not consistent with ground truth" + exit 1 +fi +result=$(bedtools intersect -F 1 -v -bed \ + -a <(cat ../input_files/synthetic.mate_1.bed ../input_files/synthetic.mate_2.bed) \ + -b results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/map_genome/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.Aligned.sortedByCoord.out.bam \ + | wc -l) +if [ $result != "0" ]; then + echo "Alignments for mate 1 reads are not consistent with ground truth" + exit 1 +fi + +# Check whether Salmon assigns reads to expected genes +echo "Verifying Salmon output" +diff \ + <(cat results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/quant.genes.sf | cut -f1,5 | tail -n +2 | sort -k1,1) \ + <(cat ../input_files/synthetic.mate_1.bed | cut -f7 | sort | uniq -c | sort -k2nr | awk '{printf($2"\t"$1"\n")}') +diff \ + <(cat results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/quant.genes.sf | cut -f1,5 | tail -n +2 | sort -k1,1) \ + <(cat ../input_files/synthetic.mate_1.bed | cut -f7 | sort | uniq -c | sort -k2nr | awk '{printf($2"\t"$1"\n")}') + diff --git a/tests/test_integration_workflow_with_conda/test.slurm.sh b/tests/test_integration_workflow_with_conda/test.slurm.sh new file mode 100755 index 0000000000000000000000000000000000000000..e4a7009040415e42ec4e991b28be31776f2c31bc --- /dev/null +++ b/tests/test_integration_workflow_with_conda/test.slurm.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Tear down test environment +cleanup () { + rc=$? + # rm -rf .cache/ + # rm -rf .config/ + # rm -rf .fontconfig/ + # rm -rf .java/ + # rm -rf .snakemake/ + # rm -rf logs/ + # rm -rf results/ + # rm -rf snakemake_report.html + cd $user_dir + echo "Exit status: $rc" +} +trap cleanup EXIT + +# Set up test environment +set -eo pipefail # ensures that script exits at first command that exits with non-zero status +set -u # ensures that script exits when unset variables are used +set -x # facilitates debugging by printing out executed commands +user_dir=$PWD +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +cd $script_dir + +# Run tests +snakemake \ + --snakefile="../../Snakefile" \ + --configfile="../input_files/config.yaml" \ + --cluster-config="../input_files/cluster.json" \ + --cluster="sbatch --cpus-per-task={cluster.threads} --mem={cluster.mem} --qos={cluster.queue} --time={cluster.time} --job-name={cluster.name} -o {cluster.out} -p scicore" \ + --cores=256 \ + --printshellcmds \ + --rerun-incomplete \ + --use-conda \ + --notemp \ + --no-hooks \ + --verbose + +# Create a Snakemake report after the workflow execution +snakemake \ + --snakefile="../../Snakefile" \ + --configfile="../input_files/config.yaml" \ + --report="snakemake_report.html" + +# Check md5 sum of some output files +find results/ -type f -name \*\.gz -exec gunzip '{}' \; +find results/ -type f -name \*\.zip -exec sh -c 'unzip -o {} -d $(dirname {})' \; +md5sum --check "expected_output.md5" + +# Checksum file generated with +# find results/ \ +# -type f \ +# -name \*\.gz \ +# -exec gunzip '{}' \; +# find results/ \ +# -type f \ +# -name \*\.zip \ +# -exec sh -c 'unzip -o {} -d $(dirname {})' \; +# md5sum $(cat expected_output.files) > expected_output.md5 + +# Check whether STAR produces expected alignments +# STAR alignments need to be fully within ground truth alignments for tests to pass; not checking +# vice versa because processing might cut off parts of reads (if testing STAR directly, add '-f 1' +# as additional option) +echo "Verifying STAR output" +result=$(bedtools intersect -F 1 -v -bed \ + -a ../input_files/synthetic.mate_1.bed \ + -b results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/map_genome/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.se.Aligned.sortedByCoord.out.bam \ + | wc -l) +if [ $result != "0" ]; then + echo "Alignments for mate 1 reads are not consistent with ground truth" + exit 1 +fi +result=$(bedtools intersect -F 1 -v -bed \ + -a <(cat ../input_files/synthetic.mate_1.bed ../input_files/synthetic.mate_2.bed) \ + -b results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/map_genome/synthetic_10_reads_paired_synthetic_10_reads_paired.pe.Aligned.sortedByCoord.out.bam \ + | wc -l) +if [ $result != "0" ]; then + echo "Alignments for mate 1 reads are not consistent with ground truth" + exit 1 +fi + +# Check whether Salmon assigns reads to expected genes +echo "Verifying Salmon output" +diff \ + <(cat results/samples/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1/synthetic_10_reads_mate_1_synthetic_10_reads_mate_1.salmon.se/quant.genes.sf | cut -f1,5 | tail -n +2 | sort -k1,1) \ + <(cat ../input_files/synthetic.mate_1.bed | cut -f7 | sort | uniq -c | sort -k2nr | awk '{printf($2"\t"$1"\n")}') +diff \ + <(cat results/samples/synthetic_10_reads_paired_synthetic_10_reads_paired/synthetic_10_reads_paired_synthetic_10_reads_paired.salmon.pe/quant.genes.sf | cut -f1,5 | tail -n +2 | sort -k1,1) \ + <(cat ../input_files/synthetic.mate_1.bed | cut -f7 | sort | uniq -c | sort -k2nr | awk '{printf($2"\t"$1"\n")}') + + diff --git a/tests/test_scripts_prepare_inputs_table/test.sh b/tests/test_scripts_prepare_inputs_table/test.sh index ebd9391f2303cfe8e251c127d5748faa68ea7ba8..3c570241ebb83ad13da152e43a8f8666dc8b83d5 100755 --- a/tests/test_scripts_prepare_inputs_table/test.sh +++ b/tests/test_scripts_prepare_inputs_table/test.sh @@ -35,7 +35,7 @@ python "../../scripts/prepare_inputs.py" \ # Check if dry run completes snakemake \ - --snakefile="../../Snakefile" \ + --snakefile="../../workflow/Snakefile" \ --configfile="config.yaml" \ --dryrun \ --verbose diff --git a/Snakefile b/workflow/Snakefile similarity index 96% rename from Snakefile rename to workflow/Snakefile index c4c4e05414cdeb1ce6c1dc66ef935c9a7b264380..d46c511b58c1152403ff0b05749cab4a796e34f8 100644 --- a/Snakefile +++ b/workflow/Snakefile @@ -100,8 +100,8 @@ def parse_rule_config(rule_config: dict, current_rule: str, immutable: Tuple[str localrules: start, finish, rename_star_rpm_for_alfa, prepare_multiqc_config # Include subworkflows -include: os.path.join("workflow", "rules", "paired_end.snakefile.smk") -include: os.path.join("workflow", "rules", "single_end.snakefile.smk") +include: os.path.join("rules", "paired_end.snakefile.smk") +include: os.path.join("rules", "single_end.snakefile.smk") rule finish: @@ -223,6 +223,9 @@ rule fastqc: singularity: "docker://quay.io/biocontainers/fastqc:0.11.9--hdfd78af_1" + conda: + os.path.join(workflow.basedir, "envs", "fastqc.yaml") + log: stderr = os.path.join( config["log_dir"], @@ -304,6 +307,9 @@ rule create_index_star: singularity: "docker://quay.io/biocontainers/star:2.7.8a--h9ee0642_1" + conda: + os.path.join(workflow.basedir, "envs", "STAR.yaml") + threads: 12 log: @@ -373,6 +379,9 @@ rule extract_transcriptome: singularity: "docker://quay.io/biocontainers/gffread:0.12.1--h2e03b76_1" + conda: + os.path.join(workflow.basedir, "envs", "gffread.yaml") + shell: "(gffread \ -w {output.transcriptome} \ @@ -463,6 +472,9 @@ rule create_index_salmon: singularity: "docker://quay.io/biocontainers/salmon:1.4.0--h84f40af_1" + + conda: + os.path.join(workflow.basedir, "envs", "salmon.yaml") log: stderr = os.path.join( @@ -518,6 +530,9 @@ rule create_index_kallisto: singularity: "docker://quay.io/biocontainers/kallisto:0.46.2--h60f4f9f_2" + conda: + os.path.join(workflow.basedir, "envs", "kallisto.yaml") + log: stderr = os.path.join( config['log_dir'], @@ -563,6 +578,9 @@ rule extract_transcripts_as_bed12: singularity: "docker://quay.io/biocontainers/zgtf:0.1.1--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "zgtf.yaml") + threads: 1 log: @@ -611,6 +629,9 @@ rule index_genomic_alignment_samtools: singularity: "docker://quay.io/biocontainers/samtools:1.3.1--h1b8c3c0_8" + conda: + os.path.join(workflow.basedir, "envs", "samtools.yaml") + threads: 1 log: @@ -700,6 +721,9 @@ rule calculate_TIN_scores: singularity: "docker://quay.io/biocontainers/tin-score-calculation:0.4--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "tin-score-calculation.yaml") + shell: "(calculate-tin.py \ -i {input.bam} \ @@ -781,6 +805,9 @@ rule salmon_quantmerge_genes: singularity: "docker://quay.io/biocontainers/salmon:1.4.0--h84f40af_1" + conda: + os.path.join(workflow.basedir, "envs", "salmon.yaml") + shell: "(salmon quantmerge \ --quants {params.salmon_in} \ @@ -864,6 +891,9 @@ rule salmon_quantmerge_transcripts: singularity: "docker://quay.io/biocontainers/salmon:1.4.0--h84f40af_1" + conda: + os.path.join(workflow.basedir, "envs", "salmon.yaml") + shell: "(salmon quantmerge \ --quants {params.salmon_in} \ @@ -946,6 +976,9 @@ rule kallisto_merge_genes: singularity: "docker://quay.io/biocontainers/r-merge-kallisto:0.6--hdfd78af_0" + conda: + os.path.join(workflow.basedir, "envs", "r-merge-kallisto.yaml") + shell: "(merge_kallisto.R \ --input {params.tables} \ @@ -1027,6 +1060,9 @@ rule kallisto_merge_transcripts: singularity: "docker://quay.io/biocontainers/r-merge-kallisto:0.6--hdfd78af_0" + conda: + os.path.join(workflow.basedir, "envs", "r-merge-kallisto.yaml") + shell: "(merge_kallisto.R \ --input {params.tables} \ @@ -1074,6 +1110,9 @@ rule pca_salmon: singularity: "docker://quay.io/biocontainers/zpca:0.8.3.post1--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "zpca.yaml") + shell: "(zpca-tpm \ --tpm {input.tpm} \ @@ -1120,6 +1159,9 @@ rule pca_kallisto: singularity: "docker://quay.io/biocontainers/zpca:0.8.3.post1--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "zpca.yaml") + shell: "(zpca-tpm \ --tpm {input.tpm} \ @@ -1210,6 +1252,9 @@ rule star_rpm: singularity: "docker://quay.io/biocontainers/star:2.7.8a--h9ee0642_1" + conda: + os.path.join(workflow.basedir, "envs", "STAR.yaml") + log: stderr = os.path.join( config["log_dir"], @@ -1356,6 +1401,9 @@ rule generate_alfa_index: singularity: "docker://quay.io/biocontainers/alfa:1.1.1--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "alfa.yaml") + log: os.path.join( config["log_dir"], @@ -1459,6 +1507,9 @@ rule alfa_qc: singularity: "docker://quay.io/biocontainers/alfa:1.1.1--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "alfa.yaml") + log: os.path.join( config["log_dir"], @@ -1484,7 +1535,6 @@ rule prepare_multiqc_config: input: script = os.path.join( workflow.basedir, - "workflow", "scripts", "zarp_multiqc_config.py") @@ -1632,6 +1682,9 @@ rule multiqc_report: singularity: "docker://quay.io/biocontainers/zavolan-multiqc-plugins:1.3--pyh5e36f6f_0" + conda: + os.path.join(workflow.basedir, "envs", "zavolan-multiqc-plugins.yaml") + shell: "(multiqc \ --outdir {output.multiqc_report} \ @@ -1676,6 +1729,9 @@ rule sort_bed_4_big: singularity: "docker://quay.io/biocontainers/bedtools:2.27.1--h9a82719_5" + conda: + os.path.join(workflow.basedir, "envs", "bedtools.yaml") + log: stderr = os.path.join( config["log_dir"], @@ -1736,6 +1792,9 @@ rule prepare_bigWig: singularity: "docker://quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h0b8a92a_2" + conda: + os.path.join(workflow.basedir, "envs", "ucsc-bedgraphtobigwig.yaml") + log: stderr = os.path.join( config["log_dir"], diff --git a/workflow/envs/STAR.yaml b/workflow/envs/STAR.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4c4b6226e38581604aaeba74e6cd1a81147b9aa7 --- /dev/null +++ b/workflow/envs/STAR.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - STAR=2.7.8a +... diff --git a/workflow/envs/alfa.yaml b/workflow/envs/alfa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5f444fb27c3324a02296af57cfc400df82460bd2 --- /dev/null +++ b/workflow/envs/alfa.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - alfa=1.1.1 +... diff --git a/workflow/envs/bedtools.yaml b/workflow/envs/bedtools.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2d4077169c4777a1258bb444efd4e16b22510148 --- /dev/null +++ b/workflow/envs/bedtools.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - bedtools=2.27.1 +... diff --git a/workflow/envs/cutadapt.yaml b/workflow/envs/cutadapt.yaml new file mode 100644 index 0000000000000000000000000000000000000000..064d30234ed4b627aae8805b3d854b937480a926 --- /dev/null +++ b/workflow/envs/cutadapt.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - cutadapt=3.4 +... diff --git a/workflow/envs/fastqc.yaml b/workflow/envs/fastqc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a5d96ff8ce5b749a8139726cc70cc4595f42607b --- /dev/null +++ b/workflow/envs/fastqc.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - fastqc=0.11.9 +... diff --git a/workflow/envs/gffread.yaml b/workflow/envs/gffread.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3b1399ce9273598a648f01e581be76fe521fb8ae --- /dev/null +++ b/workflow/envs/gffread.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - gffread=0.12.1 +... diff --git a/workflow/envs/kallisto.yaml b/workflow/envs/kallisto.yaml new file mode 100644 index 0000000000000000000000000000000000000000..977d1cd7473ee39b631cc3967f058e9a539ced74 --- /dev/null +++ b/workflow/envs/kallisto.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - kallisto=0.46.2 +... diff --git a/workflow/envs/r-merge-kallisto.yaml b/workflow/envs/r-merge-kallisto.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b069945295b9240d5e0266d1fe91992481548629 --- /dev/null +++ b/workflow/envs/r-merge-kallisto.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - r-merge-kallisto=0.6 +... diff --git a/workflow/envs/salmon.yaml b/workflow/envs/salmon.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9db5f9ddbafb883f88bb259bb9e67abaa7b5bb6b --- /dev/null +++ b/workflow/envs/salmon.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - salmon=1.4.0 +... diff --git a/workflow/envs/samtools.yaml b/workflow/envs/samtools.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0a515aa5869d727dcb5fbc40f82d0610b627045c --- /dev/null +++ b/workflow/envs/samtools.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - samtools=1.3.1 +... diff --git a/workflow/envs/tin-score-calculation.yaml b/workflow/envs/tin-score-calculation.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3cf610d59a0d2f1de130b2311014a8ebc1bd2c82 --- /dev/null +++ b/workflow/envs/tin-score-calculation.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - tin-score-calculation=0.4 +... diff --git a/workflow/envs/ucsc-bedgraphtobigwig.yaml b/workflow/envs/ucsc-bedgraphtobigwig.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7b79a3ad81c0b87c046c8eb8c457c29db0ec7e5f --- /dev/null +++ b/workflow/envs/ucsc-bedgraphtobigwig.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - ucsc-bedgraphtobigwig=377 +... diff --git a/workflow/envs/zavolan-multiqc-plugins.yaml b/workflow/envs/zavolan-multiqc-plugins.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4d11f50a33d87893aa087b818c6ef4d268032c87 --- /dev/null +++ b/workflow/envs/zavolan-multiqc-plugins.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - zavolan-multiqc-plugins=1.3 +... diff --git a/workflow/envs/zgtf.yaml b/workflow/envs/zgtf.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9e71d51f1977801cd7179eca8b25f2943f7bba0b --- /dev/null +++ b/workflow/envs/zgtf.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - zgtf=0.1.1 +... diff --git a/workflow/envs/zpca.yaml b/workflow/envs/zpca.yaml new file mode 100644 index 0000000000000000000000000000000000000000..faa059705e2927977948ee20211cc8586e0b98fa --- /dev/null +++ b/workflow/envs/zpca.yaml @@ -0,0 +1,7 @@ +--- +channels: + - conda-forge + - bioconda +dependencies: + - zpca=0.8.3.post1 +... diff --git a/workflow/rules/paired_end.snakefile.smk b/workflow/rules/paired_end.snakefile.smk index 0fc0d6b2ae014a385573942360e21b3b55087b85..37c55460935a5bc1c86716f3ad69efc96e7e5fde 100644 --- a/workflow/rules/paired_end.snakefile.smk +++ b/workflow/rules/paired_end.snakefile.smk @@ -55,6 +55,9 @@ rule pe_remove_adapters_cutadapt: singularity: "docker://quay.io/biocontainers/cutadapt:3.4--py37h73a75cf_1" + conda: + os.path.join(workflow.basedir, "envs", "cutadapt.yaml") + threads: 8 log: @@ -150,6 +153,9 @@ rule pe_remove_polya_cutadapt: singularity: "docker://quay.io/biocontainers/cutadapt:3.4--py37h73a75cf_1" + conda: + os.path.join(workflow.basedir, "envs", "cutadapt.yaml") + threads: 8 log: @@ -281,6 +287,9 @@ rule pe_map_genome_star: singularity: "docker://quay.io/biocontainers/star:2.7.8a--h9ee0642_1" + conda: + os.path.join(workflow.basedir, "envs", "STAR.yaml") + threads: 12 log: @@ -416,6 +425,9 @@ rule pe_quantification_salmon: singularity: "docker://quay.io/biocontainers/salmon:1.4.0--h84f40af_1" + conda: + os.path.join(workflow.basedir, "envs", "salmon.yaml") + shell: "(salmon quant \ --libType {params.libType} \ @@ -500,6 +512,9 @@ rule pe_genome_quantification_kallisto: singularity: "docker://quay.io/biocontainers/kallisto:0.46.2--h60f4f9f_2" + conda: + os.path.join(workflow.basedir, "envs", "kallisto.yaml") + threads: 8 log: diff --git a/workflow/rules/single_end.snakefile.smk b/workflow/rules/single_end.snakefile.smk index c60cfb55f212cf74e465192844746e44ba49691b..e270aba84b8a70d69780aa5f31891b991dc8f54f 100644 --- a/workflow/rules/single_end.snakefile.smk +++ b/workflow/rules/single_end.snakefile.smk @@ -45,6 +45,9 @@ rule remove_adapters_cutadapt: singularity: "docker://quay.io/biocontainers/cutadapt:3.4--py37h73a75cf_1" + conda: + os.path.join(workflow.basedir, "envs", "cutadapt.yaml") + threads: 8 log: @@ -115,6 +118,9 @@ rule remove_polya_cutadapt: singularity: "docker://quay.io/biocontainers/cutadapt:3.4--py37h73a75cf_1" + conda: + os.path.join(workflow.basedir, "envs", "cutadapt.yaml") + threads: 8 log: @@ -225,6 +231,9 @@ rule map_genome_star: singularity: "docker://quay.io/biocontainers/star:2.7.8a--h9ee0642_1" + conda: + os.path.join(workflow.basedir, "envs", "STAR.yaml") + threads: 12 log: @@ -363,6 +372,9 @@ rule quantification_salmon: singularity: "docker://quay.io/biocontainers/salmon:1.4.0--h84f40af_1" + conda: + os.path.join(workflow.basedir, "envs", "salmon.yaml") + shell: "(salmon quant \ --libType {params.libType} \ @@ -461,6 +473,9 @@ rule genome_quantification_kallisto: singularity: "docker://quay.io/biocontainers/kallisto:0.46.2--h60f4f9f_2" + conda: + os.path.join(workflow.basedir, "envs", "kallisto.yaml") + shell: "(kallisto quant \ --single \