fix and test for files with no gene id in attributes
This commit is contained in:
parent
805c15297e
commit
ec3c346fd8
@ -45,7 +45,7 @@ docker-run:
|
|||||||
- MATRIX_NAME: [
|
- MATRIX_NAME: [
|
||||||
"fusions", "differential_expression", "isoforms",
|
"fusions", "differential_expression", "isoforms",
|
||||||
"only_differential_expression", "differential_expression_gff3",
|
"only_differential_expression", "differential_expression_gff3",
|
||||||
"ncbi_gzip", "denovo"
|
"ncbi_gzip", "denovo", "ncbi_no_gene_id", "ensembl_with_versions"
|
||||||
]
|
]
|
||||||
rules:
|
rules:
|
||||||
# NOTE As we're overriding the rules block for the included docker-run
|
# NOTE As we're overriding the rules block for the included docker-run
|
||||||
@ -109,15 +109,41 @@ docker-run:
|
|||||||
build_minimap_index,get_transcriptome,merge_gff_bundles,run_gffcompare,build_minimap_index,split_bam
|
build_minimap_index,get_transcriptome,merge_gff_bundles,run_gffcompare,build_minimap_index,split_bam
|
||||||
- if: $MATRIX_NAME == "ncbi_gzip"
|
- if: $MATRIX_NAME == "ncbi_gzip"
|
||||||
variables:
|
variables:
|
||||||
NF_BEFORE_SCRIPT: wget -O differential_expression.tar.gz https://ont-exd-int-s3-euwst1-epi2me-labs.s3.amazonaws.com/wf-isoforms/differential_expression.tar.gz && tar -xzvf differential_expression.tar.gz
|
NF_BEFORE_SCRIPT: wget -O differential_expression_ncbi.tar.gz https://ont-exd-int-s3-euwst1-epi2me-labs.s3.amazonaws.com/wf-isoforms/differential_expression_ncbi.tar.gz && tar -xzvf differential_expression_ncbi.tar.gz
|
||||||
NF_WORKFLOW_OPTS: "-executor.\\$$local.memory 16GB \
|
NF_WORKFLOW_OPTS: "-executor.\\$$local.memory 16GB \
|
||||||
--fastq differential_expression/differential_expression_fastq \
|
--fastq differential_expression_ncbi/differential_expression_fastq \
|
||||||
--transcriptome-source precomputed \
|
--transcriptome-source precomputed \
|
||||||
--de_analysis \
|
--de_analysis \
|
||||||
--ref_genome differential_expression/GRCh38.p14.NCBI_test.fna.gz \
|
--ref_genome differential_expression_ncbi/GRCh38.p14.NCBI_test.fna.gz \
|
||||||
--ref_annotation differential_expression/GRCh38.p14_NCBI_test.gtf.gz \
|
--ref_annotation differential_expression_ncbi/GRCh38.p14_NCBI_test.gtf.gz \
|
||||||
--direct_rna --minimap_index_opts '-w 25' \
|
--direct_rna --minimap_index_opts '-w 25' \
|
||||||
--transcriptome_assembly false --sample_sheet test_data/sample_sheet.csv"
|
--transcriptome_assembly false --sample_sheet test_data/sample_sheet.csv"
|
||||||
NF_IGNORE_PROCESSES: >
|
NF_IGNORE_PROCESSES: >
|
||||||
preprocess_reads,merge_transcriptomes,assemble_transcripts,
|
preprocess_reads,merge_transcriptomes,assemble_transcripts,
|
||||||
build_minimap_index,get_transcriptome,merge_gff_bundles,run_gffcompare,build_minimap_index,split_bam
|
build_minimap_index,get_transcriptome,merge_gff_bundles,run_gffcompare,build_minimap_index,split_bam
|
||||||
|
- if: $MATRIX_NAME == "ncbi_no_gene_id"
|
||||||
|
variables:
|
||||||
|
NF_BEFORE_SCRIPT: wget -O differential_expression_ncbi.tar.gz https://ont-exd-int-s3-euwst1-epi2me-labs.s3.amazonaws.com/wf-isoforms/differential_expression_ncbi.tar.gz && tar -xzvf differential_expression_ncbi.tar.gz
|
||||||
|
NF_WORKFLOW_OPTS: "-executor.\\$$local.memory 16GB \
|
||||||
|
--fastq differential_expression_ncbi/differential_expression_fastq \
|
||||||
|
--transcriptome-source precomputed --de_analysis \
|
||||||
|
--ref_genome differential_expression_ncbi/GCF_000001405.40_GRCh38.p14_genomic.fna.gz \
|
||||||
|
--ref_annotation differential_expression_ncbi/GCF_000001405.40_GRCh38.p14_genomic.gff.gz \
|
||||||
|
--direct_rna --ref_transcriptome differential_expression_ncbi/GCF_000001405.40_GRCh38.p14_rna.fna.gz \
|
||||||
|
--transcriptome_assembly false --sample_sheet test_data/sample_sheet.csv"
|
||||||
|
NF_IGNORE_PROCESSES: >
|
||||||
|
preprocess_reads,merge_transcriptomes,assemble_transcripts,
|
||||||
|
build_minimap_index,get_transcriptome,merge_gff_bundles,run_gffcompare,build_minimap_index,split_bam
|
||||||
|
- if: $MATRIX_NAME == "ensembl_with_versions"
|
||||||
|
variables:
|
||||||
|
NF_BEFORE_SCRIPT: wget -O differential_expression.tar.gz https://ont-exd-int-s3-euwst1-epi2me-labs.s3.amazonaws.com/wf-isoforms/differential_expression.tar.gz && tar -xzvf differential_expression.tar.gz
|
||||||
|
NF_WORKFLOW_OPTS: "-executor.\\$$local.memory 16GB \
|
||||||
|
--fastq differential_expression/differential_expression_fastq \
|
||||||
|
--transcriptome-source precomputed --de_analysis \
|
||||||
|
--ref_genome differential_expression/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz \
|
||||||
|
--ref_annotation differential_expression/Homo_sapiens.GRCh38.109.gtf.gz \
|
||||||
|
--direct_rna --ref_transcriptome differential_expression/Homo_sapiens.GRCh38.cdna.all.fa.gz \
|
||||||
|
--transcriptome_assembly false --sample_sheet test_data/sample_sheet.csv"
|
||||||
|
NF_IGNORE_PROCESSES: >
|
||||||
|
preprocess_reads,merge_transcriptomes,assemble_transcripts,
|
||||||
|
build_minimap_index,get_transcriptome,merge_gff_bundles,run_gffcompare,build_minimap_index,split_bam
|
||||||
|
|||||||
@ -4,12 +4,15 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [unreleased]
|
## [v0.2.1]
|
||||||
### Changed
|
### Changed
|
||||||
- Any sample aliases that contain spaces will be replaced with underscores.
|
- Any sample aliases that contain spaces will be replaced with underscores.
|
||||||
|
- Updated documentation to explain we only support Ensembl, NCBI and ENCODE annotation file types.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Documentation parameter examples corrected.
|
- Documentation parameter examples corrected.
|
||||||
|
- Handling for annotation files that use gene as gene_id attribute.
|
||||||
|
- Handling for Ensembl annotation files.
|
||||||
|
|
||||||
## [v0.2.0]
|
## [v0.2.0]
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@ -82,7 +82,7 @@ Differential gene expression is sensitive to the input data quantity and quality
|
|||||||
- Directory containing cDNA/direct RNA reads. Or a directory containing subdirectories each with reads from different samples
|
- Directory containing cDNA/direct RNA reads. Or a directory containing subdirectories each with reads from different samples
|
||||||
(in fastq/fastq.gz format)
|
(in fastq/fastq.gz format)
|
||||||
- Reference genome in fasta format (required for reference-based assembly).
|
- Reference genome in fasta format (required for reference-based assembly).
|
||||||
- Optional reference annotation in GFF2/3 format (extensions allowed are .gtf(.gz), .gff(.gz), .gff3(.gz)) (required for differential expression analysis `--de_analysis`).
|
- Optional reference annotation in GFF2/3 format (extensions allowed are .gtf(.gz), .gff(.gz), .gff3(.gz)) (required for differential expression analysis `--de_analysis`). Only annotation files from [Encode](https://www.encodeproject.org), [Ensembl](https://www.ensembl.org/index.html) and [NCBI](https://www.ncbi.nlm.nih.gov/) are supported.
|
||||||
- For fusion detection, JAFFAL reference files (see Quickstart)
|
- For fusion detection, JAFFAL reference files (see Quickstart)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@ min_samps_feature_expr <- args[3]
|
|||||||
min_gene_expr <- args[4]
|
min_gene_expr <- args[4]
|
||||||
min_feature_expr <- args[5]
|
min_feature_expr <- args[5]
|
||||||
annotation_type <- args[6]
|
annotation_type <- args[6]
|
||||||
|
strip_version <- args[7]
|
||||||
|
|
||||||
cat("Loading counts, conditions and parameters.\n")
|
cat("Loading counts, conditions and parameters.\n")
|
||||||
cts <- as.matrix(read.csv("merged/all_counts.tsv", sep="\t", row.names="Reference", stringsAsFactors=FALSE))
|
cts <- as.matrix(read.csv("merged/all_counts.tsv", sep="\t", row.names="Reference", stringsAsFactors=FALSE))
|
||||||
@ -27,15 +28,10 @@ txdf <- select(txdb, keys(txdb,"GENEID"), "TXNAME", "GENEID")
|
|||||||
tab <- table(txdf$GENEID)
|
tab <- table(txdf$GENEID)
|
||||||
txdf$ntx<- tab[match(txdf$GENEID, names(tab))]
|
txdf$ntx<- tab[match(txdf$GENEID, names(tab))]
|
||||||
|
|
||||||
strip_version<-function(x) {
|
|
||||||
tmp<-data.frame(strsplit(x,".", fixed=TRUE), stringsAsFactors=FALSE)
|
|
||||||
tmp<-as.vector(tmp[1,])
|
|
||||||
colnames(tmp) <- c()
|
|
||||||
rownames(tmp) <- c()
|
|
||||||
return(tmp)
|
|
||||||
}
|
|
||||||
|
|
||||||
#rownames(cts) <- strip_version(rownames(cts))
|
if (strip_version == "true"){
|
||||||
|
rownames(cts) <- lapply(rownames(cts), sub, pattern = "\\.\\d+$", replacement = "")
|
||||||
|
}
|
||||||
|
|
||||||
cts <- cts[rownames(cts) %in% txdf$TXNAME, ] # FIXME: filter for transcripts which are in the annotation. Why they are not all there?
|
cts <- cts[rownames(cts) %in% txdf$TXNAME, ] # FIXME: filter for transcripts which are in the annotation. Why they are not all there?
|
||||||
|
|
||||||
|
|||||||
@ -173,8 +173,9 @@ def dexseq_section(dexseq_file, section, id_dic):
|
|||||||
section.markdown(dexseq_caption)
|
section.markdown(dexseq_caption)
|
||||||
dexseq_results = pd.read_csv(dexseq_file, sep='\t')
|
dexseq_results = pd.read_csv(dexseq_file, sep='\t')
|
||||||
dexseq_results.index.name = "gene_id:trancript_id"
|
dexseq_results.index.name = "gene_id:trancript_id"
|
||||||
|
# Replace gene id with more useful gene name where possible
|
||||||
dexseq_results.index = dexseq_results.index.map(
|
dexseq_results.index = dexseq_results.index.map(
|
||||||
lambda x: id_dic[x.split(':')[0]] + ':' + str(x.split(':')[1]))
|
lambda x: str(id_dic.get(x.split(':')[0])) + ':' + str(x.split(':')[1]))
|
||||||
dexseq_pvals = dexseq_results.sort_values(by='pvalue', ascending=True)
|
dexseq_pvals = dexseq_results.sort_values(by='pvalue', ascending=True)
|
||||||
section.table(dexseq_results.loc[dexseq_pvals.index], index=True)
|
section.table(dexseq_results.loc[dexseq_pvals.index], index=True)
|
||||||
section.markdown("""
|
section.markdown("""
|
||||||
@ -220,8 +221,10 @@ thresholds defined are shaded as 'Up-' or 'Down-' regulated.""")
|
|||||||
def dtu_section(dtu_file, section, gt_dic, ge_dic):
|
def dtu_section(dtu_file, section, gt_dic, ge_dic):
|
||||||
"""Plot dtu section."""
|
"""Plot dtu section."""
|
||||||
dtu_results = pd.read_csv(dtu_file, sep='\t')
|
dtu_results = pd.read_csv(dtu_file, sep='\t')
|
||||||
dtu_results["gene_name"] = dtu_results["txID"].apply(lambda x: gt_dic[x])
|
dtu_results["gene_name"] = dtu_results["txID"].apply(
|
||||||
dtu_results["geneID"] = dtu_results["geneID"].apply(lambda x: ge_dic[x])
|
lambda x: gt_dic.get(x))
|
||||||
|
dtu_results["geneID"] = dtu_results["geneID"].apply(
|
||||||
|
lambda x: ge_dic.get(x))
|
||||||
dtu_pvals = dtu_results.sort_values(by='gene', ascending=True)
|
dtu_pvals = dtu_results.sort_values(by='gene', ascending=True)
|
||||||
dtu_caption = '''Table showing gene and transcript identifiers
|
dtu_caption = '''Table showing gene and transcript identifiers
|
||||||
and their FDR corrected probabilities
|
and their FDR corrected probabilities
|
||||||
@ -248,8 +251,8 @@ experimental conditions, the log-scaled counts per million measure of abundance
|
|||||||
and the false discovery corrected p-value (FDR). This table has not been
|
and the false discovery corrected p-value (FDR). This table has not been
|
||||||
filtered for genes that satisfy statistical or magnitudinal thresholds"""
|
filtered for genes that satisfy statistical or magnitudinal thresholds"""
|
||||||
section.markdown(dge_caption)
|
section.markdown(dge_caption)
|
||||||
dge_results.index = dge_results.index.map(lambda x: ids_dic[x])
|
dge_results.index = dge_results.index.map(lambda x: ids_dic.get(x))
|
||||||
dge_pvals.index = dge_pvals.index.map(lambda x: ids_dic[x])
|
dge_pvals.index = dge_pvals.index.map(lambda x: ids_dic.get(x))
|
||||||
section.table(dge_results.loc[dge_pvals.index], index=True)
|
section.table(dge_results.loc[dge_pvals.index], index=True)
|
||||||
dge = pd.read_csv(dge_file, sep="\t")
|
dge = pd.read_csv(dge_file, sep="\t")
|
||||||
section.markdown("""
|
section.markdown("""
|
||||||
@ -317,19 +320,31 @@ def get_translations(gtf):
|
|||||||
for i in fn:
|
for i in fn:
|
||||||
if i.startswith("#"):
|
if i.startswith("#"):
|
||||||
continue
|
continue
|
||||||
try:
|
# Different gtf/gff formats contain different attributes
|
||||||
gene_name = get_feature(i, 'gene_name')
|
# and different formating (eg. gene_name="xyz" or gene_name "xyz")
|
||||||
except IndexError:
|
if 'gene_name' in i:
|
||||||
|
gene_name = get_feature(i, "gene_name")
|
||||||
|
elif 'gene_id' in i:
|
||||||
gene_name = get_feature(i, 'gene_id')
|
gene_name = get_feature(i, 'gene_id')
|
||||||
try:
|
elif 'gene' in i:
|
||||||
|
gene_name = get_feature(i, "gene")
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if 'ref_gene_id' in i:
|
||||||
gene_reference = get_feature(i, 'ref_gene_id')
|
gene_reference = get_feature(i, 'ref_gene_id')
|
||||||
except IndexError:
|
elif 'gene_id' in i:
|
||||||
gene_reference = get_feature(i, 'gene_id')
|
gene_reference = get_feature(i, 'gene_id')
|
||||||
try:
|
else:
|
||||||
|
gene_reference = gene_name
|
||||||
|
if 'transcript_id' in i:
|
||||||
transcript_id = get_feature(i, 'transcript_id')
|
transcript_id = get_feature(i, 'transcript_id')
|
||||||
except IndexError:
|
else:
|
||||||
transcript_id = "unknown"
|
transcript_id = "unknown"
|
||||||
|
if 'gene_id' in i:
|
||||||
gene_id = get_feature(i, 'gene_id')
|
gene_id = get_feature(i, 'gene_id')
|
||||||
|
else:
|
||||||
|
gene_id = gene_name
|
||||||
gene_txid[transcript_id] = gene_name
|
gene_txid[transcript_id] = gene_name
|
||||||
gene_geid[gene_id] = gene_reference
|
gene_geid[gene_id] = gene_reference
|
||||||
return gene_txid, gene_geid
|
return gene_txid, gene_geid
|
||||||
|
|||||||
@ -70,5 +70,5 @@ Differential gene expression is sensitive to the input data quantity and quality
|
|||||||
- Directory containing cDNA/direct RNA reads. Or a directory containing subdirectories each with reads from different samples
|
- Directory containing cDNA/direct RNA reads. Or a directory containing subdirectories each with reads from different samples
|
||||||
(in fastq/fastq.gz format)
|
(in fastq/fastq.gz format)
|
||||||
- Reference genome in fasta format (required for reference-based assembly).
|
- Reference genome in fasta format (required for reference-based assembly).
|
||||||
- Optional reference annotation in GFF2/3 format (extensions allowed are .gtf(.gz), .gff(.gz), .gff3(.gz)) (required for differential expression analysis `--de_analysis`).
|
- Optional reference annotation in GFF2/3 format (extensions allowed are .gtf(.gz), .gff(.gz), .gff3(.gz)) (required for differential expression analysis `--de_analysis`). Only annotation files from [Encode](https://www.encodeproject.org), [Ensembl](https://www.ensembl.org/index.html) and [NCBI](https://www.ncbi.nlm.nih.gov/) are supported.
|
||||||
- For fusion detection, JAFFAL reference files (see Quickstart)
|
- For fusion detection, JAFFAL reference files (see Quickstart)
|
||||||
|
|||||||
@ -115,7 +115,7 @@ manifest {
|
|||||||
description = 'Transcriptome analysis including gene fusions, differential expression as well as assembly and annotation of cDNA and direct RNA sequencing data.'
|
description = 'Transcriptome analysis including gene fusions, differential expression as well as assembly and annotation of cDNA and direct RNA sequencing data.'
|
||||||
mainScript = 'main.nf'
|
mainScript = 'main.nf'
|
||||||
nextflowVersion = '>=22.10.8'
|
nextflowVersion = '>=22.10.8'
|
||||||
version = 'v0.2.0'
|
version = 'v0.2.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
executor {
|
executor {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -53,7 +53,7 @@ process mergeTPM {
|
|||||||
process deAnalysis {
|
process deAnalysis {
|
||||||
label "isoforms"
|
label "isoforms"
|
||||||
errorStrategy "retry"
|
errorStrategy "retry"
|
||||||
maxRetries 1
|
maxRetries 3
|
||||||
input:
|
input:
|
||||||
path sample_sheet
|
path sample_sheet
|
||||||
path merged_tsv
|
path merged_tsv
|
||||||
@ -68,16 +68,28 @@ process deAnalysis {
|
|||||||
script:
|
script:
|
||||||
// Just try both annotation file type because a .gff extension may be gff2(gtf) or gff3
|
// Just try both annotation file type because a .gff extension may be gff2(gtf) or gff3
|
||||||
String annotation_type = "gtf"
|
String annotation_type = "gtf"
|
||||||
|
String strip_version = "false"
|
||||||
if (task.attempt == 2){
|
if (task.attempt == 2){
|
||||||
annotation_type = "gff3"
|
annotation_type = "gff3"
|
||||||
|
strip_version = "false"
|
||||||
|
log.info("Retry deAnalysis with gff format setting.")
|
||||||
}
|
}
|
||||||
|
else if (task.attempt == 3){
|
||||||
|
annotation_type = "gff3"
|
||||||
|
strip_version = "true"
|
||||||
|
log.info("Retry deAnalysis with gff format setting and version removal.")
|
||||||
|
}
|
||||||
|
else if (task.attempt == 4){
|
||||||
|
strip_version = "true"
|
||||||
|
log.info("Retry deAnalysis with gtf format setting and version removal.")
|
||||||
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
mkdir merged
|
mkdir merged
|
||||||
mkdir de_analysis
|
mkdir de_analysis
|
||||||
mv $merged_tsv merged/all_counts.tsv
|
mv $merged_tsv merged/all_counts.tsv
|
||||||
mv $sample_sheet de_analysis/coldata.tsv
|
mv $sample_sheet de_analysis/coldata.tsv
|
||||||
de_analysis.R annotation.gtf $params.min_samps_gene_expr $params.min_samps_feature_expr $params.min_gene_expr $params.min_feature_expr $annotation_type
|
de_analysis.R annotation.gtf $params.min_samps_gene_expr $params.min_samps_feature_expr $params.min_gene_expr $params.min_feature_expr $annotation_type $strip_version
|
||||||
|
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user